Crowdin support for translations (#2410)

Co-authored-by: Alex Justesen <alexjustesen@users.noreply.github.com>
This commit is contained in:
Sven van Ginkel
2025-11-14 14:43:51 +01:00
committed by GitHub
parent c893fc765a
commit 116f83a367
95 changed files with 814 additions and 3424 deletions
+1
View File
@@ -11,6 +11,7 @@ body:
Please note: Please note:
- For **feature requests or changes**, use the [feature request form](https://github.com/alexjustesen/speedtest-tracker/issues/new?template=feature_request.yml). - For **feature requests or changes**, use the [feature request form](https://github.com/alexjustesen/speedtest-tracker/issues/new?template=feature_request.yml).
- For **general questions**, **setup or configuration help**, or if youre not sure this is a bug, please use **[GitHub Discussions](https://github.com/alexjustesen/speedtest-tracker/discussions)** instead. - For **general questions**, **setup or configuration help**, or if youre not sure this is a bug, please use **[GitHub Discussions](https://github.com/alexjustesen/speedtest-tracker/discussions)** instead.
- Any isseus with translations should be reported/solved within the [crowdin project](https://crowdin.com/project/speedtest-tracker).
- type: checkboxes - type: checkboxes
attributes: attributes:
label: Pre-work label: Pre-work
@@ -7,6 +7,7 @@ body:
attributes: attributes:
value: | value: |
You should only use this form to request a change or new feature, to report a bug or issue use the [bug report form](https://github.com/alexjustesen/speedtest-tracker). You should only use this form to request a change or new feature, to report a bug or issue use the [bug report form](https://github.com/alexjustesen/speedtest-tracker).
Any reqeusts for new translations should be reqeusted within the [crowdin project](https://crowdin.com/project/speedtest-tracker).
- type: checkboxes - type: checkboxes
attributes: attributes:
label: Pre-work label: Pre-work
+9
View File
@@ -10,6 +10,7 @@ Speedtest Tracker is a self-hosted application that monitors the performance and
- **Detailed Metrics**: Capture download and upload speeds, ping, packet loss and more. - **Detailed Metrics**: Capture download and upload speeds, ping, packet loss and more.
- **Historical Data**: View historical data and trends to identify patterns and issues with your internet connection. - **Historical Data**: View historical data and trends to identify patterns and issues with your internet connection.
- **Notifications**: Receive notifications when your internet performance drops below a certain threshold. - **Notifications**: Receive notifications when your internet performance drops below a certain threshold.
- **Multi-Language Support**: Available in multiple languages with community translations via [Crowdin](https://crowdin.com/project/speedtest-tracker).
## Getting Started ## Getting Started
@@ -20,4 +21,12 @@ Speedtest Tracker is containerized so you can run it anywhere you run your conta
- [Notifications](https://docs.speedtest-tracker.dev/settings/notifications) channels alert you when issues happen. - [Notifications](https://docs.speedtest-tracker.dev/settings/notifications) channels alert you when issues happen.
- [Frequently Asked Questions](https://docs.speedtest-tracker.dev/help/faqs) are common questions that can help you resolve issues. - [Frequently Asked Questions](https://docs.speedtest-tracker.dev/help/faqs) are common questions that can help you resolve issues.
## Translations
Speedtest Tracker supports multiple languages thanks to our community translators!
**Request a new language**: Visit our [Crowdin project](https://crowdin.com/project/speedtest-tracker) and request a new language directly in crowdin.
**Help translate**: Join our [Crowdin project](https://crowdin.com/project/speedtest-tracker) to contribute translations in your language. All translation levels are welcome!
[![Star History Chart](https://api.star-history.com/svg?repos=alexjustesen/speedtest-tracker&type=Date)](https://star-history.com/#alexjustesen/speedtest-tracker&Date) [![Star History Chart](https://api.star-history.com/svg?repos=alexjustesen/speedtest-tracker&type=Date)](https://star-history.com/#alexjustesen/speedtest-tracker&Date)
@@ -12,17 +12,15 @@ class SendDatabaseTestNotification
public function handle(User $user) public function handle(User $user)
{ {
$user->notify( Notification::make()
Notification::make() ->title(__('settings/notifications.test_notifications.database.received'))
->title('Test database notification received!') ->body(__('settings/notifications.test_notifications.database.pong'))
->body('You say pong') ->success()
->success() ->sendToDatabase($user);
->toDatabase(),
);
Notification::make() Notification::make()
->title('Test database notification sent.') ->title(__('settings/notifications.test_notifications.database.sent'))
->body('I say ping') ->body(__('settings/notifications.test_notifications.database.ping'))
->success() ->success()
->send(); ->send();
} }
@@ -15,7 +15,7 @@ class SendMailTestNotification
{ {
if (! count($recipients)) { if (! count($recipients)) {
Notification::make() Notification::make()
->title('You need to add mail recipients!') ->title(__('settings/notifications.test_notifications.mail.add'))
->warning() ->warning()
->send(); ->send();
@@ -28,7 +28,7 @@ class SendMailTestNotification
} }
Notification::make() Notification::make()
->title('Test mail notification sent.') ->title(__('settings/notifications.test_notifications.mail.sent'))
->success() ->success()
->send(); ->send();
} }
@@ -17,7 +17,7 @@ class SendWebhookTestNotification
{ {
if (! count($webhooks)) { if (! count($webhooks)) {
Notification::make() Notification::make()
->title('You need to add webhook URLs!') ->title(__('settings/notifications.test_notifications.webhook.add'))
->warning() ->warning()
->send(); ->send();
@@ -32,7 +32,7 @@ class SendWebhookTestNotification
->url($webhook['url']) ->url($webhook['url'])
->payload([ ->payload([
'result_id' => Str::uuid(), 'result_id' => Str::uuid(),
'site_name' => 'Webhook Notification Testing', 'site_name' => __('settings/notifications.test_notifications.webhook.payload'),
'isp' => $fakeResult->data['isp'], 'isp' => $fakeResult->data['isp'],
'ping' => $fakeResult->ping, 'ping' => $fakeResult->ping,
'download' => $fakeResult->download, 'download' => $fakeResult->download,
@@ -46,7 +46,7 @@ class SendWebhookTestNotification
} }
Notification::make() Notification::make()
->title('Test webhook notification sent.') ->title(__('settings/notifications.test_notifications.webhook.sent'))
->success() ->success()
->send(); ->send();
} }
+4 -2
View File
@@ -3,7 +3,6 @@
namespace App\Enums; namespace App\Enums;
use Filament\Support\Contracts\HasLabel; use Filament\Support\Contracts\HasLabel;
use Illuminate\Support\Str;
enum ResultService: string implements HasLabel enum ResultService: string implements HasLabel
{ {
@@ -12,6 +11,9 @@ enum ResultService: string implements HasLabel
public function getLabel(): ?string public function getLabel(): ?string
{ {
return Str::title($this->name); return match ($this) {
self::Faker => __('enums.service.faker'),
self::Ookla => __('enums.service.ookla'),
};
} }
} }
+10 -2
View File
@@ -4,7 +4,6 @@ namespace App\Enums;
use Filament\Support\Contracts\HasColor; use Filament\Support\Contracts\HasColor;
use Filament\Support\Contracts\HasLabel; use Filament\Support\Contracts\HasLabel;
use Illuminate\Support\Str;
enum ResultStatus: string implements HasColor, HasLabel enum ResultStatus: string implements HasColor, HasLabel
{ {
@@ -33,6 +32,15 @@ enum ResultStatus: string implements HasColor, HasLabel
public function getLabel(): ?string public function getLabel(): ?string
{ {
return Str::title($this->name); return match ($this) {
self::Benchmarking => __('enums.status.benchmarking'),
self::Checking => __('enums.status.checking'),
self::Completed => __('enums.status.completed'),
self::Failed => __('enums.status.failed'),
self::Running => __('enums.status.running'),
self::Started => __('enums.status.started'),
self::Skipped => __('enums.status.skipped'),
self::Waiting => __('enums.status.waiting'),
};
} }
} }
+4 -2
View File
@@ -4,7 +4,6 @@ namespace App\Enums;
use Filament\Support\Contracts\HasColor; use Filament\Support\Contracts\HasColor;
use Filament\Support\Contracts\HasLabel; use Filament\Support\Contracts\HasLabel;
use Illuminate\Support\Str;
enum UserRole: string implements HasColor, HasLabel enum UserRole: string implements HasColor, HasLabel
{ {
@@ -21,6 +20,9 @@ enum UserRole: string implements HasColor, HasLabel
public function getLabel(): ?string public function getLabel(): ?string
{ {
return Str::title($this->name); return match ($this) {
self::Admin => __('general.admin'),
self::User => __('general.user'),
};
} }
} }
+12 -2
View File
@@ -19,19 +19,29 @@ class Dashboard extends BasePage
protected string $view = 'filament.pages.dashboard'; protected string $view = 'filament.pages.dashboard';
public function getTitle(): string
{
return __('dashboard.title');
}
public static function getNavigationLabel(): string
{
return __('dashboard.title');
}
public function getSubheading(): ?string public function getSubheading(): ?string
{ {
$schedule = config('speedtest.schedule'); $schedule = config('speedtest.schedule');
if (blank($schedule) || $schedule === false) { if (blank($schedule) || $schedule === false) {
return __('No speedtests scheduled.'); return __('dashboard.no_speedtests_scheduled');
} }
$cronExpression = new CronExpression($schedule); $cronExpression = new CronExpression($schedule);
$nextRunDate = Carbon::parse($cronExpression->getNextRunDate(timeZone: config('app.display_timezone')))->format(config('app.datetime_format')); $nextRunDate = Carbon::parse($cronExpression->getNextRunDate(timeZone: config('app.display_timezone')))->format(config('app.datetime_format'));
return 'Next speedtest at: '.$nextRunDate; return __('dashboard.next_speedtest_at').': '.$nextRunDate;
} }
protected function getHeaderWidgets(): array protected function getHeaderWidgets(): array
+22 -16
View File
@@ -26,9 +26,15 @@ class DataIntegration extends SettingsPage
protected static ?int $navigationSort = 2; protected static ?int $navigationSort = 2;
protected static ?string $title = 'Data Integration'; public function getTitle(): string
{
return __('settings/data_integration.title');
}
protected static ?string $navigationLabel = 'Data Integration'; public static function getNavigationLabel(): string
{
return __('settings/data_integration.label');
}
protected static string $settings = DataIntegrationSettings::class; protected static string $settings = DataIntegrationSettings::class;
@@ -51,49 +57,49 @@ class DataIntegration extends SettingsPage
'md' => 3, 'md' => 3,
]) ])
->schema([ ->schema([
Section::make('InfluxDB v2') Section::make(__('settings/data_integration.influxdb_v2'))
->description('When enabled, all new Speedtest results will also be sent to InfluxDB.') ->description(__('settings/data_integration.influxdb_v2_description'))
->schema([ ->schema([
Toggle::make('influxdb_v2_enabled') Toggle::make('influxdb_v2_enabled')
->label('Enable') ->label(__('settings/data_integration.influxdb_v2_enabled'))
->reactive() ->reactive()
->columnSpanFull(), ->columnSpanFull(),
Grid::make(['default' => 1, 'md' => 3]) Grid::make(['default' => 1, 'md' => 3])
->hidden(fn (Get $get) => $get('influxdb_v2_enabled') !== true) ->hidden(fn (Get $get) => $get('influxdb_v2_enabled') !== true)
->schema([ ->schema([
TextInput::make('influxdb_v2_url') TextInput::make('influxdb_v2_url')
->label('URL') ->label(__('settings/data_integration.influxdb_v2_url'))
->placeholder('http://your-influxdb-instance') ->placeholder(__('settings/data_integration.influxdb_v2_url_placeholder'))
->maxLength(255) ->maxLength(255)
->required(fn (Get $get) => $get('influxdb_v2_enabled') === true) ->required(fn (Get $get) => $get('influxdb_v2_enabled') === true)
->columnSpan(['md' => 1]), ->columnSpan(['md' => 1]),
TextInput::make('influxdb_v2_org') TextInput::make('influxdb_v2_org')
->label('Org') ->label(__('settings/data_integration.influxdb_v2_org'))
->maxLength(255) ->maxLength(255)
->required(fn (Get $get) => $get('influxdb_v2_enabled') === true) ->required(fn (Get $get) => $get('influxdb_v2_enabled') === true)
->columnSpan(['md' => 1]), ->columnSpan(['md' => 1]),
TextInput::make('influxdb_v2_bucket') TextInput::make('influxdb_v2_bucket')
->placeholder('speedtest-tracker') ->placeholder(__('settings/data_integration.influxdb_v2_bucket_placeholder'))
->label('Bucket') ->label(__('settings/data_integration.influxdb_v2_bucket'))
->maxLength(255) ->maxLength(255)
->required(fn (Get $get) => $get('influxdb_v2_enabled') === true) ->required(fn (Get $get) => $get('influxdb_v2_enabled') === true)
->columnSpan(['md' => 2]), ->columnSpan(['md' => 2]),
TextInput::make('influxdb_v2_token') TextInput::make('influxdb_v2_token')
->label('Token') ->label(__('settings/data_integration.influxdb_v2_token'))
->maxLength(255) ->maxLength(255)
->password() ->password()
->required(fn (Get $get) => $get('influxdb_v2_enabled') === true) ->required(fn (Get $get) => $get('influxdb_v2_enabled') === true)
->columnSpan(['md' => 2]), ->columnSpan(['md' => 2]),
Checkbox::make('influxdb_v2_verify_ssl') Checkbox::make('influxdb_v2_verify_ssl')
->label('Verify SSL') ->label(__('settings/data_integration.influxdb_v2_verify_ssl'))
->columnSpanFull(), ->columnSpanFull(),
// Button to send old data to InfluxDB // Button to send old data to InfluxDB
Actions::make([ Actions::make([
Action::make('Export current results') Action::make('Export current results')
->label('Export current results') ->label(__('general.export_current_results'))
->action(function () { ->action(function () {
Notification::make() Notification::make()
->title('Starting bulk data write to Influxdb') ->title(__('settings/data_integration.starting_bulk_data_write_to_influxdb'))
->info() ->info()
->send(); ->send();
@@ -106,10 +112,10 @@ class DataIntegration extends SettingsPage
// Button to test InfluxDB connection // Button to test InfluxDB connection
Actions::make([ Actions::make([
Action::make('Test connection') Action::make('Test connection')
->label('Test connection') ->label(__('settings/data_integration.test_connection'))
->action(function () { ->action(function () {
Notification::make() Notification::make()
->title('Sending test data to Influxdb') ->title(__('settings/data_integration.sending_test_data_to_influxdb'))
->info() ->info()
->send(); ->send();
+29 -23
View File
@@ -34,9 +34,15 @@ class Notification extends SettingsPage
protected static ?int $navigationSort = 3; protected static ?int $navigationSort = 3;
protected static ?string $title = 'Notifications'; public function getTitle(): string
{
return __('settings/notifications.title');
}
protected static ?string $navigationLabel = 'Notifications'; public static function getNavigationLabel(): string
{
return __('settings/notifications.label');
}
protected static string $settings = NotificationSettings::class; protected static string $settings = NotificationSettings::class;
@@ -64,11 +70,11 @@ class Notification extends SettingsPage
'default' => 1, 'default' => 1,
]) ])
->schema([ ->schema([
Section::make('Database') Section::make(__('settings/notifications.database'))
->description('Notifications sent to this channel will show up under the 🔔 icon in the header.') ->description(__('settings/notifications.database_description'))
->schema([ ->schema([
Toggle::make('database_enabled') Toggle::make('database_enabled')
->label('Enable database notifications') ->label(__('settings/notifications.enable_database_notifications'))
->reactive() ->reactive()
->columnSpanFull(), ->columnSpanFull(),
Grid::make([ Grid::make([
@@ -76,18 +82,18 @@ class Notification extends SettingsPage
]) ])
->hidden(fn (Get $get) => $get('database_enabled') !== true) ->hidden(fn (Get $get) => $get('database_enabled') !== true)
->schema([ ->schema([
Fieldset::make('Triggers') Fieldset::make(__('settings.triggers'))
->schema([ ->schema([
Toggle::make('database_on_speedtest_run') Toggle::make('database_on_speedtest_run')
->label('Notify on every speedtest run') ->label(__('settings/notifications.database_on_speedtest_run'))
->columnSpanFull(), ->columnSpanFull(),
Toggle::make('database_on_threshold_failure') Toggle::make('database_on_threshold_failure')
->label('Notify on threshold failures') ->label(__('settings/notifications.database_on_threshold_failure'))
->columnSpanFull(), ->columnSpanFull(),
]), ]),
Actions::make([ Actions::make([
Action::make('test database') Action::make('test database')
->label('Test database channel') ->label(__('settings/notifications.test_database_channel'))
->action(fn () => SendDatabaseTestNotification::run(user: Auth::user())), ->action(fn () => SendDatabaseTestNotification::run(user: Auth::user())),
]), ]),
]), ]),
@@ -95,10 +101,10 @@ class Notification extends SettingsPage
->compact() ->compact()
->columnSpan('full'), ->columnSpan('full'),
Section::make('Mail') Section::make(__('settings/notifications.mail'))
->schema([ ->schema([
Toggle::make('mail_enabled') Toggle::make('mail_enabled')
->label('Enable mail notifications') ->label(__('settings/notifications.enable_mail_notifications'))
->reactive() ->reactive()
->columnSpanFull(), ->columnSpanFull(),
Grid::make([ Grid::make([
@@ -106,17 +112,17 @@ class Notification extends SettingsPage
]) ])
->hidden(fn (Get $get) => $get('mail_enabled') !== true) ->hidden(fn (Get $get) => $get('mail_enabled') !== true)
->schema([ ->schema([
Fieldset::make('Triggers') Fieldset::make(__('settings.triggers'))
->schema([ ->schema([
Toggle::make('mail_on_speedtest_run') Toggle::make('mail_on_speedtest_run')
->label('Notify on every speedtest run') ->label(__('settings/notifications.mail_on_speedtest_run'))
->columnSpanFull(), ->columnSpanFull(),
Toggle::make('mail_on_threshold_failure') Toggle::make('mail_on_threshold_failure')
->label('Notify on threshold failures') ->label(__('settings/notifications.mail_on_threshold_failure'))
->columnSpanFull(), ->columnSpanFull(),
]), ]),
Repeater::make('mail_recipients') Repeater::make('mail_recipients')
->label('Recipients') ->label(__('settings/notifications.recipients'))
->schema([ ->schema([
TextInput::make('email_address') TextInput::make('email_address')
->placeholder('your@email.com') ->placeholder('your@email.com')
@@ -126,7 +132,7 @@ class Notification extends SettingsPage
->columnSpanFull(), ->columnSpanFull(),
Actions::make([ Actions::make([
Action::make('test mail') Action::make('test mail')
->label('Test mail channel') ->label(__('settings/notifications.test_mail_channel'))
->action(fn (Get $get) => SendMailTestNotification::run(recipients: $get('mail_recipients'))) ->action(fn (Get $get) => SendMailTestNotification::run(recipients: $get('mail_recipients')))
->hidden(fn (Get $get) => ! count($get('mail_recipients'))), ->hidden(fn (Get $get) => ! count($get('mail_recipients'))),
]), ]),
@@ -135,10 +141,10 @@ class Notification extends SettingsPage
->compact() ->compact()
->columnSpan('full'), ->columnSpan('full'),
Section::make('Webhook') Section::make(__('settings/notifications.webhook'))
->schema([ ->schema([
Toggle::make('webhook_enabled') Toggle::make('webhook_enabled')
->label('Enable webhook notifications') ->label(__('settings/notifications.enable_webhook_notifications'))
->reactive() ->reactive()
->columnSpanFull(), ->columnSpanFull(),
Grid::make([ Grid::make([
@@ -146,17 +152,17 @@ class Notification extends SettingsPage
]) ])
->hidden(fn (Get $get) => $get('webhook_enabled') !== true) ->hidden(fn (Get $get) => $get('webhook_enabled') !== true)
->schema([ ->schema([
Fieldset::make('Triggers') Fieldset::make(__('settings.triggers'))
->schema([ ->schema([
Toggle::make('webhook_on_speedtest_run') Toggle::make('webhook_on_speedtest_run')
->label('Notify on every speedtest run') ->label(__('settings/notifications.webhook_on_speedtest_run'))
->columnSpan(2), ->columnSpan(2),
Toggle::make('webhook_on_threshold_failure') Toggle::make('webhook_on_threshold_failure')
->label('Notify on threshold failures') ->label(__('settings/notifications.webhook_on_threshold_failure'))
->columnSpan(2), ->columnSpan(2),
]), ]),
Repeater::make('webhook_urls') Repeater::make('webhook_urls')
->label('Recipients') ->label(__('settings/notifications.recipients'))
->schema([ ->schema([
TextInput::make('url') TextInput::make('url')
->placeholder('https://webhook.site/longstringofcharacters') ->placeholder('https://webhook.site/longstringofcharacters')
@@ -167,7 +173,7 @@ class Notification extends SettingsPage
->columnSpanFull(), ->columnSpanFull(),
Actions::make([ Actions::make([
Action::make('test webhook') Action::make('test webhook')
->label('Test webhook channel') ->label(__('settings/notifications.test_webhook_channel'))
->action(fn (Get $get) => SendWebhookTestNotification::run(webhooks: $get('webhook_urls'))) ->action(fn (Get $get) => SendWebhookTestNotification::run(webhooks: $get('webhook_urls')))
->hidden(fn (Get $get) => ! count($get('webhook_urls'))), ->hidden(fn (Get $get) => ! count($get('webhook_urls'))),
]), ]),
+21 -15
View File
@@ -21,9 +21,15 @@ class Thresholds extends SettingsPage
protected static ?int $navigationSort = 4; protected static ?int $navigationSort = 4;
protected static ?string $title = 'Thresholds'; public function getTitle(): string
{
return __('settings/thresholds.title');
}
protected static ?string $navigationLabel = 'Thresholds'; public static function getNavigationLabel(): string
{
return __('settings/thresholds.label');
}
protected static string $settings = ThresholdSettings::class; protected static string $settings = ThresholdSettings::class;
@@ -51,11 +57,11 @@ class Thresholds extends SettingsPage
'default' => 1, 'default' => 1,
]) ])
->schema([ ->schema([
Section::make('Absolute') Section::make(__('settings/thresholds.absolute'))
->description('Absolute thresholds do not take into account previous history and could be triggered on each test.') ->description(__('settings/thresholds.absolute_description'))
->schema([ ->schema([
Toggle::make('absolute_enabled') Toggle::make('absolute_enabled')
->label('Enable absolute thresholds') ->label(__('settings/thresholds.absolute_enabled'))
->reactive() ->reactive()
->columnSpan(2), ->columnSpan(2),
Grid::make([ Grid::make([
@@ -63,28 +69,28 @@ class Thresholds extends SettingsPage
]) ])
->hidden(fn (Get $get) => $get('absolute_enabled') !== true) ->hidden(fn (Get $get) => $get('absolute_enabled') !== true)
->schema([ ->schema([
Fieldset::make('Metrics') Fieldset::make(__('settings/thresholds.metrics'))
->schema([ ->schema([
TextInput::make('absolute_download') TextInput::make('absolute_download')
->label('Download') ->label(__('general.download'))
->hint('Mbps') ->hint(__('general.mbps'))
->helperText('Set to zero to disable this metric.') ->helperText(__('settings/thresholds.metrics_helper_text'))
->default(0) ->default(0)
->minValue(0) ->minValue(0)
->numeric() ->numeric()
->required(), ->required(),
TextInput::make('absolute_upload') TextInput::make('absolute_upload')
->label('Upload') ->label(__('general.upload'))
->hint('Mbps') ->hint(__('general.mbps'))
->helperText('Set to zero to disable this metric.') ->helperText(__('settings/thresholds.metrics_helper_text'))
->default(0) ->default(0)
->minValue(0) ->minValue(0)
->numeric() ->numeric()
->required(), ->required(),
TextInput::make('absolute_ping') TextInput::make('absolute_ping')
->label('Ping') ->label(__('general.ping'))
->hint('ms') ->hint(__('general.ms'))
->helperText('Set to zero to disable this metric.') ->helperText(__('settings/thresholds.metrics_helper_text'))
->default(0) ->default(0)
->minValue(0) ->minValue(0)
->numeric() ->numeric()
@@ -55,7 +55,7 @@ class ListOoklaServers extends Page implements HasForms
]); ]);
} catch (\Exception $e) { } catch (\Exception $e) {
Notification::make() Notification::make()
->title('Error fetching servers') ->title(__('errors.error_fetching_servers'))
->body($e->getMessage()) ->body($e->getMessage())
->danger() ->danger()
->send(); ->send();
@@ -92,7 +92,7 @@ class ListOoklaServers extends Page implements HasForms
$this->fetchServers(); $this->fetchServers();
Notification::make() Notification::make()
->title('Servers refreshed successfully') ->title(__('errors.servers_refreshed_successfully'))
->success() ->success()
->send(); ->send();
}), }),
@@ -106,7 +106,7 @@ class ListOoklaServers extends Page implements HasForms
$this->js('navigator.clipboard.writeText('.json_encode($this->servers).')'); $this->js('navigator.clipboard.writeText('.json_encode($this->servers).')');
Notification::make() Notification::make()
->title('Copied to clipboard') ->title(__('errors.copied_to_clipboard'))
->success() ->success()
->send(); ->send();
}), }),
@@ -19,9 +19,15 @@ class ApiTokenResource extends Resource
protected static string|\UnitEnum|null $navigationGroup = 'Settings'; protected static string|\UnitEnum|null $navigationGroup = 'Settings';
protected static ?string $label = 'API Token'; public static function getLabel(): ?string
{
return __('api_tokens.api_token');
}
protected static ?string $pluralLabel = 'API Tokens'; public static function getPluralLabel(): ?string
{
return __('api_tokens.api_tokens');
}
public static function canAccess(): bool public static function canAccess(): bool
{ {
@@ -18,7 +18,7 @@ class ListApiTokens extends ListRecords
{ {
return [ return [
Action::make('createToken') Action::make('createToken')
->label('Create API Token') ->label(__('api_tokens.create_api_token'))
->schema(ApiTokenForm::schema()) ->schema(ApiTokenForm::schema())
->action(function (array $data): void { ->action(function (array $data): void {
$token = Auth::user()->createToken( $token = Auth::user()->createToken(
@@ -28,8 +28,8 @@ class ListApiTokens extends ListRecords
); );
Notification::make() Notification::make()
->title('Token Created') ->title(__('general.token_created'))
->body('Your token: `'.explode('|', $token->plainTextToken)[1].'`') ->body(__('api_tokens.your_token').': `'.explode('|', $token->plainTextToken)[1].'`')
->success() ->success()
->persistent() ->persistent()
->send(); ->send();
@@ -15,29 +15,29 @@ class ApiTokenForm
Grid::make() Grid::make()
->schema([ ->schema([
TextInput::make('name') TextInput::make('name')
->label('Name') ->label(__('general.name'))
->unique(ignoreRecord: true) ->unique(ignoreRecord: true)
->maxLength(100) ->maxLength(100)
->required(), ->required(),
CheckboxList::make('abilities') CheckboxList::make('abilities')
->label('Abilities') ->label(__('api_tokens.abilities'))
->options([ ->options([
'results:read' => 'Read results', 'results:read' => __('api_tokens.read_results'),
'speedtests:run' => 'Run speedtest', 'speedtests:run' => __('general.run_speedtest'),
'ookla:list-servers' => 'List servers', 'ookla:list-servers' => __('general.list_servers'),
]) ])
->required() ->required()
->bulkToggleable() ->bulkToggleable()
->descriptions([ ->descriptions([
'results:read' => 'Allow this token to read results.', 'results:read' => __('api_tokens.read_results_description'),
'speedtests:run' => 'Allow this token to run speedtests.', 'speedtests:run' => __('api_tokens.run_speedtest_description'),
'ookla:list-servers' => 'Allow this token to list servers.', 'ookla:list-servers' => __('api_tokens.list_servers_description'),
]), ]),
DateTimePicker::make('expires_at') DateTimePicker::make('expires_at')
->label('Expires at') ->label(__('api_tokens.expires_at'))
->nullable() ->nullable()
->native(false) ->native(false)
->helperText('Leave empty for no expiration'), ->helperText(__('api_tokens.expires_at_helper_text')),
]) ])
->columns([ ->columns([
'lg' => 1, 'lg' => 1,
@@ -21,21 +21,28 @@ class ApiTokenTable
return $table return $table
->query(PersonalAccessToken::query()->where('tokenable_id', Auth::id())) ->query(PersonalAccessToken::query()->where('tokenable_id', Auth::id()))
->columns([ ->columns([
TextColumn::make('name')->searchable(), TextColumn::make('name')
TextColumn::make('abilities')->badge(), ->label(__('general.name'))
->searchable(),
TextColumn::make('abilities')
->label(__('api_tokens.abilities'))
->badge(),
TextColumn::make('created_at') TextColumn::make('created_at')
->label(__('general.created_at'))
->dateTime(config('app.datetime_format')) ->dateTime(config('app.datetime_format'))
->timezone(config('app.display_timezone')) ->timezone(config('app.display_timezone'))
->toggleable(isToggledHiddenByDefault: false) ->toggleable(isToggledHiddenByDefault: false)
->sortable() ->sortable()
->alignEnd(), ->alignEnd(),
TextColumn::make('last_used_at') TextColumn::make('last_used_at')
->label(__('api_tokens.last_used_at'))
->dateTime(config('app.datetime_format')) ->dateTime(config('app.datetime_format'))
->timezone(config('app.display_timezone')) ->timezone(config('app.display_timezone'))
->toggleable(isToggledHiddenByDefault: true) ->toggleable(isToggledHiddenByDefault: true)
->sortable() ->sortable()
->alignEnd(), ->alignEnd(),
TextColumn::make('expires_at') TextColumn::make('expires_at')
->label(__('api_tokens.expires_at'))
->dateTime(config('app.datetime_format')) ->dateTime(config('app.datetime_format'))
->timezone(config('app.display_timezone')) ->timezone(config('app.display_timezone'))
->toggleable(isToggledHiddenByDefault: false) ->toggleable(isToggledHiddenByDefault: false)
@@ -44,10 +51,10 @@ class ApiTokenTable
]) ])
->filters([ ->filters([
TernaryFilter::make('expired') TernaryFilter::make('expired')
->label('Token Status') ->label(__('api_tokens.token_status'))
->placeholder('All tokens') ->placeholder(__('api_tokens.all_tokens'))
->falseLabel('Active tokens') ->falseLabel(__('api_tokens.active_tokens'))
->trueLabel('Expired tokens') ->trueLabel(__('api_tokens.expired_tokens'))
->native(false) ->native(false)
->queries( ->queries(
true: fn (Builder $query) => $query true: fn (Builder $query) => $query
@@ -62,12 +69,12 @@ class ApiTokenTable
blank: fn (Builder $query) => $query, blank: fn (Builder $query) => $query,
), ),
SelectFilter::make('abilities') SelectFilter::make('abilities')
->label('Abilities') ->label(__('api_tokens.abilities'))
->multiple() ->multiple()
->options([ ->options([
'results:read' => 'Read results', 'results:read' => __('api_tokens.read_results'),
'speedtests:run' => 'Run speedtest', 'speedtests:run' => __('general.run_speedtest'),
'ookla:list-servers' => 'List servers', 'ookla:list-servers' => __('general.list_servers'),
]) ])
->query(function (Builder $query, array $data): Builder { ->query(function (Builder $query, array $data): Builder {
foreach ($data['values'] ?? [] as $value) { foreach ($data['values'] ?? [] as $value) {
@@ -16,6 +16,21 @@ class ResultResource extends Resource
protected static string|\BackedEnum|null $navigationIcon = 'heroicon-o-table-cells'; protected static string|\BackedEnum|null $navigationIcon = 'heroicon-o-table-cells';
public static function getNavigationLabel(): string
{
return __('results.title');
}
public static function getModelLabel(): string
{
return __('results.title');
}
public static function getPluralModelLabel(): string
{
return __('results.title');
}
public static function form(Schema $schema): Schema public static function form(Schema $schema): Schema
{ {
return $schema->components(ResultForm::schema()); return $schema->components(ResultForm::schema());
@@ -24,67 +24,67 @@ class ResultForm
// Left column: stacked sections // Left column: stacked sections
Grid::make(['default' => 1]) Grid::make(['default' => 1])
->schema([ ->schema([
Section::make('Result Overview')->schema([ Section::make(__('results.result_overview'))->schema([
TextInput::make('id') TextInput::make('id')
->label('ID'), ->label(__('general.id')),
TextInput::make('created_at') TextInput::make('created_at')
->label('Created') ->label(__('general.created_at'))
->afterStateHydrated(function (TextInput $component, $state) { ->afterStateHydrated(function (TextInput $component, $state) {
$component->state(Carbon::parse($state) $component->state(Carbon::parse($state)
->timezone(config('app.display_timezone')) ->timezone(config('app.display_timezone'))
->format(config('app.datetime_format'))); ->format(config('app.datetime_format')));
}), }),
TextInput::make('download') TextInput::make('download')
->label('Download') ->label(__('general.download'))
->afterStateHydrated(fn ($component, Result $record) => $component->state(! blank($record->download) ? Number::toBitRate(bits: $record->download_bits, precision: 2) : '')), ->afterStateHydrated(fn ($component, Result $record) => $component->state(! blank($record->download) ? Number::toBitRate(bits: $record->download_bits, precision: 2) : '')),
TextInput::make('upload') TextInput::make('upload')
->label('Upload') ->label(__('general.upload'))
->afterStateHydrated(fn ($component, Result $record) => $component->state(! blank($record->upload) ? Number::toBitRate(bits: $record->upload_bits, precision: 2) : '')), ->afterStateHydrated(fn ($component, Result $record) => $component->state(! blank($record->upload) ? Number::toBitRate(bits: $record->upload_bits, precision: 2) : '')),
TextInput::make('ping') TextInput::make('ping')
->label('Ping') ->label(__('general.ping'))
->formatStateUsing(fn ($state) => number_format((float) $state, 0, '.', '').' ms'), ->formatStateUsing(fn ($state) => number_format((float) $state, 0, '.', '').' ms'),
TextInput::make('data.packetLoss') TextInput::make('data.packetLoss')
->label('Packet Loss') ->label(__('results.packet_loss'))
->formatStateUsing(fn ($state) => number_format((float) $state, 2, '.', '').' %'), ->formatStateUsing(fn ($state) => number_format((float) $state, 2, '.', '').' %'),
])->columns(2)->columnSpan('full'), ])->columns(2)->columnSpan('full'),
Section::make('Download Latency') Section::make(__('general.download_latency'))
->schema([ ->schema([
TextInput::make('data.download.latency.jitter')->label('Jitter') TextInput::make('data.download.latency.jitter')->label(__('general.jitter'))
->formatStateUsing(fn ($state) => number_format((float) $state, 0, '.', '').' ms'), ->formatStateUsing(fn ($state) => number_format((float) $state, 0, '.', '').' ms'),
TextInput::make('data.download.latency.high')->label('High') TextInput::make('data.download.latency.high')->label(__('general.high'))
->formatStateUsing(fn ($state) => number_format((float) $state, 0, '.', '').' ms'), ->formatStateUsing(fn ($state) => number_format((float) $state, 0, '.', '').' ms'),
TextInput::make('data.download.latency.low')->label('Low') TextInput::make('data.download.latency.low')->label(__('general.low'))
->formatStateUsing(fn ($state) => number_format((float) $state, 0, '.', '').' ms'), ->formatStateUsing(fn ($state) => number_format((float) $state, 0, '.', '').' ms'),
TextInput::make('data.download.latency.iqm')->label('IQM') TextInput::make('data.download.latency.iqm')->label(__('results.iqm'))
->formatStateUsing(fn ($state) => number_format((float) $state, 0, '.', '').' ms'), ->formatStateUsing(fn ($state) => number_format((float) $state, 0, '.', '').' ms'),
]) ])
->columns(2) ->columns(2)
->collapsed() ->collapsed()
->columnSpan('full'), ->columnSpan('full'),
Section::make('Upload Latency') Section::make(__('general.upload_latency'))
->schema([ ->schema([
TextInput::make('data.upload.latency.jitter')->label('Jitter') TextInput::make('data.upload.latency.jitter')->label(__('general.jitter'))
->formatStateUsing(fn ($state) => number_format((float) $state, 0, '.', '').' ms'), ->formatStateUsing(fn ($state) => number_format((float) $state, 0, '.', '').' ms'),
TextInput::make('data.upload.latency.high')->label('High') TextInput::make('data.upload.latency.high')->label(__('general.high'))
->formatStateUsing(fn ($state) => number_format((float) $state, 0, '.', '').' ms'), ->formatStateUsing(fn ($state) => number_format((float) $state, 0, '.', '').' ms'),
TextInput::make('data.upload.latency.low')->label('Low') TextInput::make('data.upload.latency.low')->label(__('general.low'))
->formatStateUsing(fn ($state) => number_format((float) $state, 0, '.', '').' ms'), ->formatStateUsing(fn ($state) => number_format((float) $state, 0, '.', '').' ms'),
TextInput::make('data.upload.latency.iqm')->label('IQM') TextInput::make('data.upload.latency.iqm')->label(__('results.iqm'))
->formatStateUsing(fn ($state) => number_format((float) $state, 0, '.', '').' ms'), ->formatStateUsing(fn ($state) => number_format((float) $state, 0, '.', '').' ms'),
]) ])
->columns(2) ->columns(2)
->collapsed() ->collapsed()
->columnSpan('full'), ->columnSpan('full'),
Section::make('Ping Details') Section::make(__('results.ping_details'))
->schema([ ->schema([
TextInput::make('data.ping.jitter')->label('Jitter') TextInput::make('data.ping.jitter')->label(__('general.jitter'))
->formatStateUsing(fn ($state) => number_format((float) $state, 0, '.', '').' ms'), ->formatStateUsing(fn ($state) => number_format((float) $state, 0, '.', '').' ms'),
TextInput::make('data.ping.low')->label('Low') TextInput::make('data.ping.low')->label(__('general.low'))
->formatStateUsing(fn ($state) => number_format((float) $state, 0, '.', '').' ms'), ->formatStateUsing(fn ($state) => number_format((float) $state, 0, '.', '').' ms'),
TextInput::make('data.ping.high')->label('High') TextInput::make('data.ping.high')->label(__('general.high'))
->formatStateUsing(fn ($state) => number_format((float) $state, 0, '.', '').' ms'), ->formatStateUsing(fn ($state) => number_format((float) $state, 0, '.', '').' ms'),
]) ])
->columns(2) ->columns(2)
@@ -92,33 +92,39 @@ class ResultForm
->columnSpan('full'), ->columnSpan('full'),
Textarea::make('data.message') Textarea::make('data.message')
->label('Message') ->label(__('general.message'))
->hint(new HtmlString('&#x1f517;<a href="https://docs.speedtest-tracker.dev/help/error-messages" target="_blank" rel="nofollow">Error Messages</a>')) ->hint(new HtmlString('&#x1f517;<a href="https://docs.speedtest-tracker.dev/help/error-messages" target="_blank" rel="nofollow">Error Messages</a>'))
->columnSpanFull(), ->columnSpanFull(),
]) ])
->columnSpan(['md' => 3]), ->columnSpan(['md' => 3]),
// Right column: Server & Metadata // Right column: Server & Metadata
Section::make('Server & Metadata')->schema([ Section::make(__('results.server_&_metadata'))->schema([
TextEntry::make('service') TextEntry::make('service')
->label(__('results.service'))
->state(fn (Result $result): string => $result->service->getLabel()), ->state(fn (Result $result): string => $result->service->getLabel()),
TextEntry::make('server_name') TextEntry::make('server_name')
->label(__('results.server_name'))
->state(fn (Result $result): ?string => $result->server_name), ->state(fn (Result $result): ?string => $result->server_name),
TextEntry::make('server_id') TextEntry::make('server_id')
->label('Server ID') ->label(__('results.server_id'))
->state(fn (Result $result): ?string => $result->server_id), ->state(fn (Result $result): ?string => $result->server_id),
TextEntry::make('isp') TextEntry::make('isp')
->label('ISP') ->label(__('results.isp'))
->state(fn (Result $result): ?string => $result->isp), ->state(fn (Result $result): ?string => $result->isp),
TextEntry::make('server_location') TextEntry::make('server_location')
->label('Server Location') ->label(__('results.server_location'))
->state(fn (Result $result): ?string => $result->server_location), ->state(fn (Result $result): ?string => $result->server_location),
TextEntry::make('server_host') TextEntry::make('server_host')
->label(__('results.server_host'))
->state(fn (Result $result): ?string => $result->server_host), ->state(fn (Result $result): ?string => $result->server_host),
TextEntry::make('comment') TextEntry::make('comment')
->label(__('general.comment'))
->state(fn (Result $result): ?string => $result->comments), ->state(fn (Result $result): ?string => $result->comments),
Checkbox::make('scheduled'), Checkbox::make('scheduled')
Checkbox::make('healthy'), ->label(__('results.scheduled')),
Checkbox::make('healthy')
->label(__('general.healthy')),
])->columns(1)->columnSpan(['md' => 2]), ])->columns(1)->columnSpan(['md' => 2]),
]), ]),
]; ];
@@ -32,57 +32,62 @@ class ResultTable
return $table return $table
->columns([ ->columns([
TextColumn::make('id') TextColumn::make('id')
->label('ID') ->label(__('general.id'))
->toggleable(isToggledHiddenByDefault: false) ->toggleable(isToggledHiddenByDefault: false)
->sortable(), ->sortable(),
TextColumn::make('data.interface.externalIp') TextColumn::make('data.interface.externalIp')
->label('IP address') ->label(__('results.ip_address'))
->toggleable(isToggledHiddenByDefault: true) ->toggleable(isToggledHiddenByDefault: true)
->sortable(query: function (Builder $query, string $direction): Builder { ->sortable(query: function (Builder $query, string $direction): Builder {
return $query->orderBy('data->interface->externalIp', $direction); return $query->orderBy('data->interface->externalIp', $direction);
}), }),
TextColumn::make('service') TextColumn::make('service')
->label(__('results.service'))
->toggleable(isToggledHiddenByDefault: true) ->toggleable(isToggledHiddenByDefault: true)
->sortable(), ->sortable(),
TextColumn::make('data.server.id') TextColumn::make('data.server.id')
->label('Server ID') ->label(__('results.server_id'))
->toggleable(isToggledHiddenByDefault: false) ->toggleable(isToggledHiddenByDefault: false)
->sortable(query: function (Builder $query, string $direction): Builder { ->sortable(query: function (Builder $query, string $direction): Builder {
return $query->orderBy('data->server->id', $direction); return $query->orderBy('data->server->id', $direction);
}), }),
TextColumn::make('data.isp') TextColumn::make('data.isp')
->label('ISP') ->label(__('results.isp'))
->toggleable(isToggledHiddenByDefault: true) ->toggleable(isToggledHiddenByDefault: true)
->sortable(query: function (Builder $query, string $direction): Builder { ->sortable(query: function (Builder $query, string $direction): Builder {
return $query->orderBy('data->isp', $direction); return $query->orderBy('data->isp', $direction);
}), }),
TextColumn::make('data.server.location') TextColumn::make('data.server.location')
->label('Server Location') ->label(__('results.server_location'))
->toggleable(isToggledHiddenByDefault: true) ->toggleable(isToggledHiddenByDefault: true)
->sortable(query: function (Builder $query, string $direction): Builder { ->sortable(query: function (Builder $query, string $direction): Builder {
return $query->orderBy('data->server->location', $direction); return $query->orderBy('data->server->location', $direction);
}), }),
TextColumn::make('data.server.name') TextColumn::make('data.server.name')
->label(__('results.server_name'))
->toggleable(isToggledHiddenByDefault: false) ->toggleable(isToggledHiddenByDefault: false)
->sortable(query: function (Builder $query, string $direction): Builder { ->sortable(query: function (Builder $query, string $direction): Builder {
return $query->orderBy('data->server->name', $direction); return $query->orderBy('data->server->name', $direction);
}), }),
TextColumn::make('download') TextColumn::make('download')
->label(__('results.download'))
->getStateUsing(fn (Result $record): ?string => ! blank($record->download) ? Number::toBitRate(bits: $record->download_bits, precision: 2) : null) ->getStateUsing(fn (Result $record): ?string => ! blank($record->download) ? Number::toBitRate(bits: $record->download_bits, precision: 2) : null)
->toggleable(isToggledHiddenByDefault: false) ->toggleable(isToggledHiddenByDefault: false)
->sortable(), ->sortable(),
TextColumn::make('upload') TextColumn::make('upload')
->label(__('results.upload'))
->getStateUsing(fn (Result $record): ?string => ! blank($record->upload) ? Number::toBitRate(bits: $record->upload_bits, precision: 2) : null) ->getStateUsing(fn (Result $record): ?string => ! blank($record->upload) ? Number::toBitRate(bits: $record->upload_bits, precision: 2) : null)
->toggleable(isToggledHiddenByDefault: false) ->toggleable(isToggledHiddenByDefault: false)
->sortable(), ->sortable(),
TextColumn::make('ping') TextColumn::make('ping')
->label(__('results.ping'))
->toggleable(isToggledHiddenByDefault: false) ->toggleable(isToggledHiddenByDefault: false)
->sortable() ->sortable()
->formatStateUsing(function ($state) { ->formatStateUsing(function ($state) {
return number_format((float) $state, 0, '.', '').' ms'; return number_format((float) $state, 0, '.', '').' ms';
}), }),
TextColumn::make('data.download.latency.jitter') TextColumn::make('data.download.latency.jitter')
->label('Download jitter') ->label(__('results.download_latency_jitter'))
->toggleable(isToggledHiddenByDefault: true) ->toggleable(isToggledHiddenByDefault: true)
->sortable(query: function (Builder $query, string $direction): Builder { ->sortable(query: function (Builder $query, string $direction): Builder {
return $query->orderBy('data->download->latency->jitter', $direction); return $query->orderBy('data->download->latency->jitter', $direction);
@@ -91,7 +96,7 @@ class ResultTable
return number_format((float) $state, 0, '.', '').' ms'; return number_format((float) $state, 0, '.', '').' ms';
}), }),
TextColumn::make('data.download.latency.high') TextColumn::make('data.download.latency.high')
->label('Download latency high') ->label(__('results.download_latency_high'))
->toggleable(isToggledHiddenByDefault: true) ->toggleable(isToggledHiddenByDefault: true)
->sortable(query: function (Builder $query, string $direction): Builder { ->sortable(query: function (Builder $query, string $direction): Builder {
return $query->orderBy('data->download->latency->high', $direction); return $query->orderBy('data->download->latency->high', $direction);
@@ -100,7 +105,7 @@ class ResultTable
return number_format((float) $state, 0, '.', '').' ms'; return number_format((float) $state, 0, '.', '').' ms';
}), }),
TextColumn::make('data.download.latency.low') TextColumn::make('data.download.latency.low')
->label('Download latency low') ->label(__('results.download_latency_low'))
->toggleable(isToggledHiddenByDefault: true) ->toggleable(isToggledHiddenByDefault: true)
->sortable(query: function (Builder $query, string $direction): Builder { ->sortable(query: function (Builder $query, string $direction): Builder {
return $query->orderBy('data->download->latency->low', $direction); return $query->orderBy('data->download->latency->low', $direction);
@@ -109,7 +114,7 @@ class ResultTable
return number_format((float) $state, 0, '.', '').' ms'; return number_format((float) $state, 0, '.', '').' ms';
}), }),
TextColumn::make('data.download.latency.iqm') TextColumn::make('data.download.latency.iqm')
->label('Download latency iqm') ->label(__('results.download_latency_iqm'))
->toggleable(isToggledHiddenByDefault: true) ->toggleable(isToggledHiddenByDefault: true)
->sortable(query: function (Builder $query, string $direction): Builder { ->sortable(query: function (Builder $query, string $direction): Builder {
return $query->orderBy('data->download->latency->iqm', $direction); return $query->orderBy('data->download->latency->iqm', $direction);
@@ -118,7 +123,7 @@ class ResultTable
return number_format((float) $state, 0, '.', '').' ms'; return number_format((float) $state, 0, '.', '').' ms';
}), }),
TextColumn::make('data.upload.latency.jitter') TextColumn::make('data.upload.latency.jitter')
->label('Upload jitter') ->label(__('results.upload_latency_jitter'))
->toggleable(isToggledHiddenByDefault: true) ->toggleable(isToggledHiddenByDefault: true)
->sortable(query: function (Builder $query, string $direction): Builder { ->sortable(query: function (Builder $query, string $direction): Builder {
return $query->orderBy('data->upload->latency->jitter', $direction); return $query->orderBy('data->upload->latency->jitter', $direction);
@@ -127,7 +132,7 @@ class ResultTable
return number_format((float) $state, 0, '.', '').' ms'; return number_format((float) $state, 0, '.', '').' ms';
}), }),
TextColumn::make('data.upload.latency.high') TextColumn::make('data.upload.latency.high')
->label('Upload latency high') ->label(__('results.upload_latency_high'))
->toggleable(isToggledHiddenByDefault: true) ->toggleable(isToggledHiddenByDefault: true)
->sortable(query: function (Builder $query, string $direction): Builder { ->sortable(query: function (Builder $query, string $direction): Builder {
return $query->orderBy('data->upload->latency->high', $direction); return $query->orderBy('data->upload->latency->high', $direction);
@@ -136,7 +141,7 @@ class ResultTable
return number_format((float) $state, 0, '.', '').' ms'; return number_format((float) $state, 0, '.', '').' ms';
}), }),
TextColumn::make('data.upload.latency.low') TextColumn::make('data.upload.latency.low')
->label('Upload latency low') ->label(__('results.upload_latency_low'))
->toggleable(isToggledHiddenByDefault: true) ->toggleable(isToggledHiddenByDefault: true)
->sortable(query: function (Builder $query, string $direction): Builder { ->sortable(query: function (Builder $query, string $direction): Builder {
return $query->orderBy('data->upload->latency->low', $direction); return $query->orderBy('data->upload->latency->low', $direction);
@@ -145,7 +150,7 @@ class ResultTable
return number_format((float) $state, 0, '.', '').' ms'; return number_format((float) $state, 0, '.', '').' ms';
}), }),
TextColumn::make('data.upload.latency.iqm') TextColumn::make('data.upload.latency.iqm')
->label('Upload latency iqm') ->label(__('results.upload_latency_iqm'))
->toggleable(isToggledHiddenByDefault: true) ->toggleable(isToggledHiddenByDefault: true)
->sortable(query: function (Builder $query, string $direction): Builder { ->sortable(query: function (Builder $query, string $direction): Builder {
return $query->orderBy('data->upload->latency->iqm', $direction); return $query->orderBy('data->upload->latency->iqm', $direction);
@@ -154,38 +159,43 @@ class ResultTable
return number_format((float) $state, 0, '.', '').' ms'; return number_format((float) $state, 0, '.', '').' ms';
}), }),
TextColumn::make('data.packetLoss') TextColumn::make('data.packetLoss')
->label('Packet Loss') ->label(__('results.packet_loss'))
->toggleable(isToggledHiddenByDefault: true) ->toggleable(isToggledHiddenByDefault: true)
->sortable() ->sortable()
->formatStateUsing(function ($state) { ->formatStateUsing(function ($state) {
return number_format((float) $state, 2, '.', '').' %'; return number_format((float) $state, 2, '.', '').' %';
}), }),
TextColumn::make('status') TextColumn::make('status')
->label(__('general.status'))
->badge() ->badge()
->toggleable(isToggledHiddenByDefault: false) ->toggleable(isToggledHiddenByDefault: false)
->sortable(), ->sortable(),
IconColumn::make('scheduled') IconColumn::make('scheduled')
->label(__('results.scheduled'))
->boolean() ->boolean()
->toggleable(isToggledHiddenByDefault: true) ->toggleable(isToggledHiddenByDefault: true)
->alignment(Alignment::Center), ->alignment(Alignment::Center),
IconColumn::make('healthy') IconColumn::make('healthy')
->label(__('general.healthy'))
->boolean() ->boolean()
->toggleable(isToggledHiddenByDefault: true) ->toggleable(isToggledHiddenByDefault: true)
->sortable() ->sortable()
->alignment(Alignment::Center), ->alignment(Alignment::Center),
TextColumn::make('data.message') TextColumn::make('data.message')
->label('Error Message') ->label(__('results.error_message'))
->limit(15) ->limit(15)
->tooltip(fn ($state) => $state) ->tooltip(fn ($state) => $state)
->toggleable(isToggledHiddenByDefault: true) ->toggleable(isToggledHiddenByDefault: true)
->sortable(), ->sortable(),
TextColumn::make('created_at') TextColumn::make('created_at')
->label(__('general.created_at'))
->dateTime(config('app.datetime_format')) ->dateTime(config('app.datetime_format'))
->timezone(config('app.display_timezone')) ->timezone(config('app.display_timezone'))
->toggleable(isToggledHiddenByDefault: false) ->toggleable(isToggledHiddenByDefault: false)
->sortable() ->sortable()
->alignment(Alignment::End), ->alignment(Alignment::End),
TextColumn::make('updated_at') TextColumn::make('updated_at')
->label(__('general.updated_at'))
->dateTime(config('app.datetime_format')) ->dateTime(config('app.datetime_format'))
->timezone(config('app.display_timezone')) ->timezone(config('app.display_timezone'))
->toggleable(isToggledHiddenByDefault: true) ->toggleable(isToggledHiddenByDefault: true)
@@ -196,11 +206,14 @@ class ResultTable
->deferColumnManager(false) ->deferColumnManager(false)
->filters([ ->filters([
Filter::make('created_at') Filter::make('created_at')
->label(__('general.created_at'))
->schema([ ->schema([
DatePicker::make('created_from') DatePicker::make('created_from')
->label(__('results.created_from'))
->closeOnDateSelection() ->closeOnDateSelection()
->native(false), ->native(false),
DatePicker::make('created_until') DatePicker::make('created_until')
->label(__('results.created_until'))
->closeOnDateSelection() ->closeOnDateSelection()
->native(false), ->native(false),
]) ])
@@ -216,7 +229,7 @@ class ResultTable
); );
}), }),
SelectFilter::make('ip_address') SelectFilter::make('ip_address')
->label('IP address') ->label(__('results.ip_address'))
->multiple() ->multiple()
->options(function (): array { ->options(function (): array {
return Result::query() return Result::query()
@@ -233,7 +246,7 @@ class ResultTable
}) })
->attribute('data->interface->externalIp'), ->attribute('data->interface->externalIp'),
SelectFilter::make('server_name') SelectFilter::make('server_name')
->label('Server name') ->label(__('results.server_name'))
->multiple() ->multiple()
->options(function (): array { ->options(function (): array {
return Result::query() return Result::query()
@@ -250,23 +263,26 @@ class ResultTable
}) })
->attribute('data->server->name'), ->attribute('data->server->name'),
TernaryFilter::make('scheduled') TernaryFilter::make('scheduled')
->label(__('results.scheduled'))
->nullable() ->nullable()
->native(false) ->native(false)
->trueLabel('Only scheduled speedtests') ->trueLabel(__('results.only_scheduled_speedtests'))
->falseLabel('Only manual speedtests') ->falseLabel(__('results.only_manual_speedtests'))
->queries( ->queries(
true: fn (Builder $query) => $query->where('scheduled', true), true: fn (Builder $query) => $query->where('scheduled', true),
false: fn (Builder $query) => $query->where('scheduled', false), false: fn (Builder $query) => $query->where('scheduled', false),
blank: fn (Builder $query) => $query, blank: fn (Builder $query) => $query,
), ),
SelectFilter::make('status') SelectFilter::make('status')
->label(__('general.status'))
->multiple() ->multiple()
->options(ResultStatus::class), ->options(ResultStatus::class),
TernaryFilter::make('healthy') TernaryFilter::make('healthy')
->label(__('general.healthy'))
->nullable() ->nullable()
->native(false) ->native(false)
->trueLabel('Only healthy speedtests') ->trueLabel(__('results.only_healthy_speedtests'))
->falseLabel('Only unhealthy speedtests') ->falseLabel(__('results.only_unhealthy_speedtests'))
->queries( ->queries(
true: fn (Builder $query) => $query->where('healthy', true), true: fn (Builder $query) => $query->where('healthy', true),
false: fn (Builder $query) => $query->where('healthy', false), false: fn (Builder $query) => $query->where('healthy', false),
@@ -278,12 +294,13 @@ class ResultTable
ViewAction::make(), ViewAction::make(),
DeleteAction::make(), DeleteAction::make(),
Action::make('view result') Action::make('view result')
->label('View on Speedtest.net') ->label(__('results.view_on_speedtest_net'))
->icon('heroicon-o-link') ->icon('heroicon-o-link')
->url(fn (Result $record): ?string => $record->result_url) ->url(fn (Result $record): ?string => $record->result_url)
->hidden(fn (Result $record): bool => $record->status !== ResultStatus::Completed) ->hidden(fn (Result $record): bool => $record->status !== ResultStatus::Completed)
->openUrlInNewTab(), ->openUrlInNewTab(),
Action::make('updateComments') Action::make('updateComments')
->label(__('results.update_comments'))
->icon('heroicon-o-chat-bubble-bottom-center-text') ->icon('heroicon-o-chat-bubble-bottom-center-text')
->hidden(fn (): bool => ! (Auth::user()?->is_admin ?? false) && ! (Auth::user()?->is_user ?? false)) ->hidden(fn (): bool => ! (Auth::user()?->is_admin ?? false) && ! (Auth::user()?->is_user ?? false))
->mountUsing(fn ($form, Result $record) => $form->fill([ ->mountUsing(fn ($form, Result $record) => $form->fill([
@@ -295,6 +312,7 @@ class ResultTable
}) })
->schema([ ->schema([
Textarea::make('comments') Textarea::make('comments')
->label(__('general.comments'))
->rows(6) ->rows(6)
->maxLength(500), ->maxLength(500),
]), ]),
@@ -307,15 +325,16 @@ class ResultTable
ExportAction::make() ExportAction::make()
->exporter(ResultExporter::class) ->exporter(ResultExporter::class)
->columnMapping(false) ->columnMapping(false)
->modalHeading('Export all Results') ->modalHeading(__('results.export_all_results'))
->modalDescription('This will export all columns for all results.') ->modalDescription(__('results.export_all_results_description'))
->fileName(fn (): string => 'results-'.now()->timestamp), ->fileName(fn (): string => 'results-'.now()->timestamp),
ActionGroup::make([ ActionGroup::make([
Action::make('truncate') Action::make('truncate')
->label(__('results.truncate_results'))
->action(fn () => TruncateResults::dispatch(Auth::user())) ->action(fn () => TruncateResults::dispatch(Auth::user()))
->requiresConfirmation() ->requiresConfirmation()
->modalHeading('Truncate Results') ->modalHeading(__('results.truncate_results'))
->modalDescription('Are you sure you want to truncate all results data? This can\'t be undone.') ->modalDescription(__('results.truncate_results_description'))
->color('danger') ->color('danger')
->icon('heroicon-o-trash') ->icon('heroicon-o-trash')
->hidden(fn (): bool => ! Auth::user()->is_admin), ->hidden(fn (): bool => ! Auth::user()->is_admin),
@@ -22,24 +22,27 @@ class UserForm
])->columnSpan([ ])->columnSpan([
'lg' => 2, 'lg' => 2,
])->schema([ ])->schema([
Section::make('Details') Section::make(__('general.details'))
->columns([ ->columns([
'default' => 1, 'default' => 1,
'lg' => 2, 'lg' => 2,
]) ])
->schema([ ->schema([
TextInput::make('name') TextInput::make('name')
->label(__('general.name'))
->required() ->required()
->maxLength(255) ->maxLength(255)
->columnSpanFull(), ->columnSpanFull(),
TextInput::make('email') TextInput::make('email')
->label(__('general.email'))
->email() ->email()
->required() ->required()
->maxLength(255) ->maxLength(255)
->columnSpanFull(), ->columnSpanFull(),
TextInput::make('password') TextInput::make('password')
->label(__('general.password'))
->confirmed() ->confirmed()
->password() ->password()
->revealable() ->revealable()
@@ -48,6 +51,7 @@ class UserForm
->dehydrated(fn ($state) => filled($state)), ->dehydrated(fn ($state) => filled($state)),
TextInput::make('password_confirmation') TextInput::make('password_confirmation')
->label(__('general.password_confirmation'))
->password() ->password()
->revealable(), ->revealable(),
]), ]),
@@ -56,10 +60,10 @@ class UserForm
Grid::make(1) Grid::make(1)
->columnSpan(1) ->columnSpan(1)
->schema([ ->schema([
Section::make('Platform') Section::make(__('general.platform'))
->schema([ ->schema([
Select::make('role') Select::make('role')
->label('Role') ->label(__('general.role'))
->default(UserRole::User) ->default(UserRole::User)
->options(UserRole::class) ->options(UserRole::class)
->required() ->required()
@@ -69,9 +73,11 @@ class UserForm
Section::make() Section::make()
->schema([ ->schema([
Placeholder::make('created_at') Placeholder::make('created_at')
->label(__('general.created_at'))
->content(fn (?User $record): string => $record ? $record->created_at->diffForHumans() : '-'), ->content(fn (?User $record): string => $record ? $record->created_at->diffForHumans() : '-'),
Placeholder::make('updated_at') Placeholder::make('updated_at')
->label(__('general.updated_at'))
->content(fn (?User $record): string => $record ? $record->updated_at->diffForHumans() : '-'), ->content(fn (?User $record): string => $record ? $record->updated_at->diffForHumans() : '-'),
]), ]),
]), ]),
@@ -17,25 +17,30 @@ class UserTable
return $table return $table
->columns([ ->columns([
TextColumn::make('id') TextColumn::make('id')
->label('ID') ->label(__('general.id'))
->sortable() ->sortable()
->toggleable(isToggledHiddenByDefault: false), ->toggleable(isToggledHiddenByDefault: false),
TextColumn::make('name') TextColumn::make('name')
->label(__('general.name'))
->sortable() ->sortable()
->toggleable(isToggledHiddenByDefault: false), ->toggleable(isToggledHiddenByDefault: false),
TextColumn::make('email') TextColumn::make('email')
->label(__('general.email'))
->searchable() ->searchable()
->toggleable(isToggledHiddenByDefault: false), ->toggleable(isToggledHiddenByDefault: false),
TextColumn::make('role') TextColumn::make('role')
->label(__('general.role'))
->badge() ->badge()
->toggleable(isToggledHiddenByDefault: false), ->toggleable(isToggledHiddenByDefault: false),
TextColumn::make('created_at') TextColumn::make('created_at')
->label(__('general.created_at'))
->alignEnd() ->alignEnd()
->dateTime(config('app.datetime_format')) ->dateTime(config('app.datetime_format'))
->timezone(config('app.display_timezone')) ->timezone(config('app.display_timezone'))
->sortable() ->sortable()
->toggleable(isToggledHiddenByDefault: false), ->toggleable(isToggledHiddenByDefault: false),
TextColumn::make('updated_at') TextColumn::make('updated_at')
->label(__('general.updated_at'))
->alignEnd() ->alignEnd()
->dateTime(config('app.datetime_format')) ->dateTime(config('app.datetime_format'))
->timezone(config('app.display_timezone')) ->timezone(config('app.display_timezone'))
@@ -44,6 +49,7 @@ class UserTable
]) ])
->filters([ ->filters([
SelectFilter::make('role') SelectFilter::make('role')
->label(__('general.role'))
->native(false) ->native(false)
->options(UserRole::class), ->options(UserRole::class),
]) ])
@@ -20,6 +20,16 @@ class UserResource extends Resource
protected static ?int $navigationSort = 4; protected static ?int $navigationSort = 4;
public static function getLabel(): ?string
{
return __('general.user');
}
public static function getPluralLabel(): ?string
{
return __('general.users');
}
public static function form(Schema $schema): Schema public static function form(Schema $schema): Schema
{ {
return $schema->components(UserForm::schema()); return $schema->components(UserForm::schema());
@@ -13,7 +13,12 @@ class RecentDownloadChartWidget extends ChartWidget
{ {
use HasChartFilters; use HasChartFilters;
protected ?string $heading = 'Download (Mbps)'; protected ?string $heading = null;
public function getHeading(): ?string
{
return __('general.download_mbps');
}
protected int|string|array $columnSpan = 'full'; protected int|string|array $columnSpan = 'full';
@@ -48,7 +53,7 @@ class RecentDownloadChartWidget extends ChartWidget
return [ return [
'datasets' => [ 'datasets' => [
[ [
'label' => 'Download', 'label' => __('general.download'),
'data' => $results->map(fn ($item) => ! blank($item->download) ? Number::bitsToMagnitude(bits: $item->download_bits, precision: 2, magnitude: 'mbit') : null), 'data' => $results->map(fn ($item) => ! blank($item->download) ? Number::bitsToMagnitude(bits: $item->download_bits, precision: 2, magnitude: 'mbit') : null),
'borderColor' => 'rgba(14, 165, 233)', 'borderColor' => 'rgba(14, 165, 233)',
'backgroundColor' => 'rgba(14, 165, 233, 0.1)', 'backgroundColor' => 'rgba(14, 165, 233, 0.1)',
@@ -59,7 +64,7 @@ class RecentDownloadChartWidget extends ChartWidget
'pointRadius' => count($results) <= 24 ? 3 : 0, 'pointRadius' => count($results) <= 24 ? 3 : 0,
], ],
[ [
'label' => 'Average', 'label' => __('general.average'),
'data' => array_fill(0, count($results), Average::averageDownload($results)), 'data' => array_fill(0, count($results), Average::averageDownload($results)),
'borderColor' => 'rgb(243, 7, 6, 1)', 'borderColor' => 'rgb(243, 7, 6, 1)',
'pointBackgroundColor' => 'rgb(243, 7, 6, 1)', 'pointBackgroundColor' => 'rgb(243, 7, 6, 1)',
@@ -11,7 +11,12 @@ class RecentDownloadLatencyChartWidget extends ChartWidget
{ {
use HasChartFilters; use HasChartFilters;
protected ?string $heading = 'Download Latency'; protected ?string $heading = null;
public function getHeading(): ?string
{
return __('general.download_latency');
}
protected int|string|array $columnSpan = 'full'; protected int|string|array $columnSpan = 'full';
@@ -46,7 +51,7 @@ class RecentDownloadLatencyChartWidget extends ChartWidget
return [ return [
'datasets' => [ 'datasets' => [
[ [
'label' => 'Average (ms)', 'label' => __('general.average_ms'),
'data' => $results->map(fn ($item) => $item->download_latency_iqm), 'data' => $results->map(fn ($item) => $item->download_latency_iqm),
'borderColor' => 'rgba(16, 185, 129)', 'borderColor' => 'rgba(16, 185, 129)',
'backgroundColor' => 'rgba(16, 185, 129, 0.1)', 'backgroundColor' => 'rgba(16, 185, 129, 0.1)',
@@ -57,7 +62,7 @@ class RecentDownloadLatencyChartWidget extends ChartWidget
'pointRadius' => count($results) <= 24 ? 3 : 0, 'pointRadius' => count($results) <= 24 ? 3 : 0,
], ],
[ [
'label' => 'High (ms)', 'label' => __('general.high_ms'),
'data' => $results->map(fn ($item) => $item->download_latency_high), 'data' => $results->map(fn ($item) => $item->download_latency_high),
'borderColor' => 'rgba(14, 165, 233)', 'borderColor' => 'rgba(14, 165, 233)',
'backgroundColor' => 'rgba(14, 165, 233, 0.1)', 'backgroundColor' => 'rgba(14, 165, 233, 0.1)',
@@ -68,7 +73,7 @@ class RecentDownloadLatencyChartWidget extends ChartWidget
'pointRadius' => count($results) <= 24 ? 3 : 0, 'pointRadius' => count($results) <= 24 ? 3 : 0,
], ],
[ [
'label' => 'Low (ms)', 'label' => __('general.low_ms'),
'data' => $results->map(fn ($item) => $item->download_latency_low), 'data' => $results->map(fn ($item) => $item->download_latency_low),
'borderColor' => 'rgba(139, 92, 246)', 'borderColor' => 'rgba(139, 92, 246)',
'backgroundColor' => 'rgba(139, 92, 246, 0.1)', 'backgroundColor' => 'rgba(139, 92, 246, 0.1)',
@@ -11,7 +11,12 @@ class RecentJitterChartWidget extends ChartWidget
{ {
use HasChartFilters; use HasChartFilters;
protected ?string $heading = 'Jitter'; protected ?string $heading = null;
public function getHeading(): ?string
{
return __('general.jitter');
}
protected int|string|array $columnSpan = 'full'; protected int|string|array $columnSpan = 'full';
@@ -46,7 +51,7 @@ class RecentJitterChartWidget extends ChartWidget
return [ return [
'datasets' => [ 'datasets' => [
[ [
'label' => 'Download (ms)', 'label' => __('general.download_ms'),
'data' => $results->map(fn ($item) => $item->download_jitter), 'data' => $results->map(fn ($item) => $item->download_jitter),
'borderColor' => 'rgba(14, 165, 233)', 'borderColor' => 'rgba(14, 165, 233)',
'backgroundColor' => 'rgba(14, 165, 233, 0.1)', 'backgroundColor' => 'rgba(14, 165, 233, 0.1)',
@@ -57,7 +62,7 @@ class RecentJitterChartWidget extends ChartWidget
'pointRadius' => count($results) <= 24 ? 3 : 0, 'pointRadius' => count($results) <= 24 ? 3 : 0,
], ],
[ [
'label' => 'Upload (ms)', 'label' => __('general.upload_ms'),
'data' => $results->map(fn ($item) => $item->upload_jitter), 'data' => $results->map(fn ($item) => $item->upload_jitter),
'borderColor' => 'rgba(139, 92, 246)', 'borderColor' => 'rgba(139, 92, 246)',
'backgroundColor' => 'rgba(139, 92, 246, 0.1)', 'backgroundColor' => 'rgba(139, 92, 246, 0.1)',
@@ -68,7 +73,7 @@ class RecentJitterChartWidget extends ChartWidget
'pointRadius' => count($results) <= 24 ? 3 : 0, 'pointRadius' => count($results) <= 24 ? 3 : 0,
], ],
[ [
'label' => 'Ping (ms)', 'label' => __('general.ping_ms_label'),
'data' => $results->map(fn ($item) => $item->ping_jitter), 'data' => $results->map(fn ($item) => $item->ping_jitter),
'borderColor' => 'rgba(16, 185, 129)', 'borderColor' => 'rgba(16, 185, 129)',
'backgroundColor' => 'rgba(16, 185, 129, 0.1)', 'backgroundColor' => 'rgba(16, 185, 129, 0.1)',
@@ -12,7 +12,12 @@ class RecentPingChartWidget extends ChartWidget
{ {
use HasChartFilters; use HasChartFilters;
protected ?string $heading = 'Ping (ms)'; protected ?string $heading = null;
public function getHeading(): ?string
{
return __('general.ping_ms');
}
protected int|string|array $columnSpan = 'full'; protected int|string|array $columnSpan = 'full';
@@ -47,7 +52,7 @@ class RecentPingChartWidget extends ChartWidget
return [ return [
'datasets' => [ 'datasets' => [
[ [
'label' => 'Ping', 'label' => __('general.ping'),
'data' => $results->map(fn ($item) => $item->ping), 'data' => $results->map(fn ($item) => $item->ping),
'borderColor' => 'rgba(16, 185, 129)', 'borderColor' => 'rgba(16, 185, 129)',
'backgroundColor' => 'rgba(16, 185, 129, 0.1)', 'backgroundColor' => 'rgba(16, 185, 129, 0.1)',
@@ -58,7 +63,7 @@ class RecentPingChartWidget extends ChartWidget
'pointRadius' => count($results) <= 24 ? 3 : 0, 'pointRadius' => count($results) <= 24 ? 3 : 0,
], ],
[ [
'label' => 'Average', 'label' => __('general.average'),
'data' => array_fill(0, count($results), Average::averagePing($results)), 'data' => array_fill(0, count($results), Average::averagePing($results)),
'borderColor' => 'rgb(243, 7, 6, 1)', 'borderColor' => 'rgb(243, 7, 6, 1)',
'pointBackgroundColor' => 'rgb(243, 7, 6, 1)', 'pointBackgroundColor' => 'rgb(243, 7, 6, 1)',
@@ -13,7 +13,12 @@ class RecentUploadChartWidget extends ChartWidget
{ {
use HasChartFilters; use HasChartFilters;
protected ?string $heading = 'Upload (Mbps)'; protected ?string $heading = null;
public function getHeading(): ?string
{
return __('general.upload_mbps');
}
protected int|string|array $columnSpan = 'full'; protected int|string|array $columnSpan = 'full';
@@ -48,7 +53,7 @@ class RecentUploadChartWidget extends ChartWidget
return [ return [
'datasets' => [ 'datasets' => [
[ [
'label' => 'Upload', 'label' => __('general.upload'),
'data' => $results->map(fn ($item) => ! blank($item->upload) ? Number::bitsToMagnitude(bits: $item->upload_bits, precision: 2, magnitude: 'mbit') : null), 'data' => $results->map(fn ($item) => ! blank($item->upload) ? Number::bitsToMagnitude(bits: $item->upload_bits, precision: 2, magnitude: 'mbit') : null),
'borderColor' => 'rgba(139, 92, 246)', 'borderColor' => 'rgba(139, 92, 246)',
'backgroundColor' => 'rgba(139, 92, 246, 0.1)', 'backgroundColor' => 'rgba(139, 92, 246, 0.1)',
@@ -59,7 +64,7 @@ class RecentUploadChartWidget extends ChartWidget
'pointRadius' => count($results) <= 24 ? 3 : 0, 'pointRadius' => count($results) <= 24 ? 3 : 0,
], ],
[ [
'label' => 'Average', 'label' => __('general.average'),
'data' => array_fill(0, count($results), Average::averageUpload($results)), 'data' => array_fill(0, count($results), Average::averageUpload($results)),
'borderColor' => 'rgb(243, 7, 6, 1)', 'borderColor' => 'rgb(243, 7, 6, 1)',
'pointBackgroundColor' => 'rgb(243, 7, 6, 1)', 'pointBackgroundColor' => 'rgb(243, 7, 6, 1)',
@@ -11,7 +11,12 @@ class RecentUploadLatencyChartWidget extends ChartWidget
{ {
use HasChartFilters; use HasChartFilters;
protected ?string $heading = 'Upload Latency'; protected ?string $heading = null;
public function getHeading(): ?string
{
return __('general.upload_latency');
}
protected int|string|array $columnSpan = 'full'; protected int|string|array $columnSpan = 'full';
@@ -46,7 +51,7 @@ class RecentUploadLatencyChartWidget extends ChartWidget
return [ return [
'datasets' => [ 'datasets' => [
[ [
'label' => 'Average (ms)', 'label' => __('general.average_ms'),
'data' => $results->map(fn ($item) => $item->upload_latency_iqm), 'data' => $results->map(fn ($item) => $item->upload_latency_iqm),
'borderColor' => 'rgba(16, 185, 129)', 'borderColor' => 'rgba(16, 185, 129)',
'backgroundColor' => 'rgba(16, 185, 129, 0.1)', 'backgroundColor' => 'rgba(16, 185, 129, 0.1)',
@@ -57,7 +62,7 @@ class RecentUploadLatencyChartWidget extends ChartWidget
'pointRadius' => count($results) <= 24 ? 3 : 0, 'pointRadius' => count($results) <= 24 ? 3 : 0,
], ],
[ [
'label' => 'High (ms)', 'label' => __('general.high_ms'),
'data' => $results->map(fn ($item) => $item->upload_latency_high), 'data' => $results->map(fn ($item) => $item->upload_latency_high),
'borderColor' => 'rgba(14, 165, 233)', 'borderColor' => 'rgba(14, 165, 233)',
'backgroundColor' => 'rgba(14, 165, 233, 0.1)', 'backgroundColor' => 'rgba(14, 165, 233, 0.1)',
@@ -68,7 +73,7 @@ class RecentUploadLatencyChartWidget extends ChartWidget
'pointRadius' => count($results) <= 24 ? 3 : 0, 'pointRadius' => count($results) <= 24 ? 3 : 0,
], ],
[ [
'label' => 'Low (ms)', 'label' => __('general.low_ms'),
'data' => $results->map(fn ($item) => $item->upload_latency_low), 'data' => $results->map(fn ($item) => $item->upload_latency_low),
'borderColor' => 'rgba(139, 92, 246)', 'borderColor' => 'rgba(139, 92, 246)',
'backgroundColor' => 'rgba(139, 92, 246, 0.1)', 'backgroundColor' => 'rgba(139, 92, 246, 0.1)',
+12 -12
View File
@@ -24,11 +24,11 @@ class StatsOverviewWidget extends BaseWidget
if (blank($this->result)) { if (blank($this->result)) {
return [ return [
Stat::make('Latest download', '-') Stat::make(__('dashboard.latest_download'), '-')
->icon('heroicon-o-arrow-down-tray'), ->icon('heroicon-o-arrow-down-tray'),
Stat::make('Latest upload', '-') Stat::make(__('dashboard.latest_upload'), '-')
->icon('heroicon-o-arrow-up-tray'), ->icon('heroicon-o-arrow-up-tray'),
Stat::make('Latest ping', '-') Stat::make(__('dashboard.latest_ping'), '-')
->icon('heroicon-o-clock'), ->icon('heroicon-o-clock'),
]; ];
} }
@@ -42,11 +42,11 @@ class StatsOverviewWidget extends BaseWidget
if (! $previous) { if (! $previous) {
return [ return [
Stat::make('Latest download', fn (): string => ! blank($this->result) ? Number::toBitRate(bits: $this->result->download_bits, precision: 2) : 'n/a') Stat::make(__('dashboard.latest_download'), fn (): string => ! blank($this->result) ? Number::toBitRate(bits: $this->result->download_bits, precision: 2) : 'n/a')
->icon('heroicon-o-arrow-down-tray'), ->icon('heroicon-o-arrow-down-tray'),
Stat::make('Latest upload', fn (): string => ! blank($this->result) ? Number::toBitRate(bits: $this->result->upload_bits, precision: 2) : 'n/a') Stat::make(__('dashboard.latest_upload'), fn (): string => ! blank($this->result) ? Number::toBitRate(bits: $this->result->upload_bits, precision: 2) : 'n/a')
->icon('heroicon-o-arrow-up-tray'), ->icon('heroicon-o-arrow-up-tray'),
Stat::make('Latest ping', fn (): string => ! blank($this->result) ? number_format($this->result->ping, 2).' ms' : 'n/a') Stat::make(__('dashboard.latest_ping'), fn (): string => ! blank($this->result) ? number_format($this->result->ping, 2).' ms' : 'n/a')
->icon('heroicon-o-clock'), ->icon('heroicon-o-clock'),
]; ];
} }
@@ -56,19 +56,19 @@ class StatsOverviewWidget extends BaseWidget
$pingChange = percentChange($this->result->ping, $previous->ping, 2); $pingChange = percentChange($this->result->ping, $previous->ping, 2);
return [ return [
Stat::make('Latest download', fn (): string => ! blank($this->result) ? Number::toBitRate(bits: $this->result->download_bits, precision: 2) : 'n/a') Stat::make(__('dashboard.latest_download'), fn (): string => ! blank($this->result) ? Number::toBitRate(bits: $this->result->download_bits, precision: 2) : 'n/a')
->icon('heroicon-o-arrow-down-tray') ->icon('heroicon-o-arrow-down-tray')
->description($downloadChange > 0 ? $downloadChange.'% faster' : abs($downloadChange).'% slower') ->description($downloadChange > 0 ? $downloadChange.'% '.__('general.faster') : abs($downloadChange).'% '.__('general.slower'))
->descriptionIcon($downloadChange > 0 ? 'heroicon-m-arrow-trending-up' : 'heroicon-m-arrow-trending-down') ->descriptionIcon($downloadChange > 0 ? 'heroicon-m-arrow-trending-up' : 'heroicon-m-arrow-trending-down')
->color($downloadChange > 0 ? 'success' : 'danger'), ->color($downloadChange > 0 ? 'success' : 'danger'),
Stat::make('Latest upload', fn (): string => ! blank($this->result) ? Number::toBitRate(bits: $this->result->upload_bits, precision: 2) : 'n/a') Stat::make(__('dashboard.latest_upload'), fn (): string => ! blank($this->result) ? Number::toBitRate(bits: $this->result->upload_bits, precision: 2) : 'n/a')
->icon('heroicon-o-arrow-up-tray') ->icon('heroicon-o-arrow-up-tray')
->description($uploadChange > 0 ? $uploadChange.'% faster' : abs($uploadChange).'% slower') ->description($uploadChange > 0 ? $uploadChange.'% '.__('general.faster') : abs($uploadChange).'% '.__('general.slower'))
->descriptionIcon($uploadChange > 0 ? 'heroicon-m-arrow-trending-up' : 'heroicon-m-arrow-trending-down') ->descriptionIcon($uploadChange > 0 ? 'heroicon-m-arrow-trending-up' : 'heroicon-m-arrow-trending-down')
->color($uploadChange > 0 ? 'success' : 'danger'), ->color($uploadChange > 0 ? 'success' : 'danger'),
Stat::make('Latest ping', fn (): string => ! blank($this->result) ? number_format($this->result->ping, 2).' ms' : 'n/a') Stat::make(__('dashboard.latest_ping'), fn (): string => ! blank($this->result) ? number_format($this->result->ping, 2).' ms' : 'n/a')
->icon('heroicon-o-clock') ->icon('heroicon-o-clock')
->description($pingChange > 0 ? $pingChange.'% slower' : abs($pingChange).'% faster') ->description($pingChange > 0 ? $pingChange.'% '.__('general.slower') : abs($pingChange).'% '.__('general.faster'))
->descriptionIcon($pingChange > 0 ? 'heroicon-m-arrow-trending-up' : 'heroicon-m-arrow-trending-down') ->descriptionIcon($pingChange > 0 ? 'heroicon-m-arrow-trending-up' : 'heroicon-m-arrow-trending-down')
->color($pingChange > 0 ? 'danger' : 'success'), ->color($pingChange > 0 ? 'danger' : 'success'),
]; ];
+4 -4
View File
@@ -58,8 +58,8 @@ class BulkWriteResults implements ShouldQueue
]); ]);
Notification::make() Notification::make()
->title('Failed to build write to Influxdb.') ->title(__('settings/data_integration.influxdb_bulk_write_failed'))
->body('Check the logs for more details.') ->body(__('settings/data_integration.influxdb_bulk_write_failed_body'))
->danger() ->danger()
->sendToDatabase($this->user); ->sendToDatabase($this->user);
@@ -74,8 +74,8 @@ class BulkWriteResults implements ShouldQueue
$writeApi->close(); $writeApi->close();
Notification::make() Notification::make()
->title('Finished bulk data load to Influxdb.') ->title(__('settings/data_integration.influxdb_bulk_write_success'))
->body('Data has been sent to InfluxDB, check if the data was received.') ->body(__('settings/data_integration.influxdb_bulk_write_success_body'))
->success() ->success()
->sendToDatabase($this->user); ->sendToDatabase($this->user);
} }
+4 -4
View File
@@ -46,8 +46,8 @@ class TestConnectionJob implements ShouldQueue
]); ]);
Notification::make() Notification::make()
->title('Influxdb test failed') ->title(__('settings/data_integration.influxdb_test_failed'))
->body('Check the logs for more details.') ->body(__('settings/data_integration.influxdb_test_failed_body'))
->danger() ->danger()
->sendToDatabase($this->user); ->sendToDatabase($this->user);
@@ -59,8 +59,8 @@ class TestConnectionJob implements ShouldQueue
$writeApi->close(); $writeApi->close();
Notification::make() Notification::make()
->title('Successfully sent test data to Influxdb') ->title(__('settings/data_integration.influxdb_test_success'))
->body('Test data has been sent to InfluxDB, check if the data was received.') ->body(__('settings/data_integration.influxdb_test_success_body'))
->success() ->success()
->sendToDatabase($this->user); ->sendToDatabase($this->user);
} }
+1 -1
View File
@@ -41,7 +41,7 @@ class TruncateResults implements ShouldQueue
} }
Notification::make() Notification::make()
->title('Results table truncated!') ->title(__('results.truncate_results_success'))
->success() ->success()
->sendToDatabase($this->user); ->sendToDatabase($this->user);
} }
@@ -26,7 +26,7 @@ class SendSpeedtestCompletedNotification
foreach (User::all() as $user) { foreach (User::all() as $user) {
Notification::make() Notification::make()
->title('Speedtest completed') ->title(__('results.speedtest_completed'))
->success() ->success()
->sendToDatabase($user); ->sendToDatabase($user);
} }
@@ -56,7 +56,7 @@ class SendSpeedtestThresholdNotification
foreach (User::all() as $user) { foreach (User::all() as $user) {
Notification::make() Notification::make()
->title('Download threshold breached!') ->title(__('results.download_threshold_breached'))
->body('Speedtest #'.$event->result->id.' breached the download threshold of '.$thresholdSettings->absolute_download.' Mbps at '.Number::toBitRate($event->result->download_bits).'.') ->body('Speedtest #'.$event->result->id.' breached the download threshold of '.$thresholdSettings->absolute_download.' Mbps at '.Number::toBitRate($event->result->download_bits).'.')
->warning() ->warning()
->sendToDatabase($user); ->sendToDatabase($user);
@@ -74,7 +74,7 @@ class SendSpeedtestThresholdNotification
foreach (User::all() as $user) { foreach (User::all() as $user) {
Notification::make() Notification::make()
->title('Upload threshold breached!') ->title(__('results.upload_threshold_breached'))
->body('Speedtest #'.$event->result->id.' breached the upload threshold of '.$thresholdSettings->absolute_upload.' Mbps at '.Number::toBitRate($event->result->upload_bits).'.') ->body('Speedtest #'.$event->result->id.' breached the upload threshold of '.$thresholdSettings->absolute_upload.' Mbps at '.Number::toBitRate($event->result->upload_bits).'.')
->warning() ->warning()
->sendToDatabase($user); ->sendToDatabase($user);
@@ -92,7 +92,7 @@ class SendSpeedtestThresholdNotification
foreach (User::all() as $user) { foreach (User::all() as $user) {
Notification::make() Notification::make()
->title('Ping threshold breached!') ->title(__('results.ping_threshold_breached'))
->body('Speedtest #'.$event->result->id.' breached the ping threshold of '.$thresholdSettings->absolute_ping.'ms at '.$event->result->ping.'ms.') ->body('Speedtest #'.$event->result->id.' breached the ping threshold of '.$thresholdSettings->absolute_ping.'ms at '.$event->result->ping.'ms.')
->warning() ->warning()
->sendToDatabase($user); ->sendToDatabase($user);
+9 -9
View File
@@ -23,7 +23,7 @@ class RunSpeedtestAction extends Component implements HasActions, HasForms
public function dashboardAction(): Action public function dashboardAction(): Action
{ {
return Action::make('home') return Action::make('home')
->label('Public Dashboard') ->label(__('results.public_dashboard'))
->icon('heroicon-o-chart-bar') ->icon('heroicon-o-chart-bar')
->iconPosition(IconPosition::Before) ->iconPosition(IconPosition::Before)
->color('gray') ->color('gray')
@@ -38,12 +38,12 @@ class RunSpeedtestAction extends Component implements HasActions, HasForms
return Action::make('speedtest') return Action::make('speedtest')
->schema([ ->schema([
Select::make('server_id') Select::make('server_id')
->label('Select Server') ->label(__('results.select_server'))
->helperText('Leave empty to run the speedtest without specifying a server. Blocked servers will be skipped.') ->helperText(__('results.select_server_helper'))
->options(function (): array { ->options(function (): array {
return array_filter([ return array_filter([
'Manual servers' => Ookla::getConfigServers(), __('results.manual_servers') => Ookla::getConfigServers(),
'Closest servers' => GetOoklaSpeedtestServers::run(), __('results.closest_servers') => GetOoklaSpeedtestServers::run(),
]); ]);
}) })
->searchable(), ->searchable(),
@@ -56,16 +56,16 @@ class RunSpeedtestAction extends Component implements HasActions, HasForms
); );
Notification::make() Notification::make()
->title('Speedtest started') ->title(__('results.speedtest_started'))
->success() ->success()
->send(); ->send();
}) })
->modalHeading('Run Speedtest') ->modalHeading(__('results.run_speedtest'))
->modalWidth('lg') ->modalWidth('lg')
->modalSubmitActionLabel('Start') ->modalSubmitActionLabel(__('results.start'))
->button() ->button()
->color('primary') ->color('primary')
->label('Speedtest') ->label(__('results.speedtest'))
->icon('heroicon-o-rocket-launch') ->icon('heroicon-o-rocket-launch')
->iconPosition(IconPosition::Before) ->iconPosition(IconPosition::Before)
->hidden(! Auth::check() && Auth::user()->is_admin) ->hidden(! Auth::check() && Auth::user()->is_admin)
@@ -57,25 +57,25 @@ class AdminPanelProvider extends PanelProvider
]) ])
->navigationGroups([ ->navigationGroups([
NavigationGroup::make() NavigationGroup::make()
->label('Settings'), ->label(__('general.settings')),
NavigationGroup::make() NavigationGroup::make()
->label('Links') ->label(__('general.links'))
->collapsible(false), ->collapsible(false),
]) ])
->navigationItems([ ->navigationItems([
NavigationItem::make('Documentation') NavigationItem::make(__('general.documentation'))
->url('https://docs.speedtest-tracker.dev/', shouldOpenInNewTab: true) ->url('https://docs.speedtest-tracker.dev/', shouldOpenInNewTab: true)
->icon('heroicon-o-book-open') ->icon('heroicon-o-book-open')
->group('Links'), ->group(__('general.links')),
NavigationItem::make('Donate') NavigationItem::make(__('general.donate'))
->url('https://github.com/sponsors/alexjustesen', shouldOpenInNewTab: true) ->url('https://github.com/sponsors/alexjustesen', shouldOpenInNewTab: true)
->icon('heroicon-o-banknotes') ->icon('heroicon-o-banknotes')
->group('Links'), ->group(__('general.links')),
NavigationItem::make(config('speedtest.build_version')) NavigationItem::make(config('speedtest.build_version'))
->url('https://github.com/alexjustesen/speedtest-tracker', shouldOpenInNewTab: true) ->url('https://github.com/alexjustesen/speedtest-tracker', shouldOpenInNewTab: true)
->icon('tabler-brand-github') ->icon('tabler-brand-github')
->badge(fn (): string => Repository::updateAvailable() ? 'Update Available!' : 'Up to Date') ->badge(fn (): string => Repository::updateAvailable() ? __('general.update_available') : __('general.up_to_date'))
->group('Links'), ->group(__('general.links')),
]); ]);
} }
} }
+1 -1
View File
@@ -17,7 +17,7 @@ class Cron implements ValidationRule
public function validate(string $attribute, mixed $value, Closure $fail): void public function validate(string $attribute, mixed $value, Closure $fail): void
{ {
if (! CronExpression::isValidExpression($value)) { if (! CronExpression::isValidExpression($value)) {
$fail('Cron expression is not valid'); $fail(__('errors.cron_invalid'));
} }
} }
} }
+11
View File
@@ -0,0 +1,11 @@
base_path: /lang
preserve_hierarchy: true
files:
# PHP language files - root level
- source: /en/*.php
translation: /%locale_with_underscore%/%original_file_name%
# PHP language files - settings subdirectory
- source: /en/settings/*.php
translation: /%locale_with_underscore%/settings/%original_file_name%
-20
View File
@@ -1,20 +0,0 @@
<?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' => 'Die eingegebenen Zugangsdaten stimmen nicht überein.',
'password' => 'Das eingegebene Passwort ist falsch.',
'throttle' => 'Zu viele Anmeldeversuche. Bitte warte :seconds Sekunden und versuche es erneut.',
];
-19
View File
@@ -1,19 +0,0 @@
<?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; Zurück',
'next' => 'Weiter &raquo;',
];
-23
View File
@@ -1,23 +0,0 @@
<?php
return [
/*
|--------------------------------------------------------------------------
| Password Reset Language Lines
|--------------------------------------------------------------------------
|
| The following language lines are the default lines which match reasons
| that are given by the password broker for a password update attempt
| has failed, such as for an invalid token or invalid new password.
|
*/
'reset' => 'Dein Passwort wurde erfolgreich zurückgesetzt!',
'sent' => 'Wir haben dir einen Link zum Zurücksetzen des Passworts per E-Mail geschickt!',
'password' => 'Das Passwort muss mindestens 6 Zeichen lang sein und mit der Bestätigung übereinstimmen.',
'throttled' => 'Bitte warte einen Moment, bevor du es erneut versuchst.',
'token' => 'Der Link zum Zurücksetzen des Passworts ist ungültig oder abgelaufen.',
'user' => 'Zu dieser E-Mail-Adresse existiert kein Benutzerkonto.',
];
-230
View File
@@ -1,230 +0,0 @@
<?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 muss akzeptiert werden.',
'accepted_if' => ':attribute muss akzeptiert werden, wenn :other :value ist.',
'active_url' => ':attribute muss eine gültige URL sein.',
'after' => ':attribute muss ein Datum nach :date sein.',
'after_or_equal' => ':attribute muss ein Datum nach oder am :date sein.',
'alpha' => ':attribute darf nur Buchstaben enthalten.',
'alpha_dash' => ':attribute darf nur Buchstaben, Zahlen, Binde- und Unterstriche enthalten.',
'alpha_num' => ':attribute darf nur Buchstaben und Zahlen enthalten.',
'array' => ':attribute muss eine Liste sein.',
'ascii' => ':attribute darf nur Standardzeichen enthalten.',
'before' => ':attribute muss ein Datum vor :date sein.',
'before_or_equal' => ':attribute muss ein Datum vor oder am :date sein.',
'between' => [
'array' => ':attribute muss zwischen :min und :max Einträge haben.',
'file' => ':attribute muss zwischen :min und :max Kilobytes groß sein.',
'numeric' => ':attribute muss zwischen :min und :max liegen.',
'string' => ':attribute muss zwischen :min und :max Zeichen lang sein.',
],
'boolean' => ':attribute muss wahr oder falsch sein.',
'can' => ':attribute enthält einen ungültigen Wert.',
'confirmed' => 'Die Eingabe bei :attribute stimmt nicht mit der Bestätigung überein.',
'current_password' => 'Das eingegebene Passwort ist falsch.',
'date' => ':attribute ist kein gültiges Datum.',
'date_equals' => ':attribute muss genau am :date liegen.',
'date_format' => ':attribute entspricht nicht dem erforderlichen Format (:format).',
'decimal' => ':attribute muss :decimal Nachkommastellen haben.',
'declined' => ':attribute muss abgelehnt werden.',
'declined_if' => ':attribute muss abgelehnt werden, wenn :other den Wert ":value" hat.',
'different' => ':attribute und :other müssen verschieden sein.',
'digits' => ':attribute muss :digits Ziffern lang sein.',
'digits_between' => ':attribute muss zwischen :min und :max Ziffern lang sein.',
'dimensions' => ':attribute hat falsche Bildmaße.',
'distinct' => ':attribute enthält doppelte Werte.',
'doesnt_end_with' => ':attribute darf nicht mit folgenden Werten enden: :values.',
'doesnt_start_with' => ':attribute darf nicht mit folgenden Werten beginnen: :values.',
'email' => ':attribute muss eine gültige E-Mail-Adresse sein.',
'ends_with' => ':attribute muss mit einem der folgenden Werte enden: :values.',
'enum' => 'Die gewählte Option bei :attribute ist ungültig.',
'exists' => ':attribute existiert bereits.',
'file' => ':attribute muss eine Datei sein.',
'filled' => ':attribute darf nicht leer sein.',
'gt' => [
'array' => ':attribute muss mehr als :value Einträge enthalten.',
'file' => ':attribute muss größer als :value Kilobytes sein.',
'numeric' => ':attribute muss größer als :value sein.',
'string' => ':attribute muss länger als :value Zeichen sein.',
],
'gte' => [
'array' => ':attribute muss mindestens :value Einträge enthalten.',
'file' => ':attribute muss mindestens :value Kilobytes groß sein.',
'numeric' => ':attribute muss mindestens :value betragen.',
'string' => ':attribute muss mindestens :value Zeichen lang sein.',
],
'image' => ':attribute muss ein Bild sein.',
'in' => ':attribute ist ungültig.',
'in_array' => ':attribute muss in :other enthalten sein.',
'integer' => ':attribute muss eine ganze Zahl sein.',
'ip' => ':attribute muss eine gültige IP-Adresse sein.',
'ipv4' => ':attribute muss eine gültige IPv4-Adresse sein.',
'ipv6' => ':attribute muss eine gültige IPv6-Adresse sein.',
'json' => ':attribute muss ein gültiges JSON sein.',
'lowercase' => ':attribute darf nur Kleinbuchstaben enthalten.',
'lt' => [
'array' => ':attribute darf maximal :value Einträge enthalten.',
'file' => ':attribute muss kleiner als :value Kilobytes sein.',
'numeric' => ':attribute muss kleiner als :value sein.',
'string' => ':attribute muss kürzer als :value Zeichen sein.',
],
'lte' => [
'array' => ':attribute darf maximal :value Einträge enthalten.',
'file' => ':attribute darf höchstens :value Kilobytes groß sein.',
'numeric' => ':attribute darf maximal :value betragen.',
'string' => ':attribute darf maximal :value Zeichen lang sein.',
],
'mac_address' => ':attribute muss eine gültige MAC-Adresse sein.',
'max' => [
'array' => ':attribute darf maximal :max Einträge enthalten.',
'file' => ':attribute darf höchstens :max Kilobytes groß sein.',
'numeric' => ':attribute darf maximal :max betragen.',
'string' => ':attribute darf maximal :max Zeichen lang sein.',
],
'max_digits' => ':attribute darf maximal :max Ziffern enthalten.',
'mimes' => ':attribute muss eine Datei vom Typ :values sein.',
'mimetypes' => ':attribute muss eine Datei im Format :values sein.',
'min' => [
'array' => ':attribute muss mindestens :min Einträge enthalten.',
'file' => ':attribute muss mindestens :min Kilobytes groß sein.',
'numeric' => ':attribute muss mindestens :min betragen.',
'string' => ':attribute muss mindestens :min Zeichen enthalten.',
],
'min_digits' => ':attribute muss mindestens :min Ziffern enthalten.',
'missing' => ':attribute darf nicht angegeben werden.',
'missing_if' => 'Das Feld :attribute muss fehlen, wenn :other „:value“ ist.',
'missing_unless' => 'Das Feld :attribute muss fehlen, außer :other ist :value.',
'missing_with' => 'Das Feld :attribute muss fehlen, wenn :values vorhanden ist.',
'missing_with_all' => 'Das Feld :attribute muss fehlen, wenn :values vorhanden sind.',
'multiple_of' => ':attribute muss ein Vielfaches von :value sein.',
'not_in' => 'Die Auswahl :attribute ist ungültig.',
'not_regex' => ':attribute hat ein ungültiges Format.',
'numeric' => ':attribute muss eine Zahl sein.',
'password' => [
'letters' => ':attribute muss mindestens einen Buchstaben enthalten.',
'mixed' => ':attribute muss mindestens einen Klein- und einen Großbuchstaben enthalten.',
'numbers' => ':attribute muss mindestens eine Zahl enthalten.',
'symbols' => ':attribute muss mindestens ein Sonderzeichen enthalten.',
'uncompromised' => 'Das :attribute wurde in einem Datenleck gefunden. Bitte wählen Sie ein anderes :attribute.',
],
'present' => ':attribute muss vorhanden sein.',
'prohibited' => ':attribute darf nicht angegeben werden.',
'prohibited_if' => ':attribute darf nicht angegeben werden, wenn :other ":value" ist.',
'prohibited_unless' => ':attribute darf nur angegeben werden, wenn :other den Wert ":values" hat.',
'prohibits' => ':attribute darf nicht gemeinsam mit :other angegeben werden.',
'regex' => ':attribute hat ein ungültiges Format.',
'required' => ':attribute ist ein Pflichtfeld.',
'required_array_keys' => ':attribute muss Einträge für folgende Werte enthalten: :values.',
'required_if' => ':attribute ist erforderlich, wenn :other ":value" ist.',
'required_if_accepted' => ':attribute ist erforderlich, wenn :other akzeptiert wird.',
'required_unless' => ':attribute ist erforderlich, außer wenn :other den Wert ":values" hat.',
'required_with' => ':attribute ist erforderlich, wenn :values vorhanden ist.',
'required_with_all' => ':attribute ist erforderlich, wenn alle Felder :values ausgefüllt sind.',
'required_without' => ':attribute ist erforderlich, wenn :values nicht vorhanden ist.',
'required_without_all' => ':attribute ist erforderlich, wenn keines der Felder :values ausgefüllt ist.',
'same' => ':attribute muss mit :other übereinstimmen.',
'size' => [
'array' => ':attribute muss genau :size Einträge enthalten.',
'file' => ':attribute muss :size Kilobytes groß sein.',
'numeric' => ':attribute muss genau :size betragen.',
'string' => ':attribute muss genau :size Zeichen lang sein.',
],
'starts_with' => ':attribute muss mit einem der folgenden Werte beginnen: :values.',
'string' => ':attribute muss ein Text sein.',
'timezone' => ':attribute muss eine gültige Zeitzone sein.',
'unique' => ':attribute wurde bereits verwendet.',
'uploaded' => ':attribute konnte nicht hochgeladen werden.',
'uppercase' => ':attribute darf nur Großbuchstaben enthalten.',
'url' => ':attribute muss eine gültige URL sein.',
'ulid' => ':attribute muss eine gültige ULID sein.',
'uuid' => ':attribute muss eine gültige UUID sein.',
/*
|--------------------------------------------------------------------------
| Custom Validation Language Lines
|--------------------------------------------------------------------------
|
| Here you may specify custom validation messages for attributes using the
| convention "attribute.rule" to name the lines. This makes it quick to
| specify a specific custom language line for a given attribute rule.
|
*/
'custom' => [
'attribute-name' => [
'rule-name' => 'custom-message',
],
],
/*
|--------------------------------------------------------------------------
| Custom Validation Attributes
|--------------------------------------------------------------------------
|
| The following language lines are used to swap our attribute placeholder
| with something more reader friendly such as "E-Mail Address" instead
| of "email". This simply helps us make our message more expressive.
|
*/
'attributes' => [
'address' => 'Adresse',
'age' => 'Alter',
'body' => 'Inhalt',
'cell' => 'Zelle',
'city' => 'Stadt',
'country' => 'Land',
'date' => 'Datum',
'day' => 'Tag',
'excerpt' => 'Zusammenfassung',
'first_name' => 'Vorname',
'gender' => 'Geschlecht',
'marital_status' => 'Familienstand',
'profession' => 'Beruf',
'nationality' => 'Nationalität',
'hour' => 'Stunde',
'last_name' => 'Nachname',
'message' => 'Nachricht',
'minute' => 'Minute',
'mobile' => 'Handynummer',
'month' => 'Monat',
'name' => 'Name',
'zipcode' => 'Postleitzahl',
'company_name' => 'Firmenname',
'neighborhood' => 'Stadtteil',
'number' => 'Nummer',
'password' => 'Passwort',
'phone' => 'Telefonnummer',
'second' => 'Sekunde',
'sex' => 'Geschlecht',
'state' => 'Bundesland',
'street' => 'Straße',
'subject' => 'Betreff',
'text' => 'Text',
'time' => 'Zeit',
'title' => 'Titel',
'username' => 'Benutzername',
'year' => 'Jahr',
'description' => 'Beschreibung',
'password_confirmation' => 'Passwort bestätigen',
'current_password' => 'Aktuelles Passwort',
'complement' => 'Zusatz',
'modality' => 'Modalität',
'category' => 'Kategorie',
'blood_type' => 'Blutgruppe',
'birth_date' => 'Geburtsdatum',
],
];
+30
View File
@@ -0,0 +1,30 @@
<?php
return [
'title' => 'API Tokens',
'label' => 'API Tokens',
// Token management
'api_token' => 'API token',
'api_tokens' => 'API tokens',
'create_api_token' => 'Create API token',
'your_token' => 'Your token',
'token_status' => 'Token status',
// Token lists
'active_tokens' => 'Active tokens',
'expired_tokens' => 'Expired tokens',
'all_tokens' => 'All tokens',
// Token properties
'expires_at' => 'Expires at',
'expires_at_helper_text' => 'Leave empty if you don\'t want an expiration date',
'last_used_at' => 'Last used at',
// Abilities/Permissions
'abilities' => 'Abilities',
'read_results' => 'Read results',
'read_results_description' => 'The token will have permission to read results and statistics.',
'run_speedtest_description' => 'The token will have permission to run speedtest.',
'list_servers_description' => 'The token will have permission to list servers.',
];
+3 -3
View File
@@ -13,8 +13,8 @@ return [
| |
*/ */
'failed' => '您輸入的帳號密碼與系統記錄不符。', 'failed' => 'These credentials do not match our records.',
'password' => '您輸入的密碼不正確。', 'password' => 'The provided password is incorrect.',
'throttle' => '登入嘗試次數太多,請於 :seconds 秒後再試。', 'throttle' => 'Too many login attempts. Please try again in :seconds seconds.',
]; ];
+14
View File
@@ -0,0 +1,14 @@
<?php
return [
'title' => 'Dashboard',
'no_speedtests_scheduled' => 'No speedtests scheduled.',
'next_speedtest_at' => 'Next speedtest at',
// Widgets
'recent_results' => 'Recent Results',
'statistics' => 'Statistics',
'latest_download' => 'Latest download',
'latest_upload' => 'Latest upload',
'latest_ping' => 'Latest ping',
];
+21
View File
@@ -0,0 +1,21 @@
<?php
return [
// Status enum values
'status' => [
'benchmarking' => 'Benchmarking',
'checking' => 'Checking',
'completed' => 'Completed',
'failed' => 'Failed',
'running' => 'Running',
'started' => 'Started',
'skipped' => 'Skipped',
'waiting' => 'Waiting',
],
// Service enum values
'service' => [
'faker' => 'Faker',
'ookla' => 'Ookla',
],
];
+23
View File
@@ -0,0 +1,23 @@
<?php
return [
'server_error' => 'Server Error',
'oops_server_error' => 'Oops, server error!',
'error_message' => 'Error message',
'error_fetching_servers' => 'Error fetching servers',
'servers_refreshed_successfully' => 'Servers refreshed successfully',
'copied_to_clipboard' => 'Copied to clipboard',
// Speedtest specific errors
'ookla_error' => 'An error occurred when listing speedtest servers, check the logs.',
'cron_invalid' => 'Invalid cron expression',
// Status fix command
'status_fix' => [
'confirm' => 'Do you wish to continue?',
'fail' => 'Command aborted.',
'finished' => '✅ done!',
'info_1' => 'This will check all results and fix the status to "completed" or "failed" based on the data.',
'info_2' => '📖 Read the documentation: https://docs.speedtest-tracker.dev/other/commands',
],
];
+106
View File
@@ -0,0 +1,106 @@
<?php
return [
// Common actions
'save' => 'Save',
'cancel' => 'Cancel',
'delete' => 'Delete',
'edit' => 'Edit',
'create' => 'Create',
'search' => 'Search',
'filter' => 'Filter',
'export' => 'Export',
'actions' => 'Actions',
'enable' => 'Enable',
'yes' => 'Yes',
'no' => 'No',
'options' => 'Options',
'details' => 'Details',
// Common labels
'name' => 'Name',
'email' => 'Email',
'email_address' => 'Email address',
'password' => 'Password',
'password_confirmation' => 'Password confirmation',
'id' => 'ID',
'status' => 'Status',
'message' => 'Message',
'comment' => 'Comment',
'comments' => 'Comments',
'created_at' => 'Created at',
'updated_at' => 'Updated at',
'url' => 'URL',
// Navigation
'dashboard' => 'Dashboard',
'results' => 'Results',
'settings' => 'Settings',
'users' => 'Users',
'documentation' => 'Documentation',
'links' => 'Links',
'donate' => 'Donate',
// Roles
'admin' => 'Admin',
'user' => 'User',
'role' => 'Role',
// Date ranges
'last_24h' => 'Last 24 hours',
'last_week' => 'Last week',
'last_month' => 'Last month',
// Metrics
'average' => 'Average',
'high' => 'High',
'low' => 'Low',
'faster' => 'faster',
'slower' => 'slower',
'healthy' => 'Healthy',
// Units
'ms' => 'ms',
'mbps' => 'Mbps',
// Speed test metrics
'download' => 'Download',
'upload' => 'Upload',
'ping' => 'Ping',
'jitter' => 'Jitter',
// Metric labels with units
'download_mbps' => 'Download (Mbps)',
'upload_mbps' => 'Upload (Mbps)',
'ping_ms' => 'Ping (ms)',
'download_ms' => 'Download (ms)',
'upload_ms' => 'Upload (ms)',
'average_ms' => 'Average (ms)',
'high_ms' => 'High (ms)',
'low_ms' => 'Low (ms)',
'ping_ms_label' => 'Ping (ms)',
// Latency
'download_latency' => 'Download latency',
'upload_latency' => 'Upload latency',
// Actions
'run_speedtest' => 'Run speedtest',
'list_servers' => 'List servers',
'export_current_results' => 'Export current results',
'test' => 'Test',
// Common
'token' => 'Token',
// Application
'speedtest_tracker' => 'Speedtest Tracker',
'platform' => 'Platform',
// Update status
'update_available' => 'Update available!',
'up_to_date' => 'Up to date',
// Notifications
'token_created' => 'Token Created',
];
+73
View File
@@ -0,0 +1,73 @@
<?php
return [
'title' => 'Results',
'result_overview' => 'Result overview',
// Metrics
'download_latency_high' => 'Download latency high',
'download_latency_low' => 'Download latency low',
'download_latency_iqm' => 'Download latency IQM',
'download_latency_jitter' => 'Download latency jitter',
'upload_latency_high' => 'Upload latency high',
'upload_latency_low' => 'Upload latency low',
'upload_latency_iqm' => 'Upload latency IQM',
'upload_latency_jitter' => 'Upload latency jitter',
'ping_details' => 'Ping details',
'ping_jitter' => 'Ping jitter',
'ping_high' => 'Ping high',
'ping_low' => 'Ping low',
'packet_loss' => 'Packet loss',
'iqm' => 'IQM',
// Server & metadata
'server_&_metadata' => 'Server & Metadata',
'server_id' => 'Server ID',
'server_host' => 'Server host',
'server_name' => 'Server name',
'server_location' => 'Server location',
'service' => 'Service',
'isp' => 'ISP',
'ip_address' => 'IP address',
'scheduled' => 'Scheduled',
// Filters
'only_healthy_speedtests' => 'Only healthy speedtests',
'only_unhealthy_speedtests' => 'Only unhealthy speedtests',
'only_manual_speedtests' => 'Only manual speedtests',
'only_scheduled_speedtests' => 'Only scheduled speedtests',
'created_from' => 'Created from',
'created_until' => 'Created until',
// Export
'export_all_results' => 'Export all results',
'export_all_results_description' => 'Will export every column for all results.',
'export_completed' => 'Export completed, :count :rows exported.',
'failed_export' => ':count :rows failed to export.',
'row' => '{1} :count row|[2,*] :count rows',
// Actions
'update_comments' => 'Update comments',
'truncate_results' => 'Truncate results',
'truncate_results_description' => 'Are you sure you want to truncate all results? This action is irreversible.',
'truncate_results_success' => 'Results table truncated!',
'view_on_speedtest_net' => 'View on Speedtest.net',
// Notifications
'speedtest_started' => 'Speedtest started',
'speedtest_completed' => 'Speedtest completed',
'download_threshold_breached' => 'Download threshold breached!',
'upload_threshold_breached' => 'Upload threshold breached!',
'ping_threshold_breached' => 'Ping threshold breached!',
// Run Speedtest Action
'speedtest' => 'Speedtest',
'public_dashboard' => 'Public Dashboard',
'select_server' => 'Select Server',
'select_server_helper' => 'Leave empty to run the speedtest without specifying a server. Blocked servers will be skipped.',
'manual_servers' => 'Manual servers',
'closest_servers' => 'Closest servers',
];
+13
View File
@@ -0,0 +1,13 @@
<?php
return [
'title' => 'Settings',
'label' => 'Settings',
// Common settings labels
'triggers' => 'Triggers',
'verify_ssl' => 'Verify SSL',
'username' => 'Username',
'username_placeholder' => 'Username for Basic Auth (optional)',
'password_placeholder' => 'Password for Basic Auth (optional)',
];
+39
View File
@@ -0,0 +1,39 @@
<?php
return [
'title' => 'Data Integration',
'label' => 'Data Integration',
// InfluxDB v2
'influxdb_v2' => 'InfluxDB v2',
'influxdb_v2_description' => 'When enabled, all new Speedtest results will also be sent to InfluxDB.',
'influxdb_v2_enabled' => 'Enable',
'influxdb_v2_url' => 'URL',
'influxdb_v2_url_placeholder' => 'http://your-influxdb-instance',
'influxdb_v2_org' => 'Org',
'influxdb_v2_bucket' => 'Bucket',
'influxdb_v2_bucket_placeholder' => 'speedtest-tracker',
'influxdb_v2_token' => 'Token',
'influxdb_v2_verify_ssl' => 'Verify SSL',
// Actions
'test_connection' => 'Test connection',
'starting_bulk_data_write_to_influxdb' => 'Starting bulk data write to InfluxDB',
'sending_test_data_to_influxdb' => 'Sending test data to InfluxDB',
// Test connection notifications
'influxdb_test_failed' => 'Influxdb test failed',
'influxdb_test_failed_body' => 'Check the logs for more details.',
'influxdb_test_success' => 'Successfully sent test data to Influxdb',
'influxdb_test_success_body' => 'Test data has been sent to InfluxDB, check if the data was received.',
// Bulk write notifications
'influxdb_bulk_write_failed' => 'Failed to build write to Influxdb.',
'influxdb_bulk_write_failed_body' => 'Check the logs for more details.',
'influxdb_bulk_write_success' => 'Finished bulk data load to Influxdb.',
'influxdb_bulk_write_success_body' => 'Data has been sent to InfluxDB, check if the data was received.',
// Common labels
'org' => 'Org',
'bucket' => 'Bucket',
];
+56
View File
@@ -0,0 +1,56 @@
<?php
return [
'title' => 'Notifications',
'label' => 'Notifications',
// Database notifications
'database' => 'Database',
'database_description' => 'Notifications sent to this channel will show up under the 🔔 icon in the header.',
'enable_database_notifications' => 'Enable database notifications',
'database_on_speedtest_run' => 'Notify on every speedtest run',
'database_on_threshold_failure' => 'Notify on threshold failures',
'test_database_channel' => 'Test database channel',
// Mail notifications
'mail' => 'Mail',
'enable_mail_notifications' => 'Enable mail notifications',
'recipients' => 'Recipients',
'mail_on_speedtest_run' => 'Notify on every speedtest run',
'mail_on_threshold_failure' => 'Notify on threshold failures',
'test_mail_channel' => 'Test mail channel',
// Webhook
'webhook' => 'Webhook',
'webhooks' => 'Webhooks',
'enable_webhook_notifications' => 'Enable webhook notifications',
'webhook_on_speedtest_run' => 'Notify on every speedtest run',
'webhook_on_threshold_failure' => 'Notify on threshold failures',
'test_webhook_channel' => 'Test webhook channel',
// Common notification messages
'notify_on_every_speedtest_run' => 'Notify on every speedtest run',
'notify_on_threshold_failures' => 'Notify on threshold failures',
// Test notification messages
'test_notifications' => [
'database' => [
'ping' => 'I say: ping',
'pong' => 'You say: pong',
'received' => 'Test database notification received!',
'sent' => 'Test database notification sent.',
],
'mail' => [
'add' => 'Add email recipients!',
'sent' => 'Test mail notification sent.',
],
'webhook' => [
'add' => 'Add webhook URLs!',
'sent' => 'Test webhook notification sent.',
'payload' => 'Testing webhook notification',
],
],
// Helper text
'threshold_helper_text' => 'Threshold notifications will be sent to the /fail route in the URL.',
];
+22
View File
@@ -0,0 +1,22 @@
<?php
return [
'title' => 'Thresholds',
'label' => 'Thresholds',
// Absolute thresholds
'absolute' => 'Absolute',
'absolute_description' => 'Absolute thresholds do not take into account previous history and could be triggered on each test.',
'absolute_enabled' => 'Enable absolute thresholds',
// Metrics section
'metrics' => 'Metrics',
'metrics_helper_text' => 'Set to zero to disable this metric.',
// General threshold labels
'thresholds' => 'Thresholds',
'threshold_enabled' => 'Threshold enabled',
'threshold_download' => 'Threshold download',
'threshold_upload' => 'Threshold upload',
'threshold_ping' => 'Threshold ping',
];
+6
View File
@@ -0,0 +1,6 @@
<?php
return [
// Ookla server list
'ookla_servers' => 'Ookla servers',
];
+15
View File
@@ -0,0 +1,15 @@
<?php
return [
'title' => 'Users',
'label' => 'Users',
// User prompts and messages
'user_change' => [
'info' => 'User role updated.',
'password_updated_info' => ':email password updated.',
'what_is_password' => 'What is the new password?',
'what_is_the_email_address' => 'What is the email address?',
'what_role' => 'What role should the user have?',
],
];
-20
View File
@@ -1,20 +0,0 @@
<?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' => 'Estas credenciales no coinciden con nuestros registros.',
'password' => 'La contraseña proporcionada es incorrecta.',
'throttle' => 'Demasiados intentos de acceso. Por favor, inténtelo de nuevo en :seconds segundos.',
];
-19
View File
@@ -1,19 +0,0 @@
<?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; Anterior',
'next' => 'Siguiente &raquo;',
];
-20
View File
@@ -1,20 +0,0 @@
<?php
return [
/*
|--------------------------------------------------------------------------
| Password Reset Language Lines
|--------------------------------------------------------------------------
|
| The following language lines are the default lines which match reasons
| that are given by the password broker for a password update attempt
| has failed, such as for an invalid token or invalid new password.
|
*/
'reset' => '¡Su contraseña ha sido restablecida!',
'sent' => '¡Hemos enviado por correo electrónico el enlace para restablecer su contraseña!',
'password' => 'La contraseña y la confirmación deben coincidir y contener al menos seis caracteres.',
];
-91
View File
@@ -1,91 +0,0 @@
<?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.
|
*/
/*
|--------------------------------------------------------------------------
| Custom Validation Language Lines
|--------------------------------------------------------------------------
|
| Here you may specify custom validation messages for attributes using the
| convention "attribute.rule" to name the lines. This makes it quick to
| specify a specific custom language line for a given attribute rule.
|
*/
'custom' => [
'attribute-name' => [
],
],
/*
|--------------------------------------------------------------------------
| Custom Validation Attributes
|--------------------------------------------------------------------------
|
| The following language lines are used to swap our attribute placeholder
| with something more reader friendly such as "E-Mail Address" instead
| of "email". This simply helps us make our message more expressive.
|
*/
'attributes' => [
'address' => 'dirección',
'age' => 'edad',
'body' => 'contenido',
'cell' => 'celular',
'city' => 'ciudad',
'country' => 'país',
'date' => 'fecha',
'day' => 'día',
'excerpt' => 'resumen',
'first_name' => 'nombre',
'gender' => 'género',
'marital_status' => 'estado civil',
'profession' => 'profesión',
'nationality' => 'nacionalidad',
'hour' => 'hora',
'last_name' => 'apellido',
'message' => 'mensaje',
'minute' => 'minuto',
'mobile' => 'móvil',
'month' => 'mes',
'name' => 'nombre',
'zipcode' => 'código postal',
'company_name' => 'nombre de la empresa',
'neighborhood' => 'vecindario',
'number' => 'número',
'password' => 'contraseña',
'phone' => 'teléfono',
'second' => 'segundo',
'sex' => 'sexo',
'state' => 'estado',
'street' => 'calle',
'subject' => 'asunto',
'text' => 'texto',
'time' => 'hora',
'title' => 'título',
'username' => 'usuario',
'year' => 'año',
'description' => 'descripción',
'password_confirmation' => 'confirmación de contraseña',
'current_password' => 'contraseña actual',
'complement' => 'complemento',
'modality' => 'modalidad',
'category' => 'categoría',
'blood_type' => 'tipo de sangre',
'birth_date' => 'fecha de nacimiento',
],
];
-20
View File
@@ -1,20 +0,0 @@
<?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' => 'Ces crédentials ne correspondent pas à nos archives.',
'password' => 'Le mot de passe fourni est incorrect.',
'throttle' => 'Trop de tentatives de connexion échouées. Veuillez réessayer dans :seconds secondes.',
];
-19
View File
@@ -1,19 +0,0 @@
<?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; Précédent',
'next' => 'Suivant &raquo;',
];
-23
View File
@@ -1,23 +0,0 @@
<?php
return [
/*
|--------------------------------------------------------------------------
| Password Reset Language Lines
|--------------------------------------------------------------------------
|
| The following language lines are the default lines which match reasons
| that are given by the password broker for a password update attempt
| has failed, such as for an invalid token or invalid new password.
|
*/
'reset' => 'Votre mot de passe a été réinitialisé!',
'sent' => 'Nous vous avons envoyé un email contenant votre lien de réinitialisation!',
'password' => 'Le mot de passe et le mot de passe de confirmation doivent contenir au moins 6 caractères.',
'throttled' => 'Veuillez attendre avant de réessayer.',
'token' => 'Le jeton de réinitialisation du mot de passe n\'est pas valide.',
'user' => 'Aucun email trouvé pour cette adresse.',
];
-230
View File
@@ -1,230 +0,0 @@
<?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' => 'Le champ :attribute doit être valide.',
'accepted_if' => 'Le champ :attribute doit être accepté lorsque :other est :value.',
'active_url' => 'Le champ :attribute doit être une URL valide.',
'after' => 'Le champ :attribute doit être une date postérieure à :date.',
'after_or_equal' => 'Le champ :attribute doit être une date postérieure ou égale à :date.',
'alpha' => 'Le champ :attribute ne doit contenir que des lettres.',
'alpha_dash' => 'Le champ :attribute ne doit contenir que des lettres, des chiffres, des tirets ou underscore.',
'alpha_num' => 'Le champ :attribute ne doit contenir que des lettres et des chiffres.',
'array' => 'Le champ :attribute doit être un tableau.',
'ascii' => 'Le champ :attribute ne doit contenir que des caractères alphanumériques ou des symboles ascii.',
'before' => 'Le champ :attribute doit être une date antérieure à :date.',
'before_or_equal' => 'Le champ :attribute doit être une date antérieure ou égale à :date.',
'between' => [
'array' => 'Le champ :attribute doit contenir entre :min et :max elements.',
'file' => 'Le champ :attribute doit être compris entre :min et :max kilo-octets.',
'numeric' => 'Le champ :attribute doit être comprise entre :min et :max.',
'string' => 'Le champ :attribute doit contenir entre :min et :max caractères.',
],
'boolean' => 'Le champ :attribute doit être vrai ou faux.',
'can' => 'Le champ :attribute contient une valeur non autorisée.',
'confirmed' => 'Le champ de confirmation :attribute ne correspond pas.',
'current_password' => 'Le mot de passe est incorrect.',
'date' => 'Le champ :attribute doit être une date valide.',
'date_equals' => 'Le champ :attribute doit être une date égale à :date.',
'date_format' => 'Le champ :attribute doit correspondre au format :format.',
'decimal' => 'Le champ :attribute doit avoir :decimal chiffres décimaux.',
'declined' => 'Le champ :attribute doit être refusé.',
'declined_if' => 'Le champ :attribute doit être rejeté lorsque :other est :value.',
'different' => 'Le champ :attribute et :other doivent être différents.',
'digits' => 'Le champ :attribute doit être composé de :digits chiffres.',
'digits_between' => 'Le champ :attribute doit être compris entre :min et :max.',
'dimensions' => 'Le champ :attribute taille de la photo non valide.',
'distinct' => 'Le champ :attribute a une valeur dupliquée.',
'doesnt_end_with' => 'Le champ :attribute ne doit pas se terminer par l\'un des éléments suivants: :values.',
'doesnt_start_with' => 'Le champ :attribute ne doit pas commencer par l\'un des éléments suivants: :values.',
'email' => 'Le champ :attribute doit être une adresse email valide.',
'ends_with' => 'Le champ :attribute doit se terminer par l\'un des éléments suivants: :values.',
'enum' => ':attribute séléctionné non valide.',
'exists' => ':attribute existe déjà.',
'file' => 'Le champ :attribute doit être un fichier.',
'filled' => 'Le champ :attribute doit contenir une valeur.',
'gt' => [
'array' => 'Le champ :attribute doit contenir plus de :value éléments.',
'file' => 'Le champ :attribute doit être supérieur à :value kilo-octets.',
'numeric' => 'Le champ :attribute doit être supérieur à :value.',
'string' => 'Le champ :attribute doit faire plus de :value caractères.',
],
'gte' => [
'array' => 'Le champ :attribute doit contenir au moins :value éléments.',
'file' => 'Le champ :attribute doit être supérieur ou égal à :value kilo-octets.',
'numeric' => 'Le champ :attribute doit être supérieur ou égal à :value.',
'string' => 'Le champ :attribute doit être supérieur ou égal à :value caractères.',
],
'image' => 'Le champ :attribute doit être une photo.',
'in' => ':attribute séléctionné non valide.',
'in_array' => 'Le champ :attribute doit être contenant dans :other.',
'integer' => 'Le champ :attribute doit être un nombre entier.',
'ip' => 'Le champ :attribute doit être une adresse IP valide.',
'ipv4' => 'Le champ :attribute doit être une adresse IPv4 valide.',
'ipv6' => 'Le champ :attribute doit être une adresse IPv6 valide.',
'json' => 'Le champ :attribute doit être une string JSON valide.',
'lowercase' => 'Le champ :attribute doit être en minuscule.',
'lt' => [
'array' => 'Le champ :attribute doit contenir moins de :value elements.',
'file' => 'Le champ :attribute doit être inférieur à :value kilo-octets.',
'numeric' => 'Le champ :attribute doit être inférieur à :value.',
'string' => 'Le champ :attribute doit faire moins de :value caractères.',
],
'lte' => [
'array' => 'Le champ :attribute ne doit pas comporter plus de :value éléments.',
'file' => 'Le champ :attribute doit être inférieur ou égal à :value kilo-octets.',
'numeric' => 'Le champ :attribute doit être inférieur ou égal à :value.',
'string' => 'Le champ :attribute doit être inférieur ou égal à :value caractères.',
],
'mac_address' => 'Le champ :attribute doit être une adresse MAC valide.',
'max' => [
'array' => 'Le champ :attribute ne doit pas comporter plus de :max éléments.',
'file' => 'Le champ :attribute ne doit pas être supérieur à :max kilo-octets.',
'numeric' => 'Le champ :attribute ne doit pas être supérieur à :max.',
'string' => 'Le champ :attribute non ne doit pas faire plus de :max caractères.',
],
'max_digits' => 'Le champ :attribute ne peut avoir plus de :max chiffres.',
'mimes' => 'Le champ :attribute doit être un fichier de type: :values.',
'mimetypes' => 'Le champ :attribute doit être un fichier de type: :values.',
'min' => [
'array' => 'Le champ :attribute doit contenir au moins :min éléments.',
'file' => 'Le champ :attribute doit être au minimum de :min kilo-octets.',
'numeric' => 'Le champ :attribute doit être au moins :min.',
'string' => 'Le champ :attribute deve contenir au moins :min caractères.',
],
'min_digits' => 'Le champ :attribute doit avoir au moins :min chiffres.',
'missing' => 'Le champ :attribute doit être manquant.',
'missing_if' => 'Le champ :attribute doit être absent lorsque :other est :value.',
'missing_unless' => 'Le champ :attribute doit être manquant, sauf si :other est :value.',
'missing_with' => 'Le champ :attribute doit être absent lorsque :values est présent.',
'missing_with_all' => 'Le champ :attribute doit être manquant lorsque :values sont présentes.',
'multiple_of' => 'Le champ :attribute doit être un multiple de :value.',
'not_in' => ':attribute séléctionné non valide.',
'not_regex' => 'Le format du champ :attribute est invalide.',
'numeric' => 'Le champ :attribute doit être numérique.',
'password' => [
'letters' => 'Le champ :attribute doit cotenir au moins une lettre.',
'mixed' => 'Le champ :attribute doit conteniur au moins un caractère minuscule et un caractère majuscule.',
'numbers' => 'Le champ :attribute doit contenir au moins un chiffre.',
'symbols' => 'Le champ :attribute doit contenir au moins un symbole spécial.',
'uncompromised' => 'L\':attribute est apparu dans une fuite de données. Veuillez choisir un autre :attribut.',
],
'present' => 'Le champ :attribute doit être présent.',
'prohibited' => 'Le champ :attribute est interdit.',
'prohibited_if' => 'Le champ :attribute est interdit quand :other est :value.',
'prohibited_unless' => 'Le champ :attribute est interdit à moins que :other ne figure dans :values.',
'prohibits' => 'Le champ :attribute interdit à :other d\'être présent.',
'regex' => 'Le format du champ :attribute est invalide.',
'required' => 'Le champ :attribute est obligatoire.',
'required_array_keys' => 'Le champ :attribute doit contenir des entrées pour: :values.',
'required_if' => 'Le champ :attribute est obligatoire quand :other est :value.',
'required_if_accepted' => 'Le champ :attribute est nécessaire lorsque :other est accepté.',
'required_unless' => 'Le champ :attribute est obligatoire, sauf si :other figure dans :values.',
'required_with' => 'Le champ :attribute est obligatoire lorsque :values est présent.',
'required_with_all' => 'Le champ :attribute est obligatoire lorsque :values est présent.',
'required_without' => 'Le champ :attribute est requis lorsque :values n\'est pas présent',
'required_without_all' => 'Le champ :attribute est nécessaire lorsqu\'aucune des valeurs :values n\'est présente.',
'same' => 'Le champ :attribute doit correspondre à :other.',
'size' => [
'array' => 'Le champ :attribute doit contenir des :size éléments.',
'file' => 'Le champ :attribute doit être :size kilo-octets.',
'numeric' => 'Le champ :attribute doit être :size.',
'string' => 'Le champ :attribute doit faire :size caractères.',
],
'starts_with' => 'Le champ :attribute doit commencer avec: :values.',
'string' => 'Le champ :attribute doit être une chaine de caractères.',
'timezone' => 'Le champ :attribute doit être un fuseau horaire valide.',
'unique' => 'Il :attribute doit être unqieu.',
'uploaded' => 'Il :attribute n\'a pas pu être téléchargé.',
'uppercase' => 'Le champ :attribute doit être en majuscule.',
'url' => 'Le champ :attribute doit être une URL valide.',
'ulid' => 'Le champ :attribute doit être un ULID valide.',
'uuid' => 'Le champ :attribute doit être un UUID valide.',
/*
|--------------------------------------------------------------------------
| Custom Validation Language Lines
|--------------------------------------------------------------------------
|
| Here you may specify custom validation messages for attributes using the
| convention "attribute.rule" to name the lines. This makes it quick to
| specify a specific custom language line for a given attribute rule.
|
*/
'custom' => [
'attribute-name' => [
'rule-name' => 'custom-message',
],
],
/*
|--------------------------------------------------------------------------
| Custom Validation Attributes
|--------------------------------------------------------------------------
|
| The following language lines are used to swap our attribute placeholder
| with something more reader friendly such as "E-Mail Address" instead
| of "email". This simply helps us make our message more expressive.
|
*/
'attributes' => [
'address' => 'adresse',
'age' => 'age',
'body' => 'contenu',
'cell' => 'cellule',
'city' => 'ville',
'country' => 'pays',
'date' => 'date',
'day' => 'jour',
'excerpt' => 'résumé',
'first_name' => 'prénom',
'gender' => 'sexe',
'marital_status' => 'situation familliale',
'profession' => 'profession',
'nationality' => 'nationalité',
'hour' => 'heure',
'last_name' => 'nom de famille',
'message' => 'message',
'minute' => 'minute',
'mobile' => 'mobile',
'month' => 'mois',
'name' => 'nom',
'zipcode' => 'code postal',
'company_name' => 'entreprise',
'neighborhood' => 'quartier',
'number' => 'numéro',
'password' => 'mot de passe',
'phone' => 'téléphone',
'second' => 'seconde',
'sex' => 'sexe',
'state' => 'région',
'street' => 'rue',
'subject' => 'sujet',
'text' => 'texte',
'time' => 'temps',
'title' => 'titre',
'username' => 'login',
'year' => 'année',
'description' => 'description',
'password_confirmation' => 'confirmation du mot de passe',
'current_password' => 'mot de passe actuel',
'complement' => 'complément',
'modality' => 'modalité',
'category' => 'catégorie',
'blood_type' => 'groupe sanguin',
'birth_date' => 'date de naissance',
],
];
-20
View File
@@ -1,20 +0,0 @@
<?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' => 'A megadott hitelesítési adatok nem egyeznek.',
'password' => 'A megadott jelszó hibás.',
'throttle' => 'Túl sok bejelentkezési kísérlet. Kérlek, várj :seconds másodpercet, mielőtt újra próbálkozol.',
];
-19
View File
@@ -1,19 +0,0 @@
<?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; Prethodno',
'next' => 'Sljedeće &raquo;',
];
-22
View File
@@ -1,22 +0,0 @@
<?php
return [
/*
|--------------------------------------------------------------------------
| Password Reset Language Lines
|--------------------------------------------------------------------------
|
| The following language lines are the default lines which match reasons
| that are given by the password broker for a password update attempt
| has failed, such as for an invalid token or invalid new password.
|
*/
'reset' => 'Tvoja lozinka je uspješno resetirana!',
'sent' => 'Poslali smo ti poveznicu za poništavanje lozinke putem e-pošte!',
'throttled' => 'Molimo pričekaj malo prije nego što pokušaš ponovno.',
'token' => 'Token za resetiranje lozinke je nevažeći ili je istekao.',
'user' => 'Ne postoji korisnik s tom e-mail adresom.',
];
-290
View File
@@ -1,290 +0,0 @@
<?php
return [
'Admin' => 'Admin',
'User' => 'Korisnik',
'abilities' => 'Sposobnosti',
'active_tokens' => 'Aktivni tokeni',
'all_tokens' => 'Svi tokeni',
'api_token' => 'API token',
'api_tokens' => 'API tokeni',
'average' => 'Prosjek',
'average_ms' => 'Prosjek (ms)',
'Benchmarking' => 'Benchmarking',
'bucket' => 'Kanta',
'Checking' => 'Provjera',
'comment' => 'Komentar',
'comments' => 'Komentari',
'Completed' => 'Završeno',
'create_api_token' => 'Kreiraj API token',
'created_at' => 'Kreirano',
'created_from' => 'Kreirano od',
'created_until' => 'Kreirano do',
'cron_invalid' => 'Nevažeći cron izraz',
'data_integration' => 'Integracija podataka',
'database' => 'Baza podataka',
'database_description' => 'Obavijesti poslane na ovaj kanal prikazuju se pod ikonom 🔔 u zaglavlju.',
'details' => 'Detalji',
'dashboard' => 'Nadzorna ploča',
'discord' => 'Discord',
'documentation' => 'Dokumentacija',
'donate' => 'Doniraj',
'download' => 'Preuzimanje',
'download_latency' => 'Kašnjenje preuzimanja',
'download_latency_high' => 'Visoko kašnjenje preuzimanja',
'download_latency_iqm' => 'IQM kašnjenje preuzimanja',
'download_latency_jitter' => 'Jitter kašnjenja preuzimanja',
'download_latency_low' => 'Nisko kašnjenje preuzimanja',
'download_mbps' => 'Preuzimanje (Mbps)',
'download_ms' => 'Preuzimanje (ms)',
'email' => 'Email',
'email_address' => 'Email adresa',
'enable' => 'Omogući',
'enable_database_notifications' => 'Omogući obavijesti baze podataka',
'enable_discord_webhook_notifications' => 'Omogući Discord webhook obavijesti',
'enable_mail_notifications' => 'Omogući email obavijesti',
'enable_pushover_webhook_notifications' => 'Omogući Pushover webhook obavijesti',
'enable_telegram' => 'Omogući Telegram obavijesti',
'enable_webhook_notifications' => 'Omogući webhook obavijesti',
'error_message' => 'Poruka o grešci',
'expired_tokens' => 'Istekli tokeni',
'expires_at' => 'Ističe',
'expires_at_helper_text' => 'Ostavite prazno ako ne želite datum isteka',
'export_all_results' => 'Izvezi sve rezultate',
'export_all_results_description' => 'Izvest će se svi stupci za sve rezultate.',
'export_completed' => 'Izvoz završen, :count :rows izvezeno.',
'export_current_results' => 'Izvezi trenutne rezultate',
'Failed' => 'Neuspjelo',
'failed_export' => ':count :rows nije uspjelo izvesti.',
'Faker' => 'faker',
'faster' => 'Brže',
'general_settings' => [
'label' => 'Opće postavke',
'description' => 'Ovdje se mogu postaviti opće postavke aplikacije.',
'app_settings' => 'Postavke aplikacije',
'speedtest_settings' => 'Postavke testa brzine',
'api_settings' => 'Api postavke',
'app_name' => 'Naziv aplikacije',
'asset_url' => 'URL resursa',
'app_timezone' => 'Vremenska zona aplikacije',
'chart_begin_at_zero' => 'Graf počinje od nule',
'chart_datetime_format' => 'Format datuma i vremena za graf',
'datetime_format' => 'Format datuma i vremena',
'display_timezone' => 'Prikazana vremenska zona',
'public_dashboard' => 'Javna nadzorna ploča',
'speedtest_skip_ips' => 'Speedtest preskočeni IP-ovi',
'speedtest_schedule' => 'Raspored speedtesta',
'speedtest_schedule_description' => 'Unesite valjane <a href="https://crontab.guru/" target="_blank" class="text-primary-600 underline">cron izraze</a>. Primjer: <code>* * * * *</code> pokreće se svake minute.',
'speedtest_servers' => 'Speedtest poslužitelji',
'speedtest_blocked_servers' => 'Blokirani speedtest poslužitelji',
'speedtest_interface' => 'Speedtest sučelje',
'speedtest_checkinternet_url' => 'Speedtest URL za provjeru interneta',
'threshold_enabled' => 'Prag omogućeno',
'threshold_download' => 'Prag preuzimanja',
'threshold_upload' => 'Prag slanja',
'threshold_ping' => 'Prag pinga',
'prune_results_older_than' => 'Izbriši rezultate starije od',
'api_rate_limit' => 'API ograničenje brzine',
],
'gotify' => 'Gotify',
'gotify_enabled' => 'Omogući Gotify webhook obavijesti',
'healthcheck_enabled' => 'Omogući healthcheck.io webhook obavijesti',
'healthcheck_io' => 'Healthcheck.io',
'healthy' => 'Zdravo',
'high' => 'Visoko',
'high_ms' => 'Visoko (ms)',
'id' => 'ID',
'infoluxdb' => 'InfluxDB v2',
'infoluxdb_description' => 'Ako je omogućeno, novi Speedtest rezultati će biti poslani u InfluxDB.',
'ip_address' => 'IP adresa',
'iqm' => 'IQM',
'isp' => 'ISP',
'jitter' => 'Jitter',
'last_24h' => 'Posljednjih 24 sata',
'last_month' => 'Prošli mjesec',
'last_used_at' => 'Zadnje korištenje',
'last_week' => 'Prošli tjedan',
'latest_download' => 'Zadnje preuzimanje',
'latest_ping' => 'Zadnji ping',
'latest_upload' => 'Zadnje slanje',
'links' => 'Linkovi',
'list_servers' => 'Popis servera',
'list_servers_description' => 'Token dobiva ovlaštenje za popis servera.',
'low' => 'Nisko',
'low_ms' => 'Nisko (ms)',
'mail' => 'E-mail',
'message' => 'Poruka',
'ms' => 'ms',
'name' => 'Ime',
'next_speedtest_at' => 'Sljedeći speedtest: ',
'no' => 'Ne',
'no_speedtests_scheduled' => 'Nema zakazanih speedtestova.',
'notifications' => [
'label' => 'Obavijesti',
'database' => [
'ping' => 'Kažem: ping',
'pong' => 'Ti kažeš: pong',
'received' => 'Primljena testna obavijest baze podataka!',
'sent' => 'Poslana testna obavijest baze podataka.',
],
'discord' => [
'add' => 'Dodaj Discord URL-ove!',
'sent' => 'Poslana testna Discord obavijest.',
'payload' => '👋 Testiramo Discord kanal za obavijesti.',
],
'health_check' => [
'add' => 'Dodaj HealthCheck.io URL-ove!',
'sent' => 'Poslana testna HealthCheck.io obavijest.',
'payload' => '👋 Testiramo HealthCheck.io kanal za obavijesti.',
],
'gotfy' => [
'add' => 'Dodaj Gotify URL-ove!',
'sent' => 'Poslana testna Gotify obavijest.',
'payload' => '👋 Testiramo Gotify kanal za obavijesti.',
],
'mail' => [
'add' => 'Dodaj email primatelje!',
'sent' => 'Poslana testna email obavijest.',
],
'ntfy' => [
'add' => 'Dodaj ntfy URL-ove!',
'sent' => 'Poslana testna ntfy obavijest.',
'payload' => '👋 Testiramo ntfy kanal za obavijesti.',
],
'pushover' => [
'add' => 'Dodaj Pushover URL-ove!',
'sent' => 'Poslana testna Pushover obavijest.',
'payload' => '👋 Testiramo Pushover kanal za obavijesti.',
],
'slack' => [
'add' => 'Dodaj Slack URL-ove!',
'sent' => 'Poslana testna Slack obavijest.',
'payload' => '👋 Testiramo Slack kanal za obavijesti.',
],
'telegram' => [
'add' => 'Dodaj Telegram primatelje!',
'sent' => 'Poslana testna Telegram obavijest.',
],
'webhook' => [
'add' => 'Dodaj webhook URL-ove!',
'sent' => 'Poslana testna webhook obavijest.',
'payload' => 'Testiranje webhook obavijesti',
],
],
'notify_on_every_speedtest_run' => 'Obavijesti za svaki speedtest',
'notify_on_threshold_failures' => 'Obavijesti kod prekoračenja praga',
'ntfy' => 'ntfy',
'ntfy_enabled' => 'Omogući ntfy webhook obavijesti',
'only_healthy_speedtests' => 'Samo zdravi speedtestovi',
'only_manual_speedtests' => 'Samo ručni speedtestovi',
'only_scheduled_speedtests' => 'Samo zakazani speedtestovi',
'only_unhealthy_speedtests' => 'Samo neispravni speedtestovi',
'Ookla' => 'Ookla',
'ookla_error' => 'Došlo je do greške pri listanju speedtest servera, provjerite logove.',
'options' => 'Opcije',
'org' => 'Organizacija',
'packet_loss' => 'Gubitak paketa',
'password' => 'Lozinka',
'password_confirmation' => 'Potvrda lozinke',
'password_placeholder' => 'Lozinka za Basic Auth (opcionalno)',
'ping' => 'Ping',
'ping_details' => 'Detalji pinga',
'ping_high' => 'Visoki ping',
'ping_jitter' => 'Ping jitter',
'ping_low' => 'Niski ping',
'ping_ms' => 'Ping (ms)',
'platform' => 'Platforma',
'pushover' => 'Pushover',
'pushover_webhooks' => 'Pushover webhookovi',
'read_results' => 'Čitanje rezultata',
'read_results_description' => 'Token dobiva ovlaštenje za čitanje rezultata i statistika.',
'recipients' => 'Primatelji',
'results' => 'Rezultati',
'result_overview' => 'Pregled rezultata',
'role' => 'Uloga',
'row' => '{1} :count red|[2,*] :count redova',
'run_speedtest' => 'Pokreni speedtest',
'run_speedtest_description' => 'Token dobiva ovlaštenje za pokretanje speedtesta.',
'running' => 'Pokreće se',
'scheduled' => 'Zakazano',
'sending_test_data_to_influxdb' => 'Slanje testnih podataka u InfluxDB',
'server_&_metadata' => 'Server & metapodaci',
'server_host' => 'Host servera',
'server_id' => 'ID servera',
'server_location' => 'Lokacija servera',
'server_name' => 'Ime servera',
'service' => 'Usluga',
'settings' => 'Postavke',
'Skipped' => 'Preskočeno',
'slack' => 'Slack',
'slack_enabled' => 'Omogući Slack webhook obavijesti',
'slower' => 'Sporije',
'speedtest_tracker' => 'speedtest-tracker',
'Started' => 'Pokrenuto',
'starting_bulk_data_write_to_influxdb' => 'Početak masovnog unosa podataka u InfluxDB',
'status' => 'Status',
'status_fix' => [
'confirm' => 'Želite li nastaviti?',
'fail' => 'Naredba prekinuta.',
'finished' => '✅ završeno!',
'info_1' => 'Provjerava sve rezultate i popravlja status na „završeno” ili „neuspjelo” na osnovu podataka.',
'info_2' => '📖 Pogledajte dokumentaciju: https://docs.speedtest-tracker.dev/other/commands',
],
'telegram' => 'Telegram',
'telegram_chat_id' => 'Telegram chat ID',
'telegram_disable_notification' => 'Šalji poruku tiho',
'test_connection' => 'Testiraj vezu',
'test_database_channel' => 'Testiraj kanal baze podataka',
'test_discord_webhook' => 'Testiraj Discord webhook',
'test_gotify_webhook' => 'Testiraj Gotify webhook',
'test_healthcheck_webhook' => 'Testiraj healthcheck.io webhook',
'test_mail_channel' => 'Testiraj email kanal',
'test_ntfy_webhook' => 'Testiraj ntfy webhook',
'test_pushover_webhook' => 'Testiraj Pushover webhook',
'test_slack_webhook' => 'Testiraj Slack webhook',
'test_telegram_channel' => 'Testiraj Telegram kanal',
'test_webhook_channel' => 'Testiraj webhook kanal',
'threshold_helper_text' => 'Obavijesti praga bit će poslane na /fail putanju u URL-u.',
'thresholds' => 'Pragovi',
'token' => 'Token',
'token_created' => 'Token kreiran',
'token_status' => 'Status tokena',
'topic' => 'Tema',
'triggers' => 'Okidači',
'truncate' => 'Obriši',
'truncate_results' => 'Obriši rezultate',
'truncate_results_description' => 'Jeste li sigurni da želite obrisati sve rezultate? Ovo se ne može poništiti.',
'update_comments' => 'Ažuriraj komentare',
'updated_at' => 'Ažurirano',
'update_available' => 'Dostupno ažuriranje!',
'upload' => 'Slanje',
'upload_latency' => 'Kašnjenje slanja',
'upload_latency_high' => 'Visoko kašnjenje slanja',
'upload_latency_jitter' => 'Jitter slanja',
'upload_ms' => 'Slanje (ms)',
'up_to_date' => 'Ažurirano',
'url' => 'URL',
'users' => 'Korisnici',
'user_change' => [
'info' => 'Uloga korisnika ažurirana.',
'password_updated_info' => 'Lozinka za :email ažurirana.',
'what_is_password' => 'Koja je nova lozinka?',
'what_is_the_email_address' => 'Koja je email adresa?',
'what_role' => 'Koja uloga treba biti korisniku?',
],
'user_key' => 'Korisnički ključ',
'username' => 'Korisničko ime',
'username_placeholder' => 'Korisničko ime za Basic Auth (opcionalno)',
'verify_ssl' => 'Provjeri SSL',
'view_on_speedtest_net' => 'Pogledaj na Speedtest.net',
'Waiting' => 'Čekanje',
'webhook' => 'Webhook',
'webhooks' => 'Webhookovi',
'yes' => 'Da',
'your_ntfy_server_url' => 'URL vašeg ntfy servera',
'your_ntfy_topic' => 'Vaša ntfy tema',
'your_pushover_api_token' => 'Vaš Pushover API token',
'your_pushover_user_key' => 'Vaš Pushover korisnički ključ',
'your_token' => 'Vaš token',
];
-230
View File
@@ -1,230 +0,0 @@
<?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' => 'Polje :attribute mora biti prihvaćeno.',
'accepted_if' => 'Polje :attribute mora biti prihvaćeno kada je :other jednako :value.',
'active_url' => 'Polje :attribute nije valjani URL.',
'after' => 'Polje :attribute mora biti datum nakon :date.',
'after_or_equal' => 'Polje :attribute mora biti datum jednak ili nakon :date.',
'alpha' => 'Polje :attribute može sadržavati samo slova.',
'alpha_dash' => 'Polje :attribute može sadržavati samo slova, brojeve, crtice i donje crte.',
'alpha_num' => 'Polje :attribute može sadržavati samo slova i brojeve.',
'array' => 'Polje :attribute mora biti niz.',
'ascii' => 'Polje :attribute može sadržavati samo ASCII znakove.',
'before' => 'Polje :attribute mora biti datum prije :date.',
'before_or_equal' => 'Polje :attribute mora biti datum jednak ili prije :date.',
'between' => [
'array' => 'Polje :attribute mora imati između :min i :max stavki.',
'file' => 'Polje :attribute mora biti između :min i :max kilobajta.',
'numeric' => 'Polje :attribute mora biti između :min i :max.',
'string' => 'Polje :attribute mora imati između :min i :max znakova.',
],
'boolean' => 'Polje :attribute mora biti istina ili laž.',
'can' => 'Polje :attribute sadrži nevažeću vrijednost.',
'confirmed' => 'Potvrda polja :attribute se ne podudara.',
'current_password' => 'Unesena lozinka nije točna.',
'date' => 'Polje :attribute nije valjani datum.',
'date_equals' => 'Polje :attribute mora biti datum jednak :date.',
'date_format' => 'Polje :attribute ne odgovara formatu :format.',
'decimal' => 'Polje :attribute mora imati :decimal decimalnih mjesta.',
'declined' => 'Polje :attribute mora biti odbijeno.',
'declined_if' => 'Polje :attribute mora biti odbijeno kada je :other jednako ":value".',
'different' => 'Polja :attribute i :other moraju biti različita.',
'digits' => 'Polje :attribute mora imati :digits znamenki.',
'digits_between' => 'Polje :attribute mora imati između :min i :max znamenki.',
'dimensions' => 'Polje :attribute ima nevažeće dimenzije slike.',
'distinct' => 'Polje :attribute ima dupliciranu vrijednost.',
'doesnt_end_with' => 'Polje :attribute ne smije završavati sa: :values.',
'doesnt_start_with' => 'Polje :attribute ne smije počinjati sa: :values.',
'email' => 'Polje :attribute mora biti valjana email adresa.',
'ends_with' => 'Polje :attribute mora završavati s jednom od sljedećih vrijednosti: :values.',
'enum' => 'Odabrano polje :attribute nije važeće.',
'exists' => 'Odabrano polje :attribute već postoji.',
'file' => 'Polje :attribute mora biti datoteka.',
'filled' => 'Polje :attribute mora imati vrijednost.',
'gt' => [
'array' => 'Polje :attribute mora imati više od :value stavki.',
'file' => 'Polje :attribute mora biti veće od :value kilobajta.',
'numeric' => 'Polje :attribute mora biti veće od :value.',
'string' => 'Polje :attribute mora biti dulje od :value znakova.',
],
'gte' => [
'array' => 'Polje :attribute mora imati najmanje :value stavki.',
'file' => 'Polje :attribute mora biti najmanje :value kilobajta.',
'numeric' => 'Polje :attribute mora biti najmanje :value.',
'string' => 'Polje :attribute mora imati najmanje :value znakova.',
],
'image' => 'Polje :attribute mora biti slika.',
'in' => 'Odabrano polje :attribute nije važeće.',
'in_array' => 'Polje :attribute ne postoji u :other.',
'integer' => 'Polje :attribute mora biti cijeli broj.',
'ip' => 'Polje :attribute mora biti valjana IP adresa.',
'ipv4' => 'Polje :attribute mora biti valjana IPv4 adresa.',
'ipv6' => 'Polje :attribute mora biti valjana IPv6 adresa.',
'json' => 'Polje :attribute mora biti valjani JSON.',
'lowercase' => 'Polje :attribute može sadržavati samo mala slova.',
'lt' => [
'array' => 'Polje :attribute mora imati manje od :value stavki.',
'file' => 'Polje :attribute mora biti manje od :value kilobajta.',
'numeric' => 'Polje :attribute mora biti manje od :value.',
'string' => 'Polje :attribute mora biti kraće od :value znakova.',
],
'lte' => [
'array' => 'Polje :attribute ne smije imati više od :value stavki.',
'file' => 'Polje :attribute ne smije biti veće od :value kilobajta.',
'numeric' => 'Polje :attribute ne smije biti veće od :value.',
'string' => 'Polje :attribute ne smije biti duže od :value znakova.',
],
'mac_address' => 'Polje :attribute mora biti valjana MAC adresa.',
'max' => [
'array' => 'Polje :attribute ne smije imati više od :max stavki.',
'file' => 'Polje :attribute ne smije biti veće od :max kilobajta.',
'numeric' => 'Polje :attribute ne smije biti veće od :max.',
'string' => 'Polje :attribute ne smije biti duže od :max znakova.',
],
'max_digits' => 'Polje :attribute ne smije imati više od :max znamenki.',
'mimes' => 'Polje :attribute mora biti datoteka tipa: :values.',
'mimetypes' => 'Polje :attribute mora biti datoteka tipa: :values.',
'min' => [
'array' => 'Polje :attribute mora imati najmanje :min stavki.',
'file' => 'Polje :attribute mora biti najmanje :min kilobajta.',
'numeric' => 'Polje :attribute mora biti najmanje :min.',
'string' => 'Polje :attribute mora imati najmanje :min znakova.',
],
'min_digits' => 'Polje :attribute mora imati najmanje :min znamenki.',
'missing' => 'Polje :attribute mora biti odsutno.',
'missing_if' => 'Polje :attribute mora biti odsutno kada je :other jednako ":value".',
'missing_unless' => 'Polje :attribute mora biti odsutno osim ako je :other jednako ":value".',
'missing_with' => 'Polje :attribute mora biti odsutno kada je prisutno :values.',
'missing_with_all' => 'Polje :attribute mora biti odsutno kada su prisutna sva polja :values.',
'multiple_of' => 'Polje :attribute mora biti višekratnik od :value.',
'not_in' => 'Odabrano polje :attribute nije važeće.',
'not_regex' => 'Format polja :attribute nije valjan.',
'numeric' => 'Polje :attribute mora biti broj.',
'password' => [
'letters' => 'Polje :attribute mora sadržavati barem jedno slovo.',
'mixed' => 'Polje :attribute mora sadržavati barem jedno veliko i jedno malo slovo.',
'numbers' => 'Polje :attribute mora sadržavati barem jedan broj.',
'symbols' => 'Polje :attribute mora sadržavati barem jedan simbol.',
'uncompromised' => 'Polje :attribute je kompromitirano u curenju podataka. Molimo odaberite drugo :attribute.',
],
'present' => 'Polje :attribute mora biti prisutno.',
'prohibited' => 'Polje :attribute je zabranjeno.',
'prohibited_if' => 'Polje :attribute je zabranjeno kada je :other jednako ":value".',
'prohibited_unless' => 'Polje :attribute je zabranjeno osim ako je :other jednako ":values".',
'prohibits' => 'Polje :attribute zabranjuje postojanje polja :other.',
'regex' => 'Format polja :attribute nije valjan.',
'required' => 'Polje :attribute je obavezno.',
'required_array_keys' => 'Polje :attribute mora sadržavati ključeve: :values.',
'required_if' => 'Polje :attribute je obavezno kada je :other jednako ":value".',
'required_if_accepted' => 'Polje :attribute je obavezno kada je :other prihvaćeno.',
'required_unless' => 'Polje :attribute je obavezno osim ako je :other jednako ":values".',
'required_with' => 'Polje :attribute je obavezno kada je prisutno :values.',
'required_with_all' => 'Polje :attribute je obavezno kada su prisutna sva polja :values.',
'required_without' => 'Polje :attribute je obavezno kada nije prisutno :values.',
'required_without_all' => 'Polje :attribute je obavezno kada nijedno od polja :values nije prisutno.',
'same' => 'Polja :attribute i :other se moraju podudarati.',
'size' => [
'array' => 'Polje :attribute mora sadržavati točno :size stavki.',
'file' => 'Polje :attribute mora biti veličine :size kilobajta.',
'numeric' => 'Polje :attribute mora biti :size.',
'string' => 'Polje :attribute mora imati :size znakova.',
],
'starts_with' => 'Polje :attribute mora početi s jednom od sljedećih vrijednosti: :values.',
'string' => 'Polje :attribute mora biti tekst.',
'timezone' => 'Polje :attribute mora biti važeća vremenska zona.',
'unique' => 'Polje :attribute već postoji.',
'uploaded' => 'Učitavanje polja :attribute nije uspjelo.',
'uppercase' => 'Polje :attribute može sadržavati samo velika slova.',
'url' => 'Polje :attribute mora biti valjani URL.',
'ulid' => 'Polje :attribute mora biti valjani ULID.',
'uuid' => 'Polje :attribute mora biti valjani UUID.',
/*
|--------------------------------------------------------------------------
| Custom Validation Language Lines
|--------------------------------------------------------------------------
|
| Here you may specify custom validation messages for attributes using the
| convention "attribute.rule" to name the lines. This makes it quick to
| specify a specific custom language line for a given attribute rule.
|
*/
'custom' => [
'attribute-name' => [
'rule-name' => 'custom-message',
],
],
/*
|--------------------------------------------------------------------------
| Custom Validation Attributes
|--------------------------------------------------------------------------
|
| The following language lines are used to swap our attribute placeholder
| with something more reader friendly such as "E-Mail Address" instead
| of "email". This simply helps us make our message more expressive.
|
*/
'attributes' => [
'address' => 'Adresa',
'age' => 'Dob',
'body' => 'Sadržaj',
'cell' => 'Mobitel',
'city' => 'Grad',
'country' => 'Država',
'date' => 'Datum',
'day' => 'Dan',
'excerpt' => 'Izvadak',
'first_name' => 'Ime',
'gender' => 'Spol',
'marital_status' => 'Bračni status',
'profession' => 'Zanimanje',
'nationality' => 'Nacionalnost',
'hour' => 'Sat',
'last_name' => 'Prezime',
'message' => 'Poruka',
'minute' => 'Minuta',
'mobile' => 'Broj mobitela',
'month' => 'Mjesec',
'name' => 'Ime',
'zipcode' => 'Poštanski broj',
'company_name' => 'Naziv tvrtke',
'neighborhood' => 'Kvart',
'number' => 'Broj',
'password' => 'Lozinka',
'phone' => 'Telefon',
'second' => 'Sekunda',
'sex' => 'Spol',
'state' => 'Županija / Pokrajina',
'street' => 'Ulica',
'subject' => 'Predmet',
'text' => 'Tekst',
'time' => 'Vrijeme',
'title' => 'Naslov',
'username' => 'Korisničko ime',
'year' => 'Godina',
'description' => 'Opis',
'password_confirmation' => 'Potvrda lozinke',
'current_password' => 'Trenutna lozinka',
'complement' => 'Dodatak',
'modality' => 'Mod',
'category' => 'Kategorija',
'blood_type' => 'Krvna grupa',
'birth_date' => 'Datum rođenja',
],
];
-20
View File
@@ -1,20 +0,0 @@
<?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' => 'A megadott hitelesítési adatok nem egyeznek.',
'password' => 'A megadott jelszó hibás.',
'throttle' => 'Túl sok bejelentkezési kísérlet. Kérlek, várj :seconds másodpercet, mielőtt újra próbálkozol.',
];
-19
View File
@@ -1,19 +0,0 @@
<?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; Előző',
'next' => 'Következő &raquo;',
];
-22
View File
@@ -1,22 +0,0 @@
<?php
return [
/*
|--------------------------------------------------------------------------
| Password Reset Language Lines
|--------------------------------------------------------------------------
|
| The following language lines are the default lines which match reasons
| that are given by the password broker for a password update attempt
| has failed, such as for an invalid token or invalid new password.
|
*/
'reset' => 'A jelszavadat sikeresen visszaállítottuk!',
'sent' => 'Elküldtük e-mailben a jelszó-visszaállítási linket!',
'throttled' => 'Kérlek, várj egy kicsit, mielőtt újra próbálkozol.',
'token' => 'A jelszó-visszaállító hivatkozás érvénytelen vagy lejárt.',
'user' => 'Ehhez az e-mail címhez nem található felhasználó.',
];
-289
View File
@@ -1,289 +0,0 @@
<?php
return [
'Admin' => 'Admin',
'User' => 'Felhasználó',
'abilities' => 'Képességek',
'active_tokens' => 'Aktív tokenek',
'all_tokens' => 'Összes token',
'api_token' => 'API token',
'api_tokens' => 'API tokenek',
'average' => 'Átlag',
'average_ms' => 'Átlag (ms)',
'Benchmarking' => 'Teljesítménymérés',
'bucket' => 'Vödör',
'Checking' => 'Ellenőrzés',
'comment' => 'Megjegyzés',
'comments' => 'Megjegyzések',
'Completed' => 'Befejezve',
'create_api_token' => 'API token létrehozása',
'created_at' => 'Létrehozva',
'created_from' => 'Létrehozva ettől',
'created_until' => 'Létrehozva eddig',
'cron_invalid' => 'Érvénytelen cron kifejezés',
'data_integration' => 'Adatintegráció',
'database' => 'Adatbázis',
'database_description' => 'Az erre a csatornára küldött értesítések a fejlécben lévő 🔔 ikon alatt jelennek meg.',
'details' => 'Részletek',
'dashboard' => 'Irányítópult',
'discord' => 'Discord',
'documentation' => 'Dokumentáció',
'donate' => 'Adományozás',
'download' => 'Letöltés',
'download_latency' => 'Letöltési késleltetés',
'download_latency_high' => 'Magas letöltési késleltetés',
'download_latency_iqm' => 'Letöltési késleltetés IQM',
'download_latency_jitter' => 'Letöltési késleltetés jitter',
'download_latency_low' => 'Alacsony letöltési késleltetés',
'download_mbps' => 'Letöltés (Mbps)',
'download_ms' => 'Letöltés (ms)',
'email' => 'Email',
'email_address' => 'Email cím',
'enable' => 'Engedélyezés',
'enable_database_notifications' => 'Adatbázis értesítések engedélyezése',
'enable_discord_webhook_notifications' => 'Discord webhook értesítések engedélyezése',
'enable_mail_notifications' => 'Email értesítések engedélyezése',
'enable_pushover_webhook_notifications' => 'Pushover webhook értesítések engedélyezése',
'enable_telegram' => 'Telegram értesítések engedélyezése',
'enable_webhook_notifications' => 'Webhook értesítések engedélyezése',
'error_message' => 'Hibaüzenet',
'expired_tokens' => 'Lejárt tokenek',
'expires_at' => 'Lejárat dátuma',
'expires_at_helper_text' => 'Hagyja üresen, ha nem akar lejárati dátumot',
'export_all_results' => 'Összes eredmény exportálása',
'export_all_results_description' => 'Minden oszlopot exportálni fog az összes eredményhez.',
'export_completed' => 'Az exportálás befejeződött, :count :rows exportálva.',
'export_current_results' => 'Jelenlegi eredmények exportálása',
'Failed' => 'Sikertelen',
'failed_export' => ':count :rows nem sikerült exportálni.',
'Faker' => 'faker',
'faster' => 'Gyorsabb',
'general_settings' => [
'label' => 'Általános beállítások',
'description' => 'Itt állíthatók be az alkalmazás általános beállításai.',
'app_settings' => 'Alkalmazás beállítások',
'speedtest_settings' => 'Sebességteszt beállítások',
'api_settings' => 'Api beállítások',
'app_name' => 'Alkalmazás neve',
'asset_url' => 'Eszköz URL',
'app_timezone' => 'Alkalmazás időzónája',
'chart_begin_at_zero' => 'Diagram kezdése nullánál',
'chart_datetime_format' => 'Diagram dátum-idő formátum',
'datetime_format' => 'Dátum-idő formátum',
'display_timezone' => 'Megjelenített időzóna',
'public_dashboard' => 'Nyilvános irányítópult',
'speedtest_skip_ips' => 'Speedtest kihagyott IP-k',
'speedtest_schedule' => 'Speedtest ütemezés',
'speedtest_schedule_description' => 'Adj meg érvényes <a href="https://crontab.guru/" target="_blank" class="text-primary-600 underline">cron kifejezéseket</a>. Példa: <code>* * * * *</code> minden percben lefut.',
'speedtest_servers' => 'Speedtest szerverek',
'speedtest_blocked_servers' => 'Speedtest blokkolt szerverek',
'speedtest_interface' => 'Speedtest interfész',
'speedtest_checkinternet_url' => 'Speedtest internet ellenőrző URL',
'threshold_enabled' => 'Küszöbérték engedélyezve',
'threshold_download' => 'Küszöbérték letöltés',
'threshold_upload' => 'Küszöbérték feltöltés',
'threshold_ping' => 'Küszöbérték ping',
'prune_results_older_than' => 'Eredmények törlése, ha régebbi mint',
'api_rate_limit' => 'API sebességkorlát',
],
'gotify' => 'Gotify',
'gotify_enabled' => 'Gotify webhook értesítések engedélyezése',
'healthcheck_enabled' => 'healthcheck.io webhook értesítések engedélyezése',
'healthcheck_io' => 'Healthcheck.io',
'healthy' => 'Egészséges',
'high' => 'Magas',
'high_ms' => 'Magas (ms)',
'id' => 'Azonosító',
'infoluxdb' => 'InfluxDB v2',
'infoluxdb_description' => 'Ha engedélyezve van, az új Speedtest eredmények el lesznek küldve az InfluxDB-be.',
'ip_address' => 'IP cím',
'iqm' => 'IQM',
'isp' => 'Szolgáltató',
'jitter' => 'Jitter',
'last_24h' => 'Elmúlt 24 óra',
'last_month' => 'Elmúlt hónap',
'last_used_at' => 'Utoljára használva',
'last_week' => 'Elmúlt hét',
'latest_download' => 'Legutóbbi letöltés',
'latest_ping' => 'Legutóbbi ping',
'latest_upload' => 'Legutóbbi feltöltés',
'links' => 'Hivatkozások',
'list_servers' => 'Szerverek listázása',
'list_servers_description' => 'A token jogosultságot kap a szerverek listázására.',
'low' => 'Alacsony',
'low_ms' => 'Alacsony (ms)',
'mail' => 'E-mail',
'message' => 'Üzenet',
'ms' => 'ms',
'name' => 'Név',
'next_speedtest_at' => 'Következő speedtest: ',
'no' => 'Nem',
'no_speedtests_scheduled' => 'Nincs ütemezett speedtest.',
'notifications' => [
'label' => 'Értesítések',
'database' => [
'ping' => 'Azt mondom: ping',
'pong' => 'Te mondod: pong',
'received' => 'Teszt adatbázis értesítés megérkezett!',
'sent' => 'Teszt adatbázis értesítés elküldve.',
],
'discord' => [
'add' => 'Adj hozzá Discord URL-eket!',
'sent' => 'Teszt Discord értesítés elküldve.',
'payload' => '👋 Teszteljük a Discord értesítési csatornát.',
],
'health_check' => [
'add' => 'Adj hozzá HealthCheck.io URL-eket!',
'sent' => 'Teszt HealthCheck.io értesítés elküldve.',
'payload' => '👋 Teszteljük a HealthCheck.io értesítési csatornát.',
],
'gotfy' => [
'add' => 'Adj hozzá Gotify URL-eket!',
'sent' => 'Teszt Gotify értesítés elküldve.',
'payload' => '👋 Teszteljük a Gotify értesítési csatornát.',
],
'mail' => [
'add' => 'Adj hozzá email címzetteket!',
'sent' => 'Teszt email értesítés elküldve.',
],
'ntfy' => [
'add' => 'Adj hozzá ntfy URL-eket!',
'sent' => 'Teszt ntfy értesítés elküldve.',
'payload' => '👋 Teszteljük az ntfy értesítési csatornát.',
],
'pushover' => [
'add' => 'Adj hozzá Pushover URL-eket!',
'sent' => 'Teszt Pushover értesítés elküldve.',
'payload' => '👋 Teszteljük a Pushover értesítési csatornát.',
],
'slack' => [
'add' => 'Adj hozzá Slack URL-eket!',
'sent' => 'Teszt Slack értesítés elküldve.',
'payload' => '👋 Teszteljük a Slack értesítési csatornát.',
],
'telegram' => [
'add' => 'Adj hozzá Telegram címzetteket!',
'sent' => 'Teszt Telegram értesítés elküldve.',
],
'webhook' => [
'add' => 'Adj hozzá webhook URL-eket!',
'sent' => 'Teszt webhook értesítés elküldve.',
'payload' => 'Webhook értesítés tesztelése',
],
],
'notify_on_every_speedtest_run' => 'Értesítés minden speedtest után',
'notify_on_threshold_failures' => 'Értesítés küszöbérték hibáknál',
'ntfy' => 'ntfy',
'ntfy_enabled' => 'ntfy webhook értesítések engedélyezése',
'only_healthy_speedtests' => 'Csak egészséges speedtestek',
'only_manual_speedtests' => 'Csak manuális speedtestek',
'only_scheduled_speedtests' => 'Csak ütemezett speedtestek',
'only_unhealthy_speedtests' => 'Csak hibás speedtestek',
'Ookla' => 'Ookla',
'ookla_error' => 'Hiba történt a speedtest szerverek listázása közben, nézd meg a naplókat.',
'options' => 'Beállítások',
'org' => 'Szervezet',
'packet_loss' => 'Csomagvesztés',
'password' => 'Jelszó',
'password_confirmation' => 'Jelszó megerősítése',
'password_placeholder' => 'Jelszó a Basic Auth-hoz (opcionális)',
'ping' => 'Ping',
'ping_details' => 'Ping részletek',
'ping_high' => 'Magas ping',
'ping_jitter' => 'Ping jitter',
'ping_low' => 'Alacsony ping',
'ping_ms' => 'Ping (ms)',
'platform' => 'Platform',
'pushover' => 'Pushover',
'pushover_webhooks' => 'Pushover webhookok',
'read_results' => 'Eredmények olvasása',
'read_results_description' => 'A token jogosultságot kap eredmények és statisztikák olvasására.',
'recipients' => 'Címzettek',
'results' => 'Eredmények',
'result_overview' => 'Eredmény áttekintés',
'role' => 'Szerepkör',
'row' => '{1} :count sor|[2,*] :count sor',
'run_speedtest' => 'Speedtest futtatása',
'run_speedtest_description' => 'A token jogosultságot kap speedtest futtatására.',
'Running' => 'Fut',
'scheduled' => 'Ütemezve',
'sending_test_data_to_influxdb' => 'Tesztadatok küldése az InfluxDB-be',
'server_&_metadata' => 'Szerver & Metaadatok',
'server_host' => 'Szerver hoszt',
'server_id' => 'Szerver azonosító',
'server_location' => 'Szerver helyszín',
'server_name' => 'Szerver neve',
'service' => 'Szolgáltatás',
'settings' => 'Beállítások',
'Skipped' => 'Kihagyva',
'slack' => 'Slack',
'slack_enabled' => 'Slack webhook értesítések engedélyezése',
'slower' => 'Lassabb',
'speedtest_tracker' => 'speedtest-tracker',
'Started' => 'Elindult',
'starting_bulk_data_write_to_influxdb' => 'Tömeges adatok írásának indítása az InfluxDB-be',
'status' => 'Állapot',
'status_fix' => [
'confirm' => 'Folytatod?',
'fail' => 'Parancs megszakítva.',
'finished' => '✅ kész!',
'info_1' => 'Minden eredményt ellenőriz és a státuszt kijavítja „befejezett” vagy „sikertelen” értékre az adatok alapján.',
'info_2' => '📖 Olvasd el a dokumentációt: https://docs.speedtest-tracker.dev/other/commands',
],
'telegram' => 'Telegram',
'telegram_chat_id' => 'Telegram chat ID',
'telegram_disable_notification' => 'Üzenet csendes küldése',
'test_connection' => 'Kapcsolat tesztelése',
'test_database_channel' => 'Adatbázis csatorna tesztelése',
'test_discord_webhook' => 'Discord webhook tesztelése',
'test_gotify_webhook' => 'Gotify webhook tesztelése',
'test_healthcheck_webhook' => 'healthcheck.io webhook tesztelése',
'test_mail_channel' => 'Email csatorna tesztelése',
'test_ntfy_webhook' => 'ntfy webhook tesztelése',
'test_pushover_webhook' => 'Pushover webhook tesztelése',
'test_slack_webhook' => 'Slack webhook tesztelése',
'test_telegram_channel' => 'Telegram csatorna tesztelése',
'test_webhook_channel' => 'Webhook csatorna tesztelése',
'threshold_helper_text' => 'A küszöbértesítések a /fail útvonalra lesznek küldve az URL-ben.',
'thresholds' => 'Küszöbértékek',
'token' => 'Token',
'token_created' => 'Token létrehozva',
'token_status' => 'Token állapot',
'topic' => 'Téma',
'triggers' => 'Triggerek',
'truncate' => 'Törlés',
'truncate_results' => 'Eredmények törlése',
'truncate_results_description' => 'Biztosan törölni szeretnéd az összes eredményt? Ez nem visszavonható.',
'update_comments' => 'Megjegyzések frissítése',
'updated_at' => 'Frissítve',
'update_available' => 'Frissítés elérhető!',
'upload' => 'Feltöltés',
'upload_latency' => 'Feltöltési késleltetés',
'upload_latency_high' => 'Magas feltöltési késleltetés',
'upload_latency_jitter' => 'Feltöltési jitter',
'upload_ms' => 'Feltöltés (ms)',
'up_to_date' => 'Naprakész',
'url' => 'URL',
'users' => 'Felhasználók',
'user_change' => [
'info' => 'Felhasználó szerepköre frissítve.',
'password_updated_info' => ':email jelszava frissítve.',
'what_is_password' => 'Mi az új jelszó?',
'what_is_the_email_address' => 'Mi az email cím?',
'what_role' => 'Milyen szerepköre legyen a felhasználónak?',
],
'user_key' => 'Felhasználói kulcs',
'username' => 'Felhasználónév',
'username_placeholder' => 'Felhasználónév a Basic Auth-hoz (opcionális)',
'verify_ssl' => 'SSL ellenőrzése',
'view_on_speedtest_net' => 'Megtekintés a Speedtest.net-en',
'Waiting' => 'Várakozás',
'webhook' => 'Webhook',
'webhooks' => 'Webhookok',
'yes' => 'Igen',
'your_ntfy_server_url' => 'Az ntfy szervered URL-je',
'your_ntfy_topic' => 'Az ntfy témád',
'your_pushover_api_token' => 'A Pushover API tokened',
'your_pushover_user_key' => 'A Pushover felhasználói kulcsod',
'your_token' => 'A tokened',
];
-230
View File
@@ -1,230 +0,0 @@
<?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' => 'A(z) :attribute el kell legyen fogadva.',
'accepted_if' => 'A(z) :attribute el kell legyen fogadva, ha :other értéke :value.',
'active_url' => 'A(z) :attribute nem érvényes URL.',
'after' => 'A(z) :attribute dátumának későbbinek kell lennie, mint :date.',
'after_or_equal' => 'A(z) :attribute dátumának legalább :date-nek kell lennie.',
'alpha' => 'A(z) :attribute csak betűket tartalmazhat.',
'alpha_dash' => 'A(z) :attribute csak betűket, számokat, kötőjeleket és aláhúzásjeleket tartalmazhat.',
'alpha_num' => 'A(z) :attribute csak betűket és számokat tartalmazhat.',
'array' => 'A(z) :attribute egy tömbnek kell lennie.',
'ascii' => 'A(z) :attribute csak ASCII karaktereket tartalmazhat.',
'before' => 'A(z) :attribute dátumának korábbinak kell lennie, mint :date.',
'before_or_equal' => 'A(z) :attribute dátumának legfeljebb :date-nek kell lennie.',
'between' => [
'array' => 'A(z) :attribute :min és :max elem között kell legyen.',
'file' => 'A(z) :attribute mérete :min és :max kilobájt között kell legyen.',
'numeric' => 'A(z) :attribute értékének :min és :max között kell lennie.',
'string' => 'A(z) :attribute :min és :max karakter között kell legyen.',
],
'boolean' => 'A(z) :attribute értéke igaz vagy hamis lehet.',
'can' => 'A(z) :attribute érvénytelen értéket tartalmaz.',
'confirmed' => 'A(z) :attribute megerősítése nem egyezik.',
'current_password' => 'A megadott jelszó helytelen.',
'date' => 'A(z) :attribute nem érvényes dátum.',
'date_equals' => 'A(z) :attribute pontosan :date kell legyen.',
'date_format' => 'A(z) :attribute nem felel meg a formátumnak: :format.',
'decimal' => 'A(z) :attribute :decimal tizedesjegyet kell tartalmazzon.',
'declined' => 'A(z) :attribute el kell legyen utasítva.',
'declined_if' => 'A(z) :attribute el kell legyen utasítva, ha :other értéke ":value".',
'different' => 'A(z) :attribute és :other nem lehet azonos.',
'digits' => 'A(z) :attribute :digits számjegyből kell álljon.',
'digits_between' => 'A(z) :attribute :min és :max számjegy közötti érték kell legyen.',
'dimensions' => 'A(z) :attribute érvénytelen képméretet tartalmaz.',
'distinct' => 'A(z) :attribute mező ismétlődő értéket tartalmaz.',
'doesnt_end_with' => 'A(z) :attribute nem végződhet a következőkkel: :values.',
'doesnt_start_with' => 'A(z) :attribute nem kezdődhet a következőkkel: :values.',
'email' => 'A(z) :attribute érvényes e-mail cím kell legyen.',
'ends_with' => 'A(z) :attribute a következő értékek egyikével kell végződjön: :values.',
'enum' => 'A kiválasztott :attribute érvénytelen.',
'exists' => 'A kiválasztott :attribute már létezik.',
'file' => 'A(z) :attribute fájlnak kell lennie.',
'filled' => 'A(z) :attribute mező nem lehet üres.',
'gt' => [
'array' => 'A(z) :attribute több mint :value elemet kell tartalmazzon.',
'file' => 'A(z) :attribute mérete nagyobb kell legyen, mint :value kilobájt.',
'numeric' => 'A(z) :attribute nagyobb kell legyen, mint :value.',
'string' => 'A(z) :attribute hosszabb kell legyen, mint :value karakter.',
],
'gte' => [
'array' => 'A(z) :attribute legalább :value elemet kell tartalmazzon.',
'file' => 'A(z) :attribute mérete legalább :value kilobájt kell legyen.',
'numeric' => 'A(z) :attribute legalább :value kell legyen.',
'string' => 'A(z) :attribute legalább :value karakter hosszú kell legyen.',
],
'image' => 'A(z) :attribute képnek kell lennie.',
'in' => 'A(z) :attribute értéke érvénytelen.',
'in_array' => 'A(z) :attribute nem található meg a(z) :other mezőben.',
'integer' => 'A(z) :attribute egész szám kell legyen.',
'ip' => 'A(z) :attribute érvényes IP-cím kell legyen.',
'ipv4' => 'A(z) :attribute érvényes IPv4-cím kell legyen.',
'ipv6' => 'A(z) :attribute érvényes IPv6-cím kell legyen.',
'json' => 'A(z) :attribute érvényes JSON kell legyen.',
'lowercase' => 'A(z) :attribute csak kisbetűket tartalmazhat.',
'lt' => [
'array' => 'A(z) :attribute legfeljebb :value elemet tartalmazhat.',
'file' => 'A(z) :attribute kisebb kell legyen, mint :value kilobájt.',
'numeric' => 'A(z) :attribute kisebb kell legyen, mint :value.',
'string' => 'A(z) :attribute rövidebb kell legyen, mint :value karakter.',
],
'lte' => [
'array' => 'A(z) :attribute nem tartalmazhat több, mint :value elemet.',
'file' => 'A(z) :attribute nem lehet nagyobb, mint :value kilobájt.',
'numeric' => 'A(z) :attribute nem lehet nagyobb, mint :value.',
'string' => 'A(z) :attribute nem lehet hosszabb, mint :value karakter.',
],
'mac_address' => 'A(z) :attribute érvényes MAC-cím kell legyen.',
'max' => [
'array' => 'A(z) :attribute legfeljebb :max elemet tartalmazhat.',
'file' => 'A(z) :attribute legfeljebb :max kilobájt lehet.',
'numeric' => 'A(z) :attribute nem lehet nagyobb, mint :max.',
'string' => 'A(z) :attribute nem lehet hosszabb, mint :max karakter.',
],
'max_digits' => 'A(z) :attribute legfeljebb :max számjegyet tartalmazhat.',
'mimes' => 'A(z) :attribute típusának a következők egyikének kell lennie: :values.',
'mimetypes' => 'A(z) :attribute formátuma a következők egyike kell legyen: :values.',
'min' => [
'array' => 'A(z) :attribute legalább :min elemet kell tartalmazzon.',
'file' => 'A(z) :attribute legalább :min kilobájt kell legyen.',
'numeric' => 'A(z) :attribute legalább :min kell legyen.',
'string' => 'A(z) :attribute legalább :min karakter hosszú kell legyen.',
],
'min_digits' => 'A(z) :attribute legalább :min számjegyet kell tartalmazzon.',
'missing' => 'A(z) :attribute nem szerepelhet.',
'missing_if' => 'A(z) :attribute nem lehet megadva, ha :other értéke ":value".',
'missing_unless' => 'A(z) :attribute nem lehet megadva, kivéve ha :other értéke ":value".',
'missing_with' => 'A(z) :attribute nem szerepelhet, ha :values meg van adva.',
'missing_with_all' => 'A(z) :attribute nem szerepelhet, ha a(z) :values mezők mind meg vannak adva.',
'multiple_of' => 'A(z) :attribute a(z) :value többszöröse kell legyen.',
'not_in' => 'A kiválasztott :attribute érvénytelen.',
'not_regex' => 'A(z) :attribute formátuma érvénytelen.',
'numeric' => 'A(z) :attribute szám kell legyen.',
'password' => [
'letters' => 'A(z) :attribute tartalmazzon legalább egy betűt.',
'mixed' => 'A(z) :attribute tartalmazzon legalább egy kis- és egy nagybetűt.',
'numbers' => 'A(z) :attribute tartalmazzon legalább egy számot.',
'symbols' => 'A(z) :attribute tartalmazzon legalább egy speciális karaktert.',
'uncompromised' => 'A(z) :attribute egy adatszivárgásban érintett. Kérjük, válasszon másik :attribute-t.',
],
'present' => 'A(z) :attribute mezőnek jelen kell lennie.',
'prohibited' => 'A(z) :attribute megadása nem engedélyezett.',
'prohibited_if' => 'A(z) :attribute nem adható meg, ha :other értéke ":value".',
'prohibited_unless' => 'A(z) :attribute csak akkor adható meg, ha :other értéke ":values".',
'prohibits' => 'A(z) :attribute kizárja a(z) :other megadását.',
'regex' => 'A(z) :attribute formátuma érvénytelen.',
'required' => 'A(z) :attribute mező kötelező.',
'required_array_keys' => 'A(z) :attribute mezőnek tartalmaznia kell a következő kulcsokat: :values.',
'required_if' => 'A(z) :attribute kötelező, ha :other értéke ":value".',
'required_if_accepted' => 'A(z) :attribute kötelező, ha :other el van fogadva.',
'required_unless' => 'A(z) :attribute kötelező, kivéve, ha :other értéke ":values".',
'required_with' => 'A(z) :attribute kötelező, ha :values meg van adva.',
'required_with_all' => 'A(z) :attribute kötelező, ha minden :values mező ki van töltve.',
'required_without' => 'A(z) :attribute kötelező, ha :values nincs megadva.',
'required_without_all' => 'A(z) :attribute kötelező, ha egyik :values mező sincs megadva.',
'same' => 'A(z) :attribute és :other mezőknek egyezniük kell.',
'size' => [
'array' => 'A(z) :attribute pontosan :size elemet kell tartalmazzon.',
'file' => 'A(z) :attribute mérete :size kilobájt kell legyen.',
'numeric' => 'A(z) :attribute értéke pontosan :size kell legyen.',
'string' => 'A(z) :attribute pontosan :size karakter hosszú kell legyen.',
],
'starts_with' => 'A(z) :attribute a következők egyikével kell kezdődjön: :values.',
'string' => 'A(z) :attribute szöveg kell legyen.',
'timezone' => 'A(z) :attribute érvényes időzóna kell legyen.',
'unique' => 'A(z) :attribute már foglalt.',
'uploaded' => 'A(z) :attribute feltöltése sikertelen volt.',
'uppercase' => 'A(z) :attribute csak nagybetűket tartalmazhat.',
'url' => 'A(z) :attribute érvényes URL kell legyen.',
'ulid' => 'A(z) :attribute érvényes ULID kell legyen.',
'uuid' => 'A(z) :attribute érvényes UUID kell legyen.',
/*
|--------------------------------------------------------------------------
| Custom Validation Language Lines
|--------------------------------------------------------------------------
|
| Here you may specify custom validation messages for attributes using the
| convention "attribute.rule" to name the lines. This makes it quick to
| specify a specific custom language line for a given attribute rule.
|
*/
'custom' => [
'attribute-name' => [
'rule-name' => 'custom-message',
],
],
/*
|--------------------------------------------------------------------------
| Custom Validation Attributes
|--------------------------------------------------------------------------
|
| The following language lines are used to swap our attribute placeholder
| with something more reader friendly such as "E-Mail Address" instead
| of "email". This simply helps us make our message more expressive.
|
*/
'attributes' => [
'address' => 'Cím',
'age' => 'Életkor',
'body' => 'Tartalom',
'cell' => 'Mobil',
'city' => 'Város',
'country' => 'Ország',
'date' => 'Dátum',
'day' => 'Nap',
'excerpt' => 'Kivonat',
'first_name' => 'Keresztnév',
'gender' => 'Nem',
'marital_status' => 'Családi állapot',
'profession' => 'Foglalkozás',
'nationality' => 'Állampolgárság',
'hour' => 'Óra',
'last_name' => 'Vezetéknév',
'message' => 'Üzenet',
'minute' => 'Perc',
'mobile' => 'Mobiltelefonszám',
'month' => 'Hónap',
'name' => 'Név',
'zipcode' => 'Irányítószám',
'company_name' => 'Cégnév',
'neighborhood' => 'Környék',
'number' => 'Szám',
'password' => 'Jelszó',
'phone' => 'Telefonszám',
'second' => 'Másodperc',
'sex' => 'Nem',
'state' => 'Megye / Tartomány',
'street' => 'Utca',
'subject' => 'Tárgy',
'text' => 'Szöveg',
'time' => 'Idő',
'title' => 'Cím',
'username' => 'Felhasználónév',
'year' => 'Év',
'description' => 'Leírás',
'password_confirmation' => 'Jelszó megerősítése',
'current_password' => 'Jelenlegi jelszó',
'complement' => 'Kiegészítés',
'modality' => 'Mód',
'category' => 'Kategória',
'blood_type' => 'Vércsoport',
'birth_date' => 'Születési dátum',
],
];
-20
View File
@@ -1,20 +0,0 @@
<?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' => 'Queste credenziali non corrispondono ai nostri archivi.',
'password' => 'La password fornita non è corretta.',
'throttle' => 'Troppi tentativi di accesso. Riprova tra :seconds secondi.',
];
-19
View File
@@ -1,19 +0,0 @@
<?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; Precedente',
'next' => 'Successivo &raquo;',
];
-23
View File
@@ -1,23 +0,0 @@
<?php
return [
/*
|--------------------------------------------------------------------------
| Password Reset Language Lines
|--------------------------------------------------------------------------
|
| The following language lines are the default lines which match reasons
| that are given by the password broker for a password update attempt
| has failed, such as for an invalid token or invalid new password.
|
*/
'reset' => 'La tua password è stata reimpostata!',
'sent' => 'Ti abbiamo inviato via email il link per reimpostare la password!',
'password' => 'La password e la conferma devono corrispondere e contenere almeno sei caratteri.',
'throttled' => 'Per favore attendi prima di riprovare.',
'token' => 'Questo token di reimpostazione della password non è valido.',
'user' => "Non riusciamo a trovare un utente con quell'indirizzo email.",
];
-230
View File
@@ -1,230 +0,0 @@
<?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' => 'Il campo :attribute deve essere accettato.',
'accepted_if' => 'Il campo :attribute deve essere accettato quando :other è :value.',
'active_url' => 'Il campo :attribute deve essere un URL valido.',
'after' => 'Il campo :attribute deve essere una data successiva a :date.',
'after_or_equal' => 'Il campo :attribute deve essere una data successiva o uguale a :date.',
'alpha' => 'Il campo :attribute deve contenere solo lettere.',
'alpha_dash' => 'Il campo :attribute deve contenere solo lettere, numeri, trattini e trattini bassi.',
'alpha_num' => 'Il campo :attribute deve contenere solo lettere e numeri.',
'array' => 'Il campo :attribute deve essere un array.',
'ascii' => 'Il campo :attribute deve contenere solo caratteri alfanumerici e simboli a un byte.',
'before' => 'Il campo :attribute deve essere una data antecedente a :date.',
'before_or_equal' => 'Il campo :attribute deve essere una data precedente o uguale a :date.',
'between' => [
'array' => 'Il campo :attribute deve contenere tra :min e :max elementi.',
'file' => 'Il campo :attribute deve essere compreso tra :min e :max kilobyte.',
'numeric' => 'Il campo :attribute deve essere compreso tra :min e :max.',
'string' => 'Il campo :attribute deve contenere tra :min e :max caratteri.',
],
'boolean' => 'Il campo :attribute deve essere vero o falso.',
'can' => 'Il campo :attribute contiene un valore non autorizzato.',
'confirmed' => 'La conferma del campo :attribute non corrisponde.',
'current_password' => 'La password non è corretta.',
'date' => 'Il campo :attribute deve essere una data valida.',
'date_equals' => 'Il campo :attribute deve essere una data uguale a :date.',
'date_format' => 'Il campo :attribute deve corrispondere al formato :format.',
'decimal' => 'Il campo :attribute deve avere :decimal cifre decimali.',
'declined' => 'Il campo :attribute deve essere rifiutato.',
'declined_if' => 'Il campo :attribute deve essere rifiutato quando :other è :value.',
'different' => 'Il campo :attribute e :other devono essere diversi.',
'digits' => 'Il campo :attribute deve essere composto da :digits cifre.',
'digits_between' => 'Il campo :attribute deve essere compreso tra :min e :max cifre.',
'dimensions' => 'Il campo :attribute presenta dimensioni della foto non valide.',
'distinct' => 'Il campo :attribute ha un valore duplicato.',
'doesnt_end_with' => 'Il campo :attribute non deve terminare con uno dei seguenti: :values.',
'doesnt_start_with' => 'Il campo :attribute non deve iniziare con uno dei seguenti: :values.',
'email' => 'Il campo :attribute deve essere un indirizzo email valido.',
'ends_with' => 'Il campo :attribute deve terminare con uno dei seguenti: :values.',
'enum' => 'Il :attribute selezionato non valido.',
'exists' => 'Il :attribute selezionato non valido.',
'file' => 'Il campo :attribute deve essere un file.',
'filled' => 'Il campo :attribute deve avere un valore.',
'gt' => [
'array' => 'Il campo :attribute deve contenere più di :value elementi.',
'file' => 'Il campo :attribute deve essere maggiore di :value kilobyte.',
'numeric' => 'Il campo :attribute deve essere maggiore di :value.',
'string' => 'Il campo :attribute deve essere maggiore di :value caratteri.',
],
'gte' => [
'array' => 'Il campo :attribute deve contenere almeno :value elementi.',
'file' => 'Il campo :attribute deve essere maggiore o uguale a :value kilobyte.',
'numeric' => 'Il campo :attribute deve essere maggiore o uguale a :value.',
'string' => 'Il campo :attribute deve essere maggiore o uguale a :value caratteri.',
],
'image' => 'Il campo :attribute deve essere una foto.',
'in' => 'Il :attribute selezionato non è valido.',
'in_array' => 'Il campo :attribute deve esistere in :other.',
'integer' => 'Il campo :attribute deve essere un numero intero.',
'ip' => 'Il campo :attribute deve essere un indirizzo IP valido.',
'ipv4' => 'Il campo :attribute deve essere un indirizzo IPv4 valido.',
'ipv6' => 'Il campo :attribute deve essere un indirizzo IPv6 valido.',
'json' => 'Il campo :attribute deve essere una stringa JSON valida.',
'lowercase' => 'Il campo :attribute deve essere in minuscolo.',
'lt' => [
'array' => 'Il campo :attribute deve contenere meno di :value elementi.',
'file' => 'Il campo :attribute deve essere meno di :value kilobyte.',
'numeric' => 'Il campo :attribute deve essere minore di :value.',
'string' => 'Il campo :attribute deve essere minore di :value caratteri.',
],
'lte' => [
'array' => 'Il campo :attribute non deve avere più di :value elementi.',
'file' => 'Il campo :attribute deve essere minore di o uguale a :value kilobyte.',
'numeric' => 'Il campo :attribute deve essere minore di o uguale a :value.',
'string' => 'Il campo :attribute deve essere minore di o uguale a :value caratteri.',
],
'mac_address' => 'Il campo :attribute deve essere un indirizzo MAC valido.',
'max' => [
'array' => 'Il campo :attribute non deve avere più di :max elementi.',
'file' => 'Il campo :attribute non deve essere maggiore di :max kilobyte.',
'numeric' => 'Il campo :attribute non deve essere maggiore di :max.',
'string' => 'Il campo :attribute non deve essere maggiore di :max caratteri.',
],
'max_digits' => 'Il campo :attribute non deve avere più di :max cifre.',
'mimes' => 'Il campo :attribute deve essere un file di tipo: :values.',
'mimetypes' => 'Il campo :attribute deve essere un file di tipo: :values.',
'min' => [
'array' => 'Il campo :attribute deve avere almeno :min elementi.',
'file' => 'Il campo :attribute deve essere almeno :min kilobyte.',
'numeric' => 'Il campo :attribute deve essere almeno :min.',
'string' => 'Il campo :attribute deve essere almeno :min caratteri.',
],
'min_digits' => 'Il campo :attribute deve avere almeno :min cifre.',
'missing' => 'Il campo :attribute deve essere mancante.',
'missing_if' => 'Il campo :attribute deve essere mancante quando :other è :value.',
'missing_unless' => 'Il campo :attribute deve essere mancante a meno che :other sia :value.',
'missing_with' => 'Il campo :attribute deve essere mancante quando :values è presente.',
'missing_with_all' => 'Il campo :attribute deve essere mancante quando :values sono presenti.',
'multiple_of' => 'Il campo :attribute deve essere un multiplo di :value.',
'not_in' => 'Il :attribute selezionato non è valido.',
'not_regex' => 'Il formato del campo :attribute non è valido.',
'numeric' => 'Il campo :attribute deve essere un numero.',
'password' => [
'letters' => 'Il campo :attribute deve contenere almeno una lettera.',
'mixed' => 'Il campo :attribute deve contenere almeno un carattere minuscolo e un carattere maiuscolo.',
'numbers' => 'Il campo :attribute deve contenere almeno un numero.',
'symbols' => 'Il campo :attribute deve contenere almeno un simbolo speciale.',
'uncompromised' => 'Il :attribute dato è apparso in un data leak. Per favore scegliere un :attribute differente.',
],
'present' => 'Il campo :attribute deve essere presente.',
'prohibited' => 'Il campo :attribute è proibito.',
'prohibited_if' => 'Il campo :attribute è proibito quando :other è :value.',
'prohibited_unless' => 'Il campo :attribute è proibito a meno che :other sia in :values.',
'prohibits' => 'Il campo :attribute proibisce :other da essere presente.',
'regex' => 'Il formato del campo :attribute non è valido.',
'required' => 'Il campo :attribute è richiesto.',
'required_array_keys' => 'Il campo :attribute deve contenere inserimenti per: :values.',
'required_if' => 'Il campo :attribute è richiesto quando :other è :value.',
'required_if_accepted' => 'Il campo :attribute è richiesto quando :other è accettato.',
'required_unless' => 'Il campo :attribute è richiesto a meno che :other sia in :values.',
'required_with' => 'Il campo :attribute è richiesto quando :values è presente.',
'required_with_all' => 'Il campo :attribute è richiesto quando :values sono presenti.',
'required_without' => 'Il campo :attribute è richiesto quando :values non è presente.',
'required_without_all' => 'Il campo :attribute è richiesto quando nessuno dei :values sono presenti.',
'same' => 'Il campo :attribute deve corrispondere a :other.',
'size' => [
'array' => 'Il campo :attribute deve contenere :size elementi.',
'file' => 'Il campo :attribute deve essere :size kilobyte.',
'numeric' => 'Il campo :attribute deve essere :size.',
'string' => 'Il campo :attribute deve essere :size caratteri.',
],
'starts_with' => 'Il campo :attribute deve iniziare con uno dei seguenti: :values.',
'string' => 'Il campo :attribute deve essere una stringa.',
'timezone' => 'Il campo :attribute deve essere un fuso orario valido.',
'unique' => 'Il :attribute è già stato preso.',
'uploaded' => 'Il :attribute non è riuscito ad essere caricato.',
'uppercase' => 'Il campo :attribute deve essere maiuscolo.',
'url' => 'Il campo :attribute deve essere un URL valido.',
'ulid' => 'Il campo :attribute deve essere un ULID valido.',
'uuid' => 'Il campo :attribute deve essere un UUID valido.',
/*
|--------------------------------------------------------------------------
| Custom Validation Language Lines
|--------------------------------------------------------------------------
|
| Here you may specify custom validation messages for attributes using the
| convention "attribute.rule" to name the lines. This makes it quick to
| specify a specific custom language line for a given attribute rule.
|
*/
'custom' => [
'attribute-name' => [
'rule-name' => 'custom-message',
],
],
/*
|--------------------------------------------------------------------------
| Custom Validation Attributes
|--------------------------------------------------------------------------
|
| The following language lines are used to swap our attribute placeholder
| with something more reader friendly such as "E-Mail Address" instead
| of "email". This simply helps us make our message more expressive.
|
*/
'attributes' => [
'address' => 'indirizzo',
'age' => 'età',
'body' => 'corpo del testo',
'cell' => 'cella',
'city' => 'città',
'country' => 'nazione',
'date' => 'data',
'day' => 'giorno',
'excerpt' => 'sommario',
'first_name' => 'nome',
'gender' => 'identità di genere',
'marital_status' => 'stato civile',
'profession' => 'professione',
'nationality' => 'nazionalità',
'hour' => 'ora',
'last_name' => 'cognome',
'message' => 'messaggio',
'minute' => 'minuto',
'mobile' => 'cellulare',
'month' => 'mese',
'name' => 'nome',
'zipcode' => 'CAP',
'company_name' => 'nome azienda',
'neighborhood' => 'quartiere',
'number' => 'numero',
'password' => 'password',
'phone' => 'telefono',
'second' => 'secondo',
'sex' => 'sesso',
'state' => 'stato',
'street' => 'strada',
'subject' => 'oggetto',
'text' => 'testo',
'time' => 'ora',
'title' => 'titolo',
'username' => 'username',
'year' => 'anno',
'description' => 'descrizione',
'password_confirmation' => 'conferma password',
'current_password' => 'password corrente',
'complement' => 'complemento',
'modality' => 'modalità',
'category' => 'categoria',
'blood_type' => 'gruppo sanguigno',
'birth_date' => 'data di nascita',
],
];
-20
View File
@@ -1,20 +0,0 @@
<?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' => 'De ingevoerde inloggegevens komen niet overeen.',
'password' => 'Het ingevoerde wachtwoord is onjuist.',
'throttle' => 'Te veel inlogpogingen. Wacht :seconds seconden en probeer het opnieuw.',
];
-19
View File
@@ -1,19 +0,0 @@
<?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; Vorige',
'next' => 'Volgende &raquo;',
];
-23
View File
@@ -1,23 +0,0 @@
<?php
return [
/*
|--------------------------------------------------------------------------
| Password Reset Language Lines
|--------------------------------------------------------------------------
|
| The following language lines are the default lines which match reasons
| that are given by the password broker for a password update attempt
| has failed, such as for an invalid token or invalid new password.
|
*/
'reset' => 'Je wachtwoord is succesvol opnieuw ingesteld!',
'sent' => 'We hebben je een e-mail gestuurd met een link om je wachtwoord opnieuw in te stellen!',
'password' => 'Het wachtwoord moet minstens 6 tekens lang zijn en overeenkomen met de bevestiging.',
'throttled' => 'Wacht even voordat je het opnieuw probeert.',
'token' => 'De link om het wachtwoord opnieuw in te stellen is ongeldig of verlopen.',
'user' => 'Er bestaat geen gebruikersaccount met dit e-mailadres.',
];
-230
View File
@@ -1,230 +0,0 @@
<?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 moet worden geaccepteerd.',
'accepted_if' => ':attribute moet worden geaccepteerd als :other :value is.',
'active_url' => ':attribute moet een geldige URL zijn.',
'after' => ':attribute moet een datum na :date zijn.',
'after_or_equal' => ':attribute moet een datum zijn op of na :date.',
'alpha' => ':attribute mag alleen letters bevatten.',
'alpha_dash' => ':attribute mag alleen letters, cijfers, koppeltekens en underscores bevatten.',
'alpha_num' => ':attribute mag alleen letters en cijfers bevatten.',
'array' => ':attribute moet een lijst zijn.',
'ascii' => ':attribute mag alleen standaardtekens bevatten.',
'before' => ':attribute moet een datum voor :date zijn.',
'before_or_equal' => ':attribute moet een datum zijn op of voor :date.',
'between' => [
'array' => ':attribute moet tussen :min en :max items bevatten.',
'file' => ':attribute moet tussen :min en :max kilobytes groot zijn.',
'numeric' => ':attribute moet tussen :min en :max liggen.',
'string' => ':attribute moet tussen :min en :max tekens lang zijn.',
],
'boolean' => ':attribute moet waar of onwaar zijn.',
'can' => ':attribute bevat een ongeldige waarde.',
'confirmed' => ':attribute komt niet overeen met de bevestiging.',
'current_password' => 'Het ingevoerde wachtwoord is onjuist.',
'date' => ':attribute is geen geldige datum.',
'date_equals' => ':attribute moet exact :date zijn.',
'date_format' => ':attribute komt niet overeen met het formaat :format.',
'decimal' => ':attribute moet :decimal decimalen bevatten.',
'declined' => ':attribute moet worden afgewezen.',
'declined_if' => ':attribute moet worden afgewezen als :other :value is.',
'different' => ':attribute en :other moeten verschillend zijn.',
'digits' => ':attribute moet uit :digits cijfers bestaan.',
'digits_between' => ':attribute moet tussen :min en :max cijfers bevatten.',
'dimensions' => ':attribute heeft ongeldige afbeeldingsafmetingen.',
'distinct' => ':attribute bevat een dubbele waarde.',
'doesnt_end_with' => ':attribute mag niet eindigen met een van de volgende: :values.',
'doesnt_start_with' => ':attribute mag niet beginnen met een van de volgende: :values.',
'email' => ':attribute moet een geldig e-mailadres zijn.',
'ends_with' => ':attribute moet eindigen met een van de volgende: :values.',
'enum' => 'De geselecteerde waarde voor :attribute is ongeldig.',
'exists' => ':attribute bestaat al.',
'file' => ':attribute moet een bestand zijn.',
'filled' => ':attribute mag niet leeg zijn.',
'gt' => [
'array' => ':attribute moet meer dan :value items bevatten.',
'file' => ':attribute moet groter zijn dan :value kilobytes.',
'numeric' => ':attribute moet groter zijn dan :value.',
'string' => ':attribute moet meer dan :value tekens bevatten.',
],
'gte' => [
'array' => ':attribute moet minimaal :value items bevatten.',
'file' => ':attribute moet minimaal :value kilobytes zijn.',
'numeric' => ':attribute moet minimaal :value zijn.',
'string' => ':attribute moet minimaal :value tekens bevatten.',
],
'image' => ':attribute moet een afbeelding zijn.',
'in' => 'De geselecteerde waarde voor :attribute is ongeldig.',
'in_array' => ':attribute moet voorkomen in :other.',
'integer' => ':attribute moet een geheel getal zijn.',
'ip' => ':attribute moet een geldig IP-adres zijn.',
'ipv4' => ':attribute moet een geldig IPv4-adres zijn.',
'ipv6' => ':attribute moet een geldig IPv6-adres zijn.',
'json' => ':attribute moet een geldige JSON-string zijn.',
'lowercase' => ':attribute moet alleen kleine letters bevatten.',
'lt' => [
'array' => ':attribute mag maximaal :value items bevatten.',
'file' => ':attribute moet kleiner zijn dan :value kilobytes.',
'numeric' => ':attribute moet kleiner zijn dan :value.',
'string' => ':attribute moet minder dan :value tekens bevatten.',
],
'lte' => [
'array' => ':attribute mag niet meer dan :value items bevatten.',
'file' => ':attribute mag maximaal :value kilobytes zijn.',
'numeric' => ':attribute mag maximaal :value zijn.',
'string' => ':attribute mag maximaal :value tekens bevatten.',
],
'mac_address' => ':attribute moet een geldig MAC-adres zijn.',
'max' => [
'array' => ':attribute mag maximaal :max items bevatten.',
'file' => ':attribute mag maximaal :max kilobytes zijn.',
'numeric' => ':attribute mag niet groter zijn dan :max.',
'string' => ':attribute mag niet langer zijn dan :max tekens.',
],
'max_digits' => ':attribute mag maximaal :max cijfers bevatten.',
'mimes' => ':attribute moet een bestand zijn van het type: :values.',
'mimetypes' => ':attribute moet een bestand zijn van het type: :values.',
'min' => [
'array' => ':attribute moet minstens :min items bevatten.',
'file' => ':attribute moet minstens :min kilobytes zijn.',
'numeric' => ':attribute moet minstens :min zijn.',
'string' => ':attribute moet minstens :min tekens bevatten.',
],
'min_digits' => ':attribute moet minstens :min cijfers bevatten.',
'missing' => ':attribute moet ontbreken.',
'missing_if' => ':attribute moet ontbreken als :other ":value" is.',
'missing_unless' => ':attribute moet ontbreken tenzij :other :value is.',
'missing_with' => ':attribute moet ontbreken als :values aanwezig is.',
'missing_with_all' => ':attribute moet ontbreken als :values aanwezig zijn.',
'multiple_of' => ':attribute moet een veelvoud van :value zijn.',
'not_in' => 'De geselecteerde waarde voor :attribute is ongeldig.',
'not_regex' => 'Het formaat van :attribute is ongeldig.',
'numeric' => ':attribute moet een getal zijn.',
'password' => [
'letters' => ':attribute moet minstens één letter bevatten.',
'mixed' => ':attribute moet minstens één hoofdletter en één kleine letter bevatten.',
'numbers' => ':attribute moet minstens één cijfer bevatten.',
'symbols' => ':attribute moet minstens één speciaal teken bevatten.',
'uncompromised' => 'Het opgegeven :attribute is aangetroffen in een datalek. Kies een andere :attribute.',
],
'present' => ':attribute moet aanwezig zijn.',
'prohibited' => ':attribute mag niet worden opgegeven.',
'prohibited_if' => ':attribute mag niet worden opgegeven als :other ":value" is.',
'prohibited_unless' => ':attribute mag alleen worden opgegeven als :other één van de volgende waarden heeft: :values.',
'prohibits' => ':attribute staat niet toe dat :other aanwezig is.',
'regex' => 'Het formaat van :attribute is ongeldig.',
'required' => ':attribute is verplicht.',
'required_array_keys' => ':attribute moet waarden bevatten voor: :values.',
'required_if' => ':attribute is verplicht als :other ":value" is.',
'required_if_accepted' => ':attribute is verplicht als :other is geaccepteerd.',
'required_unless' => ':attribute is verplicht tenzij :other één van de volgende waarden heeft: :values.',
'required_with' => ':attribute is verplicht als :values aanwezig is.',
'required_with_all' => ':attribute is verplicht als alle :values aanwezig zijn.',
'required_without' => ':attribute is verplicht als :values niet aanwezig is.',
'required_without_all' => ':attribute is verplicht als geen van :values aanwezig zijn.',
'same' => ':attribute en :other moeten overeenkomen.',
'size' => [
'array' => ':attribute moet precies :size items bevatten.',
'file' => ':attribute moet :size kilobytes zijn.',
'numeric' => ':attribute moet :size zijn.',
'string' => ':attribute moet :size tekens lang zijn.',
],
'starts_with' => ':attribute moet beginnen met één van de volgende: :values.',
'string' => ':attribute moet een tekst zijn.',
'timezone' => ':attribute moet een geldige tijdzone zijn.',
'unique' => ':attribute is al in gebruik.',
'uploaded' => ':attribute kon niet worden geüpload.',
'uppercase' => ':attribute moet alleen hoofdletters bevatten.',
'url' => ':attribute moet een geldige URL zijn.',
'ulid' => ':attribute moet een geldige ULID zijn.',
'uuid' => ':attribute moet een geldige UUID zijn.',
/*
|--------------------------------------------------------------------------
| Custom Validation Language Lines
|--------------------------------------------------------------------------
|
| Here you may specify custom validation messages for attributes using the
| convention "attribute.rule" to name the lines. This makes it quick to
| specify a specific custom language line for a given attribute rule.
|
*/
'custom' => [
'attribute-name' => [
'rule-name' => 'aangepaste-bericht',
],
],
/*
|--------------------------------------------------------------------------
| Custom Validation Attributes
|--------------------------------------------------------------------------
|
| The following language lines are used to swap our attribute placeholder
| with something more reader friendly such as "E-Mail Address" instead
| of "email". This simply helps us make our message more expressive.
|
*/
'attributes' => [
'address' => 'Adres',
'age' => 'Leeftijd',
'body' => 'Inhoud',
'cell' => 'Mobiel',
'city' => 'Stad',
'country' => 'Land',
'date' => 'Datum',
'day' => 'Dag',
'excerpt' => 'Samenvatting',
'first_name' => 'Voornaam',
'gender' => 'Geslacht',
'marital_status' => 'Burgerlijke staat',
'profession' => 'Beroep',
'nationality' => 'Nationaliteit',
'hour' => 'Uur',
'last_name' => 'Achternaam',
'message' => 'Bericht',
'minute' => 'Minuut',
'mobile' => 'Mobiele nummer',
'month' => 'Maand',
'name' => 'Naam',
'zipcode' => 'Postcode',
'company_name' => 'Bedrijfsnaam',
'neighborhood' => 'Wijk',
'number' => 'Nummer',
'password' => 'Wachtwoord',
'phone' => 'Telefoonnummer',
'second' => 'Seconde',
'sex' => 'Geslacht',
'state' => 'Provincie',
'street' => 'Straat',
'subject' => 'Onderwerp',
'text' => 'Tekst',
'time' => 'Tijd',
'title' => 'Titel',
'username' => 'Gebruikersnaam',
'year' => 'Jaar',
'description' => 'Beschrijving',
'password_confirmation' => 'Wachtwoordbevestiging',
'current_password' => 'Huidig wachtwoord',
'complement' => 'Aanvulling',
'modality' => 'Modaliteit',
'category' => 'Categorie',
'blood_type' => 'Bloedgroep',
'birth_date' => 'Geboortedatum',
],
];
-20
View File
@@ -1,20 +0,0 @@
<?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' => 'Essas credenciais não foram encontradas em nossos registros.',
'password' => 'A senha informada está incorreta.',
'throttle' => 'Muitas tentativas de login. Tente novamente em :seconds segundos.',
];
-19
View File
@@ -1,19 +0,0 @@
<?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; Anterior',
'next' => 'Próximo &raquo;',
];
-23
View File
@@ -1,23 +0,0 @@
<?php
return [
/*
|--------------------------------------------------------------------------
| Password Reset Language Lines
|--------------------------------------------------------------------------
|
| The following language lines are the default lines which match reasons
| that are given by the password broker for a password update attempt
| has failed, such as for an invalid token or invalid new password.
|
*/
'reset' => 'Sua senha foi redefinida!',
'sent' => 'Enviamos seu link de redefinição de senha por e-mail!',
'password' => 'A senha e a confirmação devem combinar e possuir pelo menos seis caracteres.',
'throttled' => 'Aguarde antes de tentar novamente.',
'token' => 'Este token de redefinição de senha é inválido.',
'user' => 'Não encontramos um usuário com esse endereço de e-mail.',
];
-230
View File
@@ -1,230 +0,0 @@
<?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' => 'O campo :attribute deve ser aceito.',
'accepted_if' => 'O :attribute deve ser aceito quando :other for :value.',
'active_url' => 'O campo :attribute não é uma URL válida.',
'after' => 'O campo :attribute deve ser uma data posterior a :date.',
'after_or_equal' => 'O campo :attribute deve ser uma data posterior ou igual a :date.',
'alpha' => 'O campo :attribute só pode conter letras.',
'alpha_dash' => 'O campo :attribute só pode conter letras, números e traços.',
'alpha_num' => 'O campo :attribute só pode conter letras e números.',
'array' => 'O campo :attribute deve ser uma matriz.',
'ascii' => 'The :attribute field must only contain single-byte alphanumeric characters and symbols.', // TODO
'before' => 'O campo :attribute deve ser uma data anterior :date.',
'before_or_equal' => 'O campo :attribute deve ser uma data anterior ou igual a :date.',
'between' => [
'numeric' => 'O campo :attribute deve ser entre :min e :max.',
'file' => 'O campo :attribute deve ser entre :min e :max kilobytes.',
'string' => 'O campo :attribute deve ser entre :min e :max caracteres.',
'array' => 'O campo :attribute deve ter entre :min e :max itens.',
],
'boolean' => 'O campo :attribute deve ser verdadeiro ou falso.',
'can' => 'The :attribute field contains an unauthorized value.', // TODO
'confirmed' => 'O campo :attribute de confirmação não confere.',
'current_password' => 'A senha está incorreta.',
'date' => 'O campo :attribute não é uma data válida.',
'date_equals' => 'O campo :attribute deve ser uma data igual a :date.',
'date_format' => 'O campo :attribute não corresponde ao formato :format.',
'decimal' => 'The :attribute field must have :decimal decimal places.', // TODO
'declined' => 'O :attribute deve ser recusado.',
'declined_if' => 'O :attribute deve ser recusado quando :other for :value.',
'different' => 'Os campos :attribute e :other devem ser diferentes.',
'digits' => 'O campo :attribute deve ter :digits dígitos.',
'digits_between' => 'O campo :attribute deve ter entre :min e :max dígitos.',
'dimensions' => 'O campo :attribute tem dimensões de imagem inválidas.',
'distinct' => 'O campo :attribute campo tem um valor duplicado.',
'doesnt_end_with' => 'O :attribute não pode terminar com um dos seguintes: :values.',
'doesnt_start_with' => 'O :attribute não pode começar com um dos seguintes: :values.',
'email' => 'O campo :attribute deve ser um endereço de e-mail válido.',
'ends_with' => 'O campo :attribute deve terminar com um dos seguintes: :values',
'enum' => 'O :attribute selecionado é inválido.',
'exists' => 'O campo :attribute selecionado é inválido.',
'file' => 'O campo :attribute deve ser um arquivo.',
'filled' => 'O campo :attribute deve ter um valor.',
'gt' => [
'numeric' => 'O campo :attribute deve ser maior que :value.',
'file' => 'O campo :attribute deve ser maior que :value kilobytes.',
'string' => 'O campo :attribute deve ser maior que :value caracteres.',
'array' => 'O campo :attribute deve conter mais de :value itens.',
],
'gte' => [
'numeric' => 'O campo :attribute deve ser maior ou igual a :value.',
'file' => 'O campo :attribute deve ser maior ou igual a :value kilobytes.',
'string' => 'O campo :attribute deve ser maior ou igual a :value caracteres.',
'array' => 'O campo :attribute deve conter :value itens ou mais.',
],
'image' => 'O campo :attribute deve ser uma imagem.',
'in' => 'O campo :attribute selecionado é inválido.',
'in_array' => 'O campo :attribute não existe em :other.',
'integer' => 'O campo :attribute deve ser um número inteiro.',
'ip' => 'O campo :attribute deve ser um endereço de IP válido.',
'ipv4' => 'O campo :attribute deve ser um endereço IPv4 válido.',
'ipv6' => 'O campo :attribute deve ser um endereço IPv6 válido.',
'json' => 'O campo :attribute deve ser uma string JSON válida.',
'lowercase' => 'The :attribute field must be lowercase.', // TODO
'lt' => [
'numeric' => 'O campo :attribute deve ser menor que :value.',
'file' => 'O campo :attribute deve ser menor que :value kilobytes.',
'string' => 'O campo :attribute deve ser menor que :value caracteres.',
'array' => 'O campo :attribute deve conter menos de :value itens.',
],
'lte' => [
'numeric' => 'O campo :attribute deve ser menor ou igual a :value.',
'file' => 'O campo :attribute deve ser menor ou igual a :value kilobytes.',
'string' => 'O campo :attribute deve ser menor ou igual a :value caracteres.',
'array' => 'O campo :attribute não deve conter mais que :value itens.',
],
'mac_address' => 'The :attribute field must be a valid MAC address.', // TODO
'max' => [
'numeric' => 'O campo :attribute não pode ser superior a :max.',
'file' => 'O campo :attribute não pode ser superior a :max kilobytes.',
'string' => 'O campo :attribute não pode ser superior a :max caracteres.',
'array' => 'O campo :attribute não pode ter mais do que :max itens.',
],
'max_digits' => 'O campo :attribute não pode ser superior a :max dígitos',
'mimes' => 'O campo :attribute deve ser um arquivo do tipo: :values.',
'mimetypes' => 'O campo :attribute deve ser um arquivo do tipo: :values.',
'min' => [
'numeric' => 'O campo :attribute deve ser pelo menos :min.',
'file' => 'O campo :attribute deve ter pelo menos :min kilobytes.',
'string' => 'O campo :attribute deve ter pelo menos :min caracteres.',
'array' => 'O campo :attribute deve ter pelo menos :min itens.',
],
'min_digits' => 'O campo :attribute deve ter pelo menos :min dígitos',
'missing' => 'The :attribute field must be missing.', // TODO
'missing_if' => 'The :attribute field must be missing when :other is :value.', // TODO
'missing_unless' => 'The :attribute field must be missing unless :other is :value.', // TODO
'missing_with' => 'O campo :attribute não deve estar presente quando houver :values.',
'missing_with_all' => 'The :attribute field must be missing when :values are present.', // TODO
'multiple_of' => 'O campo :attribute deve ser um múltiplo de :value.',
'not_in' => 'O campo :attribute selecionado é inválido.',
'not_regex' => 'O campo :attribute possui um formato inválido.',
'numeric' => 'O campo :attribute deve ser um número.',
'password' => [
'letters' => 'O campo :attribute deve conter pelo menos uma letra.',
'mixed' => 'O campo :attribute deve conter pelo menos uma letra maiúscula e uma letra minúscula.',
'numbers' => 'O campo :attribute deve conter pelo menos um número.',
'symbols' => 'O campo :attribute deve conter pelo menos um símbolo.',
'uncompromised' => 'A senha que você inseriu em :attribute está em um vazamento de dados. Por favor escolha uma senha diferente.',
],
'present' => 'O campo :attribute deve estar presente.',
'prohibited' => 'O campo :attribute é proibido.',
'prohibited_if' => 'O campo :attribute é proibido quando :other for :value.',
'prohibited_unless' => 'O campo :attribute é proibido exceto quando :other for :values.',
'prohibits' => 'O campo :attribute proíbe :other de estar presente.',
'regex' => 'O campo :attribute tem um formato inválido.',
'required' => 'O campo :attribute é obrigatório.',
'required_array_keys' => 'O campo :attribute deve conter entradas para: :values.',
'required_if' => 'O campo :attribute é obrigatório quando :other for :value.',
'required_if_accepted' => 'The :attribute field is required when :other is accepted.', // TODO
'required_unless' => 'O campo :attribute é obrigatório exceto quando :other for :values.',
'required_with' => 'O campo :attribute é obrigatório quando :values está presente.',
'required_with_all' => 'O campo :attribute é obrigatório quando :values está presente.',
'required_without' => 'O campo :attribute é obrigatório quando :values não está presente.',
'required_without_all' => 'O campo :attribute é obrigatório quando nenhum dos :values estão presentes.',
'same' => 'Os campos :attribute e :other devem corresponder.',
'size' => [
'numeric' => 'O campo :attribute deve ser :size.',
'file' => 'O campo :attribute deve ser :size kilobytes.',
'string' => 'O campo :attribute deve ser :size caracteres.',
'array' => 'O campo :attribute deve conter :size itens.',
],
'starts_with' => 'O campo :attribute deve começar com um dos seguintes valores: :values',
'string' => 'O campo :attribute deve ser uma string.',
'timezone' => 'O campo :attribute deve ser uma zona válida.',
'unique' => 'O campo :attribute já está sendo utilizado.',
'uploaded' => 'Ocorreu uma falha no upload do campo :attribute.',
'uppercase' => 'The :attribute field must be uppercase.', // TODO
'url' => 'O campo :attribute tem um formato inválido.',
'ulid' => 'The :attribute field must be a valid ULID.', // TODO
'uuid' => 'O campo :attribute deve ser um UUID válido.',
/*
|--------------------------------------------------------------------------
| Custom Validation Language Lines
|--------------------------------------------------------------------------
|
| Here you may specify custom validation messages for attributes using the
| convention "attribute.rule" to name the lines. This makes it quick to
| specify a specific custom language line for a given attribute rule.
|
*/
'custom' => [
'attribute-name' => [
'rule-name' => 'custom-message',
],
],
/*
|--------------------------------------------------------------------------
| Custom Validation Attributes
|--------------------------------------------------------------------------
|
| The following language lines are used to swap our attribute placeholder
| with something more reader friendly such as "E-Mail Address" instead
| of "email". This simply helps us make our message more expressive.
|
*/
'attributes' => [
'address' => 'endereço',
'age' => 'idade',
'body' => 'conteúdo',
'cell' => 'célula',
'city' => 'cidade',
'country' => 'país',
'date' => 'data',
'day' => 'dia',
'excerpt' => 'resumo',
'first_name' => 'primeiro nome',
'gender' => 'gênero',
'marital_status' => 'estado civil',
'profession' => 'profissão',
'nationality' => 'nacionalidade',
'hour' => 'hora',
'last_name' => 'sobrenome',
'message' => 'mensagem',
'minute' => 'minuto',
'mobile' => 'celular',
'month' => 'mês',
'name' => 'nome',
'zipcode' => 'cep',
'company_name' => 'razão social',
'neighborhood' => 'bairro',
'number' => 'número',
'password' => 'senha',
'phone' => 'telefone',
'second' => 'segundo',
'sex' => 'sexo',
'state' => 'estado',
'street' => 'rua',
'subject' => 'assunto',
'text' => 'texto',
'time' => 'hora',
'title' => 'título',
'username' => 'usuário',
'year' => 'ano',
'description' => 'descrição',
'password_confirmation' => 'confirmação da senha',
'current_password' => 'senha atual',
'complement' => 'complemento',
'modality' => 'modalidade',
'category' => 'categoria',
'blood_type' => 'tipo sanguíneo',
'birth_date' => 'data de nascimento',
],
];
-20
View File
@@ -1,20 +0,0 @@
<?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' => 'Bu bilgiler kayıtlarımızla uyuşmuyor.',
'password' => 'Sağlanan şifre yanlış.',
'throttle' => 'Çok fazla giriş denemesi. Lütfen :seconds saniye içinde tekrar deneyin.',
];
-19
View File
@@ -1,19 +0,0 @@
<?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; Önceki',
'next' => 'Sonraki &raquo;',
];
-23
View File
@@ -1,23 +0,0 @@
<?php
return [
/*
|--------------------------------------------------------------------------
| Password Reset Language Lines
|--------------------------------------------------------------------------
|
| The following language lines are the default lines which match reasons
| that are given by the password broker for a password update attempt
| has failed, such as for an invalid token or invalid new password.
|
*/
'reset' => 'Parolanız sıfırlandı!',
'sent' => 'Parola sıfırlama bağlantınızı e-postayla gönderdik!',
'password' => 'Şifre ve onay aynı olmalı ve en az altı karakter uzunluğunda olmalıdır.',
'throttled' => 'Tekrar denemeden önce lütfen bekleyin.',
'token' => 'Bu parola sıfırlama anahtarı geçersiz.',
'user' => 'Bu e-posta adresine sahip bir kullanıcı bulamadık.',
];
-230
View File
@@ -1,230 +0,0 @@
<?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 alanı kabul edilmelidir.',
'accepted_if' => ':attribute alanı, :other değeri :value olduğunda kabul edilmelidir.',
'active_url' => ':attribute alanı geçerli bir URL olmalıdır.',
'after' => ':attribute alanı :date değerinden sonraki bir tarih olmalıdır.',
'after_or_equal' => ':attribute alanı :date tarihinden sonra veya ona eşit bir tarih olmalıdır.',
'alpha' => ':attribute alanı yalnızca harf içermelidir.',
'alpha_dash' => ':attribute alanı yalnızca harf, rakam, tire(-) ve alt çizgi(_) içermelidir.',
'alpha_num' => ':attribute alanı yalnızca harf ve rakamlardan oluşmalıdır.',
'array' => ':attribute alanı bir dizi olmalıdır.',
'ascii' => ':attribute alanı yalnızca tek baytlık alfanümerik karakterler ve semboller içermelidir.',
'before' => ':attribute alanı :date değerinden önceki bir tarih olmalıdır.',
'before_or_equal' => ':attribute alanı :date tarihinden önce veya ona eşit bir tarih olmalıdır.',
'between' => [
'array' => ':attribute :min ile :max öğe arasında olmalıdır.',
'file' => ':attribute :min ile :max kilobayt arasında olmalıdır.',
'numeric' => ':attribute :min ile :max arasında olmalıdır.',
'string' => ':attribute :min ile :max karakter arasında olmalıdır.',
],
'boolean' => ':attribute alanı doğru veya yanlış olmalıdır.',
'can' => ':attribute alanı yetkisiz bir değer içeriyor.',
'confirmed' => ':attribute doğrulaması eşleşmiyor.',
'current_password' => 'Şifre yanlış.',
'date' => ':attribute geçerli bir tarih olmalıdır.',
'date_equals' => ':attribute :date tarihine eşit bir tarih olmalıdır.',
'date_format' => ':attribute :format formatıyla eşleşmelidir.',
'decimal' => ':attribute :decimal ondalık basamak içermelidir.',
'declined' => ':attribute reddedilmelidir.',
'declined_if' => ':attribute, :other :value olduğunda reddedilmelidir.',
'different' => ':attribute ve :other farklı olmalıdır.',
'digits' => ':attribute :digits basamaklı olmalıdır.',
'digits_between' => ':attribute :min ile :max basamak arasında olmalıdır.',
'dimensions' => ':attribute geçersiz resim boyutlarına sahiptir.',
'distinct' => ':attribute alanında yinelenen bir değer var.',
'doesnt_end_with' => ':attribute şu değerlerden biriyle bitmemelidir: :values.',
'doesnt_start_with' => ':attribute şu değerlerden biriyle başlamamalıdır: :values.',
'email' => ':attribute geçerli bir e-posta adresi olmalıdır.',
'ends_with' => ':attribute şu değerlerden biriyle bitmelidir: :values.',
'enum' => 'Seçilen :attribute geçersiz.',
'exists' => 'Seçilen :attribute geçersiz.',
'file' => ':attribute bir dosya olmalıdır.',
'filled' => ':attribute bir değer içermelidir.',
'gt' => [
'array' => ':attribute :value öğeden fazla olmalıdır.',
'file' => ':attribute :value kilobayttan büyük olmalıdır.',
'numeric' => ':attribute :value değerinden büyük olmalıdır.',
'string' => ':attribute :value karakterden uzun olmalıdır.',
],
'gte' => [
'array' => ':attribute :value veya daha fazla öğe içermelidir.',
'file' => ':attribute :value kilobayt veya daha büyük olmalıdır.',
'numeric' => ':attribute :value değerine eşit veya daha büyük olmalıdır.',
'string' => ':attribute :value karakter veya daha fazla olmalıdır.',
],
'image' => ':attribute bir resim olmalıdır.',
'in' => 'Seçilen :attribute geçersiz.',
'in_array' => ':attribute, :other içinde mevcut olmalıdır.',
'integer' => ':attribute bir tam sayı olmalıdır.',
'ip' => ':attribute geçerli bir IP adresi olmalıdır.',
'ipv4' => ':attribute geçerli bir IPv4 adresi olmalıdır.',
'ipv6' => ':attribute geçerli bir IPv6 adresi olmalıdır.',
'json' => ':attribute geçerli bir JSON metni olmalıdır.',
'lowercase' => ':attribute küçük harflerden oluşmalıdır.',
'lt' => [
'array' => ':attribute :value öğeden az olmalıdır.',
'file' => ':attribute :value kilobayttan küçük olmalıdır.',
'numeric' => ':attribute :value değerinden küçük olmalıdır.',
'string' => ':attribute :value karakterden kısa olmalıdır.',
],
'lte' => [
'array' => ':attribute :value öğeden fazla olmamalıdır.',
'file' => ':attribute :value kilobayt veya daha az olmalıdır.',
'numeric' => ':attribute :value değerine eşit veya daha küçük olmalıdır.',
'string' => ':attribute :value karakter veya daha az olmalıdır.',
],
'mac_address' => ':attribute geçerli bir MAC adresi olmalıdır.',
'max' => [
'array' => ':attribute :max öğeden fazla olmamalıdır.',
'file' => ':attribute :max kilobayttan büyük olmamalıdır.',
'numeric' => ':attribute :max değerinden büyük olmamalıdır.',
'string' => ':attribute :max karakterden uzun olmamalıdır.',
],
'max_digits' => ':attribute :max basamaktan fazla olmamalıdır.',
'mimes' => ':attribute şu türde bir dosya olmalıdır: :values.',
'mimetypes' => ':attribute şu türde bir dosya olmalıdır: :values.',
'min' => [
'array' => ':attribute en az :min öğe içermelidir.',
'file' => ':attribute en az :min kilobayt olmalıdır.',
'numeric' => ':attribute en az :min olmalıdır.',
'string' => ':attribute en az :min karakter olmalıdır.',
],
'min_digits' => ':attribute en az :min basamak içermelidir.',
'missing' => ':attribute eksik olmalıdır.',
'missing_if' => ':attribute, :other :value olduğunda eksik olmalıdır.',
'missing_unless' => ':attribute, :other :value değilse eksik olmalıdır.',
'missing_with' => ':attribute, :values mevcut olduğunda eksik olmalıdır.',
'missing_with_all' => ':attribute, :values mevcut olduğunda eksik olmalıdır.',
'multiple_of' => ':attribute :value katı olmalıdır.',
'not_in' => 'Seçilen :attribute geçersiz.',
'not_regex' => ':attribute formatı geçersiz.',
'numeric' => ':attribute bir sayı olmalıdır.',
'password' => [
'letters' => ':attribute en az bir harf içermelidir.',
'mixed' => ':attribute en az bir büyük harf ve bir küçük harf içermelidir.',
'numbers' => ':attribute en az bir rakam içermelidir.',
'symbols' => ':attribute en az bir sembol içermelidir.',
'uncompromised' => 'Verilen :attribute bir veri ihlalinde tespit edilmiştir. Lütfen farklı bir :attribute seçin.',
],
'present' => ':attribute mevcut olmalıdır.',
'prohibited' => ':attribute yasaktır.',
'prohibited_if' => ':attribute, :other :value olduğunda yasaktır.',
'prohibited_unless' => ':attribute, :other :values içinde olmadıkça yasaktır.',
'prohibits' => ':attribute, :other alanının mevcut olmasını yasaklar.',
'regex' => ':attribute formatı geçersiz.',
'required' => ':attribute alanı gereklidir.',
'required_array_keys' => ':attribute şu anahtarları içermelidir: :values.',
'required_if' => ':attribute, :other :value olduğunda gereklidir.',
'required_if_accepted' => ':attribute, :other kabul edildiğinde gereklidir.',
'required_unless' => ':attribute, :other :values içinde olmadıkça gereklidir.',
'required_with' => ':attribute, :values mevcut olduğunda gereklidir.',
'required_with_all' => ':attribute, :values mevcut olduğunda gereklidir.',
'required_without' => ':attribute, :values mevcut değilse gereklidir.',
'required_without_all' => ':attribute, :values hiçbirisi mevcut değilse gereklidir.',
'same' => ':attribute, :other ile eşleşmelidir.',
'size' => [
'array' => ':attribute :size öğe içermelidir.',
'file' => ':attribute :size kilobayt olmalıdır.',
'numeric' => ':attribute :size olmalıdır.',
'string' => ':attribute :size karakter olmalıdır.',
],
'starts_with' => ':attribute şu değerlerden biriyle başlamalıdır: :values.',
'string' => ':attribute bir metin olmalıdır.',
'timezone' => ':attribute geçerli bir zaman dilimi olmalıdır.',
'unique' => ':attribute zaten alınmış.',
'uploaded' => ':attribute yüklenemedi.',
'uppercase' => ':attribute büyük harflerden oluşmalıdır.',
'url' => ':attribute geçerli bir URL olmalıdır.',
'ulid' => ':attribute geçerli bir ULID olmalıdır.',
'uuid' => ':attribute geçerli bir UUID olmalıdır.',
/*
|--------------------------------------------------------------------------
| Custom Validation Language Lines
|--------------------------------------------------------------------------
|
| Here you may specify custom validation messages for attributes using the
| convention "attribute.rule" to name the lines. This makes it quick to
| specify a specific custom language line for a given attribute rule.
|
*/
'custom' => [
'attribute-name' => [
'rule-name' => 'custom-message',
],
],
/*
|--------------------------------------------------------------------------
| Custom Validation Attributes
|--------------------------------------------------------------------------
|
| The following language lines are used to swap our attribute placeholder
| with something more reader friendly such as "E-Mail Address" instead
| of "email". This simply helps us make our message more expressive.
|
*/
'attributes' => [
'address' => 'adres',
'age' => 'yaş',
'body' => 'içerik',
'cell' => 'hücre',
'city' => 'şehir',
'country' => 'ülke',
'date' => 'tarih',
'day' => 'gün',
'excerpt' => 'özet',
'first_name' => 'ad',
'gender' => 'cinsiyet',
'marital_status' => 'medeni hal',
'profession' => 'meslek',
'nationality' => 'uyruk',
'hour' => 'saat',
'last_name' => 'soyad',
'message' => 'mesaj',
'minute' => 'dakika',
'mobile' => 'cep telefonu',
'month' => 'ay',
'name' => 'isim',
'zipcode' => 'posta kodu',
'company_name' => 'şirket adı',
'neighborhood' => 'mahalle',
'number' => 'numara',
'password' => 'şifre',
'phone' => 'telefon',
'second' => 'saniye',
'sex' => 'cinsiyet',
'state' => 'eyalet',
'street' => 'sokak',
'subject' => 'konu',
'text' => 'metin',
'time' => 'zaman',
'title' => 'başlık',
'username' => 'kullanıcı adı',
'year' => 'yıl',
'description' => 'açıklama',
'password_confirmation' => 'şifre doğrulama',
'current_password' => 'mevcut şifre',
'complement' => 'ek bilgi',
'modality' => 'mod',
'category' => 'kategori',
'blood_type' => 'kan grubu',
'birth_date' => 'doğum tarihi',
],
];
-19
View File
@@ -1,19 +0,0 @@
<?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;',
];
-20
View File
@@ -1,20 +0,0 @@
<?php
return [
/*
|--------------------------------------------------------------------------
| Password Reset Language Lines
|--------------------------------------------------------------------------
|
| The following language lines are the default lines which match reasons
| that are given by the password broker for a password update attempt
| has failed, such as for an invalid token or invalid new password.
|
*/
'reset' => '您的密碼已成功重設!',
'sent' => '我們已將密碼重設連結寄送至您的電子郵件信箱!',
'password' => '密碼必須至少包含六個字元,且與確認密碼相符。',
];
-91
View File
@@ -1,91 +0,0 @@
<?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.
|
*/
/*
|--------------------------------------------------------------------------
| Custom Validation Language Lines
|--------------------------------------------------------------------------
|
| Here you may specify custom validation messages for attributes using the
| convention "attribute.rule" to name the lines. This makes it quick to
| specify a specific custom language line for a given attribute rule.
|
*/
'custom' => [
'attribute-name' => [
],
],
/*
|--------------------------------------------------------------------------
| Custom Validation Attributes
|--------------------------------------------------------------------------
|
| The following language lines are used to swap our attribute placeholder
| with something more reader friendly such as "E-Mail Address" instead
| of "email". This simply helps us make our message more expressive.
|
*/
'attributes' => [
'address' => '地址',
'age' => '年齡',
'body' => '內文',
'cell' => '行動電話',
'city' => '縣市',
'country' => '國家',
'date' => '日期',
'day' => '日',
'excerpt' => '摘要',
'first_name' => '名字',
'gender' => '性別',
'marital_status' => '婚姻狀態',
'profession' => '職業',
'nationality' => '國籍',
'hour' => '時',
'last_name' => '姓氏',
'message' => '訊息內容',
'minute' => '分',
'mobile' => '行動電話',
'month' => '月',
'name' => '名稱',
'zipcode' => '郵遞區號',
'company_name' => '公司名稱',
'neighborhood' => '鄰里',
'number' => '號碼',
'password' => '密碼',
'phone' => '電話號碼',
'second' => '秒',
'sex' => '性別',
'state' => '縣市',
'street' => '街道',
'subject' => '主旨',
'text' => '文字',
'time' => '時間',
'title' => '標題',
'username' => '使用者帳號',
'year' => '年',
'description' => '說明',
'password_confirmation' => '確認密碼',
'current_password' => '目前密碼',
'complement' => '補充說明',
'modality' => '模式',
'category' => '類別',
'blood_type' => '血型',
'birth_date' => '出生日期',
],
];
+2 -2
View File
@@ -1,9 +1,9 @@
<x-guest-layout :title="__('Server Error')"> <x-guest-layout :title="__('errors.server_error')">
<div class="grid px-4 min-h-dvh place-content-center"> <div class="grid px-4 min-h-dvh place-content-center">
<div class="text-center"> <div class="text-center">
<h1 class="font-black text-gray-200 dark:text-gray-800 text-9xl">500</h1> <h1 class="font-black text-gray-200 dark:text-gray-800 text-9xl">500</h1>
<p class="text-2xl font-bold tracking-tight text-gray-900 dark:text-gray-100 sm:text-4xl">{{ __('Oops, server error!') }}</p> <p class="text-2xl font-bold tracking-tight text-gray-900 dark:text-gray-100 sm:text-4xl">{{ __('errors.oops_server_error') }}</p>
<p class="mt-4 text-gray-500 dark:text-gray-300">There was an issue, check the logs or view the docs for help.</p> <p class="mt-4 text-gray-500 dark:text-gray-300">There was an issue, check the logs or view the docs for help.</p>