Add multi-step radio wizard with Shoutcast/Icecast/AzureCast support and multi-language translations

- New 5-step RadioWizardController with session-based wizard flow
- Enhanced RadioStreamService with Shoutcast/Icecast/ AzureCast auto-detection
- Connection test functionality for stream, now-playing, and listeners
- Wizard views for all 5 steps with step indicator navigation
- All 21 language files updated with wizard translation keys (NL/EN + placeholders)
- Wizard link added to existing radio setup page
- Routes registered under /admin/radio/wizard/*
This commit is contained in:
root
2026-05-24 13:12:57 +02:00
parent 8c49a1138c
commit 5476dce882
31 changed files with 4298 additions and 43 deletions
+414
View File
@@ -0,0 +1,414 @@
<?php
namespace App\Http\Controllers\Admin;
use App\Http\Controllers\Controller;
use App\Models\Miscellaneous\WebsiteSetting;
use App\Models\RadioRank;
use App\Services\Community\RadioStreamService;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Artisan;
use Illuminate\View\View;
class RadioWizardController extends Controller
{
private const SESSION_KEY = 'radio_wizard';
public function __construct(
private readonly RadioStreamService $streamService,
) {}
public function index(): View
{
$data = session()->get(self::SESSION_KEY);
if (! $data) {
session()->forget(self::SESSION_KEY);
}
return view('admin.radio.wizard.step-1', [
'step' => 1,
'selectedPlatform' => $data['platform'] ?? null,
]);
}
public function processStep1(Request $request): RedirectResponse
{
$validated = $request->validate([
'platform' => ['required', 'string', 'in:shoutcast,icecast,azurecast,other'],
]);
session()->put(self::SESSION_KEY . '.platform', $validated['platform']);
return redirect()->route('admin.radio.wizard.step', ['step' => 2]);
}
public function step(int $step): View|RedirectResponse
{
$data = session()->get(self::SESSION_KEY);
if (! $data && $step > 1) {
return redirect()->route('admin.radio.wizard');
}
return match ($step) {
2 => $this->step2($data),
3 => $this->step3($data),
4 => $this->step4($data),
5 => $this->step5($data),
default => redirect()->route('admin.radio.wizard'),
};
}
private function step2(array $data): View
{
$platform = $data['platform'] ?? 'other';
$platformLabels = [
'shoutcast' => 'SHOUTcast',
'icecast' => 'Icecast',
'azurecast' => 'AzureCast',
'other' => 'Anders',
];
return view('admin.radio.wizard.step-2', [
'step' => 2,
'platform' => $platform,
'platformLabel' => $platformLabels[$platform] ?? 'Onbekend',
'streamUrl' => session()->get(self::SESSION_KEY . '.stream_url', ''),
'streamName' => session()->get(self::SESSION_KEY . '.stream_name', ''),
'azurecastBaseUrl' => session()->get(self::SESSION_KEY . '.azurecast_base_url', ''),
'azurecastStationId' => session()->get(self::SESSION_KEY . '.azurecast_station_id', '1'),
]);
}
public function processStep2(Request $request): RedirectResponse
{
$platform = session()->get(self::SESSION_KEY . '.platform', 'other');
$rules = [
'stream_url' => ['required', 'string', 'max:500'],
'stream_name' => ['nullable', 'string', 'max:100'],
];
if ($platform === 'azurecast') {
$rules['azurecast_base_url'] = ['nullable', 'string', 'max:500'];
$rules['azurecast_station_id'] = ['nullable', 'integer', 'min:1'];
}
$validated = $request->validate($rules);
session()->put(self::SESSION_KEY . '.stream_url', $validated['stream_url']);
session()->put(self::SESSION_KEY . '.stream_name', $validated['stream_name'] ?? 'Mijn Radio');
if ($platform === 'azurecast') {
session()->put(self::SESSION_KEY . '.azurecast_base_url', $validated['azurecast_base_url'] ?? '');
session()->put(self::SESSION_KEY . '.azurecast_station_id', $validated['azurecast_station_id'] ?? '1');
}
return redirect()->route('admin.radio.wizard.step', ['step' => 3]);
}
private function step3(array $data): View
{
$platform = $data['platform'] ?? 'other';
$streamUrl = $data['stream_url'] ?? '';
$autoDetected = null;
if (! empty($streamUrl)) {
$autoDetected = $this->streamService->detectStreamType($streamUrl);
}
return view('admin.radio.wizard.step-3', [
'step' => 3,
'platform' => $platform,
'autoDetected' => $autoDetected,
'nowPlayingApi' => session()->get(self::SESSION_KEY . '.now_playing_api', $autoDetected['now_playing_api'] ?? ''),
'listenersApi' => session()->get(self::SESSION_KEY . '.listeners_api', $autoDetected['listeners_api'] ?? ''),
'enableNowPlaying' => session()->get(self::SESSION_KEY . '.enable_now_playing', true),
'enableListeners' => session()->get(self::SESSION_KEY . '.enable_listeners', true),
'enableCurrentDj' => session()->get(self::SESSION_KEY . '.enable_current_dj', true),
]);
}
public function processStep3(Request $request): RedirectResponse
{
$validated = $request->validate([
'now_playing_api' => ['nullable', 'string', 'max:500'],
'listeners_api' => ['nullable', 'string', 'max:500'],
'enable_now_playing' => ['nullable', 'boolean'],
'enable_listeners' => ['nullable', 'boolean'],
'enable_current_dj' => ['nullable', 'boolean'],
]);
session()->put(self::SESSION_KEY . '.now_playing_api', $validated['now_playing_api'] ?? '');
session()->put(self::SESSION_KEY . '.listeners_api', $validated['listeners_api'] ?? '');
session()->put(self::SESSION_KEY . '.enable_now_playing', (bool) ($validated['enable_now_playing'] ?? false));
session()->put(self::SESSION_KEY . '.enable_listeners', (bool) ($validated['enable_listeners'] ?? false));
session()->put(self::SESSION_KEY . '.enable_current_dj', (bool) ($validated['enable_current_dj'] ?? false));
return redirect()->route('admin.radio.wizard.step', ['step' => 4]);
}
private function step4(array $data): View
{
return view('admin.radio.wizard.step-4', [
'step' => 4,
'enableShouts' => session()->get(self::SESSION_KEY . '.enable_shouts', true),
'enableApplications' => session()->get(self::SESSION_KEY . '.enable_applications', true),
'enableWidget' => session()->get(self::SESSION_KEY . '.enable_widget', true),
'enableWidgetGlobally' => session()->get(self::SESSION_KEY . '.enable_widget_globally', true),
'enablePoints' => session()->get(self::SESSION_KEY . '.enable_points', true),
'enableRequests' => session()->get(self::SESSION_KEY . '.enable_requests', true),
'enableContests' => session()->get(self::SESSION_KEY . '.enable_contests', true),
'enableGiveaways' => session()->get(self::SESSION_KEY . '.enable_giveaways', false),
'enableDiscord' => session()->get(self::SESSION_KEY . '.enable_discord', false),
'discordWebhook' => session()->get(self::SESSION_KEY . '.discord_webhook', ''),
'widgetPosition' => session()->get(self::SESSION_KEY . '.widget_position', 'bottom-right'),
]);
}
public function processStep4(Request $request): RedirectResponse
{
$validated = $request->validate([
'enable_shouts' => ['nullable', 'boolean'],
'enable_applications' => ['nullable', 'boolean'],
'enable_widget' => ['nullable', 'boolean'],
'enable_widget_globally' => ['nullable', 'boolean'],
'enable_points' => ['nullable', 'boolean'],
'enable_requests' => ['nullable', 'boolean'],
'enable_contests' => ['nullable', 'boolean'],
'enable_giveaways' => ['nullable', 'boolean'],
'enable_discord' => ['nullable', 'boolean'],
'discord_webhook' => ['nullable', 'string', 'max:500'],
'widget_position' => ['nullable', 'string', 'in:bottom-right,bottom-left,top-right,top-left'],
]);
session()->put(self::SESSION_KEY . '.enable_shouts', (bool) ($validated['enable_shouts'] ?? false));
session()->put(self::SESSION_KEY . '.enable_applications', (bool) ($validated['enable_applications'] ?? false));
session()->put(self::SESSION_KEY . '.enable_widget', (bool) ($validated['enable_widget'] ?? false));
session()->put(self::SESSION_KEY . '.enable_widget_globally', (bool) ($validated['enable_widget_globally'] ?? false));
session()->put(self::SESSION_KEY . '.enable_points', (bool) ($validated['enable_points'] ?? false));
session()->put(self::SESSION_KEY . '.enable_requests', (bool) ($validated['enable_requests'] ?? false));
session()->put(self::SESSION_KEY . '.enable_contests', (bool) ($validated['enable_contests'] ?? false));
session()->put(self::SESSION_KEY . '.enable_giveaways', (bool) ($validated['enable_giveaways'] ?? false));
session()->put(self::SESSION_KEY . '.enable_discord', (bool) ($validated['enable_discord'] ?? false));
session()->put(self::SESSION_KEY . '.discord_webhook', $validated['discord_webhook'] ?? '');
session()->put(self::SESSION_KEY . '.widget_position', $validated['widget_position'] ?? 'bottom-right');
return redirect()->route('admin.radio.wizard.step', ['step' => 5]);
}
private function step5(array $data): View
{
$platform = $data['platform'] ?? 'other';
$streamUrl = $data['stream_url'] ?? '';
$platformLabels = [
'shoutcast' => 'SHOUTcast',
'icecast' => 'Icecast',
'azurecast' => 'AzureCast',
'other' => 'Anders',
];
$testResults = null;
if (! empty($streamUrl)) {
$testResults = $this->streamService->testStreamConnection(
$streamUrl,
$data['now_playing_api'] ?? null,
$data['listeners_api'] ?? null,
);
}
$settingsList = $this->buildSettingsList($data);
return view('admin.radio.wizard.step-5', [
'step' => 5,
'platform' => $platform,
'platformLabel' => $platformLabels[$platform] ?? 'Onbekend',
'data' => $data,
'testResults' => $testResults,
'settingsList' => $settingsList,
]);
}
public function runTest(): JsonResponse
{
$data = session()->get(self::SESSION_KEY);
if (! $data || empty($data['stream_url'])) {
return response()->json([
'success' => false,
'error' => 'Geen stream URL gevonden. Start de wizard opnieuw.',
]);
}
$testResults = $this->streamService->testStreamConnection(
$data['stream_url'],
$data['now_playing_api'] ?? null,
$data['listeners_api'] ?? null,
);
return response()->json([
'success' => true,
'results' => $testResults,
]);
}
public function complete(): RedirectResponse
{
$data = session()->get(self::SESSION_KEY);
if (! $data) {
return redirect()->route('admin.radio.wizard')
->with('error', 'Geen wizard data gevonden. Start opnieuw.');
}
try {
$this->saveAllSettings($data);
$this->createDefaultRanks();
Artisan::call('config:clear');
Artisan::call('cache:clear');
session()->forget(self::SESSION_KEY);
return redirect()->route('admin.radio.setup')
->with('success', 'Radio systeem is succesvol geïnstalleerd en geconfigureerd!');
} catch (\Exception $e) {
return redirect()->route('admin.radio.wizard.step', ['step' => 5])
->with('error', 'Fout tijdens opslaan: ' . $e->getMessage());
}
}
private function saveAllSettings(array $data): void
{
$platform = $data['platform'] ?? 'other';
$settings = [
'radio_enabled' => '1',
'radio_stream_url' => $data['stream_url'] ?? '',
'radio_stream_name' => $data['stream_name'] ?? 'Mijn Radio',
'radio_style' => 'dark',
'radio_auto_play' => '0',
'radio_stream_platform' => $platform,
'radio_now_playing_enabled' => ($data['enable_now_playing'] ?? true) ? '1' : '0',
'radio_listeners_enabled' => ($data['enable_listeners'] ?? true) ? '1' : '0',
'radio_show_current_dj' => ($data['enable_current_dj'] ?? true) ? '1' : '0',
'radio_shouts_enabled' => ($data['enable_shouts'] ?? true) ? '1' : '0',
'radio_applications_enabled' => ($data['enable_applications'] ?? true) ? '1' : '0',
'radio_widget_enabled' => ($data['enable_widget'] ?? true) ? '1' : '0',
'radio_widget_show_globally' => ($data['enable_widget_globally'] ?? true) ? '1' : '0',
'radio_widget_position' => $data['widget_position'] ?? 'bottom-right',
'radio_auto_dj_detection' => '1',
'radio_show_song_history' => '1',
'radio_show_schedule_preview' => '1',
'radio_word_filter_enabled' => '1',
];
if ($platform === 'azurecast') {
$settings['radio_azurecast_base_url'] = $data['azurecast_base_url'] ?? '';
$settings['radio_azurecast_station_id'] = $data['azurecast_station_id'] ?? '1';
}
if (! empty($data['now_playing_api'])) {
$settings['radio_now_playing_api_url'] = $data['now_playing_api'];
}
if (! empty($data['listeners_api'])) {
$settings['radio_listeners_api_url'] = $data['listeners_api'];
}
if ($data['enable_points'] ?? true) {
$settings['points_enabled'] = '1';
$settings['points_per_minute'] = '2';
$settings['max_points_per_day'] = '100';
$settings['points_for_request'] = '5';
$settings['points_for_vote'] = '2';
$settings['points_for_giveaway_win'] = '50';
$settings['points_for_contest_win'] = '100';
}
if ($data['enable_requests'] ?? true) {
$settings['radio_request_form_enabled'] = '1';
}
if ($data['enable_contests'] ?? true) {
$settings['radio_contests_enabled'] = '1';
}
if ($data['enable_giveaways'] ?? false) {
$settings['radio_giveaways_enabled'] = '1';
}
if ($data['enable_discord'] ?? false && ! empty($data['discord_webhook'])) {
$settings['radio_discord_enabled'] = '1';
$settings['radio_discord_webhook_url'] = $data['discord_webhook'];
$settings['radio_discord_dj_live'] = '1';
$settings['radio_discord_song_changes'] = '1';
}
foreach ($settings as $key => $value) {
WebsiteSetting::updateOrCreate(
['key' => $key],
['value' => (string) $value, 'comment' => 'Radio wizard configuratie'],
);
}
}
private function createDefaultRanks(): void
{
$ranks = [
['name' => 'Trainee DJ', 'level' => 1, 'is_active' => true, 'description' => 'Beginnende DJ'],
['name' => 'Junior DJ', 'level' => 2, 'is_active' => true, 'description' => 'Ervaren DJ'],
['name' => 'Senior DJ', 'level' => 3, 'is_active' => true, 'description' => 'Professionele DJ'],
['name' => 'Head DJ', 'level' => 4, 'is_active' => true, 'description' => 'Hoofd DJ'],
['name' => 'Radio Manager', 'level' => 5, 'is_active' => true, 'description' => 'Radio Manager'],
];
foreach ($ranks as $rank) {
RadioRank::updateOrCreate(
['name' => $rank['name']],
$rank,
);
}
}
private function buildSettingsList(array $data): array
{
$list = [];
$list['Stream URL'] = $data['stream_url'] ?? '-';
$list['Stream Naam'] = $data['stream_name'] ?? 'Mijn Radio';
$list['Platform'] = match ($data['platform'] ?? 'other') {
'shoutcast' => 'SHOUTcast',
'icecast' => 'Icecast',
'azurecast' => 'AzureCast',
default => 'Anders',
};
if (! empty($data['now_playing_api'])) {
$list['Now Playing API'] = $data['now_playing_api'];
}
if (! empty($data['listeners_api'])) {
$list['Listeners API'] = $data['listeners_api'];
}
$list['Nu Afspelen'] = ($data['enable_now_playing'] ?? true) ? 'Aan' : 'Uit';
$list['Luisteraars'] = ($data['enable_listeners'] ?? true) ? 'Aan' : 'Uit';
$list['Huidige DJ'] = ($data['enable_current_dj'] ?? true) ? 'Aan' : 'Uit';
$list['Shouts'] = ($data['enable_shouts'] ?? true) ? 'Aan' : 'Uit';
$list['DJ Aanmeldingen'] = ($data['enable_applications'] ?? true) ? 'Aan' : 'Uit';
$list['Radio Widget'] = ($data['enable_widget'] ?? true) ? 'Aan' : 'Uit';
$list['Widget Overal'] = ($data['enable_widget_globally'] ?? true) ? 'Ja' : 'Nee';
$list['Widget Positie'] = $data['widget_position'] ?? 'bottom-right';
$list['Punten Systeem'] = ($data['enable_points'] ?? true) ? 'Aan' : 'Uit';
$list['Song Verzoeken'] = ($data['enable_requests'] ?? true) ? 'Aan' : 'Uit';
$list['Contesten'] = ($data['enable_contests'] ?? true) ? 'Aan' : 'Uit';
$list['Giveaways'] = ($data['enable_giveaways'] ?? false) ? 'Aan' : 'Uit';
$list['Discord'] = ($data['enable_discord'] ?? false) ? 'Aan' : 'Uit';
return $list;
}
}
+425 -3
View File
@@ -16,10 +16,19 @@ class RadioStreamService
}
try {
return Http::timeout(2)
$response = Http::timeout(2)
->withOptions(['verify' => false])
->head($streamUrl)
->successful();
->head($streamUrl);
if ($response->successful()) {
return true;
}
$response = Http::timeout(2)
->withOptions(['verify' => false])
->get($streamUrl);
return $response->successful();
} catch (\Exception) {
return false;
}
@@ -105,6 +114,355 @@ class RadioStreamService
return $url;
}
public function detectStreamType(string $streamUrl): array
{
if (empty($streamUrl)) {
return ['type' => 'unknown', 'detected' => false];
}
$parsed = parse_url($streamUrl);
if (! $parsed) {
return ['type' => 'unknown', 'detected' => false];
}
$scheme = $parsed['scheme'] ?? 'https';
$host = $parsed['host'] ?? '';
$baseUrl = $scheme . '://' . $host;
// Try AzureCast first
$azureCast = $this->tryAzureCast($baseUrl);
if ($azureCast['detected']) {
return $azureCast;
}
// Try Icecast
$icecast = $this->tryIcecast($baseUrl);
if ($icecast['detected']) {
return $icecast;
}
// Try Shoutcast
$shoutcast = $this->tryShoutcast($baseUrl, $streamUrl);
if ($shoutcast['detected']) {
return $shoutcast;
}
return ['type' => 'unknown', 'detected' => false, 'base_url' => $baseUrl];
}
public function tryAzureCast(string $baseUrl): array
{
try {
$response = Http::timeout(3)->get(rtrim($baseUrl, '/') . '/api/nowplaying');
if ($response->successful()) {
$data = $response->json();
if (is_array($data) && (isset($data[0]['station']) || isset($data['station']))) {
$stationId = $data[0]['station']['id'] ?? $data['station']['id'] ?? 1;
return [
'type' => 'azurecast',
'detected' => true,
'base_url' => $baseUrl,
'station_id' => $stationId,
'now_playing_api' => rtrim($baseUrl, '/') . '/api/nowplaying/' . $stationId,
'listeners_api' => rtrim($baseUrl, '/') . '/api/nowplaying/' . $stationId,
];
}
}
} catch (\Exception) {
// Not AzureCast
}
return ['detected' => false];
}
public function tryIcecast(string $baseUrl): array
{
try {
$response = Http::timeout(3)->get(rtrim($baseUrl, '/') . '/status-json.xsl');
if ($response->successful()) {
$data = $response->json();
if (isset($data['icestats'])) {
$source = $data['icestats']['source'] ?? [];
$listeners = 0;
$song = null;
$artist = null;
if (is_array($source)) {
if (isset($source['listeners'])) {
$listeners = (int) $source['listeners'];
$title = $source['title'] ?? '';
} else {
$firstSource = $source[0] ?? null;
if ($firstSource) {
$listeners = (int) ($firstSource['listeners'] ?? 0);
$title = $firstSource['title'] ?? '';
}
}
}
$title = $title ?? '';
if (str_contains($title, ' - ')) {
$parts = explode(' - ', $title, 2);
$artist = trim($parts[0]);
$song = trim($parts[1]);
} else {
$song = $title ?: null;
}
return [
'type' => 'icecast',
'detected' => true,
'base_url' => $baseUrl,
'now_playing_api' => rtrim($baseUrl, '/') . '/status-json.xsl',
'listeners_api' => rtrim($baseUrl, '/') . '/status-json.xsl',
'listeners' => $listeners,
'song' => $song,
'artist' => $artist,
];
}
}
} catch (\Exception) {
// Not Icecast
}
return ['detected' => false];
}
public function tryShoutcast(string $baseUrl, string $streamUrl): array
{
// Try SHOUTcast stats endpoint
$statsUrls = [
rtrim($baseUrl, '/') . '/stats?json=1',
rtrim($baseUrl, '/') . '/7.html',
];
foreach ($statsUrls as $statsUrl) {
try {
$response = Http::timeout(3)->get($statsUrl);
if ($response->successful()) {
$body = $response->body();
if (str_contains($statsUrl, 'json=1')) {
$data = json_decode($body, true);
if ($data && isset($data['streamstatus'])) {
$song = $data['songtitle'] ?? null;
$artist = null;
if ($song && str_contains($song, ' - ')) {
$parts = explode(' - ', $song, 2);
$artist = trim($parts[0]);
$song = trim($parts[1]);
}
return [
'type' => 'shoutcast',
'detected' => true,
'base_url' => $baseUrl,
'now_playing_api' => rtrim($baseUrl, '/') . '/stats?json=1',
'listeners_api' => rtrim($baseUrl, '/') . '/stats?json=1',
'listeners' => (int) ($data['currentlisteners'] ?? 0),
'song' => $song,
'artist' => $artist,
'stream_url' => $data['streamurl'] ?? $streamUrl,
];
}
}
if (str_contains($body, ',')) {
$parts = explode(',', $body);
if (count($parts) >= 7) {
$listeners = (int) trim($parts[2]);
return [
'type' => 'shoutcast',
'detected' => true,
'base_url' => $baseUrl,
'now_playing_api' => rtrim($baseUrl, '/') . '/7.html',
'listeners_api' => rtrim($baseUrl, '/') . '/7.html',
'listeners' => $listeners,
'stream_url' => $streamUrl,
];
}
}
}
} catch (\Exception) {
continue;
}
}
return ['detected' => false];
}
public function testStreamConnection(string $streamUrl, ?string $nowPlayingApiUrl = null, ?string $listenersApiUrl = null): array
{
$results = [
'stream' => ['status' => 'untested', 'message' => ''],
'now_playing' => ['status' => 'untested', 'message' => ''],
'listeners' => ['status' => 'untested', 'message' => ''],
'stream_type' => 'unknown',
'stream_info' => null,
];
if (empty($streamUrl)) {
$results['stream'] = ['status' => 'error', 'message' => 'Geen stream URL opgegeven'];
return $results;
}
// Test stream URL
try {
$response = Http::timeout(5)
->withOptions(['verify' => false])
->head($streamUrl);
if ($response->successful()) {
$contentType = $response->header('Content-Type');
$results['stream'] = [
'status' => 'success',
'message' => 'Stream bereikbaar!',
'content_type' => $contentType,
'http_code' => $response->status(),
];
} else {
$results['stream'] = [
'status' => 'warning',
'message' => 'Stream reageert met status ' . $response->status(),
'http_code' => $response->status(),
];
}
} catch (\Exception $e) {
$results['stream'] = [
'status' => 'error',
'message' => 'Kon geen verbinding maken: ' . $e->getMessage(),
];
}
// Detect stream type
$detected = $this->detectStreamType($streamUrl);
$results['stream_type'] = $detected['type'];
$results['stream_info'] = $detected;
// Test now-playing API
$npUrl = $nowPlayingApiUrl ?: ($detected['now_playing_api'] ?? null);
if ($npUrl) {
try {
$npResponse = Http::timeout(5)->get($npUrl);
if ($npResponse->successful()) {
$npData = $npResponse->json();
$song = null;
$artist = null;
if ($detected['type'] === 'azurecast') {
$np = $npData['now_playing'] ?? [];
$song = $np['song']['title'] ?? null;
$artist = $np['song']['artist'] ?? null;
} elseif ($detected['type'] === 'icecast') {
$source = $npData['icestats']['source'] ?? [];
if (is_array($source)) {
if (isset($source['title'])) {
$title = $source['title'];
} else {
$title = $source[0]['title'] ?? null;
}
if ($title && str_contains($title, ' - ')) {
$parts = explode(' - ', $title, 2);
$artist = trim($parts[0]);
$song = trim($parts[1]);
} else {
$song = $title;
}
}
} elseif ($detected['type'] === 'shoutcast') {
$song = $npData['songtitle'] ?? null;
if ($song && str_contains($song, ' - ')) {
$parts = explode(' - ', $song, 2);
$artist = trim($parts[0]);
$song = trim($parts[1]);
}
} else {
$song = $npData['song'] ?? $npData['title'] ?? null;
$artist = $npData['artist'] ?? null;
}
$results['now_playing'] = [
'status' => 'success',
'message' => 'Nu afspelen informatie beschikbaar',
'song' => $song,
'artist' => $artist,
'api_url' => $npUrl,
];
} else {
$results['now_playing'] = [
'status' => 'warning',
'message' => 'API reageert met status ' . $npResponse->status(),
'api_url' => $npUrl,
];
}
} catch (\Exception $e) {
$results['now_playing'] = [
'status' => 'error',
'message' => 'Kon now-playing API niet bereiken: ' . $e->getMessage(),
'api_url' => $npUrl,
];
}
} else {
$results['now_playing'] = [
'status' => 'skipped',
'message' => 'Geen now-playing API geconfigureerd',
];
}
// Test listeners API
$listenersUrl = $listenersApiUrl ?: ($detected['listeners_api'] ?? null);
if ($listenersUrl) {
try {
$listenersResponse = Http::timeout(5)->get($listenersUrl);
if ($listenersResponse->successful()) {
$listenersData = $listenersResponse->json();
$count = 0;
if ($detected['type'] === 'azurecast') {
$count = $listenersData['listeners']['total'] ?? $listenersData['listeners']['current'] ?? 0;
} elseif ($detected['type'] === 'icecast') {
$source = $listenersData['icestats']['source'] ?? [];
if (is_array($source)) {
$count = (int) ($source['listeners'] ?? $source[0]['listeners'] ?? 0);
}
} elseif ($detected['type'] === 'shoutcast') {
$count = (int) ($listenersData['currentlisteners'] ?? 0);
} else {
$count = $listenersData['listeners'] ?? $listenersData['count'] ?? $listenersData['total'] ?? 0;
}
$results['listeners'] = [
'status' => 'success',
'message' => 'Luisteraars informatie beschikbaar',
'count' => (int) $count,
'api_url' => $listenersUrl,
];
} else {
$results['listeners'] = [
'status' => 'warning',
'message' => 'Listeners API reageert met status ' . $listenersResponse->status(),
'api_url' => $listenersUrl,
];
}
} catch (\Exception $e) {
$results['listeners'] = [
'status' => 'error',
'message' => 'Kon listeners API niet bereiken: ' . $e->getMessage(),
'api_url' => $listenersUrl,
];
}
} else {
$results['listeners'] = [
'status' => 'skipped',
'message' => 'Geen listeners API geconfigureerd',
];
}
return $results;
}
public function detectAzureCast(): array
{
$baseUrl = $this->getSetting(RadioSettings::AzureCastBaseUrl);
@@ -171,6 +529,70 @@ class RadioStreamService
return $scheme . '://' . $host . '/api/nowplaying/' . $stationId;
}
public function getNowPlayingFromShoutcast(string $baseUrl): ?array
{
try {
$response = Http::timeout(3)->get(rtrim($baseUrl, '/') . '/stats?json=1');
if ($response->successful()) {
$data = $response->json();
$song = $data['songtitle'] ?? null;
$artist = null;
if ($song && str_contains($song, ' - ')) {
$parts = explode(' - ', $song, 2);
$artist = trim($parts[0]);
$song = trim($parts[1]);
}
return [
'song' => $song,
'artist' => $artist,
'raw' => $data['songtitle'] ?? null,
];
}
} catch (\Exception) {
// Silent fail
}
return null;
}
public function getNowPlayingFromIcecast(string $baseUrl): ?array
{
try {
$response = Http::timeout(3)->get(rtrim($baseUrl, '/') . '/status-json.xsl');
if ($response->successful()) {
$data = $response->json();
$icestats = $data['icestats'] ?? [];
$source = $icestats['source'] ?? [];
if (is_array($source)) {
$title = $source['title'] ?? $source[0]['title'] ?? null;
$song = null;
$artist = null;
if ($title && str_contains($title, ' - ')) {
$parts = explode(' - ', $title, 2);
$artist = trim($parts[0]);
$song = trim($parts[1]);
} else {
$song = $title;
}
return [
'song' => $song,
'artist' => $artist,
'raw' => $title,
];
}
}
} catch (\Exception) {
// Silent fail
}
return null;
}
private function getSetting(RadioSettings $setting, mixed $default = null): mixed
{
return Cache::remember("setting_{$setting->value}", 60, function () use ($setting, $default): mixed {
+118 -2
View File
@@ -1395,5 +1395,121 @@
"Thumbnails URL": "رابط الصور المصغرة",
"Group Homepage": "صفحة المجموعة",
"Habbopages URL": "رابط Habbopages",
"URL Prefix": "بادئة الرابط"
}
"URL Prefix": "بادئة الرابط",
"radio.wizard.title": "Radio Installation Wizard",
"radio.wizard.step_short": "Step",
"radio.wizard.step_prefix": "Step",
"radio.wizard.of": "of",
"radio.wizard.next_step": "Next Step →",
"radio.wizard.previous_step": "← Previous Step",
"radio.wizard.back_to_setup": "Back to setup",
"radio.wizard.step1_label": "Platform",
"radio.wizard.step2_label": "Stream",
"radio.wizard.step3_label": "API",
"radio.wizard.step4_label": "Features",
"radio.wizard.step5_label": "Test",
"radio.wizard.step1_subtitle": "Choose your streaming platform",
"radio.wizard.step2_title": "Stream Configuration",
"radio.wizard.step3_title": "API Configuration",
"radio.wizard.step3_subtitle": "Now Playing & Listeners",
"radio.wizard.step4_title": "Configure Features",
"radio.wizard.step4_subtitle": "Choose which radio features to enable",
"radio.wizard.step5_title": "Test & Install",
"radio.wizard.step5_subtitle": "Check the connection and complete the installation",
"radio.wizard.platform_shoutcast": "SHOUTcast",
"radio.wizard.platform_shoutcast_desc": "For SHOUTcast servers. Auto-detection of now playing and listeners via stats endpoint.",
"radio.wizard.platform_icecast": "Icecast",
"radio.wizard.platform_icecast_desc": "For Icecast servers. Uses status-json.xsl for auto-detection.",
"radio.wizard.platform_azurecast": "AzureCast",
"radio.wizard.platform_azurecast_desc": "AzureCast hosting. Full API integration with now-playing, listeners and auto-configuration.",
"radio.wizard.platform_other": "Other",
"radio.wizard.platform_other_desc": "Another stream provider. Manual configuration of stream URL and API endpoints.",
"radio.wizard.shoutcast_info_title": "SHOUTcast",
"radio.wizard.shoutcast_info_desc": "Enter your SHOUTcast stream URL. The wizard will try to find the stats endpoint automatically.",
"radio.wizard.icecast_info_title": "Icecast",
"radio.wizard.icecast_info_desc": "Enter your Icecast stream URL. The wizard uses status-json.xsl for auto-detection.",
"radio.wizard.azurecast_info_title": "AzureCast",
"radio.wizard.azurecast_info_desc": "AzureCast stream URL + server configuration. The wizard configures everything via the AzureCast API.",
"radio.wizard.other_info_title": "Other Stream",
"radio.wizard.other_info_desc": "Enter your stream URL. You can manually configure API endpoints for now playing and listeners later.",
"radio.wizard.stream_url_label": "Stream URL *",
"radio.wizard.stream_url_hint": "The direct URL to your audio stream (MP3, AAC, OGG, etc.)",
"radio.wizard.stream_name_label": "Stream Name",
"radio.wizard.stream_name_placeholder": "My Radio",
"radio.wizard.stream_name_hint": "A name for your radio stream (optional)",
"radio.wizard.azurecast_section": "AzureCast Server Configuration",
"radio.wizard.azurecast_base_url_label": "AzureCast Base URL",
"radio.wizard.azurecast_base_url_hint": "The base URL of your AzureCast server. Auto-detected if left empty.",
"radio.wizard.azurecast_station_id_label": "Station ID",
"radio.wizard.azurecast_station_id_hint": "The station ID in AzureCast (default: 1)",
"radio.wizard.enable_now_playing": "Enable Now Playing",
"radio.wizard.now_playing_api_label": "Now Playing API URL",
"radio.wizard.now_playing_api_hint": "API endpoint that returns the current song. Usually auto-detected.",
"radio.wizard.enable_listeners": "Enable Listeners Counter",
"radio.wizard.listeners_api_label": "Listeners API URL",
"radio.wizard.listeners_api_hint": "API endpoint that returns the listener count.",
"radio.wizard.enable_current_dj": "Show Current DJ",
"radio.wizard.detected": "detected!",
"radio.wizard.detected_desc": "API endpoints were automatically found and filled in.",
"radio.wizard.not_detected": "No automatic detection",
"radio.wizard.not_detected_desc": "Fill in the API URLs manually or skip this step.",
"radio.wizard.section_community": "Community Features",
"radio.wizard.feature_shouts": "Shouts",
"radio.wizard.feature_shouts_desc": "Leave messages",
"radio.wizard.feature_applications": "DJ Applications",
"radio.wizard.feature_applications_desc": "Apply as DJ",
"radio.wizard.feature_requests": "Song Requests",
"radio.wizard.feature_requests_desc": "Request songs",
"radio.wizard.section_display": "Display",
"radio.wizard.feature_widget": "Radio Widget",
"radio.wizard.feature_widget_desc": "Mini player on the site",
"radio.wizard.feature_widget_global": "Widget Everywhere",
"radio.wizard.feature_widget_global_desc": "Show on all pages",
"radio.wizard.widget_position_label": "Widget Position",
"radio.wizard.position_bottom_right": "Bottom Right",
"radio.wizard.position_bottom_left": "Bottom Left",
"radio.wizard.position_top_right": "Top Right",
"radio.wizard.position_top_left": "Top Left",
"radio.wizard.section_gamification": "Gamification",
"radio.wizard.feature_points": "Points System",
"radio.wizard.feature_points_desc": "Earn points by listening",
"radio.wizard.feature_contests": "Contests",
"radio.wizard.feature_contests_desc": "Organize competitions",
"radio.wizard.feature_giveaways": "Giveaways",
"radio.wizard.feature_giveaways_desc": "Give away prizes",
"radio.wizard.section_integrations": "Integrations",
"radio.wizard.feature_discord": "Discord Notifications",
"radio.wizard.feature_discord_desc": "Notifications when DJ goes live / song changes",
"radio.wizard.discord_webhook_label": "Discord Webhook URL",
"radio.wizard.discord_webhook_hint": "Create a webhook in your Discord server channel.",
"radio.wizard.test_title": "Test Connection",
"radio.wizard.test_desc": "Click Test Connection to check if your stream and APIs are reachable.",
"radio.wizard.test_loading": "Testing connection...",
"radio.wizard.test_prompt": "Click the button to test the connection.",
"radio.wizard.test_button": "Test Connection",
"radio.wizard.test_retry": "Test Again",
"radio.wizard.settings_overview": "Settings Overview",
"radio.wizard.settings_overview_desc": "These are the settings that will be saved:",
"radio.wizard.install_confirm": "Are you sure you want to install the radio with these settings?",
"radio.wizard.install_button": "Install Radio",
"radio.wizard.test_result_stream": "Stream Connection",
"radio.wizard.test_result_now_playing": "Now Playing",
"radio.wizard.test_result_listeners": "Listeners",
"radio.wizard.status_success": "Success",
"radio.wizard.status_warning": "Warning",
"radio.wizard.status_error": "Error",
"radio.wizard.status_skipped": "Skipped",
"radio.wizard.status_untested": "Not tested",
"radio.wizard.content_type": "Content-Type",
"radio.wizard.http_status": "HTTP Status",
"radio.wizard.song": "Song",
"radio.wizard.artist": "Artist",
"radio.wizard.listeners": "Listeners",
"radio.wizard.api_url": "API URL",
"radio.wizard.test_stream_ok": "Stream is reachable! You can install the radio.",
"radio.wizard.test_stream_fail": "Stream is not reachable. Check the URL and try again.",
"radio.wizard.test_not_run": "Not tested yet.",
"radio.wizard.test_connection_fail": "Could not run test: ",
"radio.wizard.error": "Error",
"radio.wizard.unknown_error": "Unknown error"
}
+118 -2
View File
@@ -1389,5 +1389,121 @@
"Thumbnails URL": "Thumbnails URL",
"Group Homepage": "Group Homepage",
"Habbopages URL": "Habbopages URL",
"URL Prefix": "URL Prefix"
}
"URL Prefix": "URL Prefix",
"radio.wizard.title": "Radio Installation Wizard",
"radio.wizard.step_short": "Step",
"radio.wizard.step_prefix": "Step",
"radio.wizard.of": "of",
"radio.wizard.next_step": "Next Step →",
"radio.wizard.previous_step": "← Previous Step",
"radio.wizard.back_to_setup": "Back to setup",
"radio.wizard.step1_label": "Platform",
"radio.wizard.step2_label": "Stream",
"radio.wizard.step3_label": "API",
"radio.wizard.step4_label": "Features",
"radio.wizard.step5_label": "Test",
"radio.wizard.step1_subtitle": "Choose your streaming platform",
"radio.wizard.step2_title": "Stream Configuration",
"radio.wizard.step3_title": "API Configuration",
"radio.wizard.step3_subtitle": "Now Playing & Listeners",
"radio.wizard.step4_title": "Configure Features",
"radio.wizard.step4_subtitle": "Choose which radio features to enable",
"radio.wizard.step5_title": "Test & Install",
"radio.wizard.step5_subtitle": "Check the connection and complete the installation",
"radio.wizard.platform_shoutcast": "SHOUTcast",
"radio.wizard.platform_shoutcast_desc": "For SHOUTcast servers. Auto-detection of now playing and listeners via stats endpoint.",
"radio.wizard.platform_icecast": "Icecast",
"radio.wizard.platform_icecast_desc": "For Icecast servers. Uses status-json.xsl for auto-detection.",
"radio.wizard.platform_azurecast": "AzureCast",
"radio.wizard.platform_azurecast_desc": "AzureCast hosting. Full API integration with now-playing, listeners and auto-configuration.",
"radio.wizard.platform_other": "Other",
"radio.wizard.platform_other_desc": "Another stream provider. Manual configuration of stream URL and API endpoints.",
"radio.wizard.shoutcast_info_title": "SHOUTcast",
"radio.wizard.shoutcast_info_desc": "Enter your SHOUTcast stream URL. The wizard will try to find the stats endpoint automatically.",
"radio.wizard.icecast_info_title": "Icecast",
"radio.wizard.icecast_info_desc": "Enter your Icecast stream URL. The wizard uses status-json.xsl for auto-detection.",
"radio.wizard.azurecast_info_title": "AzureCast",
"radio.wizard.azurecast_info_desc": "AzureCast stream URL + server configuration. The wizard configures everything via the AzureCast API.",
"radio.wizard.other_info_title": "Other Stream",
"radio.wizard.other_info_desc": "Enter your stream URL. You can manually configure API endpoints for now playing and listeners later.",
"radio.wizard.stream_url_label": "Stream URL *",
"radio.wizard.stream_url_hint": "The direct URL to your audio stream (MP3, AAC, OGG, etc.)",
"radio.wizard.stream_name_label": "Stream Name",
"radio.wizard.stream_name_placeholder": "My Radio",
"radio.wizard.stream_name_hint": "A name for your radio stream (optional)",
"radio.wizard.azurecast_section": "AzureCast Server Configuration",
"radio.wizard.azurecast_base_url_label": "AzureCast Base URL",
"radio.wizard.azurecast_base_url_hint": "The base URL of your AzureCast server. Auto-detected if left empty.",
"radio.wizard.azurecast_station_id_label": "Station ID",
"radio.wizard.azurecast_station_id_hint": "The station ID in AzureCast (default: 1)",
"radio.wizard.enable_now_playing": "Enable Now Playing",
"radio.wizard.now_playing_api_label": "Now Playing API URL",
"radio.wizard.now_playing_api_hint": "API endpoint that returns the current song. Usually auto-detected.",
"radio.wizard.enable_listeners": "Enable Listeners Counter",
"radio.wizard.listeners_api_label": "Listeners API URL",
"radio.wizard.listeners_api_hint": "API endpoint that returns the listener count.",
"radio.wizard.enable_current_dj": "Show Current DJ",
"radio.wizard.detected": "detected!",
"radio.wizard.detected_desc": "API endpoints were automatically found and filled in.",
"radio.wizard.not_detected": "No automatic detection",
"radio.wizard.not_detected_desc": "Fill in the API URLs manually or skip this step.",
"radio.wizard.section_community": "Community Features",
"radio.wizard.feature_shouts": "Shouts",
"radio.wizard.feature_shouts_desc": "Leave messages",
"radio.wizard.feature_applications": "DJ Applications",
"radio.wizard.feature_applications_desc": "Apply as DJ",
"radio.wizard.feature_requests": "Song Requests",
"radio.wizard.feature_requests_desc": "Request songs",
"radio.wizard.section_display": "Display",
"radio.wizard.feature_widget": "Radio Widget",
"radio.wizard.feature_widget_desc": "Mini player on the site",
"radio.wizard.feature_widget_global": "Widget Everywhere",
"radio.wizard.feature_widget_global_desc": "Show on all pages",
"radio.wizard.widget_position_label": "Widget Position",
"radio.wizard.position_bottom_right": "Bottom Right",
"radio.wizard.position_bottom_left": "Bottom Left",
"radio.wizard.position_top_right": "Top Right",
"radio.wizard.position_top_left": "Top Left",
"radio.wizard.section_gamification": "Gamification",
"radio.wizard.feature_points": "Points System",
"radio.wizard.feature_points_desc": "Earn points by listening",
"radio.wizard.feature_contests": "Contests",
"radio.wizard.feature_contests_desc": "Organize competitions",
"radio.wizard.feature_giveaways": "Giveaways",
"radio.wizard.feature_giveaways_desc": "Give away prizes",
"radio.wizard.section_integrations": "Integrations",
"radio.wizard.feature_discord": "Discord Notifications",
"radio.wizard.feature_discord_desc": "Notifications when DJ goes live / song changes",
"radio.wizard.discord_webhook_label": "Discord Webhook URL",
"radio.wizard.discord_webhook_hint": "Create a webhook in your Discord server channel.",
"radio.wizard.test_title": "Test Connection",
"radio.wizard.test_desc": "Click Test Connection to check if your stream and APIs are reachable.",
"radio.wizard.test_loading": "Testing connection...",
"radio.wizard.test_prompt": "Click the button to test the connection.",
"radio.wizard.test_button": "Test Connection",
"radio.wizard.test_retry": "Test Again",
"radio.wizard.settings_overview": "Settings Overview",
"radio.wizard.settings_overview_desc": "These are the settings that will be saved:",
"radio.wizard.install_confirm": "Are you sure you want to install the radio with these settings?",
"radio.wizard.install_button": "Install Radio",
"radio.wizard.test_result_stream": "Stream Connection",
"radio.wizard.test_result_now_playing": "Now Playing",
"radio.wizard.test_result_listeners": "Listeners",
"radio.wizard.status_success": "Success",
"radio.wizard.status_warning": "Warning",
"radio.wizard.status_error": "Error",
"radio.wizard.status_skipped": "Skipped",
"radio.wizard.status_untested": "Not tested",
"radio.wizard.content_type": "Content-Type",
"radio.wizard.http_status": "HTTP Status",
"radio.wizard.song": "Song",
"radio.wizard.artist": "Artist",
"radio.wizard.listeners": "Listeners",
"radio.wizard.api_url": "API URL",
"radio.wizard.test_stream_ok": "Stream is reachable! You can install the radio.",
"radio.wizard.test_stream_fail": "Stream is not reachable. Check the URL and try again.",
"radio.wizard.test_not_run": "Not tested yet.",
"radio.wizard.test_connection_fail": "Could not run test: ",
"radio.wizard.error": "Error",
"radio.wizard.unknown_error": "Unknown error"
}
+118 -2
View File
@@ -1389,5 +1389,121 @@
"Thumbnails URL": "Thumbnails URL",
"Group Homepage": "Group Homepage",
"Habbopages URL": "Habbopages URL",
"URL Prefix": "URL Prefix"
}
"URL Prefix": "URL Prefix",
"radio.wizard.title": "Radio Installation Wizard",
"radio.wizard.step_short": "Step",
"radio.wizard.step_prefix": "Step",
"radio.wizard.of": "of",
"radio.wizard.next_step": "Next Step →",
"radio.wizard.previous_step": "← Previous Step",
"radio.wizard.back_to_setup": "Back to setup",
"radio.wizard.step1_label": "Platform",
"radio.wizard.step2_label": "Stream",
"radio.wizard.step3_label": "API",
"radio.wizard.step4_label": "Features",
"radio.wizard.step5_label": "Test",
"radio.wizard.step1_subtitle": "Choose your streaming platform",
"radio.wizard.step2_title": "Stream Configuration",
"radio.wizard.step3_title": "API Configuration",
"radio.wizard.step3_subtitle": "Now Playing & Listeners",
"radio.wizard.step4_title": "Configure Features",
"radio.wizard.step4_subtitle": "Choose which radio features to enable",
"radio.wizard.step5_title": "Test & Install",
"radio.wizard.step5_subtitle": "Check the connection and complete the installation",
"radio.wizard.platform_shoutcast": "SHOUTcast",
"radio.wizard.platform_shoutcast_desc": "For SHOUTcast servers. Auto-detection of now playing and listeners via stats endpoint.",
"radio.wizard.platform_icecast": "Icecast",
"radio.wizard.platform_icecast_desc": "For Icecast servers. Uses status-json.xsl for auto-detection.",
"radio.wizard.platform_azurecast": "AzureCast",
"radio.wizard.platform_azurecast_desc": "AzureCast hosting. Full API integration with now-playing, listeners and auto-configuration.",
"radio.wizard.platform_other": "Other",
"radio.wizard.platform_other_desc": "Another stream provider. Manual configuration of stream URL and API endpoints.",
"radio.wizard.shoutcast_info_title": "SHOUTcast",
"radio.wizard.shoutcast_info_desc": "Enter your SHOUTcast stream URL. The wizard will try to find the stats endpoint automatically.",
"radio.wizard.icecast_info_title": "Icecast",
"radio.wizard.icecast_info_desc": "Enter your Icecast stream URL. The wizard uses status-json.xsl for auto-detection.",
"radio.wizard.azurecast_info_title": "AzureCast",
"radio.wizard.azurecast_info_desc": "AzureCast stream URL + server configuration. The wizard configures everything via the AzureCast API.",
"radio.wizard.other_info_title": "Other Stream",
"radio.wizard.other_info_desc": "Enter your stream URL. You can manually configure API endpoints for now playing and listeners later.",
"radio.wizard.stream_url_label": "Stream URL *",
"radio.wizard.stream_url_hint": "The direct URL to your audio stream (MP3, AAC, OGG, etc.)",
"radio.wizard.stream_name_label": "Stream Name",
"radio.wizard.stream_name_placeholder": "My Radio",
"radio.wizard.stream_name_hint": "A name for your radio stream (optional)",
"radio.wizard.azurecast_section": "AzureCast Server Configuration",
"radio.wizard.azurecast_base_url_label": "AzureCast Base URL",
"radio.wizard.azurecast_base_url_hint": "The base URL of your AzureCast server. Auto-detected if left empty.",
"radio.wizard.azurecast_station_id_label": "Station ID",
"radio.wizard.azurecast_station_id_hint": "The station ID in AzureCast (default: 1)",
"radio.wizard.enable_now_playing": "Enable Now Playing",
"radio.wizard.now_playing_api_label": "Now Playing API URL",
"radio.wizard.now_playing_api_hint": "API endpoint that returns the current song. Usually auto-detected.",
"radio.wizard.enable_listeners": "Enable Listeners Counter",
"radio.wizard.listeners_api_label": "Listeners API URL",
"radio.wizard.listeners_api_hint": "API endpoint that returns the listener count.",
"radio.wizard.enable_current_dj": "Show Current DJ",
"radio.wizard.detected": "detected!",
"radio.wizard.detected_desc": "API endpoints were automatically found and filled in.",
"radio.wizard.not_detected": "No automatic detection",
"radio.wizard.not_detected_desc": "Fill in the API URLs manually or skip this step.",
"radio.wizard.section_community": "Community Features",
"radio.wizard.feature_shouts": "Shouts",
"radio.wizard.feature_shouts_desc": "Leave messages",
"radio.wizard.feature_applications": "DJ Applications",
"radio.wizard.feature_applications_desc": "Apply as DJ",
"radio.wizard.feature_requests": "Song Requests",
"radio.wizard.feature_requests_desc": "Request songs",
"radio.wizard.section_display": "Display",
"radio.wizard.feature_widget": "Radio Widget",
"radio.wizard.feature_widget_desc": "Mini player on the site",
"radio.wizard.feature_widget_global": "Widget Everywhere",
"radio.wizard.feature_widget_global_desc": "Show on all pages",
"radio.wizard.widget_position_label": "Widget Position",
"radio.wizard.position_bottom_right": "Bottom Right",
"radio.wizard.position_bottom_left": "Bottom Left",
"radio.wizard.position_top_right": "Top Right",
"radio.wizard.position_top_left": "Top Left",
"radio.wizard.section_gamification": "Gamification",
"radio.wizard.feature_points": "Points System",
"radio.wizard.feature_points_desc": "Earn points by listening",
"radio.wizard.feature_contests": "Contests",
"radio.wizard.feature_contests_desc": "Organize competitions",
"radio.wizard.feature_giveaways": "Giveaways",
"radio.wizard.feature_giveaways_desc": "Give away prizes",
"radio.wizard.section_integrations": "Integrations",
"radio.wizard.feature_discord": "Discord Notifications",
"radio.wizard.feature_discord_desc": "Notifications when DJ goes live / song changes",
"radio.wizard.discord_webhook_label": "Discord Webhook URL",
"radio.wizard.discord_webhook_hint": "Create a webhook in your Discord server channel.",
"radio.wizard.test_title": "Test Connection",
"radio.wizard.test_desc": "Click Test Connection to check if your stream and APIs are reachable.",
"radio.wizard.test_loading": "Testing connection...",
"radio.wizard.test_prompt": "Click the button to test the connection.",
"radio.wizard.test_button": "Test Connection",
"radio.wizard.test_retry": "Test Again",
"radio.wizard.settings_overview": "Settings Overview",
"radio.wizard.settings_overview_desc": "These are the settings that will be saved:",
"radio.wizard.install_confirm": "Are you sure you want to install the radio with these settings?",
"radio.wizard.install_button": "Install Radio",
"radio.wizard.test_result_stream": "Stream Connection",
"radio.wizard.test_result_now_playing": "Now Playing",
"radio.wizard.test_result_listeners": "Listeners",
"radio.wizard.status_success": "Success",
"radio.wizard.status_warning": "Warning",
"radio.wizard.status_error": "Error",
"radio.wizard.status_skipped": "Skipped",
"radio.wizard.status_untested": "Not tested",
"radio.wizard.content_type": "Content-Type",
"radio.wizard.http_status": "HTTP Status",
"radio.wizard.song": "Song",
"radio.wizard.artist": "Artist",
"radio.wizard.listeners": "Listeners",
"radio.wizard.api_url": "API URL",
"radio.wizard.test_stream_ok": "Stream is reachable! You can install the radio.",
"radio.wizard.test_stream_fail": "Stream is not reachable. Check the URL and try again.",
"radio.wizard.test_not_run": "Not tested yet.",
"radio.wizard.test_connection_fail": "Could not run test: ",
"radio.wizard.error": "Error",
"radio.wizard.unknown_error": "Unknown error"
}
+118 -2
View File
@@ -1389,5 +1389,121 @@
"Thumbnails URL": "Thumbnails URL",
"Group Homepage": "Group Homepage",
"Habbopages URL": "Habbopages URL",
"URL Prefix": "URL Prefix"
}
"URL Prefix": "URL Prefix",
"radio.wizard.title": "Radio Installation Wizard",
"radio.wizard.step_short": "Step",
"radio.wizard.step_prefix": "Step",
"radio.wizard.of": "of",
"radio.wizard.next_step": "Next Step →",
"radio.wizard.previous_step": "← Previous Step",
"radio.wizard.back_to_setup": "Back to setup",
"radio.wizard.step1_label": "Platform",
"radio.wizard.step2_label": "Stream",
"radio.wizard.step3_label": "API",
"radio.wizard.step4_label": "Features",
"radio.wizard.step5_label": "Test",
"radio.wizard.step1_subtitle": "Choose your streaming platform",
"radio.wizard.step2_title": "Stream Configuration",
"radio.wizard.step3_title": "API Configuration",
"radio.wizard.step3_subtitle": "Now Playing & Listeners",
"radio.wizard.step4_title": "Configure Features",
"radio.wizard.step4_subtitle": "Choose which radio features to enable",
"radio.wizard.step5_title": "Test & Install",
"radio.wizard.step5_subtitle": "Check the connection and complete the installation",
"radio.wizard.platform_shoutcast": "SHOUTcast",
"radio.wizard.platform_shoutcast_desc": "For SHOUTcast servers. Auto-detection of now playing and listeners via stats endpoint.",
"radio.wizard.platform_icecast": "Icecast",
"radio.wizard.platform_icecast_desc": "For Icecast servers. Uses status-json.xsl for auto-detection.",
"radio.wizard.platform_azurecast": "AzureCast",
"radio.wizard.platform_azurecast_desc": "AzureCast hosting. Full API integration with now-playing, listeners and auto-configuration.",
"radio.wizard.platform_other": "Other",
"radio.wizard.platform_other_desc": "Another stream provider. Manual configuration of stream URL and API endpoints.",
"radio.wizard.shoutcast_info_title": "SHOUTcast",
"radio.wizard.shoutcast_info_desc": "Enter your SHOUTcast stream URL. The wizard will try to find the stats endpoint automatically.",
"radio.wizard.icecast_info_title": "Icecast",
"radio.wizard.icecast_info_desc": "Enter your Icecast stream URL. The wizard uses status-json.xsl for auto-detection.",
"radio.wizard.azurecast_info_title": "AzureCast",
"radio.wizard.azurecast_info_desc": "AzureCast stream URL + server configuration. The wizard configures everything via the AzureCast API.",
"radio.wizard.other_info_title": "Other Stream",
"radio.wizard.other_info_desc": "Enter your stream URL. You can manually configure API endpoints for now playing and listeners later.",
"radio.wizard.stream_url_label": "Stream URL *",
"radio.wizard.stream_url_hint": "The direct URL to your audio stream (MP3, AAC, OGG, etc.)",
"radio.wizard.stream_name_label": "Stream Name",
"radio.wizard.stream_name_placeholder": "My Radio",
"radio.wizard.stream_name_hint": "A name for your radio stream (optional)",
"radio.wizard.azurecast_section": "AzureCast Server Configuration",
"radio.wizard.azurecast_base_url_label": "AzureCast Base URL",
"radio.wizard.azurecast_base_url_hint": "The base URL of your AzureCast server. Auto-detected if left empty.",
"radio.wizard.azurecast_station_id_label": "Station ID",
"radio.wizard.azurecast_station_id_hint": "The station ID in AzureCast (default: 1)",
"radio.wizard.enable_now_playing": "Enable Now Playing",
"radio.wizard.now_playing_api_label": "Now Playing API URL",
"radio.wizard.now_playing_api_hint": "API endpoint that returns the current song. Usually auto-detected.",
"radio.wizard.enable_listeners": "Enable Listeners Counter",
"radio.wizard.listeners_api_label": "Listeners API URL",
"radio.wizard.listeners_api_hint": "API endpoint that returns the listener count.",
"radio.wizard.enable_current_dj": "Show Current DJ",
"radio.wizard.detected": "detected!",
"radio.wizard.detected_desc": "API endpoints were automatically found and filled in.",
"radio.wizard.not_detected": "No automatic detection",
"radio.wizard.not_detected_desc": "Fill in the API URLs manually or skip this step.",
"radio.wizard.section_community": "Community Features",
"radio.wizard.feature_shouts": "Shouts",
"radio.wizard.feature_shouts_desc": "Leave messages",
"radio.wizard.feature_applications": "DJ Applications",
"radio.wizard.feature_applications_desc": "Apply as DJ",
"radio.wizard.feature_requests": "Song Requests",
"radio.wizard.feature_requests_desc": "Request songs",
"radio.wizard.section_display": "Display",
"radio.wizard.feature_widget": "Radio Widget",
"radio.wizard.feature_widget_desc": "Mini player on the site",
"radio.wizard.feature_widget_global": "Widget Everywhere",
"radio.wizard.feature_widget_global_desc": "Show on all pages",
"radio.wizard.widget_position_label": "Widget Position",
"radio.wizard.position_bottom_right": "Bottom Right",
"radio.wizard.position_bottom_left": "Bottom Left",
"radio.wizard.position_top_right": "Top Right",
"radio.wizard.position_top_left": "Top Left",
"radio.wizard.section_gamification": "Gamification",
"radio.wizard.feature_points": "Points System",
"radio.wizard.feature_points_desc": "Earn points by listening",
"radio.wizard.feature_contests": "Contests",
"radio.wizard.feature_contests_desc": "Organize competitions",
"radio.wizard.feature_giveaways": "Giveaways",
"radio.wizard.feature_giveaways_desc": "Give away prizes",
"radio.wizard.section_integrations": "Integrations",
"radio.wizard.feature_discord": "Discord Notifications",
"radio.wizard.feature_discord_desc": "Notifications when DJ goes live / song changes",
"radio.wizard.discord_webhook_label": "Discord Webhook URL",
"radio.wizard.discord_webhook_hint": "Create a webhook in your Discord server channel.",
"radio.wizard.test_title": "Test Connection",
"radio.wizard.test_desc": "Click Test Connection to check if your stream and APIs are reachable.",
"radio.wizard.test_loading": "Testing connection...",
"radio.wizard.test_prompt": "Click the button to test the connection.",
"radio.wizard.test_button": "Test Connection",
"radio.wizard.test_retry": "Test Again",
"radio.wizard.settings_overview": "Settings Overview",
"radio.wizard.settings_overview_desc": "These are the settings that will be saved:",
"radio.wizard.install_confirm": "Are you sure you want to install the radio with these settings?",
"radio.wizard.install_button": "Install Radio",
"radio.wizard.test_result_stream": "Stream Connection",
"radio.wizard.test_result_now_playing": "Now Playing",
"radio.wizard.test_result_listeners": "Listeners",
"radio.wizard.status_success": "Success",
"radio.wizard.status_warning": "Warning",
"radio.wizard.status_error": "Error",
"radio.wizard.status_skipped": "Skipped",
"radio.wizard.status_untested": "Not tested",
"radio.wizard.content_type": "Content-Type",
"radio.wizard.http_status": "HTTP Status",
"radio.wizard.song": "Song",
"radio.wizard.artist": "Artist",
"radio.wizard.listeners": "Listeners",
"radio.wizard.api_url": "API URL",
"radio.wizard.test_stream_ok": "Stream is reachable! You can install the radio.",
"radio.wizard.test_stream_fail": "Stream is not reachable. Check the URL and try again.",
"radio.wizard.test_not_run": "Not tested yet.",
"radio.wizard.test_connection_fail": "Could not run test: ",
"radio.wizard.error": "Error",
"radio.wizard.unknown_error": "Unknown error"
}
+118 -2
View File
@@ -1395,5 +1395,121 @@
"Thumbnails URL": "Vorschaubilder URL",
"Group Homepage": "Gruppen Startseite",
"Habbopages URL": "Habbopages URL",
"URL Prefix": "URL Präfix"
}
"URL Prefix": "URL Präfix",
"radio.wizard.title": "Radio Installation Wizard",
"radio.wizard.step_short": "Step",
"radio.wizard.step_prefix": "Step",
"radio.wizard.of": "of",
"radio.wizard.next_step": "Next Step →",
"radio.wizard.previous_step": "← Previous Step",
"radio.wizard.back_to_setup": "Back to setup",
"radio.wizard.step1_label": "Platform",
"radio.wizard.step2_label": "Stream",
"radio.wizard.step3_label": "API",
"radio.wizard.step4_label": "Features",
"radio.wizard.step5_label": "Test",
"radio.wizard.step1_subtitle": "Choose your streaming platform",
"radio.wizard.step2_title": "Stream Configuration",
"radio.wizard.step3_title": "API Configuration",
"radio.wizard.step3_subtitle": "Now Playing & Listeners",
"radio.wizard.step4_title": "Configure Features",
"radio.wizard.step4_subtitle": "Choose which radio features to enable",
"radio.wizard.step5_title": "Test & Install",
"radio.wizard.step5_subtitle": "Check the connection and complete the installation",
"radio.wizard.platform_shoutcast": "SHOUTcast",
"radio.wizard.platform_shoutcast_desc": "For SHOUTcast servers. Auto-detection of now playing and listeners via stats endpoint.",
"radio.wizard.platform_icecast": "Icecast",
"radio.wizard.platform_icecast_desc": "For Icecast servers. Uses status-json.xsl for auto-detection.",
"radio.wizard.platform_azurecast": "AzureCast",
"radio.wizard.platform_azurecast_desc": "AzureCast hosting. Full API integration with now-playing, listeners and auto-configuration.",
"radio.wizard.platform_other": "Other",
"radio.wizard.platform_other_desc": "Another stream provider. Manual configuration of stream URL and API endpoints.",
"radio.wizard.shoutcast_info_title": "SHOUTcast",
"radio.wizard.shoutcast_info_desc": "Enter your SHOUTcast stream URL. The wizard will try to find the stats endpoint automatically.",
"radio.wizard.icecast_info_title": "Icecast",
"radio.wizard.icecast_info_desc": "Enter your Icecast stream URL. The wizard uses status-json.xsl for auto-detection.",
"radio.wizard.azurecast_info_title": "AzureCast",
"radio.wizard.azurecast_info_desc": "AzureCast stream URL + server configuration. The wizard configures everything via the AzureCast API.",
"radio.wizard.other_info_title": "Other Stream",
"radio.wizard.other_info_desc": "Enter your stream URL. You can manually configure API endpoints for now playing and listeners later.",
"radio.wizard.stream_url_label": "Stream URL *",
"radio.wizard.stream_url_hint": "The direct URL to your audio stream (MP3, AAC, OGG, etc.)",
"radio.wizard.stream_name_label": "Stream Name",
"radio.wizard.stream_name_placeholder": "My Radio",
"radio.wizard.stream_name_hint": "A name for your radio stream (optional)",
"radio.wizard.azurecast_section": "AzureCast Server Configuration",
"radio.wizard.azurecast_base_url_label": "AzureCast Base URL",
"radio.wizard.azurecast_base_url_hint": "The base URL of your AzureCast server. Auto-detected if left empty.",
"radio.wizard.azurecast_station_id_label": "Station ID",
"radio.wizard.azurecast_station_id_hint": "The station ID in AzureCast (default: 1)",
"radio.wizard.enable_now_playing": "Enable Now Playing",
"radio.wizard.now_playing_api_label": "Now Playing API URL",
"radio.wizard.now_playing_api_hint": "API endpoint that returns the current song. Usually auto-detected.",
"radio.wizard.enable_listeners": "Enable Listeners Counter",
"radio.wizard.listeners_api_label": "Listeners API URL",
"radio.wizard.listeners_api_hint": "API endpoint that returns the listener count.",
"radio.wizard.enable_current_dj": "Show Current DJ",
"radio.wizard.detected": "detected!",
"radio.wizard.detected_desc": "API endpoints were automatically found and filled in.",
"radio.wizard.not_detected": "No automatic detection",
"radio.wizard.not_detected_desc": "Fill in the API URLs manually or skip this step.",
"radio.wizard.section_community": "Community Features",
"radio.wizard.feature_shouts": "Shouts",
"radio.wizard.feature_shouts_desc": "Leave messages",
"radio.wizard.feature_applications": "DJ Applications",
"radio.wizard.feature_applications_desc": "Apply as DJ",
"radio.wizard.feature_requests": "Song Requests",
"radio.wizard.feature_requests_desc": "Request songs",
"radio.wizard.section_display": "Display",
"radio.wizard.feature_widget": "Radio Widget",
"radio.wizard.feature_widget_desc": "Mini player on the site",
"radio.wizard.feature_widget_global": "Widget Everywhere",
"radio.wizard.feature_widget_global_desc": "Show on all pages",
"radio.wizard.widget_position_label": "Widget Position",
"radio.wizard.position_bottom_right": "Bottom Right",
"radio.wizard.position_bottom_left": "Bottom Left",
"radio.wizard.position_top_right": "Top Right",
"radio.wizard.position_top_left": "Top Left",
"radio.wizard.section_gamification": "Gamification",
"radio.wizard.feature_points": "Points System",
"radio.wizard.feature_points_desc": "Earn points by listening",
"radio.wizard.feature_contests": "Contests",
"radio.wizard.feature_contests_desc": "Organize competitions",
"radio.wizard.feature_giveaways": "Giveaways",
"radio.wizard.feature_giveaways_desc": "Give away prizes",
"radio.wizard.section_integrations": "Integrations",
"radio.wizard.feature_discord": "Discord Notifications",
"radio.wizard.feature_discord_desc": "Notifications when DJ goes live / song changes",
"radio.wizard.discord_webhook_label": "Discord Webhook URL",
"radio.wizard.discord_webhook_hint": "Create a webhook in your Discord server channel.",
"radio.wizard.test_title": "Test Connection",
"radio.wizard.test_desc": "Click Test Connection to check if your stream and APIs are reachable.",
"radio.wizard.test_loading": "Testing connection...",
"radio.wizard.test_prompt": "Click the button to test the connection.",
"radio.wizard.test_button": "Test Connection",
"radio.wizard.test_retry": "Test Again",
"radio.wizard.settings_overview": "Settings Overview",
"radio.wizard.settings_overview_desc": "These are the settings that will be saved:",
"radio.wizard.install_confirm": "Are you sure you want to install the radio with these settings?",
"radio.wizard.install_button": "Install Radio",
"radio.wizard.test_result_stream": "Stream Connection",
"radio.wizard.test_result_now_playing": "Now Playing",
"radio.wizard.test_result_listeners": "Listeners",
"radio.wizard.status_success": "Success",
"radio.wizard.status_warning": "Warning",
"radio.wizard.status_error": "Error",
"radio.wizard.status_skipped": "Skipped",
"radio.wizard.status_untested": "Not tested",
"radio.wizard.content_type": "Content-Type",
"radio.wizard.http_status": "HTTP Status",
"radio.wizard.song": "Song",
"radio.wizard.artist": "Artist",
"radio.wizard.listeners": "Listeners",
"radio.wizard.api_url": "API URL",
"radio.wizard.test_stream_ok": "Stream is reachable! You can install the radio.",
"radio.wizard.test_stream_fail": "Stream is not reachable. Check the URL and try again.",
"radio.wizard.test_not_run": "Not tested yet.",
"radio.wizard.test_connection_fail": "Could not run test: ",
"radio.wizard.error": "Error",
"radio.wizard.unknown_error": "Unknown error"
}
+118 -2
View File
@@ -1389,5 +1389,121 @@
"Thumbnails URL": "Thumbnails URL",
"Group Homepage": "Group Homepage",
"Habbopages URL": "Habbopages URL",
"URL Prefix": "URL Prefix"
}
"URL Prefix": "URL Prefix",
"radio.wizard.title": "Radio Installation Wizard",
"radio.wizard.step_short": "Step",
"radio.wizard.step_prefix": "Step",
"radio.wizard.of": "of",
"radio.wizard.next_step": "Next Step →",
"radio.wizard.previous_step": "← Previous Step",
"radio.wizard.back_to_setup": "Back to setup",
"radio.wizard.step1_label": "Platform",
"radio.wizard.step2_label": "Stream",
"radio.wizard.step3_label": "API",
"radio.wizard.step4_label": "Features",
"radio.wizard.step5_label": "Test",
"radio.wizard.step1_subtitle": "Choose your streaming platform",
"radio.wizard.step2_title": "Stream Configuration",
"radio.wizard.step3_title": "API Configuration",
"radio.wizard.step3_subtitle": "Now Playing & Listeners",
"radio.wizard.step4_title": "Configure Features",
"radio.wizard.step4_subtitle": "Choose which radio features to enable",
"radio.wizard.step5_title": "Test & Install",
"radio.wizard.step5_subtitle": "Check the connection and complete the installation",
"radio.wizard.platform_shoutcast": "SHOUTcast",
"radio.wizard.platform_shoutcast_desc": "For SHOUTcast servers. Auto-detection of now playing and listeners via stats endpoint.",
"radio.wizard.platform_icecast": "Icecast",
"radio.wizard.platform_icecast_desc": "For Icecast servers. Uses status-json.xsl for auto-detection.",
"radio.wizard.platform_azurecast": "AzureCast",
"radio.wizard.platform_azurecast_desc": "AzureCast hosting. Full API integration with now-playing, listeners and auto-configuration.",
"radio.wizard.platform_other": "Other",
"radio.wizard.platform_other_desc": "Another stream provider. Manual configuration of stream URL and API endpoints.",
"radio.wizard.shoutcast_info_title": "SHOUTcast",
"radio.wizard.shoutcast_info_desc": "Enter your SHOUTcast stream URL. The wizard will try to find the stats endpoint automatically.",
"radio.wizard.icecast_info_title": "Icecast",
"radio.wizard.icecast_info_desc": "Enter your Icecast stream URL. The wizard uses status-json.xsl for auto-detection.",
"radio.wizard.azurecast_info_title": "AzureCast",
"radio.wizard.azurecast_info_desc": "AzureCast stream URL + server configuration. The wizard configures everything via the AzureCast API.",
"radio.wizard.other_info_title": "Other Stream",
"radio.wizard.other_info_desc": "Enter your stream URL. You can manually configure API endpoints for now playing and listeners later.",
"radio.wizard.stream_url_label": "Stream URL *",
"radio.wizard.stream_url_hint": "The direct URL to your audio stream (MP3, AAC, OGG, etc.)",
"radio.wizard.stream_name_label": "Stream Name",
"radio.wizard.stream_name_placeholder": "My Radio",
"radio.wizard.stream_name_hint": "A name for your radio stream (optional)",
"radio.wizard.azurecast_section": "AzureCast Server Configuration",
"radio.wizard.azurecast_base_url_label": "AzureCast Base URL",
"radio.wizard.azurecast_base_url_hint": "The base URL of your AzureCast server. Auto-detected if left empty.",
"radio.wizard.azurecast_station_id_label": "Station ID",
"radio.wizard.azurecast_station_id_hint": "The station ID in AzureCast (default: 1)",
"radio.wizard.enable_now_playing": "Enable Now Playing",
"radio.wizard.now_playing_api_label": "Now Playing API URL",
"radio.wizard.now_playing_api_hint": "API endpoint that returns the current song. Usually auto-detected.",
"radio.wizard.enable_listeners": "Enable Listeners Counter",
"radio.wizard.listeners_api_label": "Listeners API URL",
"radio.wizard.listeners_api_hint": "API endpoint that returns the listener count.",
"radio.wizard.enable_current_dj": "Show Current DJ",
"radio.wizard.detected": "detected!",
"radio.wizard.detected_desc": "API endpoints were automatically found and filled in.",
"radio.wizard.not_detected": "No automatic detection",
"radio.wizard.not_detected_desc": "Fill in the API URLs manually or skip this step.",
"radio.wizard.section_community": "Community Features",
"radio.wizard.feature_shouts": "Shouts",
"radio.wizard.feature_shouts_desc": "Leave messages",
"radio.wizard.feature_applications": "DJ Applications",
"radio.wizard.feature_applications_desc": "Apply as DJ",
"radio.wizard.feature_requests": "Song Requests",
"radio.wizard.feature_requests_desc": "Request songs",
"radio.wizard.section_display": "Display",
"radio.wizard.feature_widget": "Radio Widget",
"radio.wizard.feature_widget_desc": "Mini player on the site",
"radio.wizard.feature_widget_global": "Widget Everywhere",
"radio.wizard.feature_widget_global_desc": "Show on all pages",
"radio.wizard.widget_position_label": "Widget Position",
"radio.wizard.position_bottom_right": "Bottom Right",
"radio.wizard.position_bottom_left": "Bottom Left",
"radio.wizard.position_top_right": "Top Right",
"radio.wizard.position_top_left": "Top Left",
"radio.wizard.section_gamification": "Gamification",
"radio.wizard.feature_points": "Points System",
"radio.wizard.feature_points_desc": "Earn points by listening",
"radio.wizard.feature_contests": "Contests",
"radio.wizard.feature_contests_desc": "Organize competitions",
"radio.wizard.feature_giveaways": "Giveaways",
"radio.wizard.feature_giveaways_desc": "Give away prizes",
"radio.wizard.section_integrations": "Integrations",
"radio.wizard.feature_discord": "Discord Notifications",
"radio.wizard.feature_discord_desc": "Notifications when DJ goes live / song changes",
"radio.wizard.discord_webhook_label": "Discord Webhook URL",
"radio.wizard.discord_webhook_hint": "Create a webhook in your Discord server channel.",
"radio.wizard.test_title": "Test Connection",
"radio.wizard.test_desc": "Click Test Connection to check if your stream and APIs are reachable.",
"radio.wizard.test_loading": "Testing connection...",
"radio.wizard.test_prompt": "Click the button to test the connection.",
"radio.wizard.test_button": "Test Connection",
"radio.wizard.test_retry": "Test Again",
"radio.wizard.settings_overview": "Settings Overview",
"radio.wizard.settings_overview_desc": "These are the settings that will be saved:",
"radio.wizard.install_confirm": "Are you sure you want to install the radio with these settings?",
"radio.wizard.install_button": "Install Radio",
"radio.wizard.test_result_stream": "Stream Connection",
"radio.wizard.test_result_now_playing": "Now Playing",
"radio.wizard.test_result_listeners": "Listeners",
"radio.wizard.status_success": "Success",
"radio.wizard.status_warning": "Warning",
"radio.wizard.status_error": "Error",
"radio.wizard.status_skipped": "Skipped",
"radio.wizard.status_untested": "Not tested",
"radio.wizard.content_type": "Content-Type",
"radio.wizard.http_status": "HTTP Status",
"radio.wizard.song": "Song",
"radio.wizard.artist": "Artist",
"radio.wizard.listeners": "Listeners",
"radio.wizard.api_url": "API URL",
"radio.wizard.test_stream_ok": "Stream is reachable! You can install the radio.",
"radio.wizard.test_stream_fail": "Stream is not reachable. Check the URL and try again.",
"radio.wizard.test_not_run": "Not tested yet.",
"radio.wizard.test_connection_fail": "Could not run test: ",
"radio.wizard.error": "Error",
"radio.wizard.unknown_error": "Unknown error"
}
+166 -1
View File
@@ -182,5 +182,170 @@
"commandocentrum.client": "Client",
"commandocentrum.renderer": "Renderer",
"commandocentrum.webroot_status": "Webroot",
"commandocentrum.rank": "Rank"
"commandocentrum.rank": "Rank",
"radio.title": "Radio",
"radio.music": "Music",
"radio.loading": "Loading...",
"radio.navigation_label": "Radio",
"radio.setup_page_title": "Radio Setup",
"radio.setup_page_subtitle": "Configure your radio system in one go",
"radio.setup.success_title": "Radio Installed!",
"radio.setup.success_body": "Radio system has been successfully installed and configured!",
"radio.setup.error_title": "Installation Failed",
"radio.setup.error_body": "An error occurred: :message",
"radio.setup.button_label": "Install Everything",
"radio.setup.modal_heading": "Install Radio?",
"radio.setup.modal_description": "This will configure all radio settings with default values.",
"radio.setup.modal_submit": "Yes, install!",
"radio.setup.tooltip": "Install the complete radio system",
"radio.setup_complete": "✅ Installation Complete!",
"radio.what_gets_configured": "What gets configured?",
"radio.radio_stream": "Radio Stream",
"radio.radio_stream_desc": "Set your stream URL with support for SHOUTcast, Icecast, AzureCast and other streaming platforms.",
"radio.points_system": "Points System",
"radio.points_system_desc": "Let users earn points by listening, requesting songs and participating in contests.",
"radio.community_features": "Community Features",
"radio.community_features_desc": "Shouts, song requests, DJ applications and more community interactions.",
"radio.dj_management": "DJ Management",
"radio.dj_management_desc": "DJ ranks, schedule, auto-detection and Sambroadcaster/Virtual DJ integration.",
"radio.monitoring": "Stream Monitoring",
"radio.monitoring_desc": "Monitor your stream uptime with real-time monitoring.",
"radio.display_options": "Display Options",
"radio.display_options_desc": "Widget, player styles, colors and custom CSS/JS.",
"radio.default_settings": "Default Settings",
"radio.radio_label": "Radio",
"radio.enabled": "Enabled",
"radio.points_label": "Points",
"radio.per_min": " per min",
"radio.daily_limit": "Daily limit",
"radio.shouts_label": "Shouts",
"radio.on": "On",
"radio.widget": "Widget",
"radio.global": "Global",
"radio.dj_apps": "DJ Applications",
"radio.open": "Open",
"radio.monitoring_label": "Monitoring",
"radio.contests_label": "Contests",
"radio.install_radio_system": "🚀 Install Radio System",
"radio.reset_settings": "Reset Settings",
"radio.reset_confirm": "Are you sure you want to reset all radio settings?",
"radio.go_to_radio_settings": "Go to Radio Settings",
"radio.open_wizard": "🎯 Open Radio Wizard",
"radio.wizard_desc": "Step-by-step wizard with connection test",
"radio.wizard.title": "Radio Installation Wizard",
"radio.wizard.step_short": "Step",
"radio.wizard.step_prefix": "Step",
"radio.wizard.of": "of",
"radio.wizard.next_step": "Next Step →",
"radio.wizard.previous_step": "← Previous Step",
"radio.wizard.back_to_setup": "Back to setup",
"radio.wizard.step1_label": "Platform",
"radio.wizard.step2_label": "Stream",
"radio.wizard.step3_label": "API",
"radio.wizard.step4_label": "Features",
"radio.wizard.step5_label": "Test",
"radio.wizard.step1_subtitle": "Choose your streaming platform",
"radio.wizard.step2_title": "Stream Configuration",
"radio.wizard.step3_title": "API Configuration",
"radio.wizard.step3_subtitle": "Now Playing & Listeners",
"radio.wizard.step4_title": "Configure Features",
"radio.wizard.step4_subtitle": "Choose which radio features to enable",
"radio.wizard.step5_title": "Test & Install",
"radio.wizard.step5_subtitle": "Check the connection and complete the installation",
"radio.wizard.platform_shoutcast": "SHOUTcast",
"radio.wizard.platform_shoutcast_desc": "For SHOUTcast servers. Auto-detection of now playing and listeners via stats endpoint.",
"radio.wizard.platform_icecast": "Icecast",
"radio.wizard.platform_icecast_desc": "For Icecast servers. Uses status-json.xsl for auto-detection.",
"radio.wizard.platform_azurecast": "AzureCast",
"radio.wizard.platform_azurecast_desc": "AzureCast hosting. Full API integration with now-playing, listeners and auto-configuration.",
"radio.wizard.platform_other": "Other",
"radio.wizard.platform_other_desc": "Another stream provider. Manual configuration of stream URL and API endpoints.",
"radio.wizard.shoutcast_info_title": "SHOUTcast",
"radio.wizard.shoutcast_info_desc": "Enter your SHOUTcast stream URL. The wizard will try to find the stats endpoint automatically.",
"radio.wizard.icecast_info_title": "Icecast",
"radio.wizard.icecast_info_desc": "Enter your Icecast stream URL. The wizard uses status-json.xsl for auto-detection.",
"radio.wizard.azurecast_info_title": "AzureCast",
"radio.wizard.azurecast_info_desc": "AzureCast stream URL + server configuration. The wizard configures everything via the AzureCast API.",
"radio.wizard.other_info_title": "Other Stream",
"radio.wizard.other_info_desc": "Enter your stream URL. You can manually configure API endpoints for now playing and listeners later.",
"radio.wizard.stream_url_label": "Stream URL *",
"radio.wizard.stream_url_hint": "The direct URL to your audio stream (MP3, AAC, OGG, etc.)",
"radio.wizard.stream_name_label": "Stream Name",
"radio.wizard.stream_name_placeholder": "My Radio",
"radio.wizard.stream_name_hint": "A name for your radio stream (optional)",
"radio.wizard.azurecast_section": "AzureCast Server Configuration",
"radio.wizard.azurecast_base_url_label": "AzureCast Base URL",
"radio.wizard.azurecast_base_url_hint": "The base URL of your AzureCast server. Auto-detected if left empty.",
"radio.wizard.azurecast_station_id_label": "Station ID",
"radio.wizard.azurecast_station_id_hint": "The station ID in AzureCast (default: 1)",
"radio.wizard.enable_now_playing": "Enable Now Playing",
"radio.wizard.now_playing_api_label": "Now Playing API URL",
"radio.wizard.now_playing_api_hint": "API endpoint that returns the current song. Usually auto-detected.",
"radio.wizard.enable_listeners": "Enable Listeners Counter",
"radio.wizard.listeners_api_label": "Listeners API URL",
"radio.wizard.listeners_api_hint": "API endpoint that returns the listener count.",
"radio.wizard.enable_current_dj": "Show Current DJ",
"radio.wizard.detected": "detected!",
"radio.wizard.detected_desc": "API endpoints were automatically found and filled in.",
"radio.wizard.not_detected": "No automatic detection",
"radio.wizard.not_detected_desc": "Fill in the API URLs manually or skip this step.",
"radio.wizard.section_community": "Community Features",
"radio.wizard.feature_shouts": "Shouts",
"radio.wizard.feature_shouts_desc": "Leave messages",
"radio.wizard.feature_applications": "DJ Applications",
"radio.wizard.feature_applications_desc": "Apply as DJ",
"radio.wizard.feature_requests": "Song Requests",
"radio.wizard.feature_requests_desc": "Request songs",
"radio.wizard.section_display": "Display",
"radio.wizard.feature_widget": "Radio Widget",
"radio.wizard.feature_widget_desc": "Mini player on the site",
"radio.wizard.feature_widget_global": "Widget Everywhere",
"radio.wizard.feature_widget_global_desc": "Show on all pages",
"radio.wizard.widget_position_label": "Widget Position",
"radio.wizard.position_bottom_right": "Bottom Right",
"radio.wizard.position_bottom_left": "Bottom Left",
"radio.wizard.position_top_right": "Top Right",
"radio.wizard.position_top_left": "Top Left",
"radio.wizard.section_gamification": "Gamification",
"radio.wizard.feature_points": "Points System",
"radio.wizard.feature_points_desc": "Earn points by listening",
"radio.wizard.feature_contests": "Contests",
"radio.wizard.feature_contests_desc": "Organize competitions",
"radio.wizard.feature_giveaways": "Giveaways",
"radio.wizard.feature_giveaways_desc": "Give away prizes",
"radio.wizard.section_integrations": "Integrations",
"radio.wizard.feature_discord": "Discord Notifications",
"radio.wizard.feature_discord_desc": "Notifications when DJ goes live / song changes",
"radio.wizard.discord_webhook_label": "Discord Webhook URL",
"radio.wizard.discord_webhook_hint": "Create a webhook in your Discord server channel.",
"radio.wizard.test_title": "Test Connection",
"radio.wizard.test_desc": "Click Test Connection to check if your stream and APIs are reachable.",
"radio.wizard.test_loading": "Testing connection...",
"radio.wizard.test_prompt": "Click the button to test the connection.",
"radio.wizard.test_button": "Test Connection",
"radio.wizard.test_retry": "Test Again",
"radio.wizard.settings_overview": "Settings Overview",
"radio.wizard.settings_overview_desc": "These are the settings that will be saved:",
"radio.wizard.install_confirm": "Are you sure you want to install the radio with these settings?",
"radio.wizard.install_button": "Install Radio",
"radio.wizard.test_result_stream": "Stream Connection",
"radio.wizard.test_result_now_playing": "Now Playing",
"radio.wizard.test_result_listeners": "Listeners",
"radio.wizard.status_success": "Success",
"radio.wizard.status_warning": "Warning",
"radio.wizard.status_error": "Error",
"radio.wizard.status_skipped": "Skipped",
"radio.wizard.status_untested": "Not tested",
"radio.wizard.content_type": "Content-Type",
"radio.wizard.http_status": "HTTP Status",
"radio.wizard.song": "Song",
"radio.wizard.artist": "Artist",
"radio.wizard.listeners": "Listeners",
"radio.wizard.api_url": "API URL",
"radio.wizard.test_stream_ok": "Stream is reachable! You can install the radio.",
"radio.wizard.test_stream_fail": "Stream is not reachable. Check the URL and try again.",
"radio.wizard.test_not_run": "Not tested yet.",
"radio.wizard.test_connection_fail": "Could not run test: ",
"radio.wizard.error": "Error",
"radio.wizard.unknown_error": "Unknown error"
}
+118 -2
View File
@@ -1395,5 +1395,121 @@
"Thumbnails URL": "URL Miniaturas",
"Group Homepage": "Página de grupo",
"Habbopages URL": "URL Habbopages",
"URL Prefix": "Prefijo URL"
}
"URL Prefix": "Prefijo URL",
"radio.wizard.title": "Radio Installation Wizard",
"radio.wizard.step_short": "Step",
"radio.wizard.step_prefix": "Step",
"radio.wizard.of": "of",
"radio.wizard.next_step": "Next Step →",
"radio.wizard.previous_step": "← Previous Step",
"radio.wizard.back_to_setup": "Back to setup",
"radio.wizard.step1_label": "Platform",
"radio.wizard.step2_label": "Stream",
"radio.wizard.step3_label": "API",
"radio.wizard.step4_label": "Features",
"radio.wizard.step5_label": "Test",
"radio.wizard.step1_subtitle": "Choose your streaming platform",
"radio.wizard.step2_title": "Stream Configuration",
"radio.wizard.step3_title": "API Configuration",
"radio.wizard.step3_subtitle": "Now Playing & Listeners",
"radio.wizard.step4_title": "Configure Features",
"radio.wizard.step4_subtitle": "Choose which radio features to enable",
"radio.wizard.step5_title": "Test & Install",
"radio.wizard.step5_subtitle": "Check the connection and complete the installation",
"radio.wizard.platform_shoutcast": "SHOUTcast",
"radio.wizard.platform_shoutcast_desc": "For SHOUTcast servers. Auto-detection of now playing and listeners via stats endpoint.",
"radio.wizard.platform_icecast": "Icecast",
"radio.wizard.platform_icecast_desc": "For Icecast servers. Uses status-json.xsl for auto-detection.",
"radio.wizard.platform_azurecast": "AzureCast",
"radio.wizard.platform_azurecast_desc": "AzureCast hosting. Full API integration with now-playing, listeners and auto-configuration.",
"radio.wizard.platform_other": "Other",
"radio.wizard.platform_other_desc": "Another stream provider. Manual configuration of stream URL and API endpoints.",
"radio.wizard.shoutcast_info_title": "SHOUTcast",
"radio.wizard.shoutcast_info_desc": "Enter your SHOUTcast stream URL. The wizard will try to find the stats endpoint automatically.",
"radio.wizard.icecast_info_title": "Icecast",
"radio.wizard.icecast_info_desc": "Enter your Icecast stream URL. The wizard uses status-json.xsl for auto-detection.",
"radio.wizard.azurecast_info_title": "AzureCast",
"radio.wizard.azurecast_info_desc": "AzureCast stream URL + server configuration. The wizard configures everything via the AzureCast API.",
"radio.wizard.other_info_title": "Other Stream",
"radio.wizard.other_info_desc": "Enter your stream URL. You can manually configure API endpoints for now playing and listeners later.",
"radio.wizard.stream_url_label": "Stream URL *",
"radio.wizard.stream_url_hint": "The direct URL to your audio stream (MP3, AAC, OGG, etc.)",
"radio.wizard.stream_name_label": "Stream Name",
"radio.wizard.stream_name_placeholder": "My Radio",
"radio.wizard.stream_name_hint": "A name for your radio stream (optional)",
"radio.wizard.azurecast_section": "AzureCast Server Configuration",
"radio.wizard.azurecast_base_url_label": "AzureCast Base URL",
"radio.wizard.azurecast_base_url_hint": "The base URL of your AzureCast server. Auto-detected if left empty.",
"radio.wizard.azurecast_station_id_label": "Station ID",
"radio.wizard.azurecast_station_id_hint": "The station ID in AzureCast (default: 1)",
"radio.wizard.enable_now_playing": "Enable Now Playing",
"radio.wizard.now_playing_api_label": "Now Playing API URL",
"radio.wizard.now_playing_api_hint": "API endpoint that returns the current song. Usually auto-detected.",
"radio.wizard.enable_listeners": "Enable Listeners Counter",
"radio.wizard.listeners_api_label": "Listeners API URL",
"radio.wizard.listeners_api_hint": "API endpoint that returns the listener count.",
"radio.wizard.enable_current_dj": "Show Current DJ",
"radio.wizard.detected": "detected!",
"radio.wizard.detected_desc": "API endpoints were automatically found and filled in.",
"radio.wizard.not_detected": "No automatic detection",
"radio.wizard.not_detected_desc": "Fill in the API URLs manually or skip this step.",
"radio.wizard.section_community": "Community Features",
"radio.wizard.feature_shouts": "Shouts",
"radio.wizard.feature_shouts_desc": "Leave messages",
"radio.wizard.feature_applications": "DJ Applications",
"radio.wizard.feature_applications_desc": "Apply as DJ",
"radio.wizard.feature_requests": "Song Requests",
"radio.wizard.feature_requests_desc": "Request songs",
"radio.wizard.section_display": "Display",
"radio.wizard.feature_widget": "Radio Widget",
"radio.wizard.feature_widget_desc": "Mini player on the site",
"radio.wizard.feature_widget_global": "Widget Everywhere",
"radio.wizard.feature_widget_global_desc": "Show on all pages",
"radio.wizard.widget_position_label": "Widget Position",
"radio.wizard.position_bottom_right": "Bottom Right",
"radio.wizard.position_bottom_left": "Bottom Left",
"radio.wizard.position_top_right": "Top Right",
"radio.wizard.position_top_left": "Top Left",
"radio.wizard.section_gamification": "Gamification",
"radio.wizard.feature_points": "Points System",
"radio.wizard.feature_points_desc": "Earn points by listening",
"radio.wizard.feature_contests": "Contests",
"radio.wizard.feature_contests_desc": "Organize competitions",
"radio.wizard.feature_giveaways": "Giveaways",
"radio.wizard.feature_giveaways_desc": "Give away prizes",
"radio.wizard.section_integrations": "Integrations",
"radio.wizard.feature_discord": "Discord Notifications",
"radio.wizard.feature_discord_desc": "Notifications when DJ goes live / song changes",
"radio.wizard.discord_webhook_label": "Discord Webhook URL",
"radio.wizard.discord_webhook_hint": "Create a webhook in your Discord server channel.",
"radio.wizard.test_title": "Test Connection",
"radio.wizard.test_desc": "Click Test Connection to check if your stream and APIs are reachable.",
"radio.wizard.test_loading": "Testing connection...",
"radio.wizard.test_prompt": "Click the button to test the connection.",
"radio.wizard.test_button": "Test Connection",
"radio.wizard.test_retry": "Test Again",
"radio.wizard.settings_overview": "Settings Overview",
"radio.wizard.settings_overview_desc": "These are the settings that will be saved:",
"radio.wizard.install_confirm": "Are you sure you want to install the radio with these settings?",
"radio.wizard.install_button": "Install Radio",
"radio.wizard.test_result_stream": "Stream Connection",
"radio.wizard.test_result_now_playing": "Now Playing",
"radio.wizard.test_result_listeners": "Listeners",
"radio.wizard.status_success": "Success",
"radio.wizard.status_warning": "Warning",
"radio.wizard.status_error": "Error",
"radio.wizard.status_skipped": "Skipped",
"radio.wizard.status_untested": "Not tested",
"radio.wizard.content_type": "Content-Type",
"radio.wizard.http_status": "HTTP Status",
"radio.wizard.song": "Song",
"radio.wizard.artist": "Artist",
"radio.wizard.listeners": "Listeners",
"radio.wizard.api_url": "API URL",
"radio.wizard.test_stream_ok": "Stream is reachable! You can install the radio.",
"radio.wizard.test_stream_fail": "Stream is not reachable. Check the URL and try again.",
"radio.wizard.test_not_run": "Not tested yet.",
"radio.wizard.test_connection_fail": "Could not run test: ",
"radio.wizard.error": "Error",
"radio.wizard.unknown_error": "Unknown error"
}
+118 -2
View File
@@ -1389,5 +1389,121 @@
"Thumbnails URL": "Thumbnails URL",
"Group Homepage": "Group Homepage",
"Habbopages URL": "Habbopages URL",
"URL Prefix": "URL Prefix"
}
"URL Prefix": "URL Prefix",
"radio.wizard.title": "Radio Installation Wizard",
"radio.wizard.step_short": "Step",
"radio.wizard.step_prefix": "Step",
"radio.wizard.of": "of",
"radio.wizard.next_step": "Next Step →",
"radio.wizard.previous_step": "← Previous Step",
"radio.wizard.back_to_setup": "Back to setup",
"radio.wizard.step1_label": "Platform",
"radio.wizard.step2_label": "Stream",
"radio.wizard.step3_label": "API",
"radio.wizard.step4_label": "Features",
"radio.wizard.step5_label": "Test",
"radio.wizard.step1_subtitle": "Choose your streaming platform",
"radio.wizard.step2_title": "Stream Configuration",
"radio.wizard.step3_title": "API Configuration",
"radio.wizard.step3_subtitle": "Now Playing & Listeners",
"radio.wizard.step4_title": "Configure Features",
"radio.wizard.step4_subtitle": "Choose which radio features to enable",
"radio.wizard.step5_title": "Test & Install",
"radio.wizard.step5_subtitle": "Check the connection and complete the installation",
"radio.wizard.platform_shoutcast": "SHOUTcast",
"radio.wizard.platform_shoutcast_desc": "For SHOUTcast servers. Auto-detection of now playing and listeners via stats endpoint.",
"radio.wizard.platform_icecast": "Icecast",
"radio.wizard.platform_icecast_desc": "For Icecast servers. Uses status-json.xsl for auto-detection.",
"radio.wizard.platform_azurecast": "AzureCast",
"radio.wizard.platform_azurecast_desc": "AzureCast hosting. Full API integration with now-playing, listeners and auto-configuration.",
"radio.wizard.platform_other": "Other",
"radio.wizard.platform_other_desc": "Another stream provider. Manual configuration of stream URL and API endpoints.",
"radio.wizard.shoutcast_info_title": "SHOUTcast",
"radio.wizard.shoutcast_info_desc": "Enter your SHOUTcast stream URL. The wizard will try to find the stats endpoint automatically.",
"radio.wizard.icecast_info_title": "Icecast",
"radio.wizard.icecast_info_desc": "Enter your Icecast stream URL. The wizard uses status-json.xsl for auto-detection.",
"radio.wizard.azurecast_info_title": "AzureCast",
"radio.wizard.azurecast_info_desc": "AzureCast stream URL + server configuration. The wizard configures everything via the AzureCast API.",
"radio.wizard.other_info_title": "Other Stream",
"radio.wizard.other_info_desc": "Enter your stream URL. You can manually configure API endpoints for now playing and listeners later.",
"radio.wizard.stream_url_label": "Stream URL *",
"radio.wizard.stream_url_hint": "The direct URL to your audio stream (MP3, AAC, OGG, etc.)",
"radio.wizard.stream_name_label": "Stream Name",
"radio.wizard.stream_name_placeholder": "My Radio",
"radio.wizard.stream_name_hint": "A name for your radio stream (optional)",
"radio.wizard.azurecast_section": "AzureCast Server Configuration",
"radio.wizard.azurecast_base_url_label": "AzureCast Base URL",
"radio.wizard.azurecast_base_url_hint": "The base URL of your AzureCast server. Auto-detected if left empty.",
"radio.wizard.azurecast_station_id_label": "Station ID",
"radio.wizard.azurecast_station_id_hint": "The station ID in AzureCast (default: 1)",
"radio.wizard.enable_now_playing": "Enable Now Playing",
"radio.wizard.now_playing_api_label": "Now Playing API URL",
"radio.wizard.now_playing_api_hint": "API endpoint that returns the current song. Usually auto-detected.",
"radio.wizard.enable_listeners": "Enable Listeners Counter",
"radio.wizard.listeners_api_label": "Listeners API URL",
"radio.wizard.listeners_api_hint": "API endpoint that returns the listener count.",
"radio.wizard.enable_current_dj": "Show Current DJ",
"radio.wizard.detected": "detected!",
"radio.wizard.detected_desc": "API endpoints were automatically found and filled in.",
"radio.wizard.not_detected": "No automatic detection",
"radio.wizard.not_detected_desc": "Fill in the API URLs manually or skip this step.",
"radio.wizard.section_community": "Community Features",
"radio.wizard.feature_shouts": "Shouts",
"radio.wizard.feature_shouts_desc": "Leave messages",
"radio.wizard.feature_applications": "DJ Applications",
"radio.wizard.feature_applications_desc": "Apply as DJ",
"radio.wizard.feature_requests": "Song Requests",
"radio.wizard.feature_requests_desc": "Request songs",
"radio.wizard.section_display": "Display",
"radio.wizard.feature_widget": "Radio Widget",
"radio.wizard.feature_widget_desc": "Mini player on the site",
"radio.wizard.feature_widget_global": "Widget Everywhere",
"radio.wizard.feature_widget_global_desc": "Show on all pages",
"radio.wizard.widget_position_label": "Widget Position",
"radio.wizard.position_bottom_right": "Bottom Right",
"radio.wizard.position_bottom_left": "Bottom Left",
"radio.wizard.position_top_right": "Top Right",
"radio.wizard.position_top_left": "Top Left",
"radio.wizard.section_gamification": "Gamification",
"radio.wizard.feature_points": "Points System",
"radio.wizard.feature_points_desc": "Earn points by listening",
"radio.wizard.feature_contests": "Contests",
"radio.wizard.feature_contests_desc": "Organize competitions",
"radio.wizard.feature_giveaways": "Giveaways",
"radio.wizard.feature_giveaways_desc": "Give away prizes",
"radio.wizard.section_integrations": "Integrations",
"radio.wizard.feature_discord": "Discord Notifications",
"radio.wizard.feature_discord_desc": "Notifications when DJ goes live / song changes",
"radio.wizard.discord_webhook_label": "Discord Webhook URL",
"radio.wizard.discord_webhook_hint": "Create a webhook in your Discord server channel.",
"radio.wizard.test_title": "Test Connection",
"radio.wizard.test_desc": "Click Test Connection to check if your stream and APIs are reachable.",
"radio.wizard.test_loading": "Testing connection...",
"radio.wizard.test_prompt": "Click the button to test the connection.",
"radio.wizard.test_button": "Test Connection",
"radio.wizard.test_retry": "Test Again",
"radio.wizard.settings_overview": "Settings Overview",
"radio.wizard.settings_overview_desc": "These are the settings that will be saved:",
"radio.wizard.install_confirm": "Are you sure you want to install the radio with these settings?",
"radio.wizard.install_button": "Install Radio",
"radio.wizard.test_result_stream": "Stream Connection",
"radio.wizard.test_result_now_playing": "Now Playing",
"radio.wizard.test_result_listeners": "Listeners",
"radio.wizard.status_success": "Success",
"radio.wizard.status_warning": "Warning",
"radio.wizard.status_error": "Error",
"radio.wizard.status_skipped": "Skipped",
"radio.wizard.status_untested": "Not tested",
"radio.wizard.content_type": "Content-Type",
"radio.wizard.http_status": "HTTP Status",
"radio.wizard.song": "Song",
"radio.wizard.artist": "Artist",
"radio.wizard.listeners": "Listeners",
"radio.wizard.api_url": "API URL",
"radio.wizard.test_stream_ok": "Stream is reachable! You can install the radio.",
"radio.wizard.test_stream_fail": "Stream is not reachable. Check the URL and try again.",
"radio.wizard.test_not_run": "Not tested yet.",
"radio.wizard.test_connection_fail": "Could not run test: ",
"radio.wizard.error": "Error",
"radio.wizard.unknown_error": "Unknown error"
}
+118 -2
View File
@@ -1395,5 +1395,121 @@
"Thumbnails URL": "URL Miniatures",
"Group Homepage": "Page d'accueil groupe",
"Habbopages URL": "URL Habbopages",
"URL Prefix": "Préfixe URL"
}
"URL Prefix": "Préfixe URL",
"radio.wizard.title": "Radio Installation Wizard",
"radio.wizard.step_short": "Step",
"radio.wizard.step_prefix": "Step",
"radio.wizard.of": "of",
"radio.wizard.next_step": "Next Step →",
"radio.wizard.previous_step": "← Previous Step",
"radio.wizard.back_to_setup": "Back to setup",
"radio.wizard.step1_label": "Platform",
"radio.wizard.step2_label": "Stream",
"radio.wizard.step3_label": "API",
"radio.wizard.step4_label": "Features",
"radio.wizard.step5_label": "Test",
"radio.wizard.step1_subtitle": "Choose your streaming platform",
"radio.wizard.step2_title": "Stream Configuration",
"radio.wizard.step3_title": "API Configuration",
"radio.wizard.step3_subtitle": "Now Playing & Listeners",
"radio.wizard.step4_title": "Configure Features",
"radio.wizard.step4_subtitle": "Choose which radio features to enable",
"radio.wizard.step5_title": "Test & Install",
"radio.wizard.step5_subtitle": "Check the connection and complete the installation",
"radio.wizard.platform_shoutcast": "SHOUTcast",
"radio.wizard.platform_shoutcast_desc": "For SHOUTcast servers. Auto-detection of now playing and listeners via stats endpoint.",
"radio.wizard.platform_icecast": "Icecast",
"radio.wizard.platform_icecast_desc": "For Icecast servers. Uses status-json.xsl for auto-detection.",
"radio.wizard.platform_azurecast": "AzureCast",
"radio.wizard.platform_azurecast_desc": "AzureCast hosting. Full API integration with now-playing, listeners and auto-configuration.",
"radio.wizard.platform_other": "Other",
"radio.wizard.platform_other_desc": "Another stream provider. Manual configuration of stream URL and API endpoints.",
"radio.wizard.shoutcast_info_title": "SHOUTcast",
"radio.wizard.shoutcast_info_desc": "Enter your SHOUTcast stream URL. The wizard will try to find the stats endpoint automatically.",
"radio.wizard.icecast_info_title": "Icecast",
"radio.wizard.icecast_info_desc": "Enter your Icecast stream URL. The wizard uses status-json.xsl for auto-detection.",
"radio.wizard.azurecast_info_title": "AzureCast",
"radio.wizard.azurecast_info_desc": "AzureCast stream URL + server configuration. The wizard configures everything via the AzureCast API.",
"radio.wizard.other_info_title": "Other Stream",
"radio.wizard.other_info_desc": "Enter your stream URL. You can manually configure API endpoints for now playing and listeners later.",
"radio.wizard.stream_url_label": "Stream URL *",
"radio.wizard.stream_url_hint": "The direct URL to your audio stream (MP3, AAC, OGG, etc.)",
"radio.wizard.stream_name_label": "Stream Name",
"radio.wizard.stream_name_placeholder": "My Radio",
"radio.wizard.stream_name_hint": "A name for your radio stream (optional)",
"radio.wizard.azurecast_section": "AzureCast Server Configuration",
"radio.wizard.azurecast_base_url_label": "AzureCast Base URL",
"radio.wizard.azurecast_base_url_hint": "The base URL of your AzureCast server. Auto-detected if left empty.",
"radio.wizard.azurecast_station_id_label": "Station ID",
"radio.wizard.azurecast_station_id_hint": "The station ID in AzureCast (default: 1)",
"radio.wizard.enable_now_playing": "Enable Now Playing",
"radio.wizard.now_playing_api_label": "Now Playing API URL",
"radio.wizard.now_playing_api_hint": "API endpoint that returns the current song. Usually auto-detected.",
"radio.wizard.enable_listeners": "Enable Listeners Counter",
"radio.wizard.listeners_api_label": "Listeners API URL",
"radio.wizard.listeners_api_hint": "API endpoint that returns the listener count.",
"radio.wizard.enable_current_dj": "Show Current DJ",
"radio.wizard.detected": "detected!",
"radio.wizard.detected_desc": "API endpoints were automatically found and filled in.",
"radio.wizard.not_detected": "No automatic detection",
"radio.wizard.not_detected_desc": "Fill in the API URLs manually or skip this step.",
"radio.wizard.section_community": "Community Features",
"radio.wizard.feature_shouts": "Shouts",
"radio.wizard.feature_shouts_desc": "Leave messages",
"radio.wizard.feature_applications": "DJ Applications",
"radio.wizard.feature_applications_desc": "Apply as DJ",
"radio.wizard.feature_requests": "Song Requests",
"radio.wizard.feature_requests_desc": "Request songs",
"radio.wizard.section_display": "Display",
"radio.wizard.feature_widget": "Radio Widget",
"radio.wizard.feature_widget_desc": "Mini player on the site",
"radio.wizard.feature_widget_global": "Widget Everywhere",
"radio.wizard.feature_widget_global_desc": "Show on all pages",
"radio.wizard.widget_position_label": "Widget Position",
"radio.wizard.position_bottom_right": "Bottom Right",
"radio.wizard.position_bottom_left": "Bottom Left",
"radio.wizard.position_top_right": "Top Right",
"radio.wizard.position_top_left": "Top Left",
"radio.wizard.section_gamification": "Gamification",
"radio.wizard.feature_points": "Points System",
"radio.wizard.feature_points_desc": "Earn points by listening",
"radio.wizard.feature_contests": "Contests",
"radio.wizard.feature_contests_desc": "Organize competitions",
"radio.wizard.feature_giveaways": "Giveaways",
"radio.wizard.feature_giveaways_desc": "Give away prizes",
"radio.wizard.section_integrations": "Integrations",
"radio.wizard.feature_discord": "Discord Notifications",
"radio.wizard.feature_discord_desc": "Notifications when DJ goes live / song changes",
"radio.wizard.discord_webhook_label": "Discord Webhook URL",
"radio.wizard.discord_webhook_hint": "Create a webhook in your Discord server channel.",
"radio.wizard.test_title": "Test Connection",
"radio.wizard.test_desc": "Click Test Connection to check if your stream and APIs are reachable.",
"radio.wizard.test_loading": "Testing connection...",
"radio.wizard.test_prompt": "Click the button to test the connection.",
"radio.wizard.test_button": "Test Connection",
"radio.wizard.test_retry": "Test Again",
"radio.wizard.settings_overview": "Settings Overview",
"radio.wizard.settings_overview_desc": "These are the settings that will be saved:",
"radio.wizard.install_confirm": "Are you sure you want to install the radio with these settings?",
"radio.wizard.install_button": "Install Radio",
"radio.wizard.test_result_stream": "Stream Connection",
"radio.wizard.test_result_now_playing": "Now Playing",
"radio.wizard.test_result_listeners": "Listeners",
"radio.wizard.status_success": "Success",
"radio.wizard.status_warning": "Warning",
"radio.wizard.status_error": "Error",
"radio.wizard.status_skipped": "Skipped",
"radio.wizard.status_untested": "Not tested",
"radio.wizard.content_type": "Content-Type",
"radio.wizard.http_status": "HTTP Status",
"radio.wizard.song": "Song",
"radio.wizard.artist": "Artist",
"radio.wizard.listeners": "Listeners",
"radio.wizard.api_url": "API URL",
"radio.wizard.test_stream_ok": "Stream is reachable! You can install the radio.",
"radio.wizard.test_stream_fail": "Stream is not reachable. Check the URL and try again.",
"radio.wizard.test_not_run": "Not tested yet.",
"radio.wizard.test_connection_fail": "Could not run test: ",
"radio.wizard.error": "Error",
"radio.wizard.unknown_error": "Unknown error"
}
+118 -2
View File
@@ -1390,5 +1390,121 @@
"Group Homepage": "Group Homepage",
"Habbopages URL": "Habbopages URL",
"URL Prefix": "URL Prefix",
"figament::resources.navigations.Monitoring": "Megfigyelés"
}
"figament::resources.navigations.Monitoring": "Megfigyelés",
"radio.wizard.title": "Radio Installation Wizard",
"radio.wizard.step_short": "Step",
"radio.wizard.step_prefix": "Step",
"radio.wizard.of": "of",
"radio.wizard.next_step": "Next Step →",
"radio.wizard.previous_step": "← Previous Step",
"radio.wizard.back_to_setup": "Back to setup",
"radio.wizard.step1_label": "Platform",
"radio.wizard.step2_label": "Stream",
"radio.wizard.step3_label": "API",
"radio.wizard.step4_label": "Features",
"radio.wizard.step5_label": "Test",
"radio.wizard.step1_subtitle": "Choose your streaming platform",
"radio.wizard.step2_title": "Stream Configuration",
"radio.wizard.step3_title": "API Configuration",
"radio.wizard.step3_subtitle": "Now Playing & Listeners",
"radio.wizard.step4_title": "Configure Features",
"radio.wizard.step4_subtitle": "Choose which radio features to enable",
"radio.wizard.step5_title": "Test & Install",
"radio.wizard.step5_subtitle": "Check the connection and complete the installation",
"radio.wizard.platform_shoutcast": "SHOUTcast",
"radio.wizard.platform_shoutcast_desc": "For SHOUTcast servers. Auto-detection of now playing and listeners via stats endpoint.",
"radio.wizard.platform_icecast": "Icecast",
"radio.wizard.platform_icecast_desc": "For Icecast servers. Uses status-json.xsl for auto-detection.",
"radio.wizard.platform_azurecast": "AzureCast",
"radio.wizard.platform_azurecast_desc": "AzureCast hosting. Full API integration with now-playing, listeners and auto-configuration.",
"radio.wizard.platform_other": "Other",
"radio.wizard.platform_other_desc": "Another stream provider. Manual configuration of stream URL and API endpoints.",
"radio.wizard.shoutcast_info_title": "SHOUTcast",
"radio.wizard.shoutcast_info_desc": "Enter your SHOUTcast stream URL. The wizard will try to find the stats endpoint automatically.",
"radio.wizard.icecast_info_title": "Icecast",
"radio.wizard.icecast_info_desc": "Enter your Icecast stream URL. The wizard uses status-json.xsl for auto-detection.",
"radio.wizard.azurecast_info_title": "AzureCast",
"radio.wizard.azurecast_info_desc": "AzureCast stream URL + server configuration. The wizard configures everything via the AzureCast API.",
"radio.wizard.other_info_title": "Other Stream",
"radio.wizard.other_info_desc": "Enter your stream URL. You can manually configure API endpoints for now playing and listeners later.",
"radio.wizard.stream_url_label": "Stream URL *",
"radio.wizard.stream_url_hint": "The direct URL to your audio stream (MP3, AAC, OGG, etc.)",
"radio.wizard.stream_name_label": "Stream Name",
"radio.wizard.stream_name_placeholder": "My Radio",
"radio.wizard.stream_name_hint": "A name for your radio stream (optional)",
"radio.wizard.azurecast_section": "AzureCast Server Configuration",
"radio.wizard.azurecast_base_url_label": "AzureCast Base URL",
"radio.wizard.azurecast_base_url_hint": "The base URL of your AzureCast server. Auto-detected if left empty.",
"radio.wizard.azurecast_station_id_label": "Station ID",
"radio.wizard.azurecast_station_id_hint": "The station ID in AzureCast (default: 1)",
"radio.wizard.enable_now_playing": "Enable Now Playing",
"radio.wizard.now_playing_api_label": "Now Playing API URL",
"radio.wizard.now_playing_api_hint": "API endpoint that returns the current song. Usually auto-detected.",
"radio.wizard.enable_listeners": "Enable Listeners Counter",
"radio.wizard.listeners_api_label": "Listeners API URL",
"radio.wizard.listeners_api_hint": "API endpoint that returns the listener count.",
"radio.wizard.enable_current_dj": "Show Current DJ",
"radio.wizard.detected": "detected!",
"radio.wizard.detected_desc": "API endpoints were automatically found and filled in.",
"radio.wizard.not_detected": "No automatic detection",
"radio.wizard.not_detected_desc": "Fill in the API URLs manually or skip this step.",
"radio.wizard.section_community": "Community Features",
"radio.wizard.feature_shouts": "Shouts",
"radio.wizard.feature_shouts_desc": "Leave messages",
"radio.wizard.feature_applications": "DJ Applications",
"radio.wizard.feature_applications_desc": "Apply as DJ",
"radio.wizard.feature_requests": "Song Requests",
"radio.wizard.feature_requests_desc": "Request songs",
"radio.wizard.section_display": "Display",
"radio.wizard.feature_widget": "Radio Widget",
"radio.wizard.feature_widget_desc": "Mini player on the site",
"radio.wizard.feature_widget_global": "Widget Everywhere",
"radio.wizard.feature_widget_global_desc": "Show on all pages",
"radio.wizard.widget_position_label": "Widget Position",
"radio.wizard.position_bottom_right": "Bottom Right",
"radio.wizard.position_bottom_left": "Bottom Left",
"radio.wizard.position_top_right": "Top Right",
"radio.wizard.position_top_left": "Top Left",
"radio.wizard.section_gamification": "Gamification",
"radio.wizard.feature_points": "Points System",
"radio.wizard.feature_points_desc": "Earn points by listening",
"radio.wizard.feature_contests": "Contests",
"radio.wizard.feature_contests_desc": "Organize competitions",
"radio.wizard.feature_giveaways": "Giveaways",
"radio.wizard.feature_giveaways_desc": "Give away prizes",
"radio.wizard.section_integrations": "Integrations",
"radio.wizard.feature_discord": "Discord Notifications",
"radio.wizard.feature_discord_desc": "Notifications when DJ goes live / song changes",
"radio.wizard.discord_webhook_label": "Discord Webhook URL",
"radio.wizard.discord_webhook_hint": "Create a webhook in your Discord server channel.",
"radio.wizard.test_title": "Test Connection",
"radio.wizard.test_desc": "Click Test Connection to check if your stream and APIs are reachable.",
"radio.wizard.test_loading": "Testing connection...",
"radio.wizard.test_prompt": "Click the button to test the connection.",
"radio.wizard.test_button": "Test Connection",
"radio.wizard.test_retry": "Test Again",
"radio.wizard.settings_overview": "Settings Overview",
"radio.wizard.settings_overview_desc": "These are the settings that will be saved:",
"radio.wizard.install_confirm": "Are you sure you want to install the radio with these settings?",
"radio.wizard.install_button": "Install Radio",
"radio.wizard.test_result_stream": "Stream Connection",
"radio.wizard.test_result_now_playing": "Now Playing",
"radio.wizard.test_result_listeners": "Listeners",
"radio.wizard.status_success": "Success",
"radio.wizard.status_warning": "Warning",
"radio.wizard.status_error": "Error",
"radio.wizard.status_skipped": "Skipped",
"radio.wizard.status_untested": "Not tested",
"radio.wizard.content_type": "Content-Type",
"radio.wizard.http_status": "HTTP Status",
"radio.wizard.song": "Song",
"radio.wizard.artist": "Artist",
"radio.wizard.listeners": "Listeners",
"radio.wizard.api_url": "API URL",
"radio.wizard.test_stream_ok": "Stream is reachable! You can install the radio.",
"radio.wizard.test_stream_fail": "Stream is not reachable. Check the URL and try again.",
"radio.wizard.test_not_run": "Not tested yet.",
"radio.wizard.test_connection_fail": "Could not run test: ",
"radio.wizard.error": "Error",
"radio.wizard.unknown_error": "Unknown error"
}
+118 -2
View File
@@ -1395,5 +1395,121 @@
"Thumbnails URL": "URL Anteprime",
"Group Homepage": "Homepage gruppo",
"Habbopages URL": "URL Habbopages",
"URL Prefix": "Prefisso URL"
}
"URL Prefix": "Prefisso URL",
"radio.wizard.title": "Radio Installation Wizard",
"radio.wizard.step_short": "Step",
"radio.wizard.step_prefix": "Step",
"radio.wizard.of": "of",
"radio.wizard.next_step": "Next Step →",
"radio.wizard.previous_step": "← Previous Step",
"radio.wizard.back_to_setup": "Back to setup",
"radio.wizard.step1_label": "Platform",
"radio.wizard.step2_label": "Stream",
"radio.wizard.step3_label": "API",
"radio.wizard.step4_label": "Features",
"radio.wizard.step5_label": "Test",
"radio.wizard.step1_subtitle": "Choose your streaming platform",
"radio.wizard.step2_title": "Stream Configuration",
"radio.wizard.step3_title": "API Configuration",
"radio.wizard.step3_subtitle": "Now Playing & Listeners",
"radio.wizard.step4_title": "Configure Features",
"radio.wizard.step4_subtitle": "Choose which radio features to enable",
"radio.wizard.step5_title": "Test & Install",
"radio.wizard.step5_subtitle": "Check the connection and complete the installation",
"radio.wizard.platform_shoutcast": "SHOUTcast",
"radio.wizard.platform_shoutcast_desc": "For SHOUTcast servers. Auto-detection of now playing and listeners via stats endpoint.",
"radio.wizard.platform_icecast": "Icecast",
"radio.wizard.platform_icecast_desc": "For Icecast servers. Uses status-json.xsl for auto-detection.",
"radio.wizard.platform_azurecast": "AzureCast",
"radio.wizard.platform_azurecast_desc": "AzureCast hosting. Full API integration with now-playing, listeners and auto-configuration.",
"radio.wizard.platform_other": "Other",
"radio.wizard.platform_other_desc": "Another stream provider. Manual configuration of stream URL and API endpoints.",
"radio.wizard.shoutcast_info_title": "SHOUTcast",
"radio.wizard.shoutcast_info_desc": "Enter your SHOUTcast stream URL. The wizard will try to find the stats endpoint automatically.",
"radio.wizard.icecast_info_title": "Icecast",
"radio.wizard.icecast_info_desc": "Enter your Icecast stream URL. The wizard uses status-json.xsl for auto-detection.",
"radio.wizard.azurecast_info_title": "AzureCast",
"radio.wizard.azurecast_info_desc": "AzureCast stream URL + server configuration. The wizard configures everything via the AzureCast API.",
"radio.wizard.other_info_title": "Other Stream",
"radio.wizard.other_info_desc": "Enter your stream URL. You can manually configure API endpoints for now playing and listeners later.",
"radio.wizard.stream_url_label": "Stream URL *",
"radio.wizard.stream_url_hint": "The direct URL to your audio stream (MP3, AAC, OGG, etc.)",
"radio.wizard.stream_name_label": "Stream Name",
"radio.wizard.stream_name_placeholder": "My Radio",
"radio.wizard.stream_name_hint": "A name for your radio stream (optional)",
"radio.wizard.azurecast_section": "AzureCast Server Configuration",
"radio.wizard.azurecast_base_url_label": "AzureCast Base URL",
"radio.wizard.azurecast_base_url_hint": "The base URL of your AzureCast server. Auto-detected if left empty.",
"radio.wizard.azurecast_station_id_label": "Station ID",
"radio.wizard.azurecast_station_id_hint": "The station ID in AzureCast (default: 1)",
"radio.wizard.enable_now_playing": "Enable Now Playing",
"radio.wizard.now_playing_api_label": "Now Playing API URL",
"radio.wizard.now_playing_api_hint": "API endpoint that returns the current song. Usually auto-detected.",
"radio.wizard.enable_listeners": "Enable Listeners Counter",
"radio.wizard.listeners_api_label": "Listeners API URL",
"radio.wizard.listeners_api_hint": "API endpoint that returns the listener count.",
"radio.wizard.enable_current_dj": "Show Current DJ",
"radio.wizard.detected": "detected!",
"radio.wizard.detected_desc": "API endpoints were automatically found and filled in.",
"radio.wizard.not_detected": "No automatic detection",
"radio.wizard.not_detected_desc": "Fill in the API URLs manually or skip this step.",
"radio.wizard.section_community": "Community Features",
"radio.wizard.feature_shouts": "Shouts",
"radio.wizard.feature_shouts_desc": "Leave messages",
"radio.wizard.feature_applications": "DJ Applications",
"radio.wizard.feature_applications_desc": "Apply as DJ",
"radio.wizard.feature_requests": "Song Requests",
"radio.wizard.feature_requests_desc": "Request songs",
"radio.wizard.section_display": "Display",
"radio.wizard.feature_widget": "Radio Widget",
"radio.wizard.feature_widget_desc": "Mini player on the site",
"radio.wizard.feature_widget_global": "Widget Everywhere",
"radio.wizard.feature_widget_global_desc": "Show on all pages",
"radio.wizard.widget_position_label": "Widget Position",
"radio.wizard.position_bottom_right": "Bottom Right",
"radio.wizard.position_bottom_left": "Bottom Left",
"radio.wizard.position_top_right": "Top Right",
"radio.wizard.position_top_left": "Top Left",
"radio.wizard.section_gamification": "Gamification",
"radio.wizard.feature_points": "Points System",
"radio.wizard.feature_points_desc": "Earn points by listening",
"radio.wizard.feature_contests": "Contests",
"radio.wizard.feature_contests_desc": "Organize competitions",
"radio.wizard.feature_giveaways": "Giveaways",
"radio.wizard.feature_giveaways_desc": "Give away prizes",
"radio.wizard.section_integrations": "Integrations",
"radio.wizard.feature_discord": "Discord Notifications",
"radio.wizard.feature_discord_desc": "Notifications when DJ goes live / song changes",
"radio.wizard.discord_webhook_label": "Discord Webhook URL",
"radio.wizard.discord_webhook_hint": "Create a webhook in your Discord server channel.",
"radio.wizard.test_title": "Test Connection",
"radio.wizard.test_desc": "Click Test Connection to check if your stream and APIs are reachable.",
"radio.wizard.test_loading": "Testing connection...",
"radio.wizard.test_prompt": "Click the button to test the connection.",
"radio.wizard.test_button": "Test Connection",
"radio.wizard.test_retry": "Test Again",
"radio.wizard.settings_overview": "Settings Overview",
"radio.wizard.settings_overview_desc": "These are the settings that will be saved:",
"radio.wizard.install_confirm": "Are you sure you want to install the radio with these settings?",
"radio.wizard.install_button": "Install Radio",
"radio.wizard.test_result_stream": "Stream Connection",
"radio.wizard.test_result_now_playing": "Now Playing",
"radio.wizard.test_result_listeners": "Listeners",
"radio.wizard.status_success": "Success",
"radio.wizard.status_warning": "Warning",
"radio.wizard.status_error": "Error",
"radio.wizard.status_skipped": "Skipped",
"radio.wizard.status_untested": "Not tested",
"radio.wizard.content_type": "Content-Type",
"radio.wizard.http_status": "HTTP Status",
"radio.wizard.song": "Song",
"radio.wizard.artist": "Artist",
"radio.wizard.listeners": "Listeners",
"radio.wizard.api_url": "API URL",
"radio.wizard.test_stream_ok": "Stream is reachable! You can install the radio.",
"radio.wizard.test_stream_fail": "Stream is not reachable. Check the URL and try again.",
"radio.wizard.test_not_run": "Not tested yet.",
"radio.wizard.test_connection_fail": "Could not run test: ",
"radio.wizard.error": "Error",
"radio.wizard.unknown_error": "Unknown error"
}
+166 -1
View File
@@ -182,5 +182,170 @@
"commandocentrum.client": "Client",
"commandocentrum.renderer": "Renderer",
"commandocentrum.webroot_status": "Webroot",
"commandocentrum.rank": "Rank"
"commandocentrum.rank": "Rank",
"radio.title": "Radio",
"radio.music": "Muziek",
"radio.loading": "Laden...",
"radio.navigation_label": "Radio",
"radio.setup_page_title": "Radio Setup",
"radio.setup_page_subtitle": "Configureer je radio systeem in één keer",
"radio.setup.success_title": "Radio Geïnstalleerd!",
"radio.setup.success_body": "Radio systeem is succesvol geïnstalleerd en geconfigureerd!",
"radio.setup.error_title": "Installatie Mislukt",
"radio.setup.error_body": "Er is een fout opgetreden: :message",
"radio.setup.button_label": "Alles Installeren",
"radio.setup.modal_heading": "Radio Installeren?",
"radio.setup.modal_description": "Dit zal alle radio instellingen configureren met standaard waarden.",
"radio.setup.modal_submit": "Ja, installeer!",
"radio.setup.tooltip": "Installeer het complete radio systeem",
"radio.setup_complete": "✅ Installatie Voltooid!",
"radio.what_gets_configured": "Wat wordt er geconfigureerd?",
"radio.radio_stream": "Radio Stream",
"radio.radio_stream_desc": "Stel je stream URL in met ondersteuning voor SHOUTcast, Icecast, AzureCast en andere streaming platforms.",
"radio.points_system": "Punten Systeem",
"radio.points_system_desc": "Laat gebruikers punten verdienen door te luisteren, nummers aan te vragen en deel te nemen aan contests.",
"radio.community_features": "Community Functies",
"radio.community_features_desc": "Shouts, song requests, DJ aanmeldingen en meer community interacties.",
"radio.dj_management": "DJ Beheer",
"radio.dj_management_desc": "DJ ranks, schema, auto-detectie en Sambroadcaster/Virtual DJ integratie.",
"radio.monitoring": "Stream Monitoring",
"radio.monitoring_desc": "Houd je stream uptime in de gaten met real-time monitoring.",
"radio.display_options": "Weergave Opties",
"radio.display_options_desc": "Widget, player stijlen, kleuren en aanpasbare CSS/JS.",
"radio.default_settings": "Standaard Instellingen",
"radio.radio_label": "Radio",
"radio.enabled": "Ingeschakeld",
"radio.points_label": "Punten",
"radio.per_min": " per min",
"radio.daily_limit": "Dagelijkse limiet",
"radio.shouts_label": "Shouts",
"radio.on": "Aan",
"radio.widget": "Widget",
"radio.global": "Globaal",
"radio.dj_apps": "DJ Aanmeldingen",
"radio.open": "Open",
"radio.monitoring_label": "Monitoring",
"radio.contests_label": "Contesten",
"radio.install_radio_system": "🚀 Radio Systeem Installeren",
"radio.reset_settings": "Instellingen Resetten",
"radio.reset_confirm": "Weet je zeker dat je alle radio instellingen wilt resetten?",
"radio.go_to_radio_settings": "Naar Radio Instellingen",
"radio.open_wizard": "🎯 Open Radio Wizard",
"radio.wizard_desc": "Stap-voor-stap wizard met verbindingstest",
"radio.wizard.title": "Radio Installatie Wizard",
"radio.wizard.step_short": "Stap",
"radio.wizard.step_prefix": "Stap",
"radio.wizard.of": "van",
"radio.wizard.next_step": "Volgende Stap →",
"radio.wizard.previous_step": "← Vorige Stap",
"radio.wizard.back_to_setup": "Terug naar setup",
"radio.wizard.step1_label": "Platform",
"radio.wizard.step2_label": "Stream",
"radio.wizard.step3_label": "API",
"radio.wizard.step4_label": "Functies",
"radio.wizard.step5_label": "Testen",
"radio.wizard.step1_subtitle": "Kies je streaming platform",
"radio.wizard.step2_title": "Stream Configuratie",
"radio.wizard.step3_title": "API Configuratie",
"radio.wizard.step3_subtitle": "Now Playing & Luisteraars",
"radio.wizard.step4_title": "Functies Configureren",
"radio.wizard.step4_subtitle": "Kies welke radio functies je wilt inschakelen",
"radio.wizard.step5_title": "Test & Installeren",
"radio.wizard.step5_subtitle": "Controleer de verbinding en voltooi de installatie",
"radio.wizard.platform_shoutcast": "SHOUTcast",
"radio.wizard.platform_shoutcast_desc": "Geschikt voor SHOUTcast servers. Automatische detectie van nu afspelen en luisteraars via stats endpoint.",
"radio.wizard.platform_icecast": "Icecast",
"radio.wizard.platform_icecast_desc": "Geschikt voor Icecast servers. Gebruikt status-json.xsl voor automatische detectie.",
"radio.wizard.platform_azurecast": "AzureCast",
"radio.wizard.platform_azurecast_desc": "AzureCast hosting. Volledige API integratie met now-playing, listeners en auto-configuratie.",
"radio.wizard.platform_other": "Anders",
"radio.wizard.platform_other_desc": "Een andere stream provider. Handmatige configuratie van stream URL en API endpoints.",
"radio.wizard.shoutcast_info_title": "SHOUTcast",
"radio.wizard.shoutcast_info_desc": "Voer je SHOUTcast stream URL in. De wizard probeert automatisch de stats endpoint te vinden.",
"radio.wizard.icecast_info_title": "Icecast",
"radio.wizard.icecast_info_desc": "Voer je Icecast stream URL in. De wizard gebruikt status-json.xsl voor automatische detectie.",
"radio.wizard.azurecast_info_title": "AzureCast",
"radio.wizard.azurecast_info_desc": "AzureCast stream URL + server configuratie. De wizard configureert alles via de AzureCast API.",
"radio.wizard.other_info_title": "Andere Stream",
"radio.wizard.other_info_desc": "Voer je stream URL in. Je kunt later handmatig API endpoints configureren voor nu afspelen en luisteraars.",
"radio.wizard.stream_url_label": "Stream URL *",
"radio.wizard.stream_url_hint": "De directe URL naar je audiostreem (MP3, AAC, OGG, etc.)",
"radio.wizard.stream_name_label": "Stream Naam",
"radio.wizard.stream_name_placeholder": "Mijn Radio",
"radio.wizard.stream_name_hint": "Een naam voor je radiostream (optioneel)",
"radio.wizard.azurecast_section": "AzureCast Server Configuratie",
"radio.wizard.azurecast_base_url_label": "AzureCast Basis URL",
"radio.wizard.azurecast_base_url_hint": "De basis URL van je AzureCast server. Wordt automatisch gedetecteerd als leeg gelaten.",
"radio.wizard.azurecast_station_id_label": "Station ID",
"radio.wizard.azurecast_station_id_hint": "Het station ID in AzureCast (standaard: 1)",
"radio.wizard.enable_now_playing": "Nu Afspelen inschakelen",
"radio.wizard.now_playing_api_label": "Now Playing API URL",
"radio.wizard.now_playing_api_hint": "API endpoint dat het huidige nummer teruggeeft. Meestal automatisch gedetecteerd.",
"radio.wizard.enable_listeners": "Luisteraars teller inschakelen",
"radio.wizard.listeners_api_label": "Listeners API URL",
"radio.wizard.listeners_api_hint": "API endpoint dat het aantal luisteraars teruggeeft.",
"radio.wizard.enable_current_dj": "Huidige DJ tonen",
"radio.wizard.detected": "gedetecteerd!",
"radio.wizard.detected_desc": "API endpoints zijn automatisch gevonden en ingevuld.",
"radio.wizard.not_detected": "Geen automatische detectie",
"radio.wizard.not_detected_desc": "Vul de API URLs handmatig in of sla deze stap over.",
"radio.wizard.section_community": "Community Functies",
"radio.wizard.feature_shouts": "Shouts",
"radio.wizard.feature_shouts_desc": "Berichten achterlaten",
"radio.wizard.feature_applications": "DJ Aanmeldingen",
"radio.wizard.feature_applications_desc": "Solliciteren als DJ",
"radio.wizard.feature_requests": "Song Verzoeken",
"radio.wizard.feature_requests_desc": "Nummers aanvragen",
"radio.wizard.section_display": "Weergave",
"radio.wizard.feature_widget": "Radio Widget",
"radio.wizard.feature_widget_desc": "Miniplayer op de site",
"radio.wizard.feature_widget_global": "Widget Overal",
"radio.wizard.feature_widget_global_desc": "Op alle pagina's tonen",
"radio.wizard.widget_position_label": "Widget Positie",
"radio.wizard.position_bottom_right": "Rechtsonder",
"radio.wizard.position_bottom_left": "Linksonder",
"radio.wizard.position_top_right": "Rechtsboven",
"radio.wizard.position_top_left": "Linksboven",
"radio.wizard.section_gamification": "Gamification",
"radio.wizard.feature_points": "Punten Systeem",
"radio.wizard.feature_points_desc": "Verdien punten door te luisteren",
"radio.wizard.feature_contests": "Contesten",
"radio.wizard.feature_contests_desc": "Wedstrijden organiseren",
"radio.wizard.feature_giveaways": "Giveaways",
"radio.wizard.feature_giveaways_desc": "Cadeautjes weggeven",
"radio.wizard.section_integrations": "Integraties",
"radio.wizard.feature_discord": "Discord Notificaties",
"radio.wizard.feature_discord_desc": "Meldingen bij DJ live / nummer wijziging",
"radio.wizard.discord_webhook_label": "Discord Webhook URL",
"radio.wizard.discord_webhook_hint": "Maak een webhook aan in je Discord server kanaal.",
"radio.wizard.test_title": "Verbinding Testen",
"radio.wizard.test_desc": "Klik op Test Verbinding om te controleren of je stream en APIs bereikbaar zijn.",
"radio.wizard.test_loading": "Bezig met testen van de verbinding...",
"radio.wizard.test_prompt": "Klik op de knop om de verbinding te testen.",
"radio.wizard.test_button": "Test Verbinding",
"radio.wizard.test_retry": "Opnieuw Testen",
"radio.wizard.settings_overview": "Overzicht van Instellingen",
"radio.wizard.settings_overview_desc": "Dit zijn de instellingen die worden opgeslagen:",
"radio.wizard.install_confirm": "Weet je zeker dat je de radio wilt installeren met deze instellingen?",
"radio.wizard.install_button": "Radio Installeren",
"radio.wizard.test_result_stream": "Stream Verbinding",
"radio.wizard.test_result_now_playing": "Now Playing",
"radio.wizard.test_result_listeners": "Luisteraars",
"radio.wizard.status_success": "Succes",
"radio.wizard.status_warning": "Waarschuwing",
"radio.wizard.status_error": "Fout",
"radio.wizard.status_skipped": "Overgeslagen",
"radio.wizard.status_untested": "Niet getest",
"radio.wizard.content_type": "Content-Type",
"radio.wizard.http_status": "HTTP Status",
"radio.wizard.song": "Nummer",
"radio.wizard.artist": "Artiest",
"radio.wizard.listeners": "Luisteraars",
"radio.wizard.api_url": "API URL",
"radio.wizard.test_stream_ok": "Stream is bereikbaar! Je kunt de radio installeren.",
"radio.wizard.test_stream_fail": "Stream is niet bereikbaar. Controleer de URL en probeer het opnieuw.",
"radio.wizard.test_not_run": "Nog niet getest.",
"radio.wizard.test_connection_fail": "Kon de test niet uitvoeren: ",
"radio.wizard.error": "Fout",
"radio.wizard.unknown_error": "Onbekende fout"
}
+118 -2
View File
@@ -1389,5 +1389,121 @@
"Thumbnails URL": "Thumbnails URL",
"Group Homepage": "Group Homepage",
"Habbopages URL": "Habbopages URL",
"URL Prefix": "URL Prefix"
}
"URL Prefix": "URL Prefix",
"radio.wizard.title": "Radio Installation Wizard",
"radio.wizard.step_short": "Step",
"radio.wizard.step_prefix": "Step",
"radio.wizard.of": "of",
"radio.wizard.next_step": "Next Step →",
"radio.wizard.previous_step": "← Previous Step",
"radio.wizard.back_to_setup": "Back to setup",
"radio.wizard.step1_label": "Platform",
"radio.wizard.step2_label": "Stream",
"radio.wizard.step3_label": "API",
"radio.wizard.step4_label": "Features",
"radio.wizard.step5_label": "Test",
"radio.wizard.step1_subtitle": "Choose your streaming platform",
"radio.wizard.step2_title": "Stream Configuration",
"radio.wizard.step3_title": "API Configuration",
"radio.wizard.step3_subtitle": "Now Playing & Listeners",
"radio.wizard.step4_title": "Configure Features",
"radio.wizard.step4_subtitle": "Choose which radio features to enable",
"radio.wizard.step5_title": "Test & Install",
"radio.wizard.step5_subtitle": "Check the connection and complete the installation",
"radio.wizard.platform_shoutcast": "SHOUTcast",
"radio.wizard.platform_shoutcast_desc": "For SHOUTcast servers. Auto-detection of now playing and listeners via stats endpoint.",
"radio.wizard.platform_icecast": "Icecast",
"radio.wizard.platform_icecast_desc": "For Icecast servers. Uses status-json.xsl for auto-detection.",
"radio.wizard.platform_azurecast": "AzureCast",
"radio.wizard.platform_azurecast_desc": "AzureCast hosting. Full API integration with now-playing, listeners and auto-configuration.",
"radio.wizard.platform_other": "Other",
"radio.wizard.platform_other_desc": "Another stream provider. Manual configuration of stream URL and API endpoints.",
"radio.wizard.shoutcast_info_title": "SHOUTcast",
"radio.wizard.shoutcast_info_desc": "Enter your SHOUTcast stream URL. The wizard will try to find the stats endpoint automatically.",
"radio.wizard.icecast_info_title": "Icecast",
"radio.wizard.icecast_info_desc": "Enter your Icecast stream URL. The wizard uses status-json.xsl for auto-detection.",
"radio.wizard.azurecast_info_title": "AzureCast",
"radio.wizard.azurecast_info_desc": "AzureCast stream URL + server configuration. The wizard configures everything via the AzureCast API.",
"radio.wizard.other_info_title": "Other Stream",
"radio.wizard.other_info_desc": "Enter your stream URL. You can manually configure API endpoints for now playing and listeners later.",
"radio.wizard.stream_url_label": "Stream URL *",
"radio.wizard.stream_url_hint": "The direct URL to your audio stream (MP3, AAC, OGG, etc.)",
"radio.wizard.stream_name_label": "Stream Name",
"radio.wizard.stream_name_placeholder": "My Radio",
"radio.wizard.stream_name_hint": "A name for your radio stream (optional)",
"radio.wizard.azurecast_section": "AzureCast Server Configuration",
"radio.wizard.azurecast_base_url_label": "AzureCast Base URL",
"radio.wizard.azurecast_base_url_hint": "The base URL of your AzureCast server. Auto-detected if left empty.",
"radio.wizard.azurecast_station_id_label": "Station ID",
"radio.wizard.azurecast_station_id_hint": "The station ID in AzureCast (default: 1)",
"radio.wizard.enable_now_playing": "Enable Now Playing",
"radio.wizard.now_playing_api_label": "Now Playing API URL",
"radio.wizard.now_playing_api_hint": "API endpoint that returns the current song. Usually auto-detected.",
"radio.wizard.enable_listeners": "Enable Listeners Counter",
"radio.wizard.listeners_api_label": "Listeners API URL",
"radio.wizard.listeners_api_hint": "API endpoint that returns the listener count.",
"radio.wizard.enable_current_dj": "Show Current DJ",
"radio.wizard.detected": "detected!",
"radio.wizard.detected_desc": "API endpoints were automatically found and filled in.",
"radio.wizard.not_detected": "No automatic detection",
"radio.wizard.not_detected_desc": "Fill in the API URLs manually or skip this step.",
"radio.wizard.section_community": "Community Features",
"radio.wizard.feature_shouts": "Shouts",
"radio.wizard.feature_shouts_desc": "Leave messages",
"radio.wizard.feature_applications": "DJ Applications",
"radio.wizard.feature_applications_desc": "Apply as DJ",
"radio.wizard.feature_requests": "Song Requests",
"radio.wizard.feature_requests_desc": "Request songs",
"radio.wizard.section_display": "Display",
"radio.wizard.feature_widget": "Radio Widget",
"radio.wizard.feature_widget_desc": "Mini player on the site",
"radio.wizard.feature_widget_global": "Widget Everywhere",
"radio.wizard.feature_widget_global_desc": "Show on all pages",
"radio.wizard.widget_position_label": "Widget Position",
"radio.wizard.position_bottom_right": "Bottom Right",
"radio.wizard.position_bottom_left": "Bottom Left",
"radio.wizard.position_top_right": "Top Right",
"radio.wizard.position_top_left": "Top Left",
"radio.wizard.section_gamification": "Gamification",
"radio.wizard.feature_points": "Points System",
"radio.wizard.feature_points_desc": "Earn points by listening",
"radio.wizard.feature_contests": "Contests",
"radio.wizard.feature_contests_desc": "Organize competitions",
"radio.wizard.feature_giveaways": "Giveaways",
"radio.wizard.feature_giveaways_desc": "Give away prizes",
"radio.wizard.section_integrations": "Integrations",
"radio.wizard.feature_discord": "Discord Notifications",
"radio.wizard.feature_discord_desc": "Notifications when DJ goes live / song changes",
"radio.wizard.discord_webhook_label": "Discord Webhook URL",
"radio.wizard.discord_webhook_hint": "Create a webhook in your Discord server channel.",
"radio.wizard.test_title": "Test Connection",
"radio.wizard.test_desc": "Click Test Connection to check if your stream and APIs are reachable.",
"radio.wizard.test_loading": "Testing connection...",
"radio.wizard.test_prompt": "Click the button to test the connection.",
"radio.wizard.test_button": "Test Connection",
"radio.wizard.test_retry": "Test Again",
"radio.wizard.settings_overview": "Settings Overview",
"radio.wizard.settings_overview_desc": "These are the settings that will be saved:",
"radio.wizard.install_confirm": "Are you sure you want to install the radio with these settings?",
"radio.wizard.install_button": "Install Radio",
"radio.wizard.test_result_stream": "Stream Connection",
"radio.wizard.test_result_now_playing": "Now Playing",
"radio.wizard.test_result_listeners": "Listeners",
"radio.wizard.status_success": "Success",
"radio.wizard.status_warning": "Warning",
"radio.wizard.status_error": "Error",
"radio.wizard.status_skipped": "Skipped",
"radio.wizard.status_untested": "Not tested",
"radio.wizard.content_type": "Content-Type",
"radio.wizard.http_status": "HTTP Status",
"radio.wizard.song": "Song",
"radio.wizard.artist": "Artist",
"radio.wizard.listeners": "Listeners",
"radio.wizard.api_url": "API URL",
"radio.wizard.test_stream_ok": "Stream is reachable! You can install the radio.",
"radio.wizard.test_stream_fail": "Stream is not reachable. Check the URL and try again.",
"radio.wizard.test_not_run": "Not tested yet.",
"radio.wizard.test_connection_fail": "Could not run test: ",
"radio.wizard.error": "Error",
"radio.wizard.unknown_error": "Unknown error"
}
+118 -2
View File
@@ -1395,5 +1395,121 @@
"Thumbnails URL": "URL miniaturek",
"Group Homepage": "Strona grupy",
"Habbopages URL": "URL Habbopages",
"URL Prefix": "Prefiks URL"
}
"URL Prefix": "Prefiks URL",
"radio.wizard.title": "Radio Installation Wizard",
"radio.wizard.step_short": "Step",
"radio.wizard.step_prefix": "Step",
"radio.wizard.of": "of",
"radio.wizard.next_step": "Next Step →",
"radio.wizard.previous_step": "← Previous Step",
"radio.wizard.back_to_setup": "Back to setup",
"radio.wizard.step1_label": "Platform",
"radio.wizard.step2_label": "Stream",
"radio.wizard.step3_label": "API",
"radio.wizard.step4_label": "Features",
"radio.wizard.step5_label": "Test",
"radio.wizard.step1_subtitle": "Choose your streaming platform",
"radio.wizard.step2_title": "Stream Configuration",
"radio.wizard.step3_title": "API Configuration",
"radio.wizard.step3_subtitle": "Now Playing & Listeners",
"radio.wizard.step4_title": "Configure Features",
"radio.wizard.step4_subtitle": "Choose which radio features to enable",
"radio.wizard.step5_title": "Test & Install",
"radio.wizard.step5_subtitle": "Check the connection and complete the installation",
"radio.wizard.platform_shoutcast": "SHOUTcast",
"radio.wizard.platform_shoutcast_desc": "For SHOUTcast servers. Auto-detection of now playing and listeners via stats endpoint.",
"radio.wizard.platform_icecast": "Icecast",
"radio.wizard.platform_icecast_desc": "For Icecast servers. Uses status-json.xsl for auto-detection.",
"radio.wizard.platform_azurecast": "AzureCast",
"radio.wizard.platform_azurecast_desc": "AzureCast hosting. Full API integration with now-playing, listeners and auto-configuration.",
"radio.wizard.platform_other": "Other",
"radio.wizard.platform_other_desc": "Another stream provider. Manual configuration of stream URL and API endpoints.",
"radio.wizard.shoutcast_info_title": "SHOUTcast",
"radio.wizard.shoutcast_info_desc": "Enter your SHOUTcast stream URL. The wizard will try to find the stats endpoint automatically.",
"radio.wizard.icecast_info_title": "Icecast",
"radio.wizard.icecast_info_desc": "Enter your Icecast stream URL. The wizard uses status-json.xsl for auto-detection.",
"radio.wizard.azurecast_info_title": "AzureCast",
"radio.wizard.azurecast_info_desc": "AzureCast stream URL + server configuration. The wizard configures everything via the AzureCast API.",
"radio.wizard.other_info_title": "Other Stream",
"radio.wizard.other_info_desc": "Enter your stream URL. You can manually configure API endpoints for now playing and listeners later.",
"radio.wizard.stream_url_label": "Stream URL *",
"radio.wizard.stream_url_hint": "The direct URL to your audio stream (MP3, AAC, OGG, etc.)",
"radio.wizard.stream_name_label": "Stream Name",
"radio.wizard.stream_name_placeholder": "My Radio",
"radio.wizard.stream_name_hint": "A name for your radio stream (optional)",
"radio.wizard.azurecast_section": "AzureCast Server Configuration",
"radio.wizard.azurecast_base_url_label": "AzureCast Base URL",
"radio.wizard.azurecast_base_url_hint": "The base URL of your AzureCast server. Auto-detected if left empty.",
"radio.wizard.azurecast_station_id_label": "Station ID",
"radio.wizard.azurecast_station_id_hint": "The station ID in AzureCast (default: 1)",
"radio.wizard.enable_now_playing": "Enable Now Playing",
"radio.wizard.now_playing_api_label": "Now Playing API URL",
"radio.wizard.now_playing_api_hint": "API endpoint that returns the current song. Usually auto-detected.",
"radio.wizard.enable_listeners": "Enable Listeners Counter",
"radio.wizard.listeners_api_label": "Listeners API URL",
"radio.wizard.listeners_api_hint": "API endpoint that returns the listener count.",
"radio.wizard.enable_current_dj": "Show Current DJ",
"radio.wizard.detected": "detected!",
"radio.wizard.detected_desc": "API endpoints were automatically found and filled in.",
"radio.wizard.not_detected": "No automatic detection",
"radio.wizard.not_detected_desc": "Fill in the API URLs manually or skip this step.",
"radio.wizard.section_community": "Community Features",
"radio.wizard.feature_shouts": "Shouts",
"radio.wizard.feature_shouts_desc": "Leave messages",
"radio.wizard.feature_applications": "DJ Applications",
"radio.wizard.feature_applications_desc": "Apply as DJ",
"radio.wizard.feature_requests": "Song Requests",
"radio.wizard.feature_requests_desc": "Request songs",
"radio.wizard.section_display": "Display",
"radio.wizard.feature_widget": "Radio Widget",
"radio.wizard.feature_widget_desc": "Mini player on the site",
"radio.wizard.feature_widget_global": "Widget Everywhere",
"radio.wizard.feature_widget_global_desc": "Show on all pages",
"radio.wizard.widget_position_label": "Widget Position",
"radio.wizard.position_bottom_right": "Bottom Right",
"radio.wizard.position_bottom_left": "Bottom Left",
"radio.wizard.position_top_right": "Top Right",
"radio.wizard.position_top_left": "Top Left",
"radio.wizard.section_gamification": "Gamification",
"radio.wizard.feature_points": "Points System",
"radio.wizard.feature_points_desc": "Earn points by listening",
"radio.wizard.feature_contests": "Contests",
"radio.wizard.feature_contests_desc": "Organize competitions",
"radio.wizard.feature_giveaways": "Giveaways",
"radio.wizard.feature_giveaways_desc": "Give away prizes",
"radio.wizard.section_integrations": "Integrations",
"radio.wizard.feature_discord": "Discord Notifications",
"radio.wizard.feature_discord_desc": "Notifications when DJ goes live / song changes",
"radio.wizard.discord_webhook_label": "Discord Webhook URL",
"radio.wizard.discord_webhook_hint": "Create a webhook in your Discord server channel.",
"radio.wizard.test_title": "Test Connection",
"radio.wizard.test_desc": "Click Test Connection to check if your stream and APIs are reachable.",
"radio.wizard.test_loading": "Testing connection...",
"radio.wizard.test_prompt": "Click the button to test the connection.",
"radio.wizard.test_button": "Test Connection",
"radio.wizard.test_retry": "Test Again",
"radio.wizard.settings_overview": "Settings Overview",
"radio.wizard.settings_overview_desc": "These are the settings that will be saved:",
"radio.wizard.install_confirm": "Are you sure you want to install the radio with these settings?",
"radio.wizard.install_button": "Install Radio",
"radio.wizard.test_result_stream": "Stream Connection",
"radio.wizard.test_result_now_playing": "Now Playing",
"radio.wizard.test_result_listeners": "Listeners",
"radio.wizard.status_success": "Success",
"radio.wizard.status_warning": "Warning",
"radio.wizard.status_error": "Error",
"radio.wizard.status_skipped": "Skipped",
"radio.wizard.status_untested": "Not tested",
"radio.wizard.content_type": "Content-Type",
"radio.wizard.http_status": "HTTP Status",
"radio.wizard.song": "Song",
"radio.wizard.artist": "Artist",
"radio.wizard.listeners": "Listeners",
"radio.wizard.api_url": "API URL",
"radio.wizard.test_stream_ok": "Stream is reachable! You can install the radio.",
"radio.wizard.test_stream_fail": "Stream is not reachable. Check the URL and try again.",
"radio.wizard.test_not_run": "Not tested yet.",
"radio.wizard.test_connection_fail": "Could not run test: ",
"radio.wizard.error": "Error",
"radio.wizard.unknown_error": "Unknown error"
}
+118 -2
View File
@@ -1395,5 +1395,121 @@
"Thumbnails URL": "URL Miniaturas",
"Group Homepage": "Página do grupo",
"Habbopages URL": "URL Habbopages",
"URL Prefix": "Prefixo URL"
}
"URL Prefix": "Prefixo URL",
"radio.wizard.title": "Radio Installation Wizard",
"radio.wizard.step_short": "Step",
"radio.wizard.step_prefix": "Step",
"radio.wizard.of": "of",
"radio.wizard.next_step": "Next Step →",
"radio.wizard.previous_step": "← Previous Step",
"radio.wizard.back_to_setup": "Back to setup",
"radio.wizard.step1_label": "Platform",
"radio.wizard.step2_label": "Stream",
"radio.wizard.step3_label": "API",
"radio.wizard.step4_label": "Features",
"radio.wizard.step5_label": "Test",
"radio.wizard.step1_subtitle": "Choose your streaming platform",
"radio.wizard.step2_title": "Stream Configuration",
"radio.wizard.step3_title": "API Configuration",
"radio.wizard.step3_subtitle": "Now Playing & Listeners",
"radio.wizard.step4_title": "Configure Features",
"radio.wizard.step4_subtitle": "Choose which radio features to enable",
"radio.wizard.step5_title": "Test & Install",
"radio.wizard.step5_subtitle": "Check the connection and complete the installation",
"radio.wizard.platform_shoutcast": "SHOUTcast",
"radio.wizard.platform_shoutcast_desc": "For SHOUTcast servers. Auto-detection of now playing and listeners via stats endpoint.",
"radio.wizard.platform_icecast": "Icecast",
"radio.wizard.platform_icecast_desc": "For Icecast servers. Uses status-json.xsl for auto-detection.",
"radio.wizard.platform_azurecast": "AzureCast",
"radio.wizard.platform_azurecast_desc": "AzureCast hosting. Full API integration with now-playing, listeners and auto-configuration.",
"radio.wizard.platform_other": "Other",
"radio.wizard.platform_other_desc": "Another stream provider. Manual configuration of stream URL and API endpoints.",
"radio.wizard.shoutcast_info_title": "SHOUTcast",
"radio.wizard.shoutcast_info_desc": "Enter your SHOUTcast stream URL. The wizard will try to find the stats endpoint automatically.",
"radio.wizard.icecast_info_title": "Icecast",
"radio.wizard.icecast_info_desc": "Enter your Icecast stream URL. The wizard uses status-json.xsl for auto-detection.",
"radio.wizard.azurecast_info_title": "AzureCast",
"radio.wizard.azurecast_info_desc": "AzureCast stream URL + server configuration. The wizard configures everything via the AzureCast API.",
"radio.wizard.other_info_title": "Other Stream",
"radio.wizard.other_info_desc": "Enter your stream URL. You can manually configure API endpoints for now playing and listeners later.",
"radio.wizard.stream_url_label": "Stream URL *",
"radio.wizard.stream_url_hint": "The direct URL to your audio stream (MP3, AAC, OGG, etc.)",
"radio.wizard.stream_name_label": "Stream Name",
"radio.wizard.stream_name_placeholder": "My Radio",
"radio.wizard.stream_name_hint": "A name for your radio stream (optional)",
"radio.wizard.azurecast_section": "AzureCast Server Configuration",
"radio.wizard.azurecast_base_url_label": "AzureCast Base URL",
"radio.wizard.azurecast_base_url_hint": "The base URL of your AzureCast server. Auto-detected if left empty.",
"radio.wizard.azurecast_station_id_label": "Station ID",
"radio.wizard.azurecast_station_id_hint": "The station ID in AzureCast (default: 1)",
"radio.wizard.enable_now_playing": "Enable Now Playing",
"radio.wizard.now_playing_api_label": "Now Playing API URL",
"radio.wizard.now_playing_api_hint": "API endpoint that returns the current song. Usually auto-detected.",
"radio.wizard.enable_listeners": "Enable Listeners Counter",
"radio.wizard.listeners_api_label": "Listeners API URL",
"radio.wizard.listeners_api_hint": "API endpoint that returns the listener count.",
"radio.wizard.enable_current_dj": "Show Current DJ",
"radio.wizard.detected": "detected!",
"radio.wizard.detected_desc": "API endpoints were automatically found and filled in.",
"radio.wizard.not_detected": "No automatic detection",
"radio.wizard.not_detected_desc": "Fill in the API URLs manually or skip this step.",
"radio.wizard.section_community": "Community Features",
"radio.wizard.feature_shouts": "Shouts",
"radio.wizard.feature_shouts_desc": "Leave messages",
"radio.wizard.feature_applications": "DJ Applications",
"radio.wizard.feature_applications_desc": "Apply as DJ",
"radio.wizard.feature_requests": "Song Requests",
"radio.wizard.feature_requests_desc": "Request songs",
"radio.wizard.section_display": "Display",
"radio.wizard.feature_widget": "Radio Widget",
"radio.wizard.feature_widget_desc": "Mini player on the site",
"radio.wizard.feature_widget_global": "Widget Everywhere",
"radio.wizard.feature_widget_global_desc": "Show on all pages",
"radio.wizard.widget_position_label": "Widget Position",
"radio.wizard.position_bottom_right": "Bottom Right",
"radio.wizard.position_bottom_left": "Bottom Left",
"radio.wizard.position_top_right": "Top Right",
"radio.wizard.position_top_left": "Top Left",
"radio.wizard.section_gamification": "Gamification",
"radio.wizard.feature_points": "Points System",
"radio.wizard.feature_points_desc": "Earn points by listening",
"radio.wizard.feature_contests": "Contests",
"radio.wizard.feature_contests_desc": "Organize competitions",
"radio.wizard.feature_giveaways": "Giveaways",
"radio.wizard.feature_giveaways_desc": "Give away prizes",
"radio.wizard.section_integrations": "Integrations",
"radio.wizard.feature_discord": "Discord Notifications",
"radio.wizard.feature_discord_desc": "Notifications when DJ goes live / song changes",
"radio.wizard.discord_webhook_label": "Discord Webhook URL",
"radio.wizard.discord_webhook_hint": "Create a webhook in your Discord server channel.",
"radio.wizard.test_title": "Test Connection",
"radio.wizard.test_desc": "Click Test Connection to check if your stream and APIs are reachable.",
"radio.wizard.test_loading": "Testing connection...",
"radio.wizard.test_prompt": "Click the button to test the connection.",
"radio.wizard.test_button": "Test Connection",
"radio.wizard.test_retry": "Test Again",
"radio.wizard.settings_overview": "Settings Overview",
"radio.wizard.settings_overview_desc": "These are the settings that will be saved:",
"radio.wizard.install_confirm": "Are you sure you want to install the radio with these settings?",
"radio.wizard.install_button": "Install Radio",
"radio.wizard.test_result_stream": "Stream Connection",
"radio.wizard.test_result_now_playing": "Now Playing",
"radio.wizard.test_result_listeners": "Listeners",
"radio.wizard.status_success": "Success",
"radio.wizard.status_warning": "Warning",
"radio.wizard.status_error": "Error",
"radio.wizard.status_skipped": "Skipped",
"radio.wizard.status_untested": "Not tested",
"radio.wizard.content_type": "Content-Type",
"radio.wizard.http_status": "HTTP Status",
"radio.wizard.song": "Song",
"radio.wizard.artist": "Artist",
"radio.wizard.listeners": "Listeners",
"radio.wizard.api_url": "API URL",
"radio.wizard.test_stream_ok": "Stream is reachable! You can install the radio.",
"radio.wizard.test_stream_fail": "Stream is not reachable. Check the URL and try again.",
"radio.wizard.test_not_run": "Not tested yet.",
"radio.wizard.test_connection_fail": "Could not run test: ",
"radio.wizard.error": "Error",
"radio.wizard.unknown_error": "Unknown error"
}
+118 -2
View File
@@ -1389,5 +1389,121 @@
"Thumbnails URL": "Thumbnails URL",
"Group Homepage": "Group Homepage",
"Habbopages URL": "Habbopages URL",
"URL Prefix": "URL Prefix"
}
"URL Prefix": "URL Prefix",
"radio.wizard.title": "Radio Installation Wizard",
"radio.wizard.step_short": "Step",
"radio.wizard.step_prefix": "Step",
"radio.wizard.of": "of",
"radio.wizard.next_step": "Next Step →",
"radio.wizard.previous_step": "← Previous Step",
"radio.wizard.back_to_setup": "Back to setup",
"radio.wizard.step1_label": "Platform",
"radio.wizard.step2_label": "Stream",
"radio.wizard.step3_label": "API",
"radio.wizard.step4_label": "Features",
"radio.wizard.step5_label": "Test",
"radio.wizard.step1_subtitle": "Choose your streaming platform",
"radio.wizard.step2_title": "Stream Configuration",
"radio.wizard.step3_title": "API Configuration",
"radio.wizard.step3_subtitle": "Now Playing & Listeners",
"radio.wizard.step4_title": "Configure Features",
"radio.wizard.step4_subtitle": "Choose which radio features to enable",
"radio.wizard.step5_title": "Test & Install",
"radio.wizard.step5_subtitle": "Check the connection and complete the installation",
"radio.wizard.platform_shoutcast": "SHOUTcast",
"radio.wizard.platform_shoutcast_desc": "For SHOUTcast servers. Auto-detection of now playing and listeners via stats endpoint.",
"radio.wizard.platform_icecast": "Icecast",
"radio.wizard.platform_icecast_desc": "For Icecast servers. Uses status-json.xsl for auto-detection.",
"radio.wizard.platform_azurecast": "AzureCast",
"radio.wizard.platform_azurecast_desc": "AzureCast hosting. Full API integration with now-playing, listeners and auto-configuration.",
"radio.wizard.platform_other": "Other",
"radio.wizard.platform_other_desc": "Another stream provider. Manual configuration of stream URL and API endpoints.",
"radio.wizard.shoutcast_info_title": "SHOUTcast",
"radio.wizard.shoutcast_info_desc": "Enter your SHOUTcast stream URL. The wizard will try to find the stats endpoint automatically.",
"radio.wizard.icecast_info_title": "Icecast",
"radio.wizard.icecast_info_desc": "Enter your Icecast stream URL. The wizard uses status-json.xsl for auto-detection.",
"radio.wizard.azurecast_info_title": "AzureCast",
"radio.wizard.azurecast_info_desc": "AzureCast stream URL + server configuration. The wizard configures everything via the AzureCast API.",
"radio.wizard.other_info_title": "Other Stream",
"radio.wizard.other_info_desc": "Enter your stream URL. You can manually configure API endpoints for now playing and listeners later.",
"radio.wizard.stream_url_label": "Stream URL *",
"radio.wizard.stream_url_hint": "The direct URL to your audio stream (MP3, AAC, OGG, etc.)",
"radio.wizard.stream_name_label": "Stream Name",
"radio.wizard.stream_name_placeholder": "My Radio",
"radio.wizard.stream_name_hint": "A name for your radio stream (optional)",
"radio.wizard.azurecast_section": "AzureCast Server Configuration",
"radio.wizard.azurecast_base_url_label": "AzureCast Base URL",
"radio.wizard.azurecast_base_url_hint": "The base URL of your AzureCast server. Auto-detected if left empty.",
"radio.wizard.azurecast_station_id_label": "Station ID",
"radio.wizard.azurecast_station_id_hint": "The station ID in AzureCast (default: 1)",
"radio.wizard.enable_now_playing": "Enable Now Playing",
"radio.wizard.now_playing_api_label": "Now Playing API URL",
"radio.wizard.now_playing_api_hint": "API endpoint that returns the current song. Usually auto-detected.",
"radio.wizard.enable_listeners": "Enable Listeners Counter",
"radio.wizard.listeners_api_label": "Listeners API URL",
"radio.wizard.listeners_api_hint": "API endpoint that returns the listener count.",
"radio.wizard.enable_current_dj": "Show Current DJ",
"radio.wizard.detected": "detected!",
"radio.wizard.detected_desc": "API endpoints were automatically found and filled in.",
"radio.wizard.not_detected": "No automatic detection",
"radio.wizard.not_detected_desc": "Fill in the API URLs manually or skip this step.",
"radio.wizard.section_community": "Community Features",
"radio.wizard.feature_shouts": "Shouts",
"radio.wizard.feature_shouts_desc": "Leave messages",
"radio.wizard.feature_applications": "DJ Applications",
"radio.wizard.feature_applications_desc": "Apply as DJ",
"radio.wizard.feature_requests": "Song Requests",
"radio.wizard.feature_requests_desc": "Request songs",
"radio.wizard.section_display": "Display",
"radio.wizard.feature_widget": "Radio Widget",
"radio.wizard.feature_widget_desc": "Mini player on the site",
"radio.wizard.feature_widget_global": "Widget Everywhere",
"radio.wizard.feature_widget_global_desc": "Show on all pages",
"radio.wizard.widget_position_label": "Widget Position",
"radio.wizard.position_bottom_right": "Bottom Right",
"radio.wizard.position_bottom_left": "Bottom Left",
"radio.wizard.position_top_right": "Top Right",
"radio.wizard.position_top_left": "Top Left",
"radio.wizard.section_gamification": "Gamification",
"radio.wizard.feature_points": "Points System",
"radio.wizard.feature_points_desc": "Earn points by listening",
"radio.wizard.feature_contests": "Contests",
"radio.wizard.feature_contests_desc": "Organize competitions",
"radio.wizard.feature_giveaways": "Giveaways",
"radio.wizard.feature_giveaways_desc": "Give away prizes",
"radio.wizard.section_integrations": "Integrations",
"radio.wizard.feature_discord": "Discord Notifications",
"radio.wizard.feature_discord_desc": "Notifications when DJ goes live / song changes",
"radio.wizard.discord_webhook_label": "Discord Webhook URL",
"radio.wizard.discord_webhook_hint": "Create a webhook in your Discord server channel.",
"radio.wizard.test_title": "Test Connection",
"radio.wizard.test_desc": "Click Test Connection to check if your stream and APIs are reachable.",
"radio.wizard.test_loading": "Testing connection...",
"radio.wizard.test_prompt": "Click the button to test the connection.",
"radio.wizard.test_button": "Test Connection",
"radio.wizard.test_retry": "Test Again",
"radio.wizard.settings_overview": "Settings Overview",
"radio.wizard.settings_overview_desc": "These are the settings that will be saved:",
"radio.wizard.install_confirm": "Are you sure you want to install the radio with these settings?",
"radio.wizard.install_button": "Install Radio",
"radio.wizard.test_result_stream": "Stream Connection",
"radio.wizard.test_result_now_playing": "Now Playing",
"radio.wizard.test_result_listeners": "Listeners",
"radio.wizard.status_success": "Success",
"radio.wizard.status_warning": "Warning",
"radio.wizard.status_error": "Error",
"radio.wizard.status_skipped": "Skipped",
"radio.wizard.status_untested": "Not tested",
"radio.wizard.content_type": "Content-Type",
"radio.wizard.http_status": "HTTP Status",
"radio.wizard.song": "Song",
"radio.wizard.artist": "Artist",
"radio.wizard.listeners": "Listeners",
"radio.wizard.api_url": "API URL",
"radio.wizard.test_stream_ok": "Stream is reachable! You can install the radio.",
"radio.wizard.test_stream_fail": "Stream is not reachable. Check the URL and try again.",
"radio.wizard.test_not_run": "Not tested yet.",
"radio.wizard.test_connection_fail": "Could not run test: ",
"radio.wizard.error": "Error",
"radio.wizard.unknown_error": "Unknown error"
}
+118 -2
View File
@@ -1395,5 +1395,121 @@
"Thumbnails URL": "URL миниатюр",
"Group Homepage": "Домашняя страница группы",
"Habbopages URL": "URL Habbopages",
"URL Prefix": "Префикс URL"
}
"URL Prefix": "Префикс URL",
"radio.wizard.title": "Radio Installation Wizard",
"radio.wizard.step_short": "Step",
"radio.wizard.step_prefix": "Step",
"radio.wizard.of": "of",
"radio.wizard.next_step": "Next Step →",
"radio.wizard.previous_step": "← Previous Step",
"radio.wizard.back_to_setup": "Back to setup",
"radio.wizard.step1_label": "Platform",
"radio.wizard.step2_label": "Stream",
"radio.wizard.step3_label": "API",
"radio.wizard.step4_label": "Features",
"radio.wizard.step5_label": "Test",
"radio.wizard.step1_subtitle": "Choose your streaming platform",
"radio.wizard.step2_title": "Stream Configuration",
"radio.wizard.step3_title": "API Configuration",
"radio.wizard.step3_subtitle": "Now Playing & Listeners",
"radio.wizard.step4_title": "Configure Features",
"radio.wizard.step4_subtitle": "Choose which radio features to enable",
"radio.wizard.step5_title": "Test & Install",
"radio.wizard.step5_subtitle": "Check the connection and complete the installation",
"radio.wizard.platform_shoutcast": "SHOUTcast",
"radio.wizard.platform_shoutcast_desc": "For SHOUTcast servers. Auto-detection of now playing and listeners via stats endpoint.",
"radio.wizard.platform_icecast": "Icecast",
"radio.wizard.platform_icecast_desc": "For Icecast servers. Uses status-json.xsl for auto-detection.",
"radio.wizard.platform_azurecast": "AzureCast",
"radio.wizard.platform_azurecast_desc": "AzureCast hosting. Full API integration with now-playing, listeners and auto-configuration.",
"radio.wizard.platform_other": "Other",
"radio.wizard.platform_other_desc": "Another stream provider. Manual configuration of stream URL and API endpoints.",
"radio.wizard.shoutcast_info_title": "SHOUTcast",
"radio.wizard.shoutcast_info_desc": "Enter your SHOUTcast stream URL. The wizard will try to find the stats endpoint automatically.",
"radio.wizard.icecast_info_title": "Icecast",
"radio.wizard.icecast_info_desc": "Enter your Icecast stream URL. The wizard uses status-json.xsl for auto-detection.",
"radio.wizard.azurecast_info_title": "AzureCast",
"radio.wizard.azurecast_info_desc": "AzureCast stream URL + server configuration. The wizard configures everything via the AzureCast API.",
"radio.wizard.other_info_title": "Other Stream",
"radio.wizard.other_info_desc": "Enter your stream URL. You can manually configure API endpoints for now playing and listeners later.",
"radio.wizard.stream_url_label": "Stream URL *",
"radio.wizard.stream_url_hint": "The direct URL to your audio stream (MP3, AAC, OGG, etc.)",
"radio.wizard.stream_name_label": "Stream Name",
"radio.wizard.stream_name_placeholder": "My Radio",
"radio.wizard.stream_name_hint": "A name for your radio stream (optional)",
"radio.wizard.azurecast_section": "AzureCast Server Configuration",
"radio.wizard.azurecast_base_url_label": "AzureCast Base URL",
"radio.wizard.azurecast_base_url_hint": "The base URL of your AzureCast server. Auto-detected if left empty.",
"radio.wizard.azurecast_station_id_label": "Station ID",
"radio.wizard.azurecast_station_id_hint": "The station ID in AzureCast (default: 1)",
"radio.wizard.enable_now_playing": "Enable Now Playing",
"radio.wizard.now_playing_api_label": "Now Playing API URL",
"radio.wizard.now_playing_api_hint": "API endpoint that returns the current song. Usually auto-detected.",
"radio.wizard.enable_listeners": "Enable Listeners Counter",
"radio.wizard.listeners_api_label": "Listeners API URL",
"radio.wizard.listeners_api_hint": "API endpoint that returns the listener count.",
"radio.wizard.enable_current_dj": "Show Current DJ",
"radio.wizard.detected": "detected!",
"radio.wizard.detected_desc": "API endpoints were automatically found and filled in.",
"radio.wizard.not_detected": "No automatic detection",
"radio.wizard.not_detected_desc": "Fill in the API URLs manually or skip this step.",
"radio.wizard.section_community": "Community Features",
"radio.wizard.feature_shouts": "Shouts",
"radio.wizard.feature_shouts_desc": "Leave messages",
"radio.wizard.feature_applications": "DJ Applications",
"radio.wizard.feature_applications_desc": "Apply as DJ",
"radio.wizard.feature_requests": "Song Requests",
"radio.wizard.feature_requests_desc": "Request songs",
"radio.wizard.section_display": "Display",
"radio.wizard.feature_widget": "Radio Widget",
"radio.wizard.feature_widget_desc": "Mini player on the site",
"radio.wizard.feature_widget_global": "Widget Everywhere",
"radio.wizard.feature_widget_global_desc": "Show on all pages",
"radio.wizard.widget_position_label": "Widget Position",
"radio.wizard.position_bottom_right": "Bottom Right",
"radio.wizard.position_bottom_left": "Bottom Left",
"radio.wizard.position_top_right": "Top Right",
"radio.wizard.position_top_left": "Top Left",
"radio.wizard.section_gamification": "Gamification",
"radio.wizard.feature_points": "Points System",
"radio.wizard.feature_points_desc": "Earn points by listening",
"radio.wizard.feature_contests": "Contests",
"radio.wizard.feature_contests_desc": "Organize competitions",
"radio.wizard.feature_giveaways": "Giveaways",
"radio.wizard.feature_giveaways_desc": "Give away prizes",
"radio.wizard.section_integrations": "Integrations",
"radio.wizard.feature_discord": "Discord Notifications",
"radio.wizard.feature_discord_desc": "Notifications when DJ goes live / song changes",
"radio.wizard.discord_webhook_label": "Discord Webhook URL",
"radio.wizard.discord_webhook_hint": "Create a webhook in your Discord server channel.",
"radio.wizard.test_title": "Test Connection",
"radio.wizard.test_desc": "Click Test Connection to check if your stream and APIs are reachable.",
"radio.wizard.test_loading": "Testing connection...",
"radio.wizard.test_prompt": "Click the button to test the connection.",
"radio.wizard.test_button": "Test Connection",
"radio.wizard.test_retry": "Test Again",
"radio.wizard.settings_overview": "Settings Overview",
"radio.wizard.settings_overview_desc": "These are the settings that will be saved:",
"radio.wizard.install_confirm": "Are you sure you want to install the radio with these settings?",
"radio.wizard.install_button": "Install Radio",
"radio.wizard.test_result_stream": "Stream Connection",
"radio.wizard.test_result_now_playing": "Now Playing",
"radio.wizard.test_result_listeners": "Listeners",
"radio.wizard.status_success": "Success",
"radio.wizard.status_warning": "Warning",
"radio.wizard.status_error": "Error",
"radio.wizard.status_skipped": "Skipped",
"radio.wizard.status_untested": "Not tested",
"radio.wizard.content_type": "Content-Type",
"radio.wizard.http_status": "HTTP Status",
"radio.wizard.song": "Song",
"radio.wizard.artist": "Artist",
"radio.wizard.listeners": "Listeners",
"radio.wizard.api_url": "API URL",
"radio.wizard.test_stream_ok": "Stream is reachable! You can install the radio.",
"radio.wizard.test_stream_fail": "Stream is not reachable. Check the URL and try again.",
"radio.wizard.test_not_run": "Not tested yet.",
"radio.wizard.test_connection_fail": "Could not run test: ",
"radio.wizard.error": "Error",
"radio.wizard.unknown_error": "Unknown error"
}
+118 -2
View File
@@ -1389,5 +1389,121 @@
"Thumbnails URL": "Thumbnails URL",
"Group Homepage": "Group Homepage",
"Habbopages URL": "Habbopages URL",
"URL Prefix": "URL Prefix"
}
"URL Prefix": "URL Prefix",
"radio.wizard.title": "Radio Installation Wizard",
"radio.wizard.step_short": "Step",
"radio.wizard.step_prefix": "Step",
"radio.wizard.of": "of",
"radio.wizard.next_step": "Next Step →",
"radio.wizard.previous_step": "← Previous Step",
"radio.wizard.back_to_setup": "Back to setup",
"radio.wizard.step1_label": "Platform",
"radio.wizard.step2_label": "Stream",
"radio.wizard.step3_label": "API",
"radio.wizard.step4_label": "Features",
"radio.wizard.step5_label": "Test",
"radio.wizard.step1_subtitle": "Choose your streaming platform",
"radio.wizard.step2_title": "Stream Configuration",
"radio.wizard.step3_title": "API Configuration",
"radio.wizard.step3_subtitle": "Now Playing & Listeners",
"radio.wizard.step4_title": "Configure Features",
"radio.wizard.step4_subtitle": "Choose which radio features to enable",
"radio.wizard.step5_title": "Test & Install",
"radio.wizard.step5_subtitle": "Check the connection and complete the installation",
"radio.wizard.platform_shoutcast": "SHOUTcast",
"radio.wizard.platform_shoutcast_desc": "For SHOUTcast servers. Auto-detection of now playing and listeners via stats endpoint.",
"radio.wizard.platform_icecast": "Icecast",
"radio.wizard.platform_icecast_desc": "For Icecast servers. Uses status-json.xsl for auto-detection.",
"radio.wizard.platform_azurecast": "AzureCast",
"radio.wizard.platform_azurecast_desc": "AzureCast hosting. Full API integration with now-playing, listeners and auto-configuration.",
"radio.wizard.platform_other": "Other",
"radio.wizard.platform_other_desc": "Another stream provider. Manual configuration of stream URL and API endpoints.",
"radio.wizard.shoutcast_info_title": "SHOUTcast",
"radio.wizard.shoutcast_info_desc": "Enter your SHOUTcast stream URL. The wizard will try to find the stats endpoint automatically.",
"radio.wizard.icecast_info_title": "Icecast",
"radio.wizard.icecast_info_desc": "Enter your Icecast stream URL. The wizard uses status-json.xsl for auto-detection.",
"radio.wizard.azurecast_info_title": "AzureCast",
"radio.wizard.azurecast_info_desc": "AzureCast stream URL + server configuration. The wizard configures everything via the AzureCast API.",
"radio.wizard.other_info_title": "Other Stream",
"radio.wizard.other_info_desc": "Enter your stream URL. You can manually configure API endpoints for now playing and listeners later.",
"radio.wizard.stream_url_label": "Stream URL *",
"radio.wizard.stream_url_hint": "The direct URL to your audio stream (MP3, AAC, OGG, etc.)",
"radio.wizard.stream_name_label": "Stream Name",
"radio.wizard.stream_name_placeholder": "My Radio",
"radio.wizard.stream_name_hint": "A name for your radio stream (optional)",
"radio.wizard.azurecast_section": "AzureCast Server Configuration",
"radio.wizard.azurecast_base_url_label": "AzureCast Base URL",
"radio.wizard.azurecast_base_url_hint": "The base URL of your AzureCast server. Auto-detected if left empty.",
"radio.wizard.azurecast_station_id_label": "Station ID",
"radio.wizard.azurecast_station_id_hint": "The station ID in AzureCast (default: 1)",
"radio.wizard.enable_now_playing": "Enable Now Playing",
"radio.wizard.now_playing_api_label": "Now Playing API URL",
"radio.wizard.now_playing_api_hint": "API endpoint that returns the current song. Usually auto-detected.",
"radio.wizard.enable_listeners": "Enable Listeners Counter",
"radio.wizard.listeners_api_label": "Listeners API URL",
"radio.wizard.listeners_api_hint": "API endpoint that returns the listener count.",
"radio.wizard.enable_current_dj": "Show Current DJ",
"radio.wizard.detected": "detected!",
"radio.wizard.detected_desc": "API endpoints were automatically found and filled in.",
"radio.wizard.not_detected": "No automatic detection",
"radio.wizard.not_detected_desc": "Fill in the API URLs manually or skip this step.",
"radio.wizard.section_community": "Community Features",
"radio.wizard.feature_shouts": "Shouts",
"radio.wizard.feature_shouts_desc": "Leave messages",
"radio.wizard.feature_applications": "DJ Applications",
"radio.wizard.feature_applications_desc": "Apply as DJ",
"radio.wizard.feature_requests": "Song Requests",
"radio.wizard.feature_requests_desc": "Request songs",
"radio.wizard.section_display": "Display",
"radio.wizard.feature_widget": "Radio Widget",
"radio.wizard.feature_widget_desc": "Mini player on the site",
"radio.wizard.feature_widget_global": "Widget Everywhere",
"radio.wizard.feature_widget_global_desc": "Show on all pages",
"radio.wizard.widget_position_label": "Widget Position",
"radio.wizard.position_bottom_right": "Bottom Right",
"radio.wizard.position_bottom_left": "Bottom Left",
"radio.wizard.position_top_right": "Top Right",
"radio.wizard.position_top_left": "Top Left",
"radio.wizard.section_gamification": "Gamification",
"radio.wizard.feature_points": "Points System",
"radio.wizard.feature_points_desc": "Earn points by listening",
"radio.wizard.feature_contests": "Contests",
"radio.wizard.feature_contests_desc": "Organize competitions",
"radio.wizard.feature_giveaways": "Giveaways",
"radio.wizard.feature_giveaways_desc": "Give away prizes",
"radio.wizard.section_integrations": "Integrations",
"radio.wizard.feature_discord": "Discord Notifications",
"radio.wizard.feature_discord_desc": "Notifications when DJ goes live / song changes",
"radio.wizard.discord_webhook_label": "Discord Webhook URL",
"radio.wizard.discord_webhook_hint": "Create a webhook in your Discord server channel.",
"radio.wizard.test_title": "Test Connection",
"radio.wizard.test_desc": "Click Test Connection to check if your stream and APIs are reachable.",
"radio.wizard.test_loading": "Testing connection...",
"radio.wizard.test_prompt": "Click the button to test the connection.",
"radio.wizard.test_button": "Test Connection",
"radio.wizard.test_retry": "Test Again",
"radio.wizard.settings_overview": "Settings Overview",
"radio.wizard.settings_overview_desc": "These are the settings that will be saved:",
"radio.wizard.install_confirm": "Are you sure you want to install the radio with these settings?",
"radio.wizard.install_button": "Install Radio",
"radio.wizard.test_result_stream": "Stream Connection",
"radio.wizard.test_result_now_playing": "Now Playing",
"radio.wizard.test_result_listeners": "Listeners",
"radio.wizard.status_success": "Success",
"radio.wizard.status_warning": "Warning",
"radio.wizard.status_error": "Error",
"radio.wizard.status_skipped": "Skipped",
"radio.wizard.status_untested": "Not tested",
"radio.wizard.content_type": "Content-Type",
"radio.wizard.http_status": "HTTP Status",
"radio.wizard.song": "Song",
"radio.wizard.artist": "Artist",
"radio.wizard.listeners": "Listeners",
"radio.wizard.api_url": "API URL",
"radio.wizard.test_stream_ok": "Stream is reachable! You can install the radio.",
"radio.wizard.test_stream_fail": "Stream is not reachable. Check the URL and try again.",
"radio.wizard.test_not_run": "Not tested yet.",
"radio.wizard.test_connection_fail": "Could not run test: ",
"radio.wizard.error": "Error",
"radio.wizard.unknown_error": "Unknown error"
}
+118 -2
View File
@@ -1395,5 +1395,121 @@
"Thumbnails URL": "Küçük Resimler URL",
"Group Homepage": "Grup Ana Sayfası",
"Habbopages URL": "Habbopages URL",
"URL Prefix": "URL Öneki"
}
"URL Prefix": "URL Öneki",
"radio.wizard.title": "Radio Installation Wizard",
"radio.wizard.step_short": "Step",
"radio.wizard.step_prefix": "Step",
"radio.wizard.of": "of",
"radio.wizard.next_step": "Next Step →",
"radio.wizard.previous_step": "← Previous Step",
"radio.wizard.back_to_setup": "Back to setup",
"radio.wizard.step1_label": "Platform",
"radio.wizard.step2_label": "Stream",
"radio.wizard.step3_label": "API",
"radio.wizard.step4_label": "Features",
"radio.wizard.step5_label": "Test",
"radio.wizard.step1_subtitle": "Choose your streaming platform",
"radio.wizard.step2_title": "Stream Configuration",
"radio.wizard.step3_title": "API Configuration",
"radio.wizard.step3_subtitle": "Now Playing & Listeners",
"radio.wizard.step4_title": "Configure Features",
"radio.wizard.step4_subtitle": "Choose which radio features to enable",
"radio.wizard.step5_title": "Test & Install",
"radio.wizard.step5_subtitle": "Check the connection and complete the installation",
"radio.wizard.platform_shoutcast": "SHOUTcast",
"radio.wizard.platform_shoutcast_desc": "For SHOUTcast servers. Auto-detection of now playing and listeners via stats endpoint.",
"radio.wizard.platform_icecast": "Icecast",
"radio.wizard.platform_icecast_desc": "For Icecast servers. Uses status-json.xsl for auto-detection.",
"radio.wizard.platform_azurecast": "AzureCast",
"radio.wizard.platform_azurecast_desc": "AzureCast hosting. Full API integration with now-playing, listeners and auto-configuration.",
"radio.wizard.platform_other": "Other",
"radio.wizard.platform_other_desc": "Another stream provider. Manual configuration of stream URL and API endpoints.",
"radio.wizard.shoutcast_info_title": "SHOUTcast",
"radio.wizard.shoutcast_info_desc": "Enter your SHOUTcast stream URL. The wizard will try to find the stats endpoint automatically.",
"radio.wizard.icecast_info_title": "Icecast",
"radio.wizard.icecast_info_desc": "Enter your Icecast stream URL. The wizard uses status-json.xsl for auto-detection.",
"radio.wizard.azurecast_info_title": "AzureCast",
"radio.wizard.azurecast_info_desc": "AzureCast stream URL + server configuration. The wizard configures everything via the AzureCast API.",
"radio.wizard.other_info_title": "Other Stream",
"radio.wizard.other_info_desc": "Enter your stream URL. You can manually configure API endpoints for now playing and listeners later.",
"radio.wizard.stream_url_label": "Stream URL *",
"radio.wizard.stream_url_hint": "The direct URL to your audio stream (MP3, AAC, OGG, etc.)",
"radio.wizard.stream_name_label": "Stream Name",
"radio.wizard.stream_name_placeholder": "My Radio",
"radio.wizard.stream_name_hint": "A name for your radio stream (optional)",
"radio.wizard.azurecast_section": "AzureCast Server Configuration",
"radio.wizard.azurecast_base_url_label": "AzureCast Base URL",
"radio.wizard.azurecast_base_url_hint": "The base URL of your AzureCast server. Auto-detected if left empty.",
"radio.wizard.azurecast_station_id_label": "Station ID",
"radio.wizard.azurecast_station_id_hint": "The station ID in AzureCast (default: 1)",
"radio.wizard.enable_now_playing": "Enable Now Playing",
"radio.wizard.now_playing_api_label": "Now Playing API URL",
"radio.wizard.now_playing_api_hint": "API endpoint that returns the current song. Usually auto-detected.",
"radio.wizard.enable_listeners": "Enable Listeners Counter",
"radio.wizard.listeners_api_label": "Listeners API URL",
"radio.wizard.listeners_api_hint": "API endpoint that returns the listener count.",
"radio.wizard.enable_current_dj": "Show Current DJ",
"radio.wizard.detected": "detected!",
"radio.wizard.detected_desc": "API endpoints were automatically found and filled in.",
"radio.wizard.not_detected": "No automatic detection",
"radio.wizard.not_detected_desc": "Fill in the API URLs manually or skip this step.",
"radio.wizard.section_community": "Community Features",
"radio.wizard.feature_shouts": "Shouts",
"radio.wizard.feature_shouts_desc": "Leave messages",
"radio.wizard.feature_applications": "DJ Applications",
"radio.wizard.feature_applications_desc": "Apply as DJ",
"radio.wizard.feature_requests": "Song Requests",
"radio.wizard.feature_requests_desc": "Request songs",
"radio.wizard.section_display": "Display",
"radio.wizard.feature_widget": "Radio Widget",
"radio.wizard.feature_widget_desc": "Mini player on the site",
"radio.wizard.feature_widget_global": "Widget Everywhere",
"radio.wizard.feature_widget_global_desc": "Show on all pages",
"radio.wizard.widget_position_label": "Widget Position",
"radio.wizard.position_bottom_right": "Bottom Right",
"radio.wizard.position_bottom_left": "Bottom Left",
"radio.wizard.position_top_right": "Top Right",
"radio.wizard.position_top_left": "Top Left",
"radio.wizard.section_gamification": "Gamification",
"radio.wizard.feature_points": "Points System",
"radio.wizard.feature_points_desc": "Earn points by listening",
"radio.wizard.feature_contests": "Contests",
"radio.wizard.feature_contests_desc": "Organize competitions",
"radio.wizard.feature_giveaways": "Giveaways",
"radio.wizard.feature_giveaways_desc": "Give away prizes",
"radio.wizard.section_integrations": "Integrations",
"radio.wizard.feature_discord": "Discord Notifications",
"radio.wizard.feature_discord_desc": "Notifications when DJ goes live / song changes",
"radio.wizard.discord_webhook_label": "Discord Webhook URL",
"radio.wizard.discord_webhook_hint": "Create a webhook in your Discord server channel.",
"radio.wizard.test_title": "Test Connection",
"radio.wizard.test_desc": "Click Test Connection to check if your stream and APIs are reachable.",
"radio.wizard.test_loading": "Testing connection...",
"radio.wizard.test_prompt": "Click the button to test the connection.",
"radio.wizard.test_button": "Test Connection",
"radio.wizard.test_retry": "Test Again",
"radio.wizard.settings_overview": "Settings Overview",
"radio.wizard.settings_overview_desc": "These are the settings that will be saved:",
"radio.wizard.install_confirm": "Are you sure you want to install the radio with these settings?",
"radio.wizard.install_button": "Install Radio",
"radio.wizard.test_result_stream": "Stream Connection",
"radio.wizard.test_result_now_playing": "Now Playing",
"radio.wizard.test_result_listeners": "Listeners",
"radio.wizard.status_success": "Success",
"radio.wizard.status_warning": "Warning",
"radio.wizard.status_error": "Error",
"radio.wizard.status_skipped": "Skipped",
"radio.wizard.status_untested": "Not tested",
"radio.wizard.content_type": "Content-Type",
"radio.wizard.http_status": "HTTP Status",
"radio.wizard.song": "Song",
"radio.wizard.artist": "Artist",
"radio.wizard.listeners": "Listeners",
"radio.wizard.api_url": "API URL",
"radio.wizard.test_stream_ok": "Stream is reachable! You can install the radio.",
"radio.wizard.test_stream_fail": "Stream is not reachable. Check the URL and try again.",
"radio.wizard.test_not_run": "Not tested yet.",
"radio.wizard.test_connection_fail": "Could not run test: ",
"radio.wizard.error": "Error",
"radio.wizard.unknown_error": "Unknown error"
}
+118 -2
View File
@@ -1389,5 +1389,121 @@
"Thumbnails URL": "Thumbnails URL",
"Group Homepage": "Group Homepage",
"Habbopages URL": "Habbopages URL",
"URL Prefix": "URL Prefix"
}
"URL Prefix": "URL Prefix",
"radio.wizard.title": "Radio Installation Wizard",
"radio.wizard.step_short": "Step",
"radio.wizard.step_prefix": "Step",
"radio.wizard.of": "of",
"radio.wizard.next_step": "Next Step →",
"radio.wizard.previous_step": "← Previous Step",
"radio.wizard.back_to_setup": "Back to setup",
"radio.wizard.step1_label": "Platform",
"radio.wizard.step2_label": "Stream",
"radio.wizard.step3_label": "API",
"radio.wizard.step4_label": "Features",
"radio.wizard.step5_label": "Test",
"radio.wizard.step1_subtitle": "Choose your streaming platform",
"radio.wizard.step2_title": "Stream Configuration",
"radio.wizard.step3_title": "API Configuration",
"radio.wizard.step3_subtitle": "Now Playing & Listeners",
"radio.wizard.step4_title": "Configure Features",
"radio.wizard.step4_subtitle": "Choose which radio features to enable",
"radio.wizard.step5_title": "Test & Install",
"radio.wizard.step5_subtitle": "Check the connection and complete the installation",
"radio.wizard.platform_shoutcast": "SHOUTcast",
"radio.wizard.platform_shoutcast_desc": "For SHOUTcast servers. Auto-detection of now playing and listeners via stats endpoint.",
"radio.wizard.platform_icecast": "Icecast",
"radio.wizard.platform_icecast_desc": "For Icecast servers. Uses status-json.xsl for auto-detection.",
"radio.wizard.platform_azurecast": "AzureCast",
"radio.wizard.platform_azurecast_desc": "AzureCast hosting. Full API integration with now-playing, listeners and auto-configuration.",
"radio.wizard.platform_other": "Other",
"radio.wizard.platform_other_desc": "Another stream provider. Manual configuration of stream URL and API endpoints.",
"radio.wizard.shoutcast_info_title": "SHOUTcast",
"radio.wizard.shoutcast_info_desc": "Enter your SHOUTcast stream URL. The wizard will try to find the stats endpoint automatically.",
"radio.wizard.icecast_info_title": "Icecast",
"radio.wizard.icecast_info_desc": "Enter your Icecast stream URL. The wizard uses status-json.xsl for auto-detection.",
"radio.wizard.azurecast_info_title": "AzureCast",
"radio.wizard.azurecast_info_desc": "AzureCast stream URL + server configuration. The wizard configures everything via the AzureCast API.",
"radio.wizard.other_info_title": "Other Stream",
"radio.wizard.other_info_desc": "Enter your stream URL. You can manually configure API endpoints for now playing and listeners later.",
"radio.wizard.stream_url_label": "Stream URL *",
"radio.wizard.stream_url_hint": "The direct URL to your audio stream (MP3, AAC, OGG, etc.)",
"radio.wizard.stream_name_label": "Stream Name",
"radio.wizard.stream_name_placeholder": "My Radio",
"radio.wizard.stream_name_hint": "A name for your radio stream (optional)",
"radio.wizard.azurecast_section": "AzureCast Server Configuration",
"radio.wizard.azurecast_base_url_label": "AzureCast Base URL",
"radio.wizard.azurecast_base_url_hint": "The base URL of your AzureCast server. Auto-detected if left empty.",
"radio.wizard.azurecast_station_id_label": "Station ID",
"radio.wizard.azurecast_station_id_hint": "The station ID in AzureCast (default: 1)",
"radio.wizard.enable_now_playing": "Enable Now Playing",
"radio.wizard.now_playing_api_label": "Now Playing API URL",
"radio.wizard.now_playing_api_hint": "API endpoint that returns the current song. Usually auto-detected.",
"radio.wizard.enable_listeners": "Enable Listeners Counter",
"radio.wizard.listeners_api_label": "Listeners API URL",
"radio.wizard.listeners_api_hint": "API endpoint that returns the listener count.",
"radio.wizard.enable_current_dj": "Show Current DJ",
"radio.wizard.detected": "detected!",
"radio.wizard.detected_desc": "API endpoints were automatically found and filled in.",
"radio.wizard.not_detected": "No automatic detection",
"radio.wizard.not_detected_desc": "Fill in the API URLs manually or skip this step.",
"radio.wizard.section_community": "Community Features",
"radio.wizard.feature_shouts": "Shouts",
"radio.wizard.feature_shouts_desc": "Leave messages",
"radio.wizard.feature_applications": "DJ Applications",
"radio.wizard.feature_applications_desc": "Apply as DJ",
"radio.wizard.feature_requests": "Song Requests",
"radio.wizard.feature_requests_desc": "Request songs",
"radio.wizard.section_display": "Display",
"radio.wizard.feature_widget": "Radio Widget",
"radio.wizard.feature_widget_desc": "Mini player on the site",
"radio.wizard.feature_widget_global": "Widget Everywhere",
"radio.wizard.feature_widget_global_desc": "Show on all pages",
"radio.wizard.widget_position_label": "Widget Position",
"radio.wizard.position_bottom_right": "Bottom Right",
"radio.wizard.position_bottom_left": "Bottom Left",
"radio.wizard.position_top_right": "Top Right",
"radio.wizard.position_top_left": "Top Left",
"radio.wizard.section_gamification": "Gamification",
"radio.wizard.feature_points": "Points System",
"radio.wizard.feature_points_desc": "Earn points by listening",
"radio.wizard.feature_contests": "Contests",
"radio.wizard.feature_contests_desc": "Organize competitions",
"radio.wizard.feature_giveaways": "Giveaways",
"radio.wizard.feature_giveaways_desc": "Give away prizes",
"radio.wizard.section_integrations": "Integrations",
"radio.wizard.feature_discord": "Discord Notifications",
"radio.wizard.feature_discord_desc": "Notifications when DJ goes live / song changes",
"radio.wizard.discord_webhook_label": "Discord Webhook URL",
"radio.wizard.discord_webhook_hint": "Create a webhook in your Discord server channel.",
"radio.wizard.test_title": "Test Connection",
"radio.wizard.test_desc": "Click Test Connection to check if your stream and APIs are reachable.",
"radio.wizard.test_loading": "Testing connection...",
"radio.wizard.test_prompt": "Click the button to test the connection.",
"radio.wizard.test_button": "Test Connection",
"radio.wizard.test_retry": "Test Again",
"radio.wizard.settings_overview": "Settings Overview",
"radio.wizard.settings_overview_desc": "These are the settings that will be saved:",
"radio.wizard.install_confirm": "Are you sure you want to install the radio with these settings?",
"radio.wizard.install_button": "Install Radio",
"radio.wizard.test_result_stream": "Stream Connection",
"radio.wizard.test_result_now_playing": "Now Playing",
"radio.wizard.test_result_listeners": "Listeners",
"radio.wizard.status_success": "Success",
"radio.wizard.status_warning": "Warning",
"radio.wizard.status_error": "Error",
"radio.wizard.status_skipped": "Skipped",
"radio.wizard.status_untested": "Not tested",
"radio.wizard.content_type": "Content-Type",
"radio.wizard.http_status": "HTTP Status",
"radio.wizard.song": "Song",
"radio.wizard.artist": "Artist",
"radio.wizard.listeners": "Listeners",
"radio.wizard.api_url": "API URL",
"radio.wizard.test_stream_ok": "Stream is reachable! You can install the radio.",
"radio.wizard.test_stream_fail": "Stream is not reachable. Check the URL and try again.",
"radio.wizard.test_not_run": "Not tested yet.",
"radio.wizard.test_connection_fail": "Could not run test: ",
"radio.wizard.error": "Error",
"radio.wizard.unknown_error": "Unknown error"
}
@@ -356,6 +356,11 @@
</button>
</form>
<a href="{{ route('admin.radio.wizard') }}" class="btn-primary" style="text-decoration: none;">
<span>🎯</span>
{{ __('radio.open_wizard') }}
</a>
<a href="/housekeeping/radio-settings" class="btn-secondary">
<span>⚙️</span>
{{ __('radio.go_to_radio_settings') }}
+64
View File
@@ -0,0 +1,64 @@
@php
$statusLabels = [
'success' => __('radio.wizard.status_success'),
'warning' => __('radio.wizard.status_warning'),
'error' => __('radio.wizard.status_error'),
'skipped' => __('radio.wizard.status_skipped'),
'untested' => __('radio.wizard.status_untested'),
];
$statusIcons = [
'success' => '✅',
'warning' => '⚠️',
'error' => '❌',
'skipped' => '⏭️',
'untested' => '❓',
];
$testNames = [
'stream' => '📡 ' . __('radio.wizard.test_result_stream'),
'now_playing' => '🎵 ' . __('radio.wizard.test_result_now_playing'),
'listeners' => '👥 ' . __('radio.wizard.test_result_listeners'),
];
@endphp
@foreach(['stream', 'now_playing', 'listeners'] as $key)
@php $result = $results[$key] ?? null; @endphp
@if($result)
<div class="test-card {{ $result['status'] }}">
<div class="test-title">
{{ $statusIcons[$result['status']] ?? '❓' }} {{ $testNames[$key] ?? $key }}
<span class="status-badge {{ $result['status'] }}">{{ $statusLabels[$result['status']] ?? $result['status'] }}</span>
</div>
<div class="test-detail">
{{ $result['message'] }}
@if(!empty($result['content_type']))
<br><strong>{{ __('radio.wizard.content_type') }}:</strong> {{ $result['content_type'] }}
@endif
@if(!empty($result['http_code']))
<br><strong>{{ __('radio.wizard.http_status') }}:</strong> {{ $result['http_code'] }}
@endif
@if(!empty($result['song']))
<br><strong>{{ __('radio.wizard.song') }}:</strong> {{ $result['song'] }}
@endif
@if(!empty($result['artist']))
<strong>{{ __('radio.wizard.artist') }}:</strong> {{ $result['artist'] }}
@endif
@if(isset($result['count']))
<br><strong>{{ __('radio.wizard.listeners') }}:</strong> {{ $result['count'] }}
@endif
@if(!empty($result['api_url']))
<br><strong>{{ __('radio.wizard.api_url') }}:</strong> {{ $result['api_url'] }}
@endif
</div>
</div>
@endif
@endforeach
<div class="test-result-section">
@if(($results['stream']['status'] ?? '') === 'success' || ($results['stream']['status'] ?? '') === 'warning')
<p style="color: #38a169; font-weight: 600;"> {{ __('radio.wizard.test_stream_ok') }}</p>
@elseif(($results['stream']['status'] ?? '') === 'error')
<p style="color: #e53e3e; font-weight: 600;"> {{ __('radio.wizard.test_stream_fail') }}</p>
@else
<p style="color: #a0aec0;">{{ __('radio.wizard.test_not_run') }}</p>
@endif
</div>
+99
View File
@@ -0,0 +1,99 @@
@extends('layouts.app')
@section('title', __('radio.wizard.title') . ' - ' . __('radio.wizard.step_short') . ' 1 - ' . config('app.name'))
@push('styles')
<style>
.wizard-container { max-width: 900px; margin: 0 auto; padding: 2rem; }
.wizard-card { background: white; border-radius: 16px; padding: 2.5rem; box-shadow: 0 4px 20px rgba(0,0,0,0.08); margin-bottom: 2rem; }
.wizard-header { text-align: center; margin-bottom: 2.5rem; }
.wizard-title { font-size: 2rem; font-weight: 800; color: #1a202c; margin-bottom: 0.5rem; }
.wizard-subtitle { color: #4a5568; font-size: 1.1rem; }
.steps-indicator { display: flex; justify-content: center; gap: 0.5rem; margin-bottom: 2.5rem; }
.step-dot { width: 40px; height: 40px; border-radius: 50%; display: flex; align-items: center; justify-content: center; font-weight: 700; font-size: 0.9rem; }
.step-dot.active { background: #eeb425; color: white; }
.step-dot.inactive { background: #e2e8f0; color: #a0aec0; }
.step-dot.completed { background: #38a169; color: white; }
.step-line { width: 60px; height: 3px; align-self: center; border-radius: 2px; }
.step-line.active { background: #eeb425; }
.step-line.inactive { background: #e2e8f0; }
.platform-card { border: 3px solid #e2e8f0; border-radius: 16px; padding: 2rem; cursor: pointer; transition: all 0.3s; text-align: center; }
.platform-card:hover { border-color: #eeb425; transform: translateY(-2px); box-shadow: 0 8px 24px rgba(238,180,37,0.15); }
.platform-card.selected { border-color: #eeb425; background: #fffbeb; }
.platform-icon { font-size: 3rem; margin-bottom: 1rem; }
.platform-name { font-size: 1.25rem; font-weight: 700; color: #2d3748; margin-bottom: 0.5rem; }
.platform-desc { color: #4a5568; font-size: 0.9rem; line-height: 1.5; }
.platform-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: 1.5rem; margin-bottom: 2rem; }
.btn-wizard { background: linear-gradient(135deg, #eeb425, #d4a52a); color: #1a202c; padding: 0.85rem 2rem; border: none; border-radius: 10px; font-weight: 700; font-size: 1.1rem; cursor: pointer; transition: all 0.3s; box-shadow: 0 4px 12px rgba(238,180,37,0.3); }
.btn-wizard:hover { transform: translateY(-2px); box-shadow: 0 8px 24px rgba(238,180,37,0.4); }
.btn-wizard:disabled { opacity: 0.5; cursor: not-allowed; transform: none; }
.radio-input { display: none; }
.step-label { font-size: 0.85rem; color: #718096; text-align: center; margin-top: 0.5rem; }
</style>
@endpush
@section('content')
<div class="wizard-container">
<div class="wizard-header">
<h1 class="wizard-title">📻 {{ __('radio.wizard.title') }}</h1>
<p class="wizard-subtitle">{{ __('radio.wizard.step_prefix') }} 1 {{ __('radio.wizard.of') }} 5 - {{ __('radio.wizard.step1_subtitle') }}</p>
</div>
<div class="steps-indicator">
<div class="step-dot active">1</div>
<div class="step-line inactive"></div>
<div class="step-dot inactive">2</div>
<div class="step-line inactive"></div>
<div class="step-dot inactive">3</div>
<div class="step-line inactive"></div>
<div class="step-dot inactive">4</div>
<div class="step-line inactive"></div>
<div class="step-dot inactive">5</div>
</div>
<div style="display: flex; justify-content: center; gap: 3.5rem; margin-top: -1.5rem; margin-bottom: 1rem; font-size: 0.75rem; color: #718096;">
<span style="color: #eeb425; font-weight: 600;">{{ __('radio.wizard.step1_label') }}</span>
<span>{{ __('radio.wizard.step2_label') }}</span>
<span>{{ __('radio.wizard.step3_label') }}</span>
<span>{{ __('radio.wizard.step4_label') }}</span>
<span>{{ __('radio.wizard.step5_label') }}</span>
</div>
<div class="wizard-card">
<form id="platformForm" action="{{ route('admin.radio.wizard.process-step-1') }}" method="POST">
@csrf
<div class="platform-grid">
@php $platforms = ['shoutcast', 'icecast', 'azurecast', 'other']; @endphp
@php $icons = ['shoutcast' => '📡', 'icecast' => '🎵', 'azurecast' => '☁️', 'other' => '🔗']; @endphp
@foreach($platforms as $p)
<label class="platform-card" id="card-{{ $p }}" onclick="selectPlatform('{{ $p }}')">
<input type="radio" name="platform" value="{{ $p }}" class="radio-input" {{ $selectedPlatform === $p ? 'checked' : '' }} required>
<div class="platform-icon">{{ $icons[$p] }}</div>
<div class="platform-name">{{ __("radio.wizard.platform_{$p}") }}</div>
<div class="platform-desc">{{ __("radio.wizard.platform_{$p}_desc") }}</div>
</label>
@endforeach
</div>
<div style="display: flex; justify-content: space-between; align-items: center;">
<a href="{{ route('admin.radio.setup') }}" class="btn-wizard" style="background: #e2e8f0; color: #4a5568; box-shadow: none; text-decoration: none; font-size: 0.95rem;">
{{ __('radio.wizard.back_to_setup') }}
</a>
<button type="submit" class="btn-wizard" id="continueBtn" disabled>
{{ __('radio.wizard.next_step') }}
</button>
</div>
</form>
</div>
</div>
<script>
function selectPlatform(value) {
document.querySelectorAll('.platform-card').forEach(c => c.classList.remove('selected'));
document.getElementById('card-' + value).classList.add('selected');
document.querySelector('input[name="platform"][value="' + value + '"]').checked = true;
document.getElementById('continueBtn').disabled = false;
}
</script>
@endsection
+118
View File
@@ -0,0 +1,118 @@
@extends('layouts.app')
@section('title', __('radio.wizard.title') . ' - ' . __('radio.wizard.step_short') . ' 2 - ' . config('app.name'))
@push('styles')
<style>
.wizard-container { max-width: 900px; margin: 0 auto; padding: 2rem; }
.wizard-card { background: white; border-radius: 16px; padding: 2.5rem; box-shadow: 0 4px 20px rgba(0,0,0,0.08); margin-bottom: 2rem; }
.wizard-header { text-align: center; margin-bottom: 2.5rem; }
.wizard-title { font-size: 2rem; font-weight: 800; color: #1a202c; margin-bottom: 0.5rem; }
.wizard-subtitle { color: #4a5568; font-size: 1.1rem; }
.steps-indicator { display: flex; justify-content: center; gap: 0.5rem; margin-bottom: 2.5rem; }
.step-dot { width: 40px; height: 40px; border-radius: 50%; display: flex; align-items: center; justify-content: center; font-weight: 700; font-size: 0.9rem; }
.step-dot.active { background: #eeb425; color: white; }
.step-dot.inactive { background: #e2e8f0; color: #a0aec0; }
.step-dot.completed { background: #38a169; color: white; }
.step-line { width: 60px; height: 3px; align-self: center; border-radius: 2px; }
.step-line.active { background: #eeb425; }
.step-line.inactive { background: #e2e8f0; }
.form-group { margin-bottom: 1.5rem; }
.form-label { display: block; font-weight: 600; color: #2d3748; margin-bottom: 0.5rem; }
.form-input { width: 100%; padding: 0.85rem 1rem; border: 2px solid #e2e8f0; border-radius: 10px; font-size: 1rem; transition: border-color 0.2s; }
.form-input:focus { outline: none; border-color: #eeb425; box-shadow: 0 0 0 3px rgba(238,180,37,0.1); }
.form-hint { color: #718096; font-size: 0.85rem; margin-top: 0.3rem; }
.platform-badge { display: inline-block; background: #fffbeb; color: #b7791f; padding: 0.3rem 0.8rem; border-radius: 20px; font-size: 0.85rem; font-weight: 600; }
.btn-wizard { background: linear-gradient(135deg, #eeb425, #d4a52a); color: #1a202c; padding: 0.85rem 2rem; border: none; border-radius: 10px; font-weight: 700; font-size: 1.1rem; cursor: pointer; transition: all 0.3s; box-shadow: 0 4px 12px rgba(238,180,37,0.3); text-decoration: none; display: inline-block; }
.btn-wizard:hover { transform: translateY(-2px); box-shadow: 0 8px 24px rgba(238,180,37,0.4); }
.btn-secondary { background: #e2e8f0; color: #4a5568; padding: 0.85rem 2rem; border: none; border-radius: 10px; font-weight: 600; font-size: 1rem; cursor: pointer; transition: all 0.3s; text-decoration: none; display: inline-block; }
.btn-secondary:hover { background: #cbd5e0; }
.info-box { background: #ebf8ff; border-left: 4px solid #3182ce; padding: 1rem 1.5rem; border-radius: 8px; margin-bottom: 1.5rem; }
.info-box-title { font-weight: 700; color: #2b6cb0; margin-bottom: 0.3rem; }
.info-box-text { color: #4a5568; font-size: 0.9rem; }
</style>
@endpush
@section('content')
<div class="wizard-container">
<div class="wizard-header">
<h1 class="wizard-title">📻 {{ __('radio.wizard.step2_title') }}</h1>
<p class="wizard-subtitle">{{ __('radio.wizard.step_prefix') }} 2 {{ __('radio.wizard.of') }} 5 - <span class="platform-badge">{{ $platformLabel }}</span></p>
</div>
<div class="steps-indicator">
<div class="step-dot completed"></div>
<div class="step-line active"></div>
<div class="step-dot active">2</div>
<div class="step-line inactive"></div>
<div class="step-dot inactive">3</div>
<div class="step-line inactive"></div>
<div class="step-dot inactive">4</div>
<div class="step-line inactive"></div>
<div class="step-dot inactive">5</div>
</div>
<div style="display: flex; justify-content: center; gap: 3.5rem; margin-top: -1.5rem; margin-bottom: 1rem; font-size: 0.75rem; color: #718096;">
<span style="color: #38a169;"> {{ __('radio.wizard.step1_label') }}</span>
<span style="color: #eeb425; font-weight: 600;">{{ __('radio.wizard.step2_label') }}</span>
<span>{{ __('radio.wizard.step3_label') }}</span>
<span>{{ __('radio.wizard.step4_label') }}</span>
<span>{{ __('radio.wizard.step5_label') }}</span>
</div>
<div class="wizard-card">
<form action="{{ route('admin.radio.wizard.process-step-2') }}" method="POST">
@csrf
<div class="info-box">
<div class="info-box-title">{{ __("radio.wizard.platform_{$platform}_info_title") }}</div>
<div class="info-box-text">{{ __("radio.wizard.platform_{$platform}_info_desc") }}</div>
</div>
<div class="form-group">
<label class="form-label" for="stream_url">{{ __('radio.wizard.stream_url_label') }} *</label>
<input type="url" name="stream_url" id="stream_url" class="form-input" value="{{ old('stream_url', $streamUrl) }}" placeholder="https://jouw-server.nl:8000/radio.mp3" required>
<div class="form-hint">{{ __('radio.wizard.stream_url_hint') }}</div>
</div>
<div class="form-group">
<label class="form-label" for="stream_name">{{ __('radio.wizard.stream_name_label') }}</label>
<input type="text" name="stream_name" id="stream_name" class="form-input" value="{{ old('stream_name', $streamName) }}" placeholder="{{ __('radio.wizard.stream_name_placeholder') }}">
<div class="form-hint">{{ __('radio.wizard.stream_name_hint') }}</div>
</div>
@if($platform === 'azurecast')
<hr style="border: none; border-top: 2px dashed #e2e8f0; margin: 1.5rem 0;">
<h3 style="font-size: 1.2rem; font-weight: 700; color: #2d3748; margin-bottom: 1rem;">{{ __('radio.wizard.azurecast_section') }}</h3>
<div class="form-group">
<label class="form-label" for="azurecast_base_url">{{ __('radio.wizard.azurecast_base_url_label') }}</label>
<input type="url" name="azurecast_base_url" id="azurecast_base_url" class="form-input" value="{{ old('azurecast_base_url', $azurecastBaseUrl) }}" placeholder="https://radio.jouwdomein.nl">
<div class="form-hint">{{ __('radio.wizard.azurecast_base_url_hint') }}</div>
</div>
<div class="form-group">
<label class="form-label" for="azurecast_station_id">{{ __('radio.wizard.azurecast_station_id_label') }}</label>
<input type="number" name="azurecast_station_id" id="azurecast_station_id" class="form-input" value="{{ old('azurecast_station_id', $azurecastStationId) }}" min="1">
<div class="form-hint">{{ __('radio.wizard.azurecast_station_id_hint') }}</div>
</div>
@endif
@if ($errors->any())
<div style="background: #fff5f5; border: 1px solid #fc8181; border-radius: 8px; padding: 1rem; margin-bottom: 1.5rem;">
<ul style="color: #c53030; margin: 0; padding-left: 1.5rem;">
@foreach ($errors->all() as $error)
<li>{{ $error }}</li>
@endforeach
</ul>
</div>
@endif
<div style="display: flex; justify-content: space-between;">
<a href="{{ route('admin.radio.wizard') }}" class="btn-secondary"> {{ __('radio.wizard.previous_step') }}</a>
<button type="submit" class="btn-wizard">{{ __('radio.wizard.next_step') }} </button>
</div>
</form>
</div>
</div>
@endsection
+152
View File
@@ -0,0 +1,152 @@
@extends('layouts.app')
@section('title', __('radio.wizard.title') . ' - ' . __('radio.wizard.step_short') . ' 3 - ' . config('app.name'))
@push('styles')
<style>
.wizard-container { max-width: 900px; margin: 0 auto; padding: 2rem; }
.wizard-card { background: white; border-radius: 16px; padding: 2.5rem; box-shadow: 0 4px 20px rgba(0,0,0,0.08); margin-bottom: 2rem; }
.wizard-header { text-align: center; margin-bottom: 2.5rem; }
.wizard-title { font-size: 2rem; font-weight: 800; color: #1a202c; margin-bottom: 0.5rem; }
.wizard-subtitle { color: #4a5568; font-size: 1.1rem; }
.steps-indicator { display: flex; justify-content: center; gap: 0.5rem; margin-bottom: 2.5rem; }
.step-dot { width: 40px; height: 40px; border-radius: 50%; display: flex; align-items: center; justify-content: center; font-weight: 700; font-size: 0.9rem; }
.step-dot.active { background: #eeb425; color: white; }
.step-dot.inactive { background: #e2e8f0; color: #a0aec0; }
.step-dot.completed { background: #38a169; color: white; }
.step-line { width: 60px; height: 3px; align-self: center; border-radius: 2px; }
.step-line.active { background: #eeb425; }
.step-line.inactive { background: #e2e8f0; }
.form-group { margin-bottom: 1.5rem; }
.form-label { display: block; font-weight: 600; color: #2d3748; margin-bottom: 0.5rem; }
.form-input { width: 100%; padding: 0.85rem 1rem; border: 2px solid #e2e8f0; border-radius: 10px; font-size: 1rem; transition: border-color 0.2s; }
.form-input:focus { outline: none; border-color: #eeb425; box-shadow: 0 0 0 3px rgba(238,180,37,0.1); }
.form-hint { color: #718096; font-size: 0.85rem; margin-top: 0.3rem; }
.toggle-group { display: flex; align-items: center; gap: 1rem; padding: 1rem; background: #f7fafc; border-radius: 10px; margin-bottom: 1rem; }
.toggle { position: relative; width: 50px; height: 26px; flex-shrink: 0; }
.toggle input { opacity: 0; width: 0; height: 0; }
.toggle-slider { position: absolute; cursor: pointer; top: 0; left: 0; right: 0; bottom: 0; background: #cbd5e0; border-radius: 26px; transition: 0.3s; }
.toggle-slider:before { content: ""; position: absolute; height: 20px; width: 20px; left: 3px; bottom: 3px; background: white; border-radius: 50%; transition: 0.3s; }
.toggle input:checked + .toggle-slider { background: #38a169; }
.toggle input:checked + .toggle-slider:before { transform: translateX(24px); }
.toggle-label { font-weight: 500; color: #2d3748; }
.btn-wizard { background: linear-gradient(135deg, #eeb425, #d4a52a); color: #1a202c; padding: 0.85rem 2rem; border: none; border-radius: 10px; font-weight: 700; font-size: 1.1rem; cursor: pointer; transition: all 0.3s; box-shadow: 0 4px 12px rgba(238,180,37,0.3); text-decoration: none; display: inline-block; }
.btn-wizard:hover { transform: translateY(-2px); box-shadow: 0 8px 24px rgba(238,180,37,0.4); }
.btn-secondary { background: #e2e8f0; color: #4a5568; padding: 0.85rem 2rem; border: none; border-radius: 10px; font-weight: 600; font-size: 1rem; cursor: pointer; transition: all 0.3s; text-decoration: none; display: inline-block; }
.btn-secondary:hover { background: #cbd5e0; }
.detected-badge { display: inline-block; padding: 0.25rem 0.75rem; border-radius: 20px; font-size: 0.8rem; font-weight: 600; margin-left: 0.5rem; }
.detected-badge.success { background: #f0fff4; color: #38a169; }
.detected-badge.missing { background: #fff5f5; color: #e53e3e; }
.detected-badge.info { background: #ebf8ff; color: #3182ce; }
</style>
@endpush
@section('content')
<div class="wizard-container">
<div class="wizard-header">
<h1 class="wizard-title">🔌 {{ __('radio.wizard.step3_title') }}</h1>
<p class="wizard-subtitle">{{ __('radio.wizard.step_prefix') }} 3 {{ __('radio.wizard.of') }} 5 - {{ __('radio.wizard.step3_subtitle') }}</p>
</div>
<div class="steps-indicator">
<div class="step-dot completed"></div>
<div class="step-line active"></div>
<div class="step-dot completed"></div>
<div class="step-line active"></div>
<div class="step-dot active">3</div>
<div class="step-line inactive"></div>
<div class="step-dot inactive">4</div>
<div class="step-line inactive"></div>
<div class="step-dot inactive">5</div>
</div>
<div style="display: flex; justify-content: center; gap: 3.5rem; margin-top: -1.5rem; margin-bottom: 1rem; font-size: 0.75rem; color: #718096;">
<span style="color: #38a169;"> {{ __('radio.wizard.step1_label') }}</span>
<span style="color: #38a169;"> {{ __('radio.wizard.step2_label') }}</span>
<span style="color: #eeb425; font-weight: 600;">{{ __('radio.wizard.step3_label') }}</span>
<span>{{ __('radio.wizard.step4_label') }}</span>
<span>{{ __('radio.wizard.step5_label') }}</span>
</div>
<div class="wizard-card">
@if($autoDetected && $autoDetected['detected'])
<div style="background: #f0fff4; border: 1px solid #38a169; border-radius: 10px; padding: 1rem 1.5rem; margin-bottom: 2rem;">
<div style="display: flex; align-items: center; gap: 0.75rem;">
<span style="font-size: 1.5rem;"></span>
<div>
<strong style="color: #2f855a;">{{ ucfirst($autoDetected['type']) }} {{ __('radio.wizard.detected') }}</strong>
<p style="color: #4a5568; margin: 0; font-size: 0.9rem;">{{ __('radio.wizard.detected_desc') }}</p>
</div>
</div>
</div>
@elseif($autoDetected)
<div style="background: #fff5f5; border: 1px solid #fc8181; border-radius: 10px; padding: 1rem 1.5rem; margin-bottom: 2rem;">
<div style="display: flex; align-items: center; gap: 0.75rem;">
<span style="font-size: 1.5rem;">⚠️</span>
<div>
<strong style="color: #c53030;">{{ __('radio.wizard.not_detected') }}</strong>
<p style="color: #4a5568; margin: 0; font-size: 0.9rem;">{{ __('radio.wizard.not_detected_desc') }}</p>
</div>
</div>
</div>
@endif
<form action="{{ route('admin.radio.wizard.process-step-3') }}" method="POST">
@csrf
<div class="toggle-group">
<label class="toggle">
<input type="hidden" name="enable_now_playing" value="0">
<input type="checkbox" name="enable_now_playing" value="1" {{ $enableNowPlaying ? 'checked' : '' }}>
<span class="toggle-slider"></span>
</label>
<span class="toggle-label">{{ __('radio.wizard.enable_now_playing') }}</span>
</div>
<div class="form-group">
<label class="form-label" for="now_playing_api">{{ __('radio.wizard.now_playing_api_label') }}</label>
<input type="url" name="now_playing_api" id="now_playing_api" class="form-input" value="{{ old('now_playing_api', $nowPlayingApi) }}" placeholder="https://server.example.com/api/nowplaying">
<div class="form-hint">{{ __('radio.wizard.now_playing_api_hint') }}</div>
</div>
<div class="toggle-group">
<label class="toggle">
<input type="hidden" name="enable_listeners" value="0">
<input type="checkbox" name="enable_listeners" value="1" {{ $enableListeners ? 'checked' : '' }}>
<span class="toggle-slider"></span>
</label>
<span class="toggle-label">{{ __('radio.wizard.enable_listeners') }}</span>
</div>
<div class="form-group">
<label class="form-label" for="listeners_api">{{ __('radio.wizard.listeners_api_label') }}</label>
<input type="url" name="listeners_api" id="listeners_api" class="form-input" value="{{ old('listeners_api', $listenersApi) }}" placeholder="https://server.example.com/api/listeners">
<div class="form-hint">{{ __('radio.wizard.listeners_api_hint') }}</div>
</div>
<div class="toggle-group">
<label class="toggle">
<input type="hidden" name="enable_current_dj" value="0">
<input type="checkbox" name="enable_current_dj" value="1" {{ $enableCurrentDj ? 'checked' : '' }}>
<span class="toggle-slider"></span>
</label>
<span class="toggle-label">{{ __('radio.wizard.enable_current_dj') }}</span>
</div>
@if ($errors->any())
<div style="background: #fff5f5; border: 1px solid #fc8181; border-radius: 8px; padding: 1rem; margin-bottom: 1.5rem;">
<ul style="color: #c53030; margin: 0; padding-left: 1.5rem;">
@foreach ($errors->all() as $error)
<li>{{ $error }}</li>
@endforeach
</ul>
</div>
@endif
<div style="display: flex; justify-content: space-between;">
<a href="{{ route('admin.radio.wizard.step', ['step' => 2]) }}" class="btn-secondary"> {{ __('radio.wizard.previous_step') }}</a>
<button type="submit" class="btn-wizard">{{ __('radio.wizard.next_step') }} </button>
</div>
</form>
</div>
</div>
@endsection
+211
View File
@@ -0,0 +1,211 @@
@extends('layouts.app')
@section('title', __('radio.wizard.title') . ' - ' . __('radio.wizard.step_short') . ' 4 - ' . config('app.name'))
@push('styles')
<style>
.wizard-container { max-width: 900px; margin: 0 auto; padding: 2rem; }
.wizard-card { background: white; border-radius: 16px; padding: 2.5rem; box-shadow: 0 4px 20px rgba(0,0,0,0.08); margin-bottom: 2rem; }
.wizard-header { text-align: center; margin-bottom: 2.5rem; }
.wizard-title { font-size: 2rem; font-weight: 800; color: #1a202c; margin-bottom: 0.5rem; }
.wizard-subtitle { color: #4a5568; font-size: 1.1rem; }
.steps-indicator { display: flex; justify-content: center; gap: 0.5rem; margin-bottom: 2.5rem; }
.step-dot { width: 40px; height: 40px; border-radius: 50%; display: flex; align-items: center; justify-content: center; font-weight: 700; font-size: 0.9rem; }
.step-dot.active { background: #eeb425; color: white; }
.step-dot.inactive { background: #e2e8f0; color: #a0aec0; }
.step-dot.completed { background: #38a169; color: white; }
.step-line { width: 60px; height: 3px; align-self: center; border-radius: 2px; }
.step-line.active { background: #eeb425; }
.step-line.inactive { background: #e2e8f0; }
.toggle-group { display: flex; align-items: center; gap: 1rem; padding: 0.85rem 1rem; background: #f7fafc; border-radius: 10px; margin-bottom: 0.75rem; }
.toggle { position: relative; width: 46px; height: 24px; flex-shrink: 0; }
.toggle input { opacity: 0; width: 0; height: 0; }
.toggle-slider { position: absolute; cursor: pointer; top: 0; left: 0; right: 0; bottom: 0; background: #cbd5e0; border-radius: 24px; transition: 0.3s; }
.toggle-slider:before { content: ""; position: absolute; height: 18px; width: 18px; left: 3px; bottom: 3px; background: white; border-radius: 50%; transition: 0.3s; }
.toggle input:checked + .toggle-slider { background: #38a169; }
.toggle input:checked + .toggle-slider:before { transform: translateX(22px); }
.toggle-label { font-weight: 500; color: #2d3748; font-size: 0.95rem; }
.toggle-desc { color: #718096; font-size: 0.8rem; margin-left: auto; }
.form-group { margin-bottom: 1.5rem; }
.form-label { display: block; font-weight: 600; color: #2d3748; margin-bottom: 0.5rem; }
.form-input { width: 100%; padding: 0.85rem 1rem; border: 2px solid #e2e8f0; border-radius: 10px; font-size: 1rem; transition: border-color 0.2s; }
.form-input:focus { outline: none; border-color: #eeb425; box-shadow: 0 0 0 3px rgba(238,180,37,0.1); }
.form-hint { color: #718096; font-size: 0.85rem; margin-top: 0.3rem; }
.section-title { font-size: 1.15rem; font-weight: 700; color: #2d3748; margin: 1.5rem 0 1rem 0; padding-bottom: 0.5rem; border-bottom: 2px solid #eeb425; }
.btn-wizard { background: linear-gradient(135deg, #eeb425, #d4a52a); color: #1a202c; padding: 0.85rem 2rem; border: none; border-radius: 10px; font-weight: 700; font-size: 1.1rem; cursor: pointer; transition: all 0.3s; box-shadow: 0 4px 12px rgba(238,180,37,0.3); text-decoration: none; display: inline-block; }
.btn-wizard:hover { transform: translateY(-2px); box-shadow: 0 8px 24px rgba(238,180,37,0.4); }
.btn-secondary { background: #e2e8f0; color: #4a5568; padding: 0.85rem 2rem; border: none; border-radius: 10px; font-weight: 600; font-size: 1rem; cursor: pointer; transition: all 0.3s; text-decoration: none; display: inline-block; }
.btn-secondary:hover { background: #cbd5e0; }
.features-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 0.75rem; }
@media (max-width: 640px) { .features-grid { grid-template-columns: 1fr; } }
</style>
@endpush
@section('content')
<div class="wizard-container">
<div class="wizard-header">
<h1 class="wizard-title">⚙️ {{ __('radio.wizard.step4_title') }}</h1>
<p class="wizard-subtitle">{{ __('radio.wizard.step_prefix') }} 4 {{ __('radio.wizard.of') }} 5 - {{ __('radio.wizard.step4_subtitle') }}</p>
</div>
<div class="steps-indicator">
<div class="step-dot completed"></div>
<div class="step-line active"></div>
<div class="step-dot completed"></div>
<div class="step-line active"></div>
<div class="step-dot completed"></div>
<div class="step-line active"></div>
<div class="step-dot active">4</div>
<div class="step-line inactive"></div>
<div class="step-dot inactive">5</div>
</div>
<div style="display: flex; justify-content: center; gap: 3.5rem; margin-top: -1.5rem; margin-bottom: 1rem; font-size: 0.75rem; color: #718096;">
<span style="color: #38a169;"> {{ __('radio.wizard.step1_label') }}</span>
<span style="color: #38a169;"> {{ __('radio.wizard.step2_label') }}</span>
<span style="color: #38a169;"> {{ __('radio.wizard.step3_label') }}</span>
<span style="color: #eeb425; font-weight: 600;">{{ __('radio.wizard.step4_label') }}</span>
<span>{{ __('radio.wizard.step5_label') }}</span>
</div>
<div class="wizard-card">
<form action="{{ route('admin.radio.wizard.process-step-4') }}" method="POST">
@csrf
<h3 class="section-title">{{ __('radio.wizard.section_community') }}</h3>
<div class="features-grid">
<div class="toggle-group">
<label class="toggle">
<input type="hidden" name="enable_shouts" value="0">
<input type="checkbox" name="enable_shouts" value="1" {{ $enableShouts ? 'checked' : '' }}>
<span class="toggle-slider"></span>
</label>
<span class="toggle-label">{{ __('radio.wizard.feature_shouts') }}</span>
<span class="toggle-desc">{{ __('radio.wizard.feature_shouts_desc') }}</span>
</div>
<div class="toggle-group">
<label class="toggle">
<input type="hidden" name="enable_applications" value="0">
<input type="checkbox" name="enable_applications" value="1" {{ $enableApplications ? 'checked' : '' }}>
<span class="toggle-slider"></span>
</label>
<span class="toggle-label">{{ __('radio.wizard.feature_applications') }}</span>
<span class="toggle-desc">{{ __('radio.wizard.feature_applications_desc') }}</span>
</div>
<div class="toggle-group">
<label class="toggle">
<input type="hidden" name="enable_requests" value="0">
<input type="checkbox" name="enable_requests" value="1" {{ $enableRequests ? 'checked' : '' }}>
<span class="toggle-slider"></span>
</label>
<span class="toggle-label">{{ __('radio.wizard.feature_requests') }}</span>
<span class="toggle-desc">{{ __('radio.wizard.feature_requests_desc') }}</span>
</div>
</div>
<h3 class="section-title">{{ __('radio.wizard.section_display') }}</h3>
<div class="features-grid">
<div class="toggle-group">
<label class="toggle">
<input type="hidden" name="enable_widget" value="0">
<input type="checkbox" name="enable_widget" value="1" {{ $enableWidget ? 'checked' : '' }}>
<span class="toggle-slider"></span>
</label>
<span class="toggle-label">{{ __('radio.wizard.feature_widget') }}</span>
<span class="toggle-desc">{{ __('radio.wizard.feature_widget_desc') }}</span>
</div>
<div class="toggle-group" id="widgetGlobalGroup" style="{{ $enableWidget ? '' : 'opacity: 0.5;' }}">
<label class="toggle">
<input type="hidden" name="enable_widget_globally" value="0">
<input type="checkbox" name="enable_widget_globally" value="1" {{ $enableWidgetGlobally ? 'checked' : '' }}>
<span class="toggle-slider"></span>
</label>
<span class="toggle-label">{{ __('radio.wizard.feature_widget_global') }}</span>
<span class="toggle-desc">{{ __('radio.wizard.feature_widget_global_desc') }}</span>
</div>
</div>
<div class="form-group">
<label class="form-label" for="widget_position">{{ __('radio.wizard.widget_position_label') }}</label>
<select name="widget_position" id="widget_position" class="form-input">
<option value="bottom-right" {{ $widgetPosition === 'bottom-right' ? 'selected' : '' }}>{{ __('radio.wizard.position_bottom_right') }}</option>
<option value="bottom-left" {{ $widgetPosition === 'bottom-left' ? 'selected' : '' }}>{{ __('radio.wizard.position_bottom_left') }}</option>
<option value="top-right" {{ $widgetPosition === 'top-right' ? 'selected' : '' }}>{{ __('radio.wizard.position_top_right') }}</option>
<option value="top-left" {{ $widgetPosition === 'top-left' ? 'selected' : '' }}>{{ __('radio.wizard.position_top_left') }}</option>
</select>
</div>
<h3 class="section-title">{{ __('radio.wizard.section_gamification') }}</h3>
<div class="features-grid">
<div class="toggle-group">
<label class="toggle">
<input type="hidden" name="enable_points" value="0">
<input type="checkbox" name="enable_points" value="1" {{ $enablePoints ? 'checked' : '' }}>
<span class="toggle-slider"></span>
</label>
<span class="toggle-label">{{ __('radio.wizard.feature_points') }}</span>
<span class="toggle-desc">{{ __('radio.wizard.feature_points_desc') }}</span>
</div>
<div class="toggle-group">
<label class="toggle">
<input type="hidden" name="enable_contests" value="0">
<input type="checkbox" name="enable_contests" value="1" {{ $enableContests ? 'checked' : '' }}>
<span class="toggle-slider"></span>
</label>
<span class="toggle-label">{{ __('radio.wizard.feature_contests') }}</span>
<span class="toggle-desc">{{ __('radio.wizard.feature_contests_desc') }}</span>
</div>
<div class="toggle-group">
<label class="toggle">
<input type="hidden" name="enable_giveaways" value="0">
<input type="checkbox" name="enable_giveaways" value="1" {{ $enableGiveaways ? 'checked' : '' }}>
<span class="toggle-slider"></span>
</label>
<span class="toggle-label">{{ __('radio.wizard.feature_giveaways') }}</span>
<span class="toggle-desc">{{ __('radio.wizard.feature_giveaways_desc') }}</span>
</div>
</div>
<h3 class="section-title">{{ __('radio.wizard.section_integrations') }}</h3>
<div class="toggle-group" style="margin-bottom: 1rem;">
<label class="toggle">
<input type="hidden" name="enable_discord" value="0">
<input type="checkbox" name="enable_discord" value="1" id="enableDiscord" {{ $enableDiscord ? 'checked' : '' }}>
<span class="toggle-slider"></span>
</label>
<span class="toggle-label">{{ __('radio.wizard.feature_discord') }}</span>
<span class="toggle-desc">{{ __('radio.wizard.feature_discord_desc') }}</span>
</div>
<div class="form-group" id="discordWebhookGroup" style="{{ $enableDiscord ? '' : 'display: none;' }}">
<label class="form-label" for="discord_webhook">{{ __('radio.wizard.discord_webhook_label') }}</label>
<input type="url" name="discord_webhook" id="discord_webhook" class="form-input" value="{{ old('discord_webhook', $discordWebhook) }}" placeholder="https://discord.com/api/webhooks/...">
<div class="form-hint">{{ __('radio.wizard.discord_webhook_hint') }}</div>
</div>
<div style="display: flex; justify-content: space-between; margin-top: 2rem;">
<a href="{{ route('admin.radio.wizard.step', ['step' => 3]) }}" class="btn-secondary"> {{ __('radio.wizard.previous_step') }}</a>
<button type="submit" class="btn-wizard">{{ __('radio.wizard.next_step') }} </button>
</div>
</form>
</div>
</div>
<script>
document.getElementById('enableDiscord').addEventListener('change', function() {
document.getElementById('discordWebhookGroup').style.display = this.checked ? 'block' : 'none';
});
document.querySelector('input[name="enable_widget"]').addEventListener('change', function() {
const group = document.getElementById('widgetGlobalGroup');
group.style.opacity = this.checked ? '1' : '0.5';
if (!this.checked) {
document.querySelector('input[name="enable_widget_globally"]').checked = false;
}
});
</script>
@endsection
+223
View File
@@ -0,0 +1,223 @@
@extends('layouts.app')
@section('title', __('radio.wizard.title') . ' - ' . __('radio.wizard.step_short') . ' 5 - ' . config('app.name'))
@push('styles')
<style>
.wizard-container { max-width: 900px; margin: 0 auto; padding: 2rem; }
.wizard-card { background: white; border-radius: 16px; padding: 2.5rem; box-shadow: 0 4px 20px rgba(0,0,0,0.08); margin-bottom: 2rem; }
.wizard-header { text-align: center; margin-bottom: 2.5rem; }
.wizard-title { font-size: 2rem; font-weight: 800; color: #1a202c; margin-bottom: 0.5rem; }
.wizard-subtitle { color: #4a5568; font-size: 1.1rem; }
.steps-indicator { display: flex; justify-content: center; gap: 0.5rem; margin-bottom: 2.5rem; }
.step-dot { width: 40px; height: 40px; border-radius: 50%; display: flex; align-items: center; justify-content: center; font-weight: 700; font-size: 0.9rem; }
.step-dot.active { background: #eeb425; color: white; }
.step-dot.inactive { background: #e2e8f0; color: #a0aec0; }
.step-dot.completed { background: #38a169; color: white; }
.step-line { width: 60px; height: 3px; align-self: center; border-radius: 2px; }
.step-line.active { background: #eeb425; }
.step-line.inactive { background: #e2e8f0; }
.test-card { background: #f7fafc; border-radius: 12px; padding: 1.25rem; margin-bottom: 1rem; border-left: 4px solid; }
.test-card.success { border-color: #38a169; }
.test-card.warning { border-color: #ecc94b; }
.test-card.error { border-color: #e53e3e; }
.test-card.skipped { border-color: #a0aec0; }
.test-card.untested { border-color: #cbd5e0; }
.test-title { font-weight: 700; font-size: 1rem; margin-bottom: 0.5rem; display: flex; align-items: center; gap: 0.5rem; }
.test-detail { color: #4a5568; font-size: 0.9rem; }
.test-detail strong { color: #2d3748; }
.status-badge { display: inline-block; padding: 0.15rem 0.6rem; border-radius: 12px; font-size: 0.75rem; font-weight: 600; }
.status-badge.success { background: #f0fff4; color: #38a169; }
.status-badge.warning { background: #fffff0; color: #b7791f; }
.status-badge.error { background: #fff5f5; color: #e53e3e; }
.status-badge.skipped { background: #edf2f7; color: #718096; }
.setting-row { display: flex; justify-content: space-between; padding: 0.6rem 0; border-bottom: 1px solid #e2e8f0; font-size: 0.9rem; }
.setting-row:last-child { border-bottom: none; }
.setting-key { color: #4a5568; }
.setting-value { font-weight: 600; color: #2d3748; }
.btn-wizard { background: linear-gradient(135deg, #eeb425, #d4a52a); color: #1a202c; padding: 0.85rem 2rem; border: none; border-radius: 10px; font-weight: 700; font-size: 1.1rem; cursor: pointer; transition: all 0.3s; box-shadow: 0 4px 12px rgba(238,180,37,0.3); text-decoration: none; display: inline-block; }
.btn-wizard:hover { transform: translateY(-2px); box-shadow: 0 8px 24px rgba(238,180,37,0.4); }
.btn-secondary { background: #e2e8f0; color: #4a5568; padding: 0.85rem 2rem; border: none; border-radius: 10px; font-weight: 600; font-size: 1rem; cursor: pointer; transition: all 0.3s; text-decoration: none; display: inline-block; }
.btn-secondary:hover { background: #cbd5e0; }
.btn-success { background: linear-gradient(135deg, #38a169, #2f855a); color: white; padding: 0.85rem 2rem; border: none; border-radius: 10px; font-weight: 700; font-size: 1.1rem; cursor: pointer; transition: all 0.3s; box-shadow: 0 4px 12px rgba(56,161,105,0.3); text-decoration: none; display: inline-block; }
.btn-success:hover { transform: translateY(-2px); box-shadow: 0 8px 24px rgba(56,161,105,0.4); }
.loading-spinner { display: inline-block; width: 20px; height: 20px; border: 3px solid #e2e8f0; border-top-color: #eeb425; border-radius: 50%; animation: spin 0.8s linear infinite; }
@keyframes spin { to { transform: rotate(360deg); } }
.result-icon { font-size: 1.2rem; }
.test-result-section { margin-top: 1rem; padding-top: 1rem; border-top: 2px dashed #e2e8f0; }
</style>
@endpush
@section('content')
<div class="wizard-container">
<div class="wizard-header">
<h1 class="wizard-title">🧪 {{ __('radio.wizard.step5_title') }}</h1>
<p class="wizard-subtitle">{{ __('radio.wizard.step_prefix') }} 5 {{ __('radio.wizard.of') }} 5 - {{ __('radio.wizard.step5_subtitle') }}</p>
</div>
<div class="steps-indicator">
<div class="step-dot completed"></div>
<div class="step-line active"></div>
<div class="step-dot completed"></div>
<div class="step-line active"></div>
<div class="step-dot completed"></div>
<div class="step-line active"></div>
<div class="step-dot completed"></div>
<div class="step-line active"></div>
<div class="step-dot active">5</div>
</div>
<div style="display: flex; justify-content: center; gap: 3.5rem; margin-top: -1.5rem; margin-bottom: 1rem; font-size: 0.75rem; color: #718096;">
<span style="color: #38a169;"> {{ __('radio.wizard.step1_label') }}</span>
<span style="color: #38a169;"> {{ __('radio.wizard.step2_label') }}</span>
<span style="color: #38a169;"> {{ __('radio.wizard.step3_label') }}</span>
<span style="color: #38a169;"> {{ __('radio.wizard.step4_label') }}</span>
<span style="color: #eeb425; font-weight: 600;">{{ __('radio.wizard.step5_label') }}</span>
</div>
@if(session('error'))
<div style="background: #fff5f5; border: 1px solid #fc8181; border-radius: 10px; padding: 1rem 1.5rem; margin-bottom: 1.5rem;">
<strong style="color: #c53030;">{{ session('error') }}</strong>
</div>
@endif
<div class="wizard-card">
<h2 style="font-size: 1.3rem; font-weight: 700; color: #2d3748; margin-bottom: 1.5rem;">
🔌 {{ __('radio.wizard.test_title') }}
</h2>
<p style="color: #4a5568; margin-bottom: 1.5rem;">{{ __('radio.wizard.test_desc') }}</p>
<div id="testResults">
<div id="testLoading" style="display: none; text-align: center; padding: 2rem;">
<div class="loading-spinner" style="width: 40px; height: 40px; border-width: 4px; margin: 0 auto 1rem;"></div>
<p style="color: #4a5568;">{{ __('radio.wizard.test_loading') }}</p>
</div>
<div id="testOutput">
@if($testResults)
@include('admin.radio.wizard._test-results', ['results' => $testResults])
@else
<p style="color: #a0aec0; text-align: center; padding: 2rem;">{{ __('radio.wizard.test_prompt') }}</p>
@endif
</div>
</div>
<div style="text-align: center; margin-top: 1rem;">
<button onclick="runTest()" class="btn-wizard" id="testBtn">
🔍 {{ __('radio.wizard.test_button') }}
</button>
</div>
</div>
<div class="wizard-card">
<h2 style="font-size: 1.3rem; font-weight: 700; color: #2d3748; margin-bottom: 1rem;">
📋 {{ __('radio.wizard.settings_overview') }}
</h2>
<p style="color: #4a5568; margin-bottom: 1.5rem;">{{ __('radio.wizard.settings_overview_desc') }}</p>
<div style="background: #f7fafc; border-radius: 10px; padding: 1.25rem;">
@foreach($settingsList as $key => $value)
<div class="setting-row">
<span class="setting-key">{{ $key }}</span>
<span class="setting-value">{{ $value }}</span>
</div>
@endforeach
</div>
</div>
<div style="display: flex; justify-content: space-between; align-items: center;">
<a href="{{ route('admin.radio.wizard.step', ['step' => 4]) }}" class="btn-secondary"> {{ __('radio.wizard.previous_step') }}</a>
<form action="{{ route('admin.radio.wizard.complete') }}" method="POST" style="display: inline;" onsubmit="return confirm('{{ __('radio.wizard.install_confirm') }}')">
@csrf
<button type="submit" class="btn-success">
🚀 {{ __('radio.wizard.install_button') }}
</button>
</form>
</div>
</div>
<script>
function runTest() {
const testBtn = document.getElementById('testBtn');
const testLoading = document.getElementById('testLoading');
const testOutput = document.getElementById('testOutput');
testBtn.disabled = true;
testBtn.innerHTML = '<span class="loading-spinner"></span> {{ __('radio.wizard.test_loading') }}';
testLoading.style.display = 'block';
testOutput.innerHTML = '';
fetch('{{ route('admin.radio.wizard.test') }}')
.then(r => r.json())
.then(data => {
testLoading.style.display = 'none';
if (data.success && data.results) {
let html = '';
const tests = {
'stream': { label: '📡 {{ __('radio.wizard.test_result_stream') }}' },
'now_playing': { label: '🎵 {{ __('radio.wizard.test_result_now_playing') }}' },
'listeners': { label: '👥 {{ __('radio.wizard.test_result_listeners') }}' },
};
const statusIcons = { success: '✅', warning: '⚠️', error: '❌', skipped: '⏭️', untested: '❓' };
const statusLabels = { success: '{{ __('radio.wizard.status_success') }}', warning: '{{ __('radio.wizard.status_warning') }}', error: '{{ __('radio.wizard.status_error') }}', skipped: '{{ __('radio.wizard.status_skipped') }}', untested: '{{ __('radio.wizard.status_untested') }}' };
for (const [key, info] of Object.entries(tests)) {
const result = data.results[key];
if (!result) continue;
const icon = statusIcons[result.status] || '❓';
const statusLabel = statusLabels[result.status] || result.status;
html += '<div class="test-card ' + result.status + '">';
html += '<div class="test-title">' + icon + ' ' + info.label + ' <span class="status-badge ' + result.status + '">' + statusLabel + '</span></div>';
html += '<div class="test-detail">' + result.message;
if (result.content_type) {
html += '<br><strong>{{ __('radio.wizard.content_type') }}:</strong> ' + result.content_type;
}
if (result.http_code) {
html += '<br><strong>{{ __('radio.wizard.http_status') }}:</strong> ' + result.http_code;
}
if (result.song) {
html += '<br><strong>{{ __('radio.wizard.song') }}:</strong> ' + result.song;
}
if (result.artist) {
html += ' <strong>{{ __('radio.wizard.artist') }}:</strong> ' + result.artist;
}
if (result.count !== undefined) {
html += '<br><strong>{{ __('radio.wizard.listeners') }}:</strong> ' + result.count;
}
if (result.api_url) {
html += '<br><strong>{{ __('radio.wizard.api_url') }}:</strong> ' + result.api_url;
}
html += '</div></div>';
}
html += '<div class="test-result-section">';
if (data.results.stream && (data.results.stream.status === 'success' || data.results.stream.status === 'warning')) {
html += '<p style="color: #38a169; font-weight: 600;">✅ {{ __('radio.wizard.test_stream_ok') }}</p>';
} else if (data.results.stream && data.results.stream.status === 'error') {
html += '<p style="color: #e53e3e; font-weight: 600;">❌ {{ __('radio.wizard.test_stream_fail') }}</p>';
} else {
html += '<p style="color: #a0aec0;">{{ __('radio.wizard.test_not_run') }}</p>';
}
html += '</div>';
testOutput.innerHTML = html;
} else {
testOutput.innerHTML = '<div class="test-card error"><div class="test-title">❌ {{ __('radio.wizard.error') }}</div><div class="test-detail">' + (data.error || '{{ __('radio.wizard.unknown_error') }}') + '</div></div>';
}
})
.catch(err => {
testLoading.style.display = 'none';
testOutput.innerHTML = '<div class="test-card error"><div class="test-title">❌ {{ __('radio.wizard.error') }}</div><div class="test-detail">{{ __('radio.wizard.test_connection_fail') }} ' + err.message + '</div></div>';
})
.finally(() => {
testBtn.disabled = false;
testBtn.innerHTML = '🔄 {{ __('radio.wizard.test_retry') }}';
});
}
</script>
@endsection
+13
View File
@@ -1,6 +1,7 @@
<?php
use App\Http\Controllers\Admin\RadioSetupController;
use App\Http\Controllers\Admin\RadioWizardController;
use App\Http\Controllers\Api\FurniEditorController;
use Illuminate\Support\Facades\Route;
@@ -8,6 +9,18 @@ use Illuminate\Support\Facades\Route;
Route::prefix('admin')->group(function () {
Route::get('/radio/setup', [RadioSetupController::class, 'index'])->name('admin.radio.setup');
Route::post('/radio/setup', [RadioSetupController::class, 'setup'])->name('admin.radio.setup.post');
// Radio wizard (multi-step)
Route::prefix('radio/wizard')->group(function () {
Route::get('/', [RadioWizardController::class, 'index'])->name('admin.radio.wizard');
Route::post('/step-1', [RadioWizardController::class, 'processStep1'])->name('admin.radio.wizard.process-step-1');
Route::get('/step/{step}', [RadioWizardController::class, 'step'])->name('admin.radio.wizard.step')->where('step', '[2-5]');
Route::post('/step-2', [RadioWizardController::class, 'processStep2'])->name('admin.radio.wizard.process-step-2');
Route::post('/step-3', [RadioWizardController::class, 'processStep3'])->name('admin.radio.wizard.process-step-3');
Route::post('/step-4', [RadioWizardController::class, 'processStep4'])->name('admin.radio.wizard.process-step-4');
Route::get('/test', [RadioWizardController::class, 'runTest'])->name('admin.radio.wizard.test');
Route::post('/complete', [RadioWizardController::class, 'complete'])->name('admin.radio.wizard.complete');
});
});
// Furni editor API