You've already forked Atomcms-edit
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:
+414
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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 {
|
||||
|
||||
+117
-1
@@ -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"
|
||||
}
|
||||
+117
-1
@@ -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"
|
||||
}
|
||||
+117
-1
@@ -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"
|
||||
}
|
||||
+117
-1
@@ -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"
|
||||
}
|
||||
+117
-1
@@ -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"
|
||||
}
|
||||
+117
-1
@@ -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
@@ -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"
|
||||
}
|
||||
|
||||
+117
-1
@@ -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"
|
||||
}
|
||||
+117
-1
@@ -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"
|
||||
}
|
||||
+117
-1
@@ -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"
|
||||
}
|
||||
+117
-1
@@ -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"
|
||||
}
|
||||
+117
-1
@@ -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
@@ -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"
|
||||
}
|
||||
|
||||
+117
-1
@@ -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"
|
||||
}
|
||||
+117
-1
@@ -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"
|
||||
}
|
||||
+117
-1
@@ -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"
|
||||
}
|
||||
+117
-1
@@ -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"
|
||||
}
|
||||
+117
-1
@@ -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"
|
||||
}
|
||||
+117
-1
@@ -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"
|
||||
}
|
||||
+117
-1
@@ -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"
|
||||
}
|
||||
+117
-1
@@ -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') }}
|
||||
|
||||
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user