From 089b8b42278027d508c301327ee1531ec9186cb8 Mon Sep 17 00:00:00 2001 From: freetlab Date: Wed, 3 Jun 2026 21:20:08 +0200 Subject: [PATCH] fix(i18n): normalize translations and fallbacks --- lib/app.dart | 31 +- lib/estado/estado_radio.dart | 41 +- lib/l10n/app_ar.arb | 620 +++++---- lib/l10n/app_bn.arb | 622 +++++---- lib/l10n/app_de.arb | 552 +++++--- lib/l10n/app_en.arb | 180 ++- lib/l10n/app_es.arb | 133 +- lib/l10n/app_fr.arb | 568 +++++--- lib/l10n/app_hi.arb | 624 +++++---- lib/l10n/app_id.arb | 572 +++++--- lib/l10n/app_it.arb | 558 +++++--- lib/l10n/app_ja.arb | 630 +++++---- lib/l10n/app_localizations_ext.dart | 1241 +++++------------ lib/l10n/app_pt.arb | 568 +++++--- lib/l10n/app_ru.arb | 642 +++++---- lib/l10n/app_zh.arb | 620 +++++---- lib/l10n/display_names.dart | 29 + lib/l10n/gen/app_localizations.dart | 1316 +++++++++++++++++++ lib/l10n/gen/app_localizations_ar.dart | 991 ++++++++++++-- lib/l10n/gen/app_localizations_bn.dart | 998 ++++++++++++-- lib/l10n/gen/app_localizations_de.dart | 974 ++++++++++++-- lib/l10n/gen/app_localizations_en.dart | 740 +++++++++++ lib/l10n/gen/app_localizations_es.dart | 746 +++++++++++ lib/l10n/gen/app_localizations_fr.dart | 999 ++++++++++++-- lib/l10n/gen/app_localizations_hi.dart | 999 ++++++++++++-- lib/l10n/gen/app_localizations_id.dart | 976 ++++++++++++-- lib/l10n/gen/app_localizations_it.dart | 974 ++++++++++++-- lib/l10n/gen/app_localizations_ja.dart | 991 ++++++++++++-- lib/l10n/gen/app_localizations_pt.dart | 984 ++++++++++++-- lib/l10n/gen/app_localizations_ru.dart | 1003 ++++++++++++-- lib/l10n/gen/app_localizations_zh.dart | 990 ++++++++++++-- lib/pantallas/pantalla_ajustes.dart | 65 +- lib/pantallas/pantalla_alarma_sonando.dart | 15 +- lib/pantallas/pantalla_alarmas.dart | 134 +- lib/pantallas/pantalla_favoritos.dart | 10 +- lib/pantallas/pantalla_inicio.dart | 78 +- lib/pantallas/pantalla_reproductor.dart | 77 +- lib/servicios/servicio_alarmas_android.dart | 25 +- lib/servicios/servicio_audio.dart | 47 +- lib/servicios/servicio_grabacion_radio.dart | 19 +- lib/widgets/ecualizador_widget.dart | 26 +- lib/widgets/mini_reproductor.dart | 35 +- lib/widgets/pluri_icon.dart | 17 +- lib/widgets/pluri_onboarding_dialog.dart | 66 +- lib/widgets/tarjeta_emisora.dart | 37 +- test/pantallas/pantalla_inicio_test.dart | 26 +- 46 files changed, 17720 insertions(+), 4869 deletions(-) create mode 100644 lib/l10n/display_names.dart diff --git a/lib/app.dart b/lib/app.dart index 280601c..9611d15 100644 --- a/lib/app.dart +++ b/lib/app.dart @@ -4,6 +4,7 @@ import 'package:provider/provider.dart'; import 'estado/estado_radio.dart'; import 'estado/estado_alarmas.dart'; import 'estado/estado_idioma.dart'; +import 'l10n/display_names.dart'; import 'l10n/gen/app_localizations.dart'; import 'modelos/alarma_musical.dart'; import 'pantallas/pantalla_alarmas.dart'; @@ -236,7 +237,9 @@ class _PaginaPrincipalState extends State<_PaginaPrincipal> { content: Text( AppLocalizations.of( context, - ).skipCurrentAlarmExecution(alarma.nombre), + ).skipCurrentAlarmExecution( + localizedAlarmName(AppLocalizations.of(context), alarma.nombre), + ), ), ), ); @@ -355,7 +358,10 @@ class _PaginaPrincipalState extends State<_PaginaPrincipal> { crossAxisAlignment: CrossAxisAlignment.stretch, children: [ Text( - _formatearDuracionTimer(restante), + _formatearDuracionTimer( + AppLocalizations.of(ctx), + restante, + ), style: Theme.of(ctx).textTheme.headlineMedium, ), @@ -385,6 +391,7 @@ class _PaginaPrincipalState extends State<_PaginaPrincipal> { ActionChip( label: Text( _formatearDuracionTimer( + AppLocalizations.of(ctx), Duration(seconds: segundos), ), ), @@ -431,17 +438,29 @@ class _PaginaPrincipalState extends State<_PaginaPrincipal> { } } -String _formatearDuracionTimer(Duration duracion) { +String _formatearDuracionTimer( + AppLocalizations l10n, + Duration duracion, +) { final horas = duracion.inHours; final minutos = duracion.inMinutes.remainder(60); final segundos = duracion.inSeconds.remainder(60); if (horas > 0) { - return '${horas}h ${minutos.toString().padLeft(2, '0')}m ${segundos.toString().padLeft(2, '0')}s'; + return l10n.durationHoursMinutesSeconds( + horas, + minutos.toString().padLeft(2, '0'), + segundos.toString().padLeft(2, '0'), + ); } if (minutos > 0) { - return segundos == 0 ? '$minutos min' : '${minutos}m ${segundos}s'; + return segundos == 0 + ? l10n.durationMinutesOnly(minutos) + : l10n.durationMinutesSeconds( + minutos, + segundos.toString().padLeft(2, '0'), + ); } - return '$segundos s'; + return l10n.durationSecondsOnly(segundos); } class _TimerPersonalizadoSheet extends StatefulWidget { diff --git a/lib/estado/estado_radio.dart b/lib/estado/estado_radio.dart index 504643e..1095c07 100644 --- a/lib/estado/estado_radio.dart +++ b/lib/estado/estado_radio.dart @@ -4,15 +4,19 @@ import 'dart:io'; import 'package:flutter/foundation.dart'; import 'package:flutter/services.dart'; +import 'package:flutter/widgets.dart' show Locale; import 'package:geocoding/geocoding.dart'; import 'package:geolocator/geolocator.dart'; import 'package:path_provider/path_provider.dart'; import 'package:shared_preferences/shared_preferences.dart'; import 'package:url_launcher/url_launcher.dart'; +import '../l10n/display_names.dart'; +import '../l10n/gen/app_localizations.dart'; import '../modelos/emisora.dart'; import '../modelos/grupo_favoritos.dart'; import '../modelos/preset_ecualizador.dart'; +import '../servicios/servicio_alarmas_android.dart'; import '../servicios/servicio_audio.dart'; import '../servicios/servicio_ecualizador.dart'; import '../servicios/servicio_favoritos.dart'; @@ -57,6 +61,19 @@ class EstadoRadio extends ChangeNotifier { final ServicioGrabacionRadio grabacion; final Future Function()? _resolverArchivoCustom; + AppLocalizations get _textos { + final actual = _l10n; + if (actual != null) return actual; + return lookupAppLocalizations(const Locale('es')); + } + + void configurarLocalizaciones(AppLocalizations l10n) { + _l10n = l10n; + audio.configurarLocalizaciones(l10n); + grabacion.configurarLocalizaciones(l10n); + ServicioAlarmasAndroid.configurarLocalizaciones(l10n); + } + late final ServicioTimer timer; StreamSubscription? _suscripcionEstadoAudio; StreamSubscription? _suscripcionGrabacion; @@ -64,6 +81,7 @@ class EstadoRadio extends ChangeNotifier { int _revisionReproduccion = 0; Emisora? _emisoraSeleccionada; String? _emisoraPreferidaUuid; + AppLocalizations? _l10n; // Errores de reproducción → SnackBar. final _errorController = StreamController.broadcast(); @@ -237,7 +255,7 @@ class EstadoRadio extends ChangeNotifier { _suscripcionGrabacion = grabacion.estadoStream.listen((estado) { if (estado.tipo == EstadoGrabacionRadioTipo.error && estado.error != null) { - _errorController.add('Error al grabar la radio: ${estado.error}'); + _errorController.add(_textos.radioRecordingError(estado.error!)); } notifyListeners(); }); @@ -274,7 +292,7 @@ class EstadoRadio extends ChangeNotifier { _populares = results[0]; _tendencias = results[1]; } catch (_) { - _errorCarga = 'Sin conexión a la API de radio'; + _errorCarga = _textos.radioApiConnectionError; } finally { _cargandoPopulares = false; notifyListeners(); @@ -433,7 +451,7 @@ class EstadoRadio extends ChangeNotifier { ); _resultadosBusqueda = pagina; } catch (_) { - _errorController.add('Error en la busqueda. Comprueba tu conexion.'); + _errorController.add(_textos.radioSearchError); } finally { _cargandoBusqueda = false; notifyListeners(); @@ -468,7 +486,7 @@ class EstadoRadio extends ChangeNotifier { // _buscarPaginaFiltrada actualiza offset/hayMas usando páginas crudas. _hayMasBusqueda = _hayMasBusqueda && pagina.isNotEmpty; } catch (_) { - _errorController.add('No se pudieron cargar mas emisoras.'); + _errorController.add(_textos.radioLoadMoreStationsError); } finally { _cargandoMasBusqueda = false; notifyListeners(); @@ -554,7 +572,7 @@ class EstadoRadio extends ChangeNotifier { } if (pais == null || pais.isEmpty) { - throw Exception('No se pudo detectar tu region'); + throw StateError('nearby-region-not-detected'); } _paisCercanoDetectado = pais; _emisorasCercanas = _filtrarMinBitrate( @@ -562,8 +580,7 @@ class EstadoRadio extends ChangeNotifier { _ultimoMinBitrateBusqueda, ); } catch (_) { - _errorCercanas = - 'No pudimos detectar emisoras cercanas. Usa filtros por pais.'; + _errorCercanas = _textos.radioNearbyStationsError; _emisorasCercanas = []; } finally { _cargandoCercanas = false; @@ -595,7 +612,9 @@ class EstadoRadio extends ChangeNotifier { _errorController.add( mensajeError.isNotEmpty && mensajeError != 'Exception' ? mensajeError - : 'No se puede reproducir "${emisora.nombre}"', + : _textos.radioCannotPlayStation( + localizedStationName(_textos, emisora.nombre), + ), ); notifyListeners(); } @@ -604,13 +623,13 @@ class EstadoRadio extends ChangeNotifier { Future iniciarGrabacion({Duration? duracion}) async { final actual = emisoraActual; if (actual == null) { - _errorController.add('Primero selecciona una emisora para grabar.'); + _errorController.add(_textos.recordingSelectStationFirst); return; } try { await grabacion.iniciar(actual, duracion: duracion); } catch (e) { - _errorController.add('No se pudo iniciar la grabación: $e'); + _errorController.add(_textos.recordingStartError(e.toString())); } } @@ -898,7 +917,7 @@ class EstadoRadio extends ChangeNotifier { /// Importa configuración desde un JSON exportado previamente. Future importarConfig(Map data) async { final version = data['version'] as int? ?? 1; - if (version != 1) throw Exception('Versión de configuración no compatible'); + if (version != 1) throw Exception(_textos.unsupportedConfigVersion); final favRaw = data['favoritos'] as List? ?? []; for (final raw in favRaw) { diff --git a/lib/l10n/app_ar.arb b/lib/l10n/app_ar.arb index 0323540..9c73272 100644 --- a/lib/l10n/app_ar.arb +++ b/lib/l10n/app_ar.arb @@ -1,107 +1,135 @@ { "@@locale": "ar", "appTitle": "PluriWave", - "navHome": "Home", - "navSearch": "Search", - "navFavorites": "Favorites", - "navAlarms": "Alarms", - "navSettings": "Settings", - "actionOk": "OK", - "sleepTimer": "Sleep timer", - "sleepTimerDescription": "Smooth radio shutdown with an exact countdown.", - "cancelTimer": "Cancel timer", - "optionOther": "Other", - "customDurationTitle": "Custom duration", - "durationGreaterThanZero": "Choose a duration greater than zero.", - "hoursLabel": "Hours", - "minutesLabel": "Minutes", - "secondsLabel": "Seconds", - "saveQuickAccess": "Save as quick access", - "startTimer": "Start timer", - "skipCurrentAlarmExecution": "Skipped this execution of {alarmName}.", + "navHome": "الرئيسية", + "navSearch": "بحث", + "navFavorites": "المفضلة", + "navAlarms": "المنبهات", + "navSettings": "الإعدادات", + "actionOk": "حسنًا", + "sleepTimer": "مؤقّت النوم", + "sleepTimerDescription": "إيقاف الراديو بسلاسة مع عدّ تنازلي دقيق.", + "cancelTimer": "إلغاء المؤقّت", + "optionOther": "أخرى", + "customDurationTitle": "مدة مخصّصة", + "durationGreaterThanZero": "اختر مدة أكبر من الصفر.", + "hoursLabel": "ساعات", + "minutesLabel": "دقائق", + "secondsLabel": "ثوانٍ", + "durationHoursMinutesSeconds": "{hours} ? {minutes} ? {seconds} ?", + "@durationHoursMinutesSeconds": { + "placeholders": { + "hours": {}, + "minutes": {}, + "seconds": {} + } + }, + "durationMinutesSeconds": "{minutes} ? {seconds} ?", + "@durationMinutesSeconds": { + "placeholders": { + "minutes": {}, + "seconds": {} + } + }, + "durationMinutesOnly": "{minutes} ?", + "@durationMinutesOnly": { + "placeholders": { + "minutes": {} + } + }, + "durationSecondsOnly": "{seconds} ?", + "@durationSecondsOnly": { + "placeholders": { + "seconds": {} + } + }, + "saveQuickAccess": "حفظ كاختصار سريع", + "startTimer": "بدء المؤقّت", + "skipCurrentAlarmExecution": "تم تخطي هذا التشغيل من {alarmName}.", "@skipCurrentAlarmExecution": { "placeholders": { "alarmName": {} } }, - "settingsTitle": "Settings", - "settingsSubtitle": "Fine-grained sound control, backups, and custom stations.", - "languageSectionTitle": "Language", - "languageSectionDescription": "Choose how the app language is displayed.", - "languageSystemDefault": "System", - "languageSpanish": "Spanish", - "languageEnglish": "English", - "languageUpdated": "Language updated: {languageName}", + "settingsTitle": "الإعدادات", + "settingsSubtitle": "تحكم دقيق في الصوت والنسخ الاحتياطية والمحطات المخصصة.", + "languageSectionTitle": "اللغة", + "languageSectionDescription": "اختر كيفية عرض لغة التطبيق.", + "languageSystemDefault": "النظام", + "languageSpanish": "الإسبانية", + "languageEnglish": "الإنجليزية", + "languageUpdated": "تم تحديث اللغة: {languageName}", "@languageUpdated": { "placeholders": { "languageName": {} } }, - "languageUpdatedSystem": "Language updated: System", - "timerSectionTitle": "Sleep timer", - "timerSectionAdd": "Add", - "timerSectionDescription": "Customize the quick presets shown when automatically stopping the radio.", - "timerSectionRestoreRecommended": "Restore recommended times", - "newQuickAccessTitle": "New quick access", - "saveQuickAccessButton": "Save quick access", - "settingsSafeStatus": "Safe", - "recordingsSectionTitle": "Recordings", - "recordingsFolderDialogTitle": "Select recordings folder", - "recordingsPathUpdated": "Recording path updated", - "recordingsPathSaveError": "Could not save the path: {error}", - "recordingsDefaultFolderRestored": "The internal default folder will be used", - "recordingsFolderTitle": "Recordings folder", - "recordingsPathCalculating": "Calculating path...", - "recordingsChangePath": "Change path", - "recordingsUseDefaultPath": "Use default path", - "recordingsOriginalStreamHint": "The radio is saved from the original stream, without recompressing.", - "equalizerActive": "Active", - "equalizerDisabled": "Disabled", - "equalizerEnable": "Enable equalizer", - "equalizerRealtimeSubtitle": "Changes are applied in real time to the current station.", - "equalizerPendingSubtitle": "Changes are saved and will apply when Android enables the effect.", - "equalizerPerStationTitle": "Use custom EQ for this favorite", - "equalizerPerStationActive": "Active for {stationName}", - "equalizerPerStationMain": "Using main EQ for {stationName}", - "preferredStationTitle": "Preferred station", - "preferredStationDescription": "Preselected for new alarms and available for quick playback.", - "preferredStationNoStationsTitle": "No stations available yet", - "preferredStationNoStationsSubtitle": "Save favorites or load stations to choose a preferred one.", - "preferredStationAutomaticFallback": "Automatic fallback", - "preferredStationDefaultFavorite": "Default favorite", - "preferredStationCurrent": "Current preferred: {stationName}", - "preferredStationAutoUsing": "No favorites: automatically using {stationName}", - "preferredStationPlay": "Play preferred", - "customStationsTitle": "Custom stations", - "customStationsAdd": "Add", - "customStationsEmpty": "No custom stations.", - "playAction": "Play", - "deleteAction": "Delete", - "addStationTitle": "Add station", - "stationNameLabel": "Name *", - "requiredField": "Required field", - "streamUrlLabel": "Stream URL *", - "invalidUrl": "Invalid URL", - "countryOptionalLabel": "Country (optional)", - "saveStation": "Save station", - "backupSectionTitle": "Backup", - "backupExportTitle": "Export configuration", - "backupExportSubtitle": "Favorites, custom stations, and EQ presets", - "backupImportTitle": "Import configuration", - "backupImportSubtitle": "Restore from a backup file", - "backupShareSubject": "PluriWave — backup", - "backupShareText": "PluriWave configuration exported on {date}", - "backupExportError": "Export error: {error}", - "backupImportConfirmMessage": "This will add favorites, stations, and presets from the file. Continue?", - "backupImportSuccess": "Configuration imported successfully", - "backupImportError": "Import error: {error}", - "appVersionLoading": "Loading version...", - "appVersionSubtitle": "{version} - World radio", - "savedFavoritesTitle": "Saved favorites", - "stationFilterTitle": "Station filter", - "stationFilterSubtitle": "Only stations verified as active", - "backgroundAudioTitle": "Background audio", - "backgroundAudioSubtitle": "Continues when the screen turns off", + "languageUpdatedSystem": "تم تحديث اللغة: النظام", + "timerSectionTitle": "مؤقّت النوم", + "timerSectionAdd": "إضافة", + "timerSectionDescription": "خصّص الاختصارات السريعة التي تظهر عند إيقاف الراديو تلقائيًا.", + "timerSectionRestoreRecommended": "استعادة الأوقات الموصى بها", + "newQuickAccessTitle": "اختصار سريع جديد", + "saveQuickAccessButton": "حفظ الاختصار السريع", + "settingsSafeStatus": "آمن", + "recordingsSectionTitle": "التسجيلات", + "recordingsFolderDialogTitle": "اختر مجلد التسجيلات", + "recordingsPathUpdated": "تم تحديث مسار التسجيل", + "recordingsPathSaveError": "تعذّر حفظ المسار: {error}", + "recordingsDefaultFolderRestored": "سيتم استخدام المجلد الداخلي الافتراضي", + "recordingsFolderTitle": "مجلد التسجيل", + "recordingsPathCalculating": "جارٍ حساب المسار...", + "recordingsChangePath": "تغيير المسار", + "recordingsUseDefaultPath": "استخدام المسار الافتراضي", + "recordingsOriginalStreamHint": "يتم حفظ الراديو من البث الأصلي، دون إعادة ضغط.", + "equalizerActive": "نشط", + "equalizerDisabled": "معطّل", + "equalizerEnable": "تفعيل المعادل", + "equalizerRealtimeSubtitle": "تُطبّق التغييرات فورًا على المحطة الحالية.", + "equalizerPendingSubtitle": "تُحفظ التغييرات وستُطبّق عندما يفعّل Android التأثير.", + "equalizerPerStationTitle": "استخدام معادل خاص لهذه المفضلة", + "equalizerPerStationActive": "نشط لـ {stationName}", + "equalizerPerStationMain": "استخدام المعادل الرئيسي لـ {stationName}", + "preferredStationTitle": "المحطة المفضلة", + "preferredStationDescription": "يتم اختيارها مسبقًا عند إنشاء المنبهات ويمكن تشغيلها سريعًا.", + "preferredStationNoStationsTitle": "لا توجد محطات متاحة بعد", + "preferredStationNoStationsSubtitle": "احفظ المفضلات أو حمّل محطات لاختيار محطة مفضلة.", + "preferredStationAutomaticFallback": "بديل تلقائي", + "preferredStationDefaultFavorite": "المفضلة الافتراضية", + "preferredStationCurrent": "المفضلة الحالية: {stationName}", + "preferredStationAutoUsing": "لا توجد مفضلات: يتم استخدام {stationName} تلقائيًا", + "preferredStationPlay": "تشغيل المفضلة", + "customStationsTitle": "محطات مخصصة", + "customStationsAdd": "إضافة", + "customStationsEmpty": "لا توجد محطات مخصصة.", + "playAction": "تشغيل", + "deleteAction": "حذف", + "addStationTitle": "إضافة محطة", + "stationNameLabel": "الاسم *", + "unnamedStation": "محطة بدون اسم", + "requiredField": "حقل مطلوب", + "streamUrlLabel": "رابط البث *", + "invalidUrl": "رابط غير صالح", + "countryOptionalLabel": "البلد (اختياري)", + "saveStation": "حفظ المحطة", + "backupSectionTitle": "النسخ الاحتياطي", + "backupExportTitle": "تصدير الإعدادات", + "backupExportSubtitle": "المفضلات والمحطات المخصصة وإعدادات المعادل المسبقة", + "backupImportTitle": "استيراد الإعدادات", + "backupImportSubtitle": "استعادة من ملف نسخة احتياطية", + "backupShareSubject": "PluriWave — نسخة احتياطية", + "backupShareText": "إعدادات PluriWave المصدّرة في {date}", + "backupExportError": "خطأ أثناء التصدير: {error}", + "backupImportConfirmMessage": "سيضيف هذا المفضلات والمحطات وإعدادات المعادل من الملف. هل تريد المتابعة؟", + "backupImportSuccess": "تم استيراد الإعدادات بنجاح", + "backupImportError": "خطأ أثناء الاستيراد: {error}", + "appVersionLoading": "جارٍ تحميل الإصدار...", + "appVersionSubtitle": "{version} - راديو عالمي", + "savedFavoritesTitle": "المفضلات المحفوظة", + "stationFilterTitle": "فلتر المحطات", + "stationFilterSubtitle": "المحطات المؤكدة كنشطة فقط", + "backgroundAudioTitle": "الصوت في الخلفية", + "backgroundAudioSubtitle": "يستمر عند إطفاء الشاشة", "dash": "—", "@recordingsPathSaveError": { "placeholders": { @@ -148,15 +176,15 @@ "version": {} } }, - "cancelAction": "Cancel", - "equalizerTitle": "Equalizer", - "recordingsOpenFolder": "Open folder", - "recordingsOpenFolderError": "Could not open the folder: {error}", - "recordingsMaxSizeTitle": "Maximum recording size", - "recordingsMaxSizeSubtitle": "Current limit: {size} MB", - "recordingsMaxSizeDialogTitle": "Maximum size per recording", - "recordingsMaxSizeMbLabel": "Maximum megabytes", - "recordingsMaxSizeSaved": "Recording limit updated to {size} MB", + "cancelAction": "إلغاء", + "equalizerTitle": "المعادل", + "recordingsOpenFolder": "فتح المجلد", + "recordingsOpenFolderError": "تعذّر فتح المجلد: {error}", + "recordingsMaxSizeTitle": "الحد الأقصى لحجم التسجيل", + "recordingsMaxSizeSubtitle": "الحد الحالي: {size} ميغابايت", + "recordingsMaxSizeDialogTitle": "الحد الأقصى للحجم لكل تسجيل", + "recordingsMaxSizeMbLabel": "الحد الأقصى بالميغابايت", + "recordingsMaxSizeSaved": "تم تحديث حد التسجيل إلى {size} ميغابايت", "@recordingsOpenFolderError": { "placeholders": { "error": {} @@ -176,33 +204,33 @@ } } }, - "stationOrderTitle": "Station order", - "stationOrderByName": "By name", - "stationOrderByQuality": "By quality", - "stationOrderScopeDescription": "Applies to favorites, searches, nearby stations and quick lists.", - "favoriteGroupsTitle": "Favorite lists", - "favoriteGroupsDescription": "Create short lists to organize your saved stations.", - "favoriteGroupsAdd": "Add list", - "favoriteGroupsEdit": "Edit list", - "favoriteGroupsDelete": "Delete list", - "favoriteGroupsNameLabel": "List name", - "favoriteGroupsNameTooLong": "Maximum 28 characters.", - "favoriteGroupsUnassigned": "Unassigned", - "favoriteGroupsProtectedHint": "Default list: it cannot be edited or deleted.", - "favoriteGroupsCreated": "List created", - "favoriteGroupsUpdated": "List updated", - "favoriteGroupsDeleted": "List deleted; its stations return to Unassigned.", - "favoriteGroupsAssign": "Move to list", - "favoriteGroupsAssignSubtitle": "Current list: {groupName}", - "favoriteGroupsAssigned": "{stationName} moved to {groupName}", - "favoritesTitle": "Favorites", - "favoritesEmptyTitle": "No favorites yet", - "favoritesEmptySubtitle": "Tap the heart on any station to save it to your collection.", - "favoritesHeaderSubtitle": "Organize your collection by lists and keep important radios close.", - "favoritesCollection": "Collection", - "favoritesSavedCount": "{count} saved", - "favoritesRemoveTooltip": "Remove from favorites", - "favoritesRemovedMessage": "{stationName} removed from favorites", + "stationOrderTitle": "ترتيب المحطات", + "stationOrderByName": "حسب الاسم", + "stationOrderByQuality": "حسب الجودة", + "stationOrderScopeDescription": "ينطبق على المفضلات وعمليات البحث والمحطات القريبة والقوائم السريعة.", + "favoriteGroupsTitle": "قوائم المفضلة", + "favoriteGroupsDescription": "أنشئ قوائم قصيرة لتنظيم محطاتك المحفوظة.", + "favoriteGroupsAdd": "إضافة قائمة", + "favoriteGroupsEdit": "تعديل القائمة", + "favoriteGroupsDelete": "حذف القائمة", + "favoriteGroupsNameLabel": "اسم القائمة", + "favoriteGroupsNameTooLong": "الحد الأقصى 28 حرفًا.", + "favoriteGroupsUnassigned": "غير معيّنة", + "favoriteGroupsProtectedHint": "القائمة الافتراضية: لا يمكن تعديلها أو حذفها.", + "favoriteGroupsCreated": "تم إنشاء القائمة", + "favoriteGroupsUpdated": "تم تحديث القائمة", + "favoriteGroupsDeleted": "تم حذف القائمة؛ عادت محطاتها إلى غير معيّنة.", + "favoriteGroupsAssign": "نقل إلى قائمة", + "favoriteGroupsAssignSubtitle": "القائمة الحالية: {groupName}", + "favoriteGroupsAssigned": "تم نقل {stationName} إلى {groupName}", + "favoritesTitle": "المفضلة", + "favoritesEmptyTitle": "لا توجد مفضلات بعد", + "favoritesEmptySubtitle": "اضغط على القلب في أي محطة لحفظها في مجموعتك.", + "favoritesHeaderSubtitle": "نظّم مجموعتك في قوائم وأبقِ المحطات المهمة قريبة.", + "favoritesCollection": "المجموعة", + "favoritesSavedCount": "{count} محفوظة", + "favoritesRemoveTooltip": "إزالة من المفضلة", + "favoritesRemovedMessage": "تمت إزالة {stationName} من المفضلة", "@favoriteGroupsAssignSubtitle": { "placeholders": { "groupName": {} @@ -226,9 +254,9 @@ "stationName": {} } }, - "alarmPostponedCurrentExecution": "Alarm postponed for this occurrence.", - "searchScreenTitle": "ابحث عن المحطات", - "searchScreenSubtitle": "اعثر على المحطات بالاسم أو البلد أو اللغة باستخدام فلاتر سريعة وتباين عالٍ.", + "alarmPostponedCurrentExecution": "تم تأجيل المنبه لهذا التشغيل.", + "searchScreenTitle": "البحث عن إشارة", + "searchScreenSubtitle": "اعثر على إذاعات حسب الاسم أو البلد أو اللغة باستخدام فلاتر سريعة وتباين عالٍ.", "searchFiltersLabel": "الفلاتر", "searchHint": "راديو هورايزن، جاز، أخبار...", "searchCountryFilterLabel": "البلد", @@ -236,8 +264,8 @@ "searchMinQualityFilterLabel": "الحد الأدنى للجودة", "searchEmptyTitle": "ابحث عن محطة", "searchNoResultsTitle": "لا توجد نتائج", - "searchEmptySubtitle": "استخدم الشريط العلوي أو الوسوم لاكتشاف محطات من جميع أنحاء العالم.", - "searchNoResultsSubtitle": "جرّب إزالة الفلاتر أو كتابة اسم آخر للعثور على محطة نشطة.", + "searchEmptySubtitle": "استخدم الشريط العلوي أو الشرائح لاكتشاف إشارات من كل العالم.", + "searchNoResultsSubtitle": "جرّب إزالة الفلاتر أو كتابة اسم آخر للعثور على إشارة نشطة.", "countrySpain": "إسبانيا", "countryUsa": "الولايات المتحدة", "countryMexico": "المكسيك", @@ -257,9 +285,9 @@ "languageNameJapanese": "اليابانية", "languageNameArabic": "العربية", "languageNameRussian": "الروسية", - "homeScreenSubtitle": "Live global radio with clean signals, smart favorites, and a show-style visual experience.", - "exploreStations": "Explore stations", - "stationsCount": "{count} stations", + "homeScreenSubtitle": "راديو عالمي مباشر بإشارات نقية ومفضلات ذكية وتجربة بصرية بأسلوب المسابقات.", + "exploreStations": "استكشاف المحطات", + "stationsCount": "{count} محطة راديو", "@stationsCount": { "placeholders": { "count": { @@ -267,36 +295,36 @@ } } }, - "qualityHd": "HD quality", - "nearYou": "Near you", - "nearYouInCountry": "Near you ? {country}", + "qualityHd": "جودة HD", + "nearYou": "بالقرب منك", + "nearYouInCountry": "بالقرب منك · {country}", "@nearYouInCountry": { "placeholders": { "country": {} } }, - "detectAction": "Detect", - "liveRadar": "Live radar", - "genresTitle": "Genres", - "retryAction": "Retry", - "noStationsAvailable": "No stations available", - "noStationsAvailableSubtitle": "Try refreshing or choosing another genre to capture a signal again.", - "genrePop": "Pop", - "genreRock": "Rock", - "genreJazz": "Jazz", - "genreClassical": "Classical", - "genreElectronic": "Electronic", - "genreNews": "News", - "genreTalk": "Talk", - "genreHipHop": "Hip-hop", - "genreCountry": "Country", - "genreMetal": "Metal", - "genreReggae": "Reggae", - "genreLatin": "Latin", - "alarmScreenTitle": "Music wake-up", - "alarmScreenSubtitle": "Alarms with radio, safe fallback sound, smart vacations, and the next occurrence always visible.", - "createAlarmAction": "Create alarm", - "alarmsCount": "{count} alarms", + "detectAction": "اكتشاف", + "liveRadar": "رادار مباشر", + "genresTitle": "الأنواع", + "retryAction": "إعادة المحاولة", + "noStationsAvailable": "لا توجد محطات متاحة", + "noStationsAvailableSubtitle": "جرّب التحديث أو اختيار نوع آخر لالتقاط الإشارة من جديد.", + "genrePop": "بوب", + "genreRock": "روك", + "genreJazz": "جاز", + "genreClassical": "كلاسيكي", + "genreElectronic": "إلكترونية", + "genreNews": "أخبار", + "genreTalk": "حوارات", + "genreHipHop": "هيب هوب", + "genreCountry": "كانتري", + "genreMetal": "ميتال", + "genreReggae": "ريغي", + "genreLatin": "لاتينية", + "alarmScreenTitle": "الاستيقاظ الموسيقي", + "alarmScreenSubtitle": "منبهات بالراديو وصوت آمن وإجازات ذكية والتنفيذ التالي ظاهر دائمًا.", + "createAlarmAction": "إنشاء منبه", + "alarmsCount": "{count} منبهات", "@alarmsCount": { "placeholders": { "count": { @@ -304,10 +332,10 @@ } } }, - "activeAlarmsWithoutNextTitle": "Active alarms without a next occurrence", - "noActiveAlarms": "No active alarms", - "nextAlarmTitle": "Next alarm", - "activeAlarmsWithoutNextSubtitle": "There are {count} active alarm(s), but they do not currently have a valid future date. Check date, weekdays, and vacations.", + "activeAlarmsWithoutNextTitle": "منبهات نشطة بلا تشغيل قادم", + "noActiveAlarms": "لا توجد منبهات نشطة", + "nextAlarmTitle": "المنبه التالي", + "activeAlarmsWithoutNextSubtitle": "توجد {count} منبهات نشطة، لكنها لا تملك حاليًا تاريخًا مستقبليًا صالحًا. راجع التاريخ والأيام والإجازات.", "@activeAlarmsWithoutNextSubtitle": { "placeholders": { "count": { @@ -315,10 +343,10 @@ } } }, - "createAlarmHint": "Create an alarm and PluriWave will calculate the next occurrence automatically.", - "alarmVacationPlay": "Plays during vacations", - "alarmVacationPause": "Paused during vacations", - "alarmFadeInLabel": "Fade-in {seconds}s", + "createAlarmHint": "أنشئ منبهًا وسيحسب PluriWave التشغيل التالي تلقائيًا.", + "alarmVacationPlay": "يرن في الإجازات", + "alarmVacationPause": "يتوقف في الإجازات", + "alarmFadeInLabel": "تدرّج الصوت {seconds}ث", "@alarmFadeInLabel": { "placeholders": { "seconds": { @@ -326,61 +354,61 @@ } } }, - "alarmNextExecution": "Next occurrence: {date}", + "alarmNextExecution": "التشغيل التالي: {date}", "@alarmNextExecution": { "placeholders": { "date": {} } }, - "alarmNoNextExecution": "It has no active next occurrence.", - "alarmSkippedExecution": "One occurrence was skipped: {date}.", + "alarmNoNextExecution": "لا يوجد تشغيل نشط قادم.", + "alarmSkippedExecution": "تم تخطي تشغيل: {date}.", "@alarmSkippedExecution": { "placeholders": { "date": {} } }, - "editAction": "Edit", - "skipNextAction": "Skip next", - "deleteTooltip": "Delete", - "alarmSkippedNoNextSnackbar": "Alarm skipped. There is no next occurrence left.", - "alarmSkippedReturnsSnackbar": "Alarm skipped. It will return on {date}.", + "editAction": "تعديل", + "skipNextAction": "تخطي التالي", + "deleteTooltip": "حذف", + "alarmSkippedNoNextSnackbar": "تم تخطي المنبه. لا يوجد تشغيل قادم.", + "alarmSkippedReturnsSnackbar": "تم تخطي المنبه. سيعود في {date}.", "@alarmSkippedReturnsSnackbar": { "placeholders": { "date": {} } }, - "alarmVacationPausedNoNext": "It is paused for vacations ({vacationName}) and has no next occurrence.", + "alarmVacationPausedNoNext": "متوقف بسبب الإجازة ({vacationName}) ولا يوجد تشغيل قادم.", "@alarmVacationPausedNoNext": { "placeholders": { "vacationName": {} } }, - "alarmVacationPausedReturns": "It is paused for vacations ({vacationName}) and returns on {date}.", + "alarmVacationPausedReturns": "متوقف بسبب الإجازة ({vacationName}) وسيعود في {date}.", "@alarmVacationPausedReturns": { "placeholders": { "vacationName": {}, "date": {} } }, - "alarmVacationReturns": "With vacations enabled, it will ring again on {date}.", + "alarmVacationReturns": "مع تفعيل الإجازات، سيعود للرنين في {date}.", "@alarmVacationReturns": { "placeholders": { "date": {} } }, - "defaultAlarmName": "Music alarm", - "newAlarmTitle": "New alarm", - "editAlarmTitle": "Edit alarm", - "nameField": "Name", - "timeField": "Time", - "dateField": "Date", - "onceOption": "Once", - "dailyOption": "Daily", - "weekdaysOption": "Weekdays", - "soundAndVolumeSection": "Sound and volume", - "alarmFadeInTitle": "Alarm fade-in", - "alarmFadeInOff": "0 s (no transition)", - "alarmFadeInSummary": "{seconds} s (from 5% to the selected volume)", + "defaultAlarmName": "منبه موسيقي", + "newAlarmTitle": "منبه جديد", + "editAlarmTitle": "تعديل المنبه", + "nameField": "الاسم", + "timeField": "الوقت", + "dateField": "التاريخ", + "onceOption": "مرة واحدة", + "dailyOption": "يومي", + "weekdaysOption": "أيام", + "soundAndVolumeSection": "الصوت ومستوى الصوت", + "alarmFadeInTitle": "تدرّج صوت المنبه", + "alarmFadeInOff": "0 ث (بدون انتقال)", + "alarmFadeInSummary": "{seconds} ث (من 5% إلى مستوى الصوت المختار)", "@alarmFadeInSummary": { "placeholders": { "seconds": { @@ -388,22 +416,22 @@ } } }, - "internalSafeSoundLabel": "Internal safe sound", - "soundWarmSunrise": "Warm sunrise", - "soundSoftBell": "Soft bell", - "soundDigitalPulse": "Digital pulse", - "favoriteStationLabel": "Favorite station", - "noStationUseInternalSound": "No station: use internal sound", - "saveFavoritesAlarmHint": "Save stations in Favorites to use them as a music alarm.", - "useCurrentStationAction": "Use current station", - "playDuringVacations": "Play during vacations", - "playDuringVacationsHint": "If you turn this off, the next occurrence will jump to the first valid day.", - "saveAlarmAction": "Save alarm", - "chooseOneWeekdayError": "Choose at least one weekday.", - "androidReliabilityReview": "Review Android reliability", - "statusOk": "OK", - "statusPending": "pending", - "androidReliabilityStatus": "Reliability: exact {exact} ? notifications {notifications} ? screen {screen}", + "internalSafeSoundLabel": "صوت داخلي آمن", + "soundWarmSunrise": "شروق دافئ", + "soundSoftBell": "جرس ناعم", + "soundDigitalPulse": "نبضة رقمية", + "favoriteStationLabel": "المحطة المفضلة", + "noStationUseInternalSound": "بدون محطة: استخدام الصوت الداخلي", + "saveFavoritesAlarmHint": "احفظ محطات في المفضلة لاستخدامها كمنبه موسيقي.", + "useCurrentStationAction": "استخدام المحطة الحالية", + "playDuringVacations": "الرنين أثناء الإجازات", + "playDuringVacationsHint": "إذا أوقفت ذلك، سيتخطى التشغيل التالي إلى أول يوم صالح.", + "saveAlarmAction": "حفظ المنبه", + "chooseOneWeekdayError": "اختر يومًا واحدًا على الأقل من الأسبوع.", + "androidReliabilityReview": "مراجعة موثوقية Android", + "statusOk": "حسنًا", + "statusPending": "معلّق", + "androidReliabilityStatus": "الموثوقية: الدقيقة {exact} · الإشعارات {notifications} · الشاشة {screen}", "@androidReliabilityStatus": { "placeholders": { "exact": {}, @@ -411,19 +439,165 @@ "screen": {} } }, - "vacationRangesTitle": "Vacation ranges", - "addAction": "Add", - "vacationRangesHint": "If an alarm is set to \"Paused during vacations\", it automatically skips these ranges.", - "noVacationRangesLoaded": "No ranges loaded.", - "deleteRangeTooltip": "Delete range", - "vacationsDefaultName": "Vacation", - "newVacationRangeTitle": "New vacation range", - "startField": "Start", - "endField": "End", - "saveRangeAction": "Save range", - "noAlarmsYetTitle": "There are no alarms yet.", - "noAlarmsYetSubtitle": "Create one to design your musical wake-up.", - "ringingInternalAudioActive": "Playing with internal safe audio.", - "ringingPreparingInternalAudio": "Preparing internal safe audio.", - "stopAlarmAction": "Stop alarm" + "vacationRangesTitle": "نطاقات الإجازات", + "addAction": "إضافة", + "vacationRangesHint": "إذا كان المنبه لديه \"توقف في الإجازات\"، فسيتم تخطي هذه النطاقات تلقائيًا.", + "noVacationRangesLoaded": "لا توجد نطاقات محمّلة.", + "deleteRangeTooltip": "حذف النطاق", + "vacationsDefaultName": "إجازات", + "newVacationRangeTitle": "نطاق إجازة جديد", + "startField": "البداية", + "endField": "النهاية", + "saveRangeAction": "حفظ النطاق", + "noAlarmsYetTitle": "لا توجد منبهات بعد.", + "noAlarmsYetSubtitle": "أنشئ واحدًا لتصميم استيقاظك الموسيقي.", + "ringingInternalAudioActive": "يرن باستخدام الصوت الداخلي الآمن.", + "ringingPreparingInternalAudio": "جارٍ تجهيز الصوت الداخلي الآمن.", + "stopAlarmAction": "إيقاف المنبه", + "pauseAction": "إيقاف مؤقت", + "miniPlayerOpenLabel": "فتح المشغل لـ {stationName}", + "@miniPlayerOpenLabel": { + "placeholders": { + "stationName": {} + } + }, + "playerIconLabel": "المشغل", + "playbackStatusConnecting": "جارٍ الاتصال...", + "playbackStatusLive": "مباشر", + "playbackStatusPaused": "متوقف مؤقتًا", + "playbackStatusConnectionError": "خطأ في الاتصال", + "playbackStatusStopped": "متوقف", + "stationSemanticLabel": "محطة {stationName}", + "@stationSemanticLabel": { + "placeholders": { + "stationName": {} + } + }, + "favoritesAddTooltip": "إضافة إلى المفضلة", + "favoritesAddedMessage": "تمت إضافة {stationName} إلى المفضلة", + "@favoritesAddedMessage": { + "placeholders": { + "stationName": {} + } + }, + "stationIconLabel": "أيقونة المحطة", + "liveNow": "مباشر الآن", + "equalizerBandLabel": "النطاق {band}", + "@equalizerBandLabel": { + "placeholders": { + "band": {} + } + }, + "equalizerBandValue": "{value} ديسيبل", + "@equalizerBandValue": { + "placeholders": { + "value": {} + } + }, + "equalizerPresetFlat": "مسطح", + "equalizerPresetRock": "روك", + "equalizerPresetPop": "بوب", + "equalizerPresetBassBoost": "تعزيز الجهير", + "equalizerPresetJazz": "جاز", + "equalizerPresetVoice": "صوت", + "equalizerPresetCustom": "مخصص", + "onboardingTitle": "مرحبًا بك في PluriWave", + "onboardingNewsTitle": "المستجدات", + "onboardingStartAction": "ابدأ", + "onboardingCloseTooltip": "إغلاق", + "radioRecordingError": "خطأ أثناء تسجيل الراديو: {error}", + "@radioRecordingError": { + "placeholders": { + "error": {} + } + }, + "radioApiConnectionError": "لا يوجد اتصال بواجهة برمجة تطبيقات الراديو", + "radioSearchError": "خطأ في البحث. تحقق من اتصالك.", + "radioLoadMoreStationsError": "تعذر تحميل المزيد من المحطات.", + "radioNearbyStationsError": "تعذر علينا اكتشاف محطات قريبة. استخدم عوامل التصفية حسب البلد.", + "radioCannotPlayStation": "لا يمكن تشغيل \"{stationName}\"", + "@radioCannotPlayStation": { + "placeholders": { + "stationName": {} + } + }, + "recordingSelectStationFirst": "اختر محطة أولًا للتسجيل.", + "recordingStartError": "تعذر بدء التسجيل: {error}", + "@recordingStartError": { + "placeholders": { + "error": {} + } + }, + "unsupportedConfigVersion": "إصدار الإعدادات غير مدعوم", + "audioErrorGeneric": "خطأ في التشغيل", + "audioErrorNoInternet": "لا يوجد اتصال بالإنترنت", + "audioErrorInvalidUrl": "عنوان الراديو غير صالح", + "audioErrorNotFound": "الراديو غير متاح (خطأ 404)", + "audioErrorTimeout": "انتهت مهلة الاتصال", + "audioErrorCannotConnect": "لا يمكن الاتصال بالراديو", + "audioErrorUnsupportedFormat": "تنسيق البث غير مدعوم", + "audioErrorDecode": "خطأ أثناء فك ترميز بث الصوت", + "audioErrorCleartext": "تستخدم هذه المحطة HTTP غير مشفّر، وهذا غير مسموح", + "audioErrorSsl": "شهادة SSL غير صالحة في الراديو", + "audioErrorCannotPlay": "لا يمكن تشغيل هذه المحطة", + "audioErrorUnexpectedPlayback": "خطأ غير متوقع أثناء التشغيل", + "androidExactAlarmScheduleError": "تعذر على Android جدولة منبه دقيق. تحقق من إذن المنبهات الدقيقة.", + "recordingPathEmptyError": "لا يمكن أن يكون مسار التسجيل فارغًا", + "recordingMaxSizeInvalidError": "يجب أن يكون الحجم الأقصى أكبر من الصفر", + "recordingAlreadyActiveError": "يوجد تسجيل قيد التنفيذ بالفعل", + "alarmRingingFallbackActive": "يعمل الآن باستخدام الصوت الداخلي الآمن.", + "alarmRingingPreparingFallback": "جارٍ تجهيز الصوت الداخلي الآمن.", + "alarmRingingTryingStation": "جارٍ محاولة تشغيل محطتك بأعلى جودة متاحة.", + "alarmScheduleOnce": "مرة واحدة · {date}", + "@alarmScheduleOnce": { + "placeholders": { + "date": {} + } + }, + "alarmScheduleWeekdays": "الأيام: {days}", + "@alarmScheduleWeekdays": { + "placeholders": { + "days": {} + } + }, + "androidReliabilityTitle": "مراجعة موثوقية Android", + "closeAction": "إغلاق", + "customOption": "مخصص", + "endLabel": "النهاية", + "equalizerDisable": "تعطيل المعادل", + "helpTitle": "المساعدة والشرح", + "helpSubtitle": "راجع ميزات PluriWave والنصائح والمستجدات.", + "indefiniteOption": "غير محدد", + "invalidNumber": "رقم غير صالح", + "nameLabel": "الاسم", + "notPlaying": "لا يتم التشغيل", + "oneTimeOption": "مرة واحدة", + "pausePlaybackTooltip": "إيقاف مؤقت", + "qualityOriginal": "الجودة الأصلية: {quality}", + "@qualityOriginal": { + "placeholders": { + "quality": {} + } + }, + "qualityUnknown": "الجودة غير مذكورة", + "recordAction": "تسجيل", + "recordDurationTitle": "مدة التسجيل", + "recordRadioSubtitle": "اختر مدة التسجيل.", + "recordRadioTitle": "تسجيل الراديو", + "recordingActiveTitle": "جارٍ تسجيل الراديو", + "recordingDirectTitle": "تسجيل مباشر", + "recordingsOpenFolderPlainError": "تعذر فتح مجلد التسجيلات", + "recordingsOpenLatest": "فتح آخر تسجيل", + "recordingsOpenLatestError": "تعذر فتح آخر تسجيل", + "startLabel": "البداية", + "startPlaybackTooltip": "بدء التشغيل", + "stopAction": "إيقاف", + "stopPlaybackTooltip": "إيقاف التشغيل", + "weekdayShortMonday": "الإثنين", + "weekdayShortTuesday": "الثلاثاء", + "weekdayShortWednesday": "الأربعاء", + "weekdayShortThursday": "الخميس", + "weekdayShortFriday": "الجمعة", + "weekdayShortSaturday": "السبت", + "weekdayShortSunday": "الأحد" } diff --git a/lib/l10n/app_bn.arb b/lib/l10n/app_bn.arb index 435ab39..5495cae 100644 --- a/lib/l10n/app_bn.arb +++ b/lib/l10n/app_bn.arb @@ -1,107 +1,135 @@ { "@@locale": "bn", "appTitle": "PluriWave", - "navHome": "Home", - "navSearch": "Search", - "navFavorites": "Favorites", - "navAlarms": "Alarms", - "navSettings": "Settings", - "actionOk": "OK", - "sleepTimer": "Sleep timer", - "sleepTimerDescription": "Smooth radio shutdown with an exact countdown.", - "cancelTimer": "Cancel timer", - "optionOther": "Other", - "customDurationTitle": "Custom duration", - "durationGreaterThanZero": "Choose a duration greater than zero.", - "hoursLabel": "Hours", - "minutesLabel": "Minutes", - "secondsLabel": "Seconds", - "saveQuickAccess": "Save as quick access", - "startTimer": "Start timer", - "skipCurrentAlarmExecution": "Skipped this execution of {alarmName}.", + "navHome": "হোম", + "navSearch": "অনুসন্ধান", + "navFavorites": "প্রিয়", + "navAlarms": "অ্যালার্ম", + "navSettings": "সেটিংস", + "actionOk": "ঠিক আছে", + "sleepTimer": "ঘুমের টাইমার", + "sleepTimerDescription": "নির্ভুল কাউন্টডাউন দিয়ে রেডিও মসৃণভাবে বন্ধ করা।", + "cancelTimer": "টাইমার বাতিল করুন", + "optionOther": "অন্যান্য", + "customDurationTitle": "নিজস্ব সময়কাল", + "durationGreaterThanZero": "শূন্যের চেয়ে বেশি একটি সময়কাল বেছে নিন।", + "hoursLabel": "ঘণ্টা", + "minutesLabel": "মিনিট", + "secondsLabel": "সেকেন্ড", + "durationHoursMinutesSeconds": "{hours} ? {minutes} ?? {seconds} ??", + "@durationHoursMinutesSeconds": { + "placeholders": { + "hours": {}, + "minutes": {}, + "seconds": {} + } + }, + "durationMinutesSeconds": "{minutes} ?? {seconds} ??", + "@durationMinutesSeconds": { + "placeholders": { + "minutes": {}, + "seconds": {} + } + }, + "durationMinutesOnly": "{minutes} ??", + "@durationMinutesOnly": { + "placeholders": { + "minutes": {} + } + }, + "durationSecondsOnly": "{seconds} ??", + "@durationSecondsOnly": { + "placeholders": { + "seconds": {} + } + }, + "saveQuickAccess": "দ্রুত অ্যাক্সেস হিসেবে সংরক্ষণ করুন", + "startTimer": "টাইমার শুরু করুন", + "skipCurrentAlarmExecution": "{alarmName}-এর এই চালনা এড়িয়ে দেওয়া হয়েছে।", "@skipCurrentAlarmExecution": { "placeholders": { "alarmName": {} } }, - "settingsTitle": "Settings", - "settingsSubtitle": "Fine-grained sound control, backups, and custom stations.", - "languageSectionTitle": "Language", - "languageSectionDescription": "Choose how the app language is displayed.", - "languageSystemDefault": "System", - "languageSpanish": "Spanish", - "languageEnglish": "English", - "languageUpdated": "Language updated: {languageName}", + "settingsTitle": "সেটিংস", + "settingsSubtitle": "শব্দ, ব্যাকআপ এবং নিজস্ব স্টেশনের সূক্ষ্ম নিয়ন্ত্রণ।", + "languageSectionTitle": "ভাষা", + "languageSectionDescription": "অ্যাপের ভাষা কীভাবে দেখাবে তা বেছে নিন।", + "languageSystemDefault": "সিস্টেম", + "languageSpanish": "স্প্যানিশ", + "languageEnglish": "ইংরেজি", + "languageUpdated": "ভাষা আপডেট হয়েছে: {languageName}", "@languageUpdated": { "placeholders": { "languageName": {} } }, - "languageUpdatedSystem": "Language updated: System", - "timerSectionTitle": "Sleep timer", - "timerSectionAdd": "Add", - "timerSectionDescription": "Customize the quick presets shown when automatically stopping the radio.", - "timerSectionRestoreRecommended": "Restore recommended times", - "newQuickAccessTitle": "New quick access", - "saveQuickAccessButton": "Save quick access", - "settingsSafeStatus": "Safe", - "recordingsSectionTitle": "Recordings", - "recordingsFolderDialogTitle": "Select recordings folder", - "recordingsPathUpdated": "Recording path updated", - "recordingsPathSaveError": "Could not save the path: {error}", - "recordingsDefaultFolderRestored": "The internal default folder will be used", - "recordingsFolderTitle": "Recordings folder", - "recordingsPathCalculating": "Calculating path...", - "recordingsChangePath": "Change path", - "recordingsUseDefaultPath": "Use default path", - "recordingsOriginalStreamHint": "The radio is saved from the original stream, without recompressing.", - "equalizerActive": "Active", - "equalizerDisabled": "Disabled", - "equalizerEnable": "Enable equalizer", - "equalizerRealtimeSubtitle": "Changes are applied in real time to the current station.", - "equalizerPendingSubtitle": "Changes are saved and will apply when Android enables the effect.", - "equalizerPerStationTitle": "Use custom EQ for this favorite", - "equalizerPerStationActive": "Active for {stationName}", - "equalizerPerStationMain": "Using main EQ for {stationName}", - "preferredStationTitle": "Preferred station", - "preferredStationDescription": "Preselected for new alarms and available for quick playback.", - "preferredStationNoStationsTitle": "No stations available yet", - "preferredStationNoStationsSubtitle": "Save favorites or load stations to choose a preferred one.", - "preferredStationAutomaticFallback": "Automatic fallback", - "preferredStationDefaultFavorite": "Default favorite", - "preferredStationCurrent": "Current preferred: {stationName}", - "preferredStationAutoUsing": "No favorites: automatically using {stationName}", - "preferredStationPlay": "Play preferred", - "customStationsTitle": "Custom stations", - "customStationsAdd": "Add", - "customStationsEmpty": "No custom stations.", - "playAction": "Play", - "deleteAction": "Delete", - "addStationTitle": "Add station", - "stationNameLabel": "Name *", - "requiredField": "Required field", - "streamUrlLabel": "Stream URL *", - "invalidUrl": "Invalid URL", - "countryOptionalLabel": "Country (optional)", - "saveStation": "Save station", - "backupSectionTitle": "Backup", - "backupExportTitle": "Export configuration", - "backupExportSubtitle": "Favorites, custom stations, and EQ presets", - "backupImportTitle": "Import configuration", - "backupImportSubtitle": "Restore from a backup file", - "backupShareSubject": "PluriWave — backup", - "backupShareText": "PluriWave configuration exported on {date}", - "backupExportError": "Export error: {error}", - "backupImportConfirmMessage": "This will add favorites, stations, and presets from the file. Continue?", - "backupImportSuccess": "Configuration imported successfully", - "backupImportError": "Import error: {error}", - "appVersionLoading": "Loading version...", - "appVersionSubtitle": "{version} - World radio", - "savedFavoritesTitle": "Saved favorites", - "stationFilterTitle": "Station filter", - "stationFilterSubtitle": "Only stations verified as active", - "backgroundAudioTitle": "Background audio", - "backgroundAudioSubtitle": "Continues when the screen turns off", + "languageUpdatedSystem": "ভাষা আপডেট হয়েছে: সিস্টেম", + "timerSectionTitle": "ঘুমের টাইমার", + "timerSectionAdd": "যোগ করুন", + "timerSectionDescription": "রেডিও স্বয়ংক্রিয়ভাবে বন্ধ করার সময় দেখা যায় এমন দ্রুত প্রিসেটগুলো সাজান।", + "timerSectionRestoreRecommended": "প্রস্তাবিত সময় ফিরিয়ে আনুন", + "newQuickAccessTitle": "নতুন দ্রুত অ্যাক্সেস", + "saveQuickAccessButton": "দ্রুত অ্যাক্সেস সংরক্ষণ করুন", + "settingsSafeStatus": "নিরাপদ", + "recordingsSectionTitle": "রেকর্ডিং", + "recordingsFolderDialogTitle": "রেকর্ডিং ফোল্ডার নির্বাচন করুন", + "recordingsPathUpdated": "রেকর্ডিং পথ আপডেট হয়েছে", + "recordingsPathSaveError": "পথ সংরক্ষণ করা যায়নি: {error}", + "recordingsDefaultFolderRestored": "ডিফল্ট অভ্যন্তরীণ ফোল্ডার ব্যবহার করা হবে", + "recordingsFolderTitle": "রেকর্ডিং ফোল্ডার", + "recordingsPathCalculating": "পথ গণনা করা হচ্ছে...", + "recordingsChangePath": "পথ পরিবর্তন করুন", + "recordingsUseDefaultPath": "ডিফল্ট পথ ব্যবহার করুন", + "recordingsOriginalStreamHint": "রেডিওটি মূল স্ট্রিম থেকে সংরক্ষিত হয়, পুনরায় কমপ্রেস করা হয় না।", + "equalizerActive": "সক্রিয়", + "equalizerDisabled": "নিষ্ক্রিয়", + "equalizerEnable": "ইকুয়ালাইজার চালু করুন", + "equalizerRealtimeSubtitle": "পরিবর্তনগুলো বর্তমান স্টেশনে তাৎক্ষণিকভাবে প্রয়োগ হয়।", + "equalizerPendingSubtitle": "পরিবর্তনগুলো সংরক্ষিত থাকবে এবং Android প্রভাব চালু করলে প্রয়োগ হবে।", + "equalizerPerStationTitle": "এই প্রিয়টির জন্য নিজস্ব ইকুয়ালাইজার ব্যবহার করুন", + "equalizerPerStationActive": "{stationName}-এর জন্য সক্রিয়", + "equalizerPerStationMain": "{stationName}-এর জন্য মূল ইকুয়ালাইজার ব্যবহার করা হচ্ছে", + "preferredStationTitle": "পছন্দের স্টেশন", + "preferredStationDescription": "নতুন অ্যালার্মে আগে থেকে বেছে নেওয়া হয় এবং দ্রুত চালানো যায়।", + "preferredStationNoStationsTitle": "এখনও কোনো স্টেশন উপলব্ধ নেই", + "preferredStationNoStationsSubtitle": "পছন্দের স্টেশন বেছে নিতে প্রিয় সংরক্ষণ করুন বা স্টেশন লোড করুন।", + "preferredStationAutomaticFallback": "স্বয়ংক্রিয় বিকল্প", + "preferredStationDefaultFavorite": "ডিফল্ট প্রিয়", + "preferredStationCurrent": "বর্তমান পছন্দের: {stationName}", + "preferredStationAutoUsing": "কোনো প্রিয় নেই: স্বয়ংক্রিয়ভাবে {stationName} ব্যবহার করা হচ্ছে", + "preferredStationPlay": "পছন্দেরটি চালান", + "customStationsTitle": "নিজস্ব স্টেশন", + "customStationsAdd": "যোগ করুন", + "customStationsEmpty": "কোনো নিজস্ব স্টেশন নেই।", + "playAction": "চালান", + "deleteAction": "মুছুন", + "addStationTitle": "স্টেশন যোগ করুন", + "stationNameLabel": "নাম *", + "unnamedStation": "নামহীন স্টেশন", + "requiredField": "আবশ্যক ক্ষেত্র", + "streamUrlLabel": "স্ট্রিম URL *", + "invalidUrl": "অবৈধ URL", + "countryOptionalLabel": "দেশ (ঐচ্ছিক)", + "saveStation": "স্টেশন সংরক্ষণ করুন", + "backupSectionTitle": "ব্যাকআপ", + "backupExportTitle": "সেটিংস রপ্তানি করুন", + "backupExportSubtitle": "প্রিয়, নিজস্ব স্টেশন এবং ইকুয়ালাইজার প্রিসেট", + "backupImportTitle": "সেটিংস আমদানি করুন", + "backupImportSubtitle": "ব্যাকআপ ফাইল থেকে পুনরুদ্ধার করুন", + "backupShareSubject": "PluriWave — ব্যাকআপ", + "backupShareText": "{date} তারিখে রপ্তানি করা PluriWave সেটিংস", + "backupExportError": "রপ্তানির সময় ত্রুটি: {error}", + "backupImportConfirmMessage": "এটি ফাইলের প্রিয়, স্টেশন এবং প্রিসেট যোগ করবে। চালিয়ে যাবেন?", + "backupImportSuccess": "সেটিংস সফলভাবে আমদানি হয়েছে", + "backupImportError": "আমদানির সময় ত্রুটি: {error}", + "appVersionLoading": "সংস্করণ লোড হচ্ছে...", + "appVersionSubtitle": "{version} - বিশ্ব রেডিও", + "savedFavoritesTitle": "সংরক্ষিত প্রিয়", + "stationFilterTitle": "স্টেশন ফিল্টার", + "stationFilterSubtitle": "শুধু সক্রিয় হিসেবে যাচাই করা স্টেশন", + "backgroundAudioTitle": "পটভূমির অডিও", + "backgroundAudioSubtitle": "স্ক্রিন বন্ধ করলেও চলতে থাকে", "dash": "—", "@recordingsPathSaveError": { "placeholders": { @@ -148,15 +176,15 @@ "version": {} } }, - "cancelAction": "Cancel", - "equalizerTitle": "Equalizer", - "recordingsOpenFolder": "Open folder", - "recordingsOpenFolderError": "Could not open the folder: {error}", - "recordingsMaxSizeTitle": "Maximum recording size", - "recordingsMaxSizeSubtitle": "Current limit: {size} MB", - "recordingsMaxSizeDialogTitle": "Maximum size per recording", - "recordingsMaxSizeMbLabel": "Maximum megabytes", - "recordingsMaxSizeSaved": "Recording limit updated to {size} MB", + "cancelAction": "বাতিল করুন", + "equalizerTitle": "ইকুয়ালাইজার", + "recordingsOpenFolder": "ফোল্ডার খুলুন", + "recordingsOpenFolderError": "ফোল্ডার খোলা যায়নি: {error}", + "recordingsMaxSizeTitle": "রেকর্ডিংয়ের সর্বোচ্চ আকার", + "recordingsMaxSizeSubtitle": "বর্তমান সীমা: {size} MB", + "recordingsMaxSizeDialogTitle": "প্রতি রেকর্ডিংয়ের সর্বোচ্চ আকার", + "recordingsMaxSizeMbLabel": "সর্বোচ্চ মেগাবাইট", + "recordingsMaxSizeSaved": "রেকর্ডিং সীমা {size} MB-এ আপডেট হয়েছে", "@recordingsOpenFolderError": { "placeholders": { "error": {} @@ -176,33 +204,33 @@ } } }, - "stationOrderTitle": "Station order", - "stationOrderByName": "By name", - "stationOrderByQuality": "By quality", - "stationOrderScopeDescription": "Applies to favorites, searches, nearby stations and quick lists.", - "favoriteGroupsTitle": "Favorite lists", - "favoriteGroupsDescription": "Create short lists to organize your saved stations.", - "favoriteGroupsAdd": "Add list", - "favoriteGroupsEdit": "Edit list", - "favoriteGroupsDelete": "Delete list", - "favoriteGroupsNameLabel": "List name", - "favoriteGroupsNameTooLong": "Maximum 28 characters.", - "favoriteGroupsUnassigned": "Unassigned", - "favoriteGroupsProtectedHint": "Default list: it cannot be edited or deleted.", - "favoriteGroupsCreated": "List created", - "favoriteGroupsUpdated": "List updated", - "favoriteGroupsDeleted": "List deleted; its stations return to Unassigned.", - "favoriteGroupsAssign": "Move to list", - "favoriteGroupsAssignSubtitle": "Current list: {groupName}", - "favoriteGroupsAssigned": "{stationName} moved to {groupName}", - "favoritesTitle": "Favorites", - "favoritesEmptyTitle": "No favorites yet", - "favoritesEmptySubtitle": "Tap the heart on any station to save it to your collection.", - "favoritesHeaderSubtitle": "Organize your collection by lists and keep important radios close.", - "favoritesCollection": "Collection", - "favoritesSavedCount": "{count} saved", - "favoritesRemoveTooltip": "Remove from favorites", - "favoritesRemovedMessage": "{stationName} removed from favorites", + "stationOrderTitle": "স্টেশনের ক্রম", + "stationOrderByName": "নাম অনুযায়ী", + "stationOrderByQuality": "গুণমান অনুযায়ী", + "stationOrderScopeDescription": "প্রিয়, অনুসন্ধান, কাছাকাছি স্টেশন এবং দ্রুত তালিকায় প্রযোজ্য।", + "favoriteGroupsTitle": "প্রিয় তালিকা", + "favoriteGroupsDescription": "সংরক্ষিত স্টেশন সাজাতে ছোট তালিকা তৈরি করুন।", + "favoriteGroupsAdd": "তালিকা যোগ করুন", + "favoriteGroupsEdit": "তালিকা সম্পাদনা করুন", + "favoriteGroupsDelete": "তালিকা মুছুন", + "favoriteGroupsNameLabel": "তালিকার নাম", + "favoriteGroupsNameTooLong": "সর্বোচ্চ ২৮ অক্ষর।", + "favoriteGroupsUnassigned": "বরাদ্দ নয়", + "favoriteGroupsProtectedHint": "ডিফল্ট তালিকা: সম্পাদনা বা মুছে ফেলা যায় না।", + "favoriteGroupsCreated": "তালিকা তৈরি হয়েছে", + "favoriteGroupsUpdated": "তালিকা আপডেট হয়েছে", + "favoriteGroupsDeleted": "তালিকা মুছে ফেলা হয়েছে; এর স্টেশনগুলো বরাদ্দ নয়-এ ফিরে গেছে।", + "favoriteGroupsAssign": "তালিকায় সরান", + "favoriteGroupsAssignSubtitle": "বর্তমান তালিকা: {groupName}", + "favoriteGroupsAssigned": "{stationName} {groupName}-এ সরানো হয়েছে", + "favoritesTitle": "প্রিয়", + "favoritesEmptyTitle": "এখনও কোনো প্রিয় নেই", + "favoritesEmptySubtitle": "যেকোনো স্টেশনে হৃদয় আইকনে ট্যাপ করে সেটি আপনার সংগ্রহে সংরক্ষণ করুন।", + "favoritesHeaderSubtitle": "আপনার সংগ্রহ তালিকা দিয়ে সাজান এবং গুরুত্বপূর্ণ রেডিওগুলো কাছে রাখুন।", + "favoritesCollection": "সংগ্রহ", + "favoritesSavedCount": "{count} সংরক্ষিত", + "favoritesRemoveTooltip": "প্রিয় থেকে সরান", + "favoritesRemovedMessage": "{stationName} প্রিয় থেকে সরানো হয়েছে", "@favoriteGroupsAssignSubtitle": { "placeholders": { "groupName": {} @@ -226,18 +254,18 @@ "stationName": {} } }, - "alarmPostponedCurrentExecution": "Alarm postponed for this occurrence.", + "alarmPostponedCurrentExecution": "এই চালনার জন্য অ্যালার্ম পিছিয়ে দেওয়া হয়েছে।", "searchScreenTitle": "সিগন্যাল খুঁজুন", - "searchScreenSubtitle": "দ্রুত ফিল্টার আর উচ্চ কনট্রাস্টে নাম, দেশ বা ভাষা দিয়ে স্টেশন খুঁজে নিন।", + "searchScreenSubtitle": "নাম, দেশ বা ভাষা দিয়ে দ্রুত ফিল্টার ও উচ্চ কনট্রাস্টে রেডিও খুঁজুন।", "searchFiltersLabel": "ফিল্টার", - "searchHint": "রেডিও হরাইজন, জ্যাজ, খবর...", + "searchHint": "রেডিও হোরাইজন, জ্যাজ, সংবাদ...", "searchCountryFilterLabel": "দেশ", "searchLanguageFilterLabel": "ভাষা", - "searchMinQualityFilterLabel": "ন্যূনতম মান", + "searchMinQualityFilterLabel": "ন্যূনতম গুণমান", "searchEmptyTitle": "একটি স্টেশন খুঁজুন", "searchNoResultsTitle": "কোনো ফলাফল নেই", - "searchEmptySubtitle": "উপরের বার বা চিপগুলো ব্যবহার করে সারা বিশ্বের স্টেশন খুঁজে দেখুন।", - "searchNoResultsSubtitle": "ফিল্টার সরিয়ে বা অন্য নাম লিখে একটি সক্রিয় স্টেশন খুঁজে দেখুন।", + "searchEmptySubtitle": "উপরের বার বা চিপ ব্যবহার করে সারা বিশ্বের সিগন্যাল আবিষ্কার করুন।", + "searchNoResultsSubtitle": "সক্রিয় সিগন্যাল পেতে ফিল্টার সরিয়ে বা অন্য নাম লিখে দেখুন।", "countrySpain": "স্পেন", "countryUsa": "যুক্তরাষ্ট্র", "countryMexico": "মেক্সিকো", @@ -257,9 +285,9 @@ "languageNameJapanese": "জাপানি", "languageNameArabic": "আরবি", "languageNameRussian": "রুশ", - "homeScreenSubtitle": "Live global radio with clean signals, smart favorites, and a show-style visual experience.", - "exploreStations": "Explore stations", - "stationsCount": "{count} stations", + "homeScreenSubtitle": "পরিষ্কার সিগন্যাল, বুদ্ধিমান প্রিয় এবং গেম শো-ধাঁচের ভিজ্যুয়াল অভিজ্ঞতাসহ লাইভ বিশ্ব রেডিও।", + "exploreStations": "স্টেশন দেখুন", + "stationsCount": "{count} রেডিও", "@stationsCount": { "placeholders": { "count": { @@ -267,36 +295,36 @@ } } }, - "qualityHd": "HD quality", - "nearYou": "Near you", - "nearYouInCountry": "Near you ? {country}", + "qualityHd": "HD গুণমান", + "nearYou": "আপনার কাছাকাছি", + "nearYouInCountry": "আপনার কাছাকাছি · {country}", "@nearYouInCountry": { "placeholders": { "country": {} } }, - "detectAction": "Detect", - "liveRadar": "Live radar", - "genresTitle": "Genres", - "retryAction": "Retry", - "noStationsAvailable": "No stations available", - "noStationsAvailableSubtitle": "Try refreshing or choosing another genre to capture a signal again.", - "genrePop": "Pop", - "genreRock": "Rock", - "genreJazz": "Jazz", - "genreClassical": "Classical", - "genreElectronic": "Electronic", - "genreNews": "News", - "genreTalk": "Talk", - "genreHipHop": "Hip-hop", - "genreCountry": "Country", - "genreMetal": "Metal", - "genreReggae": "Reggae", - "genreLatin": "Latin", - "alarmScreenTitle": "Music wake-up", - "alarmScreenSubtitle": "Alarms with radio, safe fallback sound, smart vacations, and the next occurrence always visible.", - "createAlarmAction": "Create alarm", - "alarmsCount": "{count} alarms", + "detectAction": "সনাক্ত করুন", + "liveRadar": "লাইভ রাডার", + "genresTitle": "ধরন", + "retryAction": "আবার চেষ্টা করুন", + "noStationsAvailable": "কোনো স্টেশন উপলব্ধ নেই", + "noStationsAvailableSubtitle": "সিগন্যাল আবার ধরতে রিফ্রেশ করুন বা অন্য ধরন বেছে নিন।", + "genrePop": "পপ", + "genreRock": "রক", + "genreJazz": "জ্যাজ", + "genreClassical": "ক্লাসিক্যাল", + "genreElectronic": "ইলেকট্রনিক", + "genreNews": "সংবাদ", + "genreTalk": "আলাপ", + "genreHipHop": "হিপ-হপ", + "genreCountry": "কান্ট্রি", + "genreMetal": "মেটাল", + "genreReggae": "রেগে", + "genreLatin": "লাতিন", + "alarmScreenTitle": "সুরেলা জাগরণ", + "alarmScreenSubtitle": "রেডিও অ্যালার্ম, নিরাপদ শব্দ, স্মার্ট ছুটি এবং পরবর্তী চালনা সবসময় দৃশ্যমান।", + "createAlarmAction": "অ্যালার্ম তৈরি করুন", + "alarmsCount": "{count} অ্যালার্ম", "@alarmsCount": { "placeholders": { "count": { @@ -304,10 +332,10 @@ } } }, - "activeAlarmsWithoutNextTitle": "Active alarms without a next occurrence", - "noActiveAlarms": "No active alarms", - "nextAlarmTitle": "Next alarm", - "activeAlarmsWithoutNextSubtitle": "There are {count} active alarm(s), but they do not currently have a valid future date. Check date, weekdays, and vacations.", + "activeAlarmsWithoutNextTitle": "পরবর্তী চালনা ছাড়া সক্রিয় অ্যালার্ম", + "noActiveAlarms": "কোনো সক্রিয় অ্যালার্ম নেই", + "nextAlarmTitle": "পরবর্তী অ্যালার্ম", + "activeAlarmsWithoutNextSubtitle": "{count}টি সক্রিয় অ্যালার্ম আছে, কিন্তু এখন তাদের কোনো বৈধ ভবিষ্যৎ তারিখ নেই। তারিখ, দিন এবং ছুটি দেখুন।", "@activeAlarmsWithoutNextSubtitle": { "placeholders": { "count": { @@ -315,10 +343,10 @@ } } }, - "createAlarmHint": "Create an alarm and PluriWave will calculate the next occurrence automatically.", - "alarmVacationPlay": "Plays during vacations", - "alarmVacationPause": "Paused during vacations", - "alarmFadeInLabel": "Fade-in {seconds}s", + "createAlarmHint": "একটি অ্যালার্ম তৈরি করুন, PluriWave স্বয়ংক্রিয়ভাবে পরবর্তী চালনা হিসাব করবে।", + "alarmVacationPlay": "ছুটিতে বাজে", + "alarmVacationPause": "ছুটিতে বিরতি", + "alarmFadeInLabel": "ফেড-ইন {seconds}সে", "@alarmFadeInLabel": { "placeholders": { "seconds": { @@ -326,61 +354,61 @@ } } }, - "alarmNextExecution": "Next occurrence: {date}", + "alarmNextExecution": "পরবর্তী চালনা: {date}", "@alarmNextExecution": { "placeholders": { "date": {} } }, - "alarmNoNextExecution": "It has no active next occurrence.", - "alarmSkippedExecution": "One occurrence was skipped: {date}.", + "alarmNoNextExecution": "কোনো সক্রিয় পরবর্তী চালনা নেই।", + "alarmSkippedExecution": "একটি চালনা এড়িয়ে দেওয়া হয়েছে: {date}।", "@alarmSkippedExecution": { "placeholders": { "date": {} } }, - "editAction": "Edit", - "skipNextAction": "Skip next", - "deleteTooltip": "Delete", - "alarmSkippedNoNextSnackbar": "Alarm skipped. There is no next occurrence left.", - "alarmSkippedReturnsSnackbar": "Alarm skipped. It will return on {date}.", + "editAction": "সম্পাদনা", + "skipNextAction": "পরবর্তীটি এড়িয়ে যান", + "deleteTooltip": "মুছুন", + "alarmSkippedNoNextSnackbar": "অ্যালার্ম এড়ানো হয়েছে। আর কোনো পরবর্তী চালনা নেই।", + "alarmSkippedReturnsSnackbar": "অ্যালার্ম এড়ানো হয়েছে। {date}-এ আবার ফিরবে।", "@alarmSkippedReturnsSnackbar": { "placeholders": { "date": {} } }, - "alarmVacationPausedNoNext": "It is paused for vacations ({vacationName}) and has no next occurrence.", + "alarmVacationPausedNoNext": "ছুটির কারণে ({vacationName}) বিরত আছে এবং কোনো পরবর্তী চালনা নেই।", "@alarmVacationPausedNoNext": { "placeholders": { "vacationName": {} } }, - "alarmVacationPausedReturns": "It is paused for vacations ({vacationName}) and returns on {date}.", + "alarmVacationPausedReturns": "ছুটির কারণে ({vacationName}) বিরত আছে এবং {date}-এ ফিরবে।", "@alarmVacationPausedReturns": { "placeholders": { "vacationName": {}, "date": {} } }, - "alarmVacationReturns": "With vacations enabled, it will ring again on {date}.", + "alarmVacationReturns": "ছুটি চালু থাকলে, {date}-এ আবার বাজবে।", "@alarmVacationReturns": { "placeholders": { "date": {} } }, - "defaultAlarmName": "Music alarm", - "newAlarmTitle": "New alarm", - "editAlarmTitle": "Edit alarm", - "nameField": "Name", - "timeField": "Time", - "dateField": "Date", - "onceOption": "Once", - "dailyOption": "Daily", - "weekdaysOption": "Weekdays", - "soundAndVolumeSection": "Sound and volume", - "alarmFadeInTitle": "Alarm fade-in", - "alarmFadeInOff": "0 s (no transition)", - "alarmFadeInSummary": "{seconds} s (from 5% to the selected volume)", + "defaultAlarmName": "সুরেলা অ্যালার্ম", + "newAlarmTitle": "নতুন অ্যালার্ম", + "editAlarmTitle": "অ্যালার্ম সম্পাদনা", + "nameField": "নাম", + "timeField": "সময়", + "dateField": "তারিখ", + "onceOption": "একবার", + "dailyOption": "দৈনিক", + "weekdaysOption": "দিন", + "soundAndVolumeSection": "শব্দ ও ভলিউম", + "alarmFadeInTitle": "অ্যালার্ম ফেড-ইন", + "alarmFadeInOff": "০ সে (কোনো পরিবর্তন নয়)", + "alarmFadeInSummary": "{seconds} সে (৫% থেকে নির্বাচিত ভলিউমে)", "@alarmFadeInSummary": { "placeholders": { "seconds": { @@ -388,22 +416,22 @@ } } }, - "internalSafeSoundLabel": "Internal safe sound", - "soundWarmSunrise": "Warm sunrise", - "soundSoftBell": "Soft bell", - "soundDigitalPulse": "Digital pulse", - "favoriteStationLabel": "Favorite station", - "noStationUseInternalSound": "No station: use internal sound", - "saveFavoritesAlarmHint": "Save stations in Favorites to use them as a music alarm.", - "useCurrentStationAction": "Use current station", - "playDuringVacations": "Play during vacations", - "playDuringVacationsHint": "If you turn this off, the next occurrence will jump to the first valid day.", - "saveAlarmAction": "Save alarm", - "chooseOneWeekdayError": "Choose at least one weekday.", - "androidReliabilityReview": "Review Android reliability", - "statusOk": "OK", - "statusPending": "pending", - "androidReliabilityStatus": "Reliability: exact {exact} ? notifications {notifications} ? screen {screen}", + "internalSafeSoundLabel": "নিরাপদ অভ্যন্তরীণ শব্দ", + "soundWarmSunrise": "উষ্ণ সূর্যোদয়", + "soundSoftBell": "নরম ঘণ্টা", + "soundDigitalPulse": "ডিজিটাল পালস", + "favoriteStationLabel": "প্রিয় স্টেশন", + "noStationUseInternalSound": "স্টেশন নেই: অভ্যন্তরীণ শব্দ ব্যবহার করুন", + "saveFavoritesAlarmHint": "সুরেলা অ্যালার্ম হিসেবে ব্যবহার করতে প্রিয়তে স্টেশন সংরক্ষণ করুন।", + "useCurrentStationAction": "বর্তমান স্টেশন ব্যবহার করুন", + "playDuringVacations": "ছুটিতে বাজান", + "playDuringVacationsHint": "এটি বন্ধ করলে পরবর্তী চালনা প্রথম বৈধ দিনে চলে যাবে।", + "saveAlarmAction": "অ্যালার্ম সংরক্ষণ করুন", + "chooseOneWeekdayError": "সপ্তাহের অন্তত একটি দিন বেছে নিন।", + "androidReliabilityReview": "Android নির্ভরযোগ্যতা পর্যালোচনা করুন", + "statusOk": "ঠিক আছে", + "statusPending": "অপেক্ষমাণ", + "androidReliabilityStatus": "নির্ভরযোগ্যতা: নির্দিষ্ট {exact} · বিজ্ঞপ্তি {notifications} · স্ক্রিন {screen}", "@androidReliabilityStatus": { "placeholders": { "exact": {}, @@ -411,19 +439,165 @@ "screen": {} } }, - "vacationRangesTitle": "Vacation ranges", - "addAction": "Add", - "vacationRangesHint": "If an alarm is set to \"Paused during vacations\", it automatically skips these ranges.", - "noVacationRangesLoaded": "No ranges loaded.", - "deleteRangeTooltip": "Delete range", - "vacationsDefaultName": "Vacation", - "newVacationRangeTitle": "New vacation range", - "startField": "Start", - "endField": "End", - "saveRangeAction": "Save range", - "noAlarmsYetTitle": "There are no alarms yet.", - "noAlarmsYetSubtitle": "Create one to design your musical wake-up.", - "ringingInternalAudioActive": "Playing with internal safe audio.", - "ringingPreparingInternalAudio": "Preparing internal safe audio.", - "stopAlarmAction": "Stop alarm" + "vacationRangesTitle": "ছুটির পরিসর", + "addAction": "যোগ করুন", + "vacationRangesHint": "কোনো অ্যালার্মে \"ছুটিতে বিরতি\" থাকলে এই পরিসরগুলো স্বয়ংক্রিয়ভাবে এড়িয়ে যাবে।", + "noVacationRangesLoaded": "কোনো পরিসর লোড হয়নি।", + "deleteRangeTooltip": "পরিসর মুছুন", + "vacationsDefaultName": "ছুটি", + "newVacationRangeTitle": "নতুন ছুটির পরিসর", + "startField": "শুরু", + "endField": "শেষ", + "saveRangeAction": "পরিসর সংরক্ষণ করুন", + "noAlarmsYetTitle": "এখনও কোনো অ্যালার্ম নেই।", + "noAlarmsYetSubtitle": "আপনার সুরেলা জাগরণ সাজাতে একটি তৈরি করুন।", + "ringingInternalAudioActive": "নিরাপদ অভ্যন্তরীণ শব্দ দিয়ে বাজছে।", + "ringingPreparingInternalAudio": "নিরাপদ অভ্যন্তরীণ শব্দ প্রস্তুত হচ্ছে।", + "stopAlarmAction": "অ্যালার্ম বন্ধ করুন", + "pauseAction": "বিরতি দিন", + "miniPlayerOpenLabel": "{stationName}-এর প্লেয়ার খুলুন", + "@miniPlayerOpenLabel": { + "placeholders": { + "stationName": {} + } + }, + "playerIconLabel": "প্লেয়ার", + "playbackStatusConnecting": "সংযুক্ত হচ্ছে...", + "playbackStatusLive": "লাইভ", + "playbackStatusPaused": "বিরতিতে", + "playbackStatusConnectionError": "সংযোগে ত্রুটি", + "playbackStatusStopped": "বন্ধ", + "stationSemanticLabel": "স্টেশন {stationName}", + "@stationSemanticLabel": { + "placeholders": { + "stationName": {} + } + }, + "favoritesAddTooltip": "পছন্দের তালিকায় যোগ করুন", + "favoritesAddedMessage": "{stationName} পছন্দের তালিকায় যোগ করা হয়েছে", + "@favoritesAddedMessage": { + "placeholders": { + "stationName": {} + } + }, + "stationIconLabel": "স্টেশনের প্রতীক", + "liveNow": "এখন লাইভ", + "equalizerBandLabel": "ব্যান্ড {band}", + "@equalizerBandLabel": { + "placeholders": { + "band": {} + } + }, + "equalizerBandValue": "{value} ডেসিবেল", + "@equalizerBandValue": { + "placeholders": { + "value": {} + } + }, + "equalizerPresetFlat": "সমতল", + "equalizerPresetRock": "রক", + "equalizerPresetPop": "পপ", + "equalizerPresetBassBoost": "বেস বাড়ানো", + "equalizerPresetJazz": "জ্যাজ", + "equalizerPresetVoice": "কণ্ঠ", + "equalizerPresetCustom": "নিজস্ব", + "onboardingTitle": "PluriWave-এ স্বাগতম", + "onboardingNewsTitle": "নতুন কী আছে", + "onboardingStartAction": "শুরু করুন", + "onboardingCloseTooltip": "বন্ধ করুন", + "radioRecordingError": "রেডিও রেকর্ড করতে ত্রুটি: {error}", + "@radioRecordingError": { + "placeholders": { + "error": {} + } + }, + "radioApiConnectionError": "রেডিও এপিআই-এর সঙ্গে কোনো সংযোগ নেই", + "radioSearchError": "অনুসন্ধানে ত্রুটি। আপনার সংযোগ পরীক্ষা করুন।", + "radioLoadMoreStationsError": "আরও স্টেশন আনা যায়নি।", + "radioNearbyStationsError": "কাছাকাছি স্টেশন শনাক্ত করা যায়নি। দেশ অনুযায়ী ফিল্টার ব্যবহার করুন।", + "radioCannotPlayStation": "\"{stationName}\" চালানো যাচ্ছে না", + "@radioCannotPlayStation": { + "placeholders": { + "stationName": {} + } + }, + "recordingSelectStationFirst": "রেকর্ড করার আগে একটি স্টেশন নির্বাচন করুন।", + "recordingStartError": "রেকর্ডিং শুরু করা যায়নি: {error}", + "@recordingStartError": { + "placeholders": { + "error": {} + } + }, + "unsupportedConfigVersion": "কনফিগারেশন সংস্করণ সমর্থিত নয়", + "audioErrorGeneric": "চালানোর সময় ত্রুটি", + "audioErrorNoInternet": "ইন্টারনেট সংযোগ নেই", + "audioErrorInvalidUrl": "রেডিওর ঠিকানা বৈধ নয়", + "audioErrorNotFound": "রেডিওটি উপলব্ধ নয় (404 ত্রুটি)", + "audioErrorTimeout": "সংযোগের সময়সীমা শেষ হয়েছে", + "audioErrorCannotConnect": "রেডিওর সঙ্গে সংযোগ করা যাচ্ছে না", + "audioErrorUnsupportedFormat": "স্ট্রিম ফরম্যাট সমর্থিত নয়", + "audioErrorDecode": "অডিও স্ট্রিম ডিকোড করতে ত্রুটি", + "audioErrorCleartext": "এই রেডিও এনক্রিপশন ছাড়া HTTP ব্যবহার করে, যা অনুমোদিত নয়", + "audioErrorSsl": "রেডিওর SSL সার্টিফিকেট অবৈধ", + "audioErrorCannotPlay": "এই রেডিও চালানো যাচ্ছে না", + "audioErrorUnexpectedPlayback": "চালানোর সময় অপ্রত্যাশিত ত্রুটি", + "androidExactAlarmScheduleError": "অ্যান্ড্রয়েড সুনির্দিষ্ট অ্যালার্ম নির্ধারণ করতে পারেনি। সুনির্দিষ্ট অ্যালার্মের অনুমতি পরীক্ষা করুন।", + "recordingPathEmptyError": "রেকর্ডিংয়ের পথ খালি থাকতে পারে না", + "recordingMaxSizeInvalidError": "সর্বোচ্চ আকার শূন্যের বেশি হতে হবে", + "recordingAlreadyActiveError": "ইতিমধ্যেই একটি রেকর্ডিং চলছে", + "alarmRingingFallbackActive": "অভ্যন্তরীণ নিরাপদ অডিও দিয়ে চলছে।", + "alarmRingingPreparingFallback": "অভ্যন্তরীণ নিরাপদ অডিও প্রস্তুত করা হচ্ছে।", + "alarmRingingTryingStation": "আপনার স্টেশন সর্বোচ্চ উপলভ্য মানে চালানোর চেষ্টা করা হচ্ছে।", + "alarmScheduleOnce": "একবার · {date}", + "@alarmScheduleOnce": { + "placeholders": { + "date": {} + } + }, + "alarmScheduleWeekdays": "দিন: {days}", + "@alarmScheduleWeekdays": { + "placeholders": { + "days": {} + } + }, + "androidReliabilityTitle": "Android নির্ভরযোগ্যতা দেখুন", + "closeAction": "বন্ধ করুন", + "customOption": "কাস্টম", + "endLabel": "শেষ", + "equalizerDisable": "ইকুয়ালাইজার বন্ধ করুন", + "helpTitle": "সহায়তা ও টিউটোরিয়াল", + "helpSubtitle": "PluriWave-এর ফিচার, টিপস ও নতুন বিষয়গুলো দেখুন।", + "indefiniteOption": "অনির্দিষ্ট", + "invalidNumber": "অবৈধ সংখ্যা", + "nameLabel": "নাম", + "notPlaying": "চলছে না", + "oneTimeOption": "একবার", + "pausePlaybackTooltip": "প্লেব্যাক বিরতি", + "qualityOriginal": "মূল মান: {quality}", + "@qualityOriginal": { + "placeholders": { + "quality": {} + } + }, + "qualityUnknown": "মান জানানো নেই", + "recordAction": "রেকর্ড করুন", + "recordDurationTitle": "রেকর্ডিং সময়কাল", + "recordRadioSubtitle": "কতক্ষণ রেকর্ড করতে চান বেছে নিন।", + "recordRadioTitle": "রেডিও রেকর্ড করুন", + "recordingActiveTitle": "রেডিও রেকর্ড হচ্ছে", + "recordingDirectTitle": "সরাসরি রেকর্ডিং", + "recordingsOpenFolderPlainError": "রেকর্ডিং ফোল্ডার খোলা যায়নি", + "recordingsOpenLatest": "সর্বশেষ রেকর্ডিং খুলুন", + "recordingsOpenLatestError": "সর্বশেষ রেকর্ডিং খোলা যায়নি", + "startLabel": "শুরু", + "startPlaybackTooltip": "প্লেব্যাক শুরু করুন", + "stopAction": "থামান", + "stopPlaybackTooltip": "প্লেব্যাক থামান", + "weekdayShortMonday": "সোম", + "weekdayShortTuesday": "মঙ্গল", + "weekdayShortWednesday": "বুধ", + "weekdayShortThursday": "বৃহস্পতি", + "weekdayShortFriday": "শুক্র", + "weekdayShortSaturday": "শনি", + "weekdayShortSunday": "রবি" } diff --git a/lib/l10n/app_de.arb b/lib/l10n/app_de.arb index 84c4f68..c8737fe 100644 --- a/lib/l10n/app_de.arb +++ b/lib/l10n/app_de.arb @@ -8,26 +8,53 @@ "navSettings": "Einstellungen", "actionOk": "OK", "sleepTimer": "Sleep-Timer", - "sleepTimerDescription": "Smooth radio shutdown with an exact countdown.", - "cancelTimer": "Cancel timer", - "optionOther": "Other", - "customDurationTitle": "Custom duration", - "durationGreaterThanZero": "Choose a duration greater than zero.", - "hoursLabel": "Hours", - "minutesLabel": "Minutes", - "secondsLabel": "Seconds", - "saveQuickAccess": "Save as quick access", - "startTimer": "Start timer", - "skipCurrentAlarmExecution": "Skipped this execution of {alarmName}.", + "sleepTimerDescription": "Sanftes Ausschalten des Radios mit genauem Countdown.", + "cancelTimer": "Timer abbrechen", + "optionOther": "Andere", + "customDurationTitle": "Benutzerdefinierte Dauer", + "durationGreaterThanZero": "Wähle eine Dauer größer als null.", + "hoursLabel": "Stunden", + "minutesLabel": "Minuten", + "secondsLabel": "Sekunden", + "durationHoursMinutesSeconds": "{hours} Std {minutes} Min {seconds} Sek", + "@durationHoursMinutesSeconds": { + "placeholders": { + "hours": {}, + "minutes": {}, + "seconds": {} + } + }, + "durationMinutesSeconds": "{minutes} Min {seconds} Sek", + "@durationMinutesSeconds": { + "placeholders": { + "minutes": {}, + "seconds": {} + } + }, + "durationMinutesOnly": "{minutes} Min", + "@durationMinutesOnly": { + "placeholders": { + "minutes": {} + } + }, + "durationSecondsOnly": "{seconds} Sek", + "@durationSecondsOnly": { + "placeholders": { + "seconds": {} + } + }, + "saveQuickAccess": "Als Schnellzugriff speichern", + "startTimer": "Timer starten", + "skipCurrentAlarmExecution": "Diese Ausführung von {alarmName} wurde ausgelassen.", "@skipCurrentAlarmExecution": { "placeholders": { "alarmName": {} } }, "settingsTitle": "Einstellungen", - "settingsSubtitle": "Fine-grained sound control, backups, and custom stations.", + "settingsSubtitle": "Feinabstimmung von Klang, Backups und benutzerdefinierten Sendern.", "languageSectionTitle": "Sprache", - "languageSectionDescription": "Choose how the app language is displayed.", + "languageSectionDescription": "Wähle, wie die Sprache der App angezeigt wird.", "languageSystemDefault": "System", "languageSpanish": "Spanisch", "languageEnglish": "Englisch", @@ -38,70 +65,71 @@ } }, "languageUpdatedSystem": "Sprache aktualisiert: System", - "timerSectionTitle": "Sleep timer", - "timerSectionAdd": "Add", - "timerSectionDescription": "Customize the quick presets shown when automatically stopping the radio.", - "timerSectionRestoreRecommended": "Restore recommended times", - "newQuickAccessTitle": "New quick access", - "saveQuickAccessButton": "Save quick access", - "settingsSafeStatus": "Safe", - "recordingsSectionTitle": "Recordings", - "recordingsFolderDialogTitle": "Select recordings folder", - "recordingsPathUpdated": "Recording path updated", - "recordingsPathSaveError": "Could not save the path: {error}", - "recordingsDefaultFolderRestored": "The internal default folder will be used", - "recordingsFolderTitle": "Recordings folder", - "recordingsPathCalculating": "Calculating path...", - "recordingsChangePath": "Change path", - "recordingsUseDefaultPath": "Use default path", - "recordingsOriginalStreamHint": "The radio is saved from the original stream, without recompressing.", - "equalizerActive": "Active", - "equalizerDisabled": "Disabled", - "equalizerEnable": "Enable equalizer", - "equalizerRealtimeSubtitle": "Changes are applied in real time to the current station.", - "equalizerPendingSubtitle": "Changes are saved and will apply when Android enables the effect.", - "equalizerPerStationTitle": "Use custom EQ for this favorite", - "equalizerPerStationActive": "Active for {stationName}", - "equalizerPerStationMain": "Using main EQ for {stationName}", - "preferredStationTitle": "Preferred station", - "preferredStationDescription": "Preselected for new alarms and available for quick playback.", - "preferredStationNoStationsTitle": "No stations available yet", - "preferredStationNoStationsSubtitle": "Save favorites or load stations to choose a preferred one.", - "preferredStationAutomaticFallback": "Automatic fallback", - "preferredStationDefaultFavorite": "Default favorite", - "preferredStationCurrent": "Current preferred: {stationName}", - "preferredStationAutoUsing": "No favorites: automatically using {stationName}", - "preferredStationPlay": "Play preferred", - "customStationsTitle": "Custom stations", - "customStationsAdd": "Add", - "customStationsEmpty": "No custom stations.", - "playAction": "Play", - "deleteAction": "Delete", - "addStationTitle": "Add station", + "timerSectionTitle": "Sleep-Timer", + "timerSectionAdd": "Hinzufügen", + "timerSectionDescription": "Passe die Schnellzugriffe an, die beim automatischen Ausschalten des Radios angezeigt werden.", + "timerSectionRestoreRecommended": "Empfohlene Zeiten wiederherstellen", + "newQuickAccessTitle": "Neuer Schnellzugriff", + "saveQuickAccessButton": "Schnellzugriff speichern", + "settingsSafeStatus": "Sicher", + "recordingsSectionTitle": "Aufnahmen", + "recordingsFolderDialogTitle": "Aufnahmeordner auswählen", + "recordingsPathUpdated": "Aufnahmepfad aktualisiert", + "recordingsPathSaveError": "Pfad konnte nicht gespeichert werden: {error}", + "recordingsDefaultFolderRestored": "Der interne Standardordner wird verwendet", + "recordingsFolderTitle": "Aufnahmeordner", + "recordingsPathCalculating": "Pfad wird berechnet...", + "recordingsChangePath": "Pfad ändern", + "recordingsUseDefaultPath": "Standardpfad verwenden", + "recordingsOriginalStreamHint": "Das Radio wird aus dem Originalstream gespeichert, ohne erneute Komprimierung.", + "equalizerActive": "Aktiv", + "equalizerDisabled": "Deaktiviert", + "equalizerEnable": "Equalizer aktivieren", + "equalizerRealtimeSubtitle": "Änderungen werden in Echtzeit auf den aktuellen Sender angewendet.", + "equalizerPendingSubtitle": "Änderungen werden gespeichert und angewendet, sobald Android den Effekt aktiviert.", + "equalizerPerStationTitle": "Eigenen EQ für diesen Favoriten verwenden", + "equalizerPerStationActive": "Aktiv für {stationName}", + "equalizerPerStationMain": "Haupt-EQ für {stationName} wird verwendet", + "preferredStationTitle": "Bevorzugter Sender", + "preferredStationDescription": "Wird beim Erstellen von Alarmen vorausgewählt und kann als Schnellwiedergabe gestartet werden.", + "preferredStationNoStationsTitle": "Noch keine Sender verfügbar", + "preferredStationNoStationsSubtitle": "Speichere Favoriten oder lade Sender, um einen bevorzugten auszuwählen.", + "preferredStationAutomaticFallback": "Automatischer Fallback", + "preferredStationDefaultFavorite": "Standardfavorit", + "preferredStationCurrent": "Aktuell bevorzugt: {stationName}", + "preferredStationAutoUsing": "Keine Favoriten: {stationName} wird automatisch verwendet", + "preferredStationPlay": "Bevorzugten Sender abspielen", + "customStationsTitle": "Benutzerdefinierte Sender", + "customStationsAdd": "Hinzufügen", + "customStationsEmpty": "Keine benutzerdefinierten Sender.", + "playAction": "Wiedergeben", + "deleteAction": "Löschen", + "addStationTitle": "Sender hinzufügen", "stationNameLabel": "Name *", - "requiredField": "Required field", - "streamUrlLabel": "Stream URL *", - "invalidUrl": "Invalid URL", - "countryOptionalLabel": "Country (optional)", - "saveStation": "Save station", - "backupSectionTitle": "Backup", - "backupExportTitle": "Export configuration", - "backupExportSubtitle": "Favorites, custom stations, and EQ presets", - "backupImportTitle": "Import configuration", - "backupImportSubtitle": "Restore from a backup file", - "backupShareSubject": "PluriWave — backup", - "backupShareText": "PluriWave configuration exported on {date}", - "backupExportError": "Export error: {error}", - "backupImportConfirmMessage": "This will add favorites, stations, and presets from the file. Continue?", - "backupImportSuccess": "Configuration imported successfully", - "backupImportError": "Import error: {error}", - "appVersionLoading": "Loading version...", - "appVersionSubtitle": "{version} - World radio", - "savedFavoritesTitle": "Saved favorites", - "stationFilterTitle": "Station filter", - "stationFilterSubtitle": "Only stations verified as active", - "backgroundAudioTitle": "Background audio", - "backgroundAudioSubtitle": "Continues when the screen turns off", + "unnamedStation": "Unbenannter Sender", + "requiredField": "Pflichtfeld", + "streamUrlLabel": "Stream-URL *", + "invalidUrl": "Ungültige URL", + "countryOptionalLabel": "Land (optional)", + "saveStation": "Sender speichern", + "backupSectionTitle": "Sicherung", + "backupExportTitle": "Konfiguration exportieren", + "backupExportSubtitle": "Favoriten, benutzerdefinierte Sender und EQ-Presets", + "backupImportTitle": "Konfiguration importieren", + "backupImportSubtitle": "Aus einer Sicherungsdatei wiederherstellen", + "backupShareSubject": "PluriWave — Sicherung", + "backupShareText": "PluriWave-Konfiguration exportiert am {date}", + "backupExportError": "Fehler beim Exportieren: {error}", + "backupImportConfirmMessage": "Dadurch werden Favoriten, Sender und Presets aus der Datei hinzugefügt. Fortfahren?", + "backupImportSuccess": "Konfiguration erfolgreich importiert", + "backupImportError": "Fehler beim Importieren: {error}", + "appVersionLoading": "Version wird geladen...", + "appVersionSubtitle": "{version} - Weltradio", + "savedFavoritesTitle": "Gespeicherte Favoriten", + "stationFilterTitle": "Senderfilter", + "stationFilterSubtitle": "Nur Sender, die als aktiv überprüft wurden", + "backgroundAudioTitle": "Audio im Hintergrund", + "backgroundAudioSubtitle": "Läuft weiter, wenn der Bildschirm ausgeschaltet wird", "dash": "—", "@recordingsPathSaveError": { "placeholders": { @@ -150,13 +178,13 @@ }, "cancelAction": "Abbrechen", "equalizerTitle": "Equalizer", - "recordingsOpenFolder": "Open folder", - "recordingsOpenFolderError": "Could not open the folder: {error}", - "recordingsMaxSizeTitle": "Maximum recording size", - "recordingsMaxSizeSubtitle": "Current limit: {size} MB", - "recordingsMaxSizeDialogTitle": "Maximum size per recording", - "recordingsMaxSizeMbLabel": "Maximum megabytes", - "recordingsMaxSizeSaved": "Recording limit updated to {size} MB", + "recordingsOpenFolder": "Ordner öffnen", + "recordingsOpenFolderError": "Ordner konnte nicht geöffnet werden: {error}", + "recordingsMaxSizeTitle": "Maximale Aufnahmegröße", + "recordingsMaxSizeSubtitle": "Aktuelles Limit: {size} MB", + "recordingsMaxSizeDialogTitle": "Maximale Größe pro Aufnahme", + "recordingsMaxSizeMbLabel": "Maximale Megabytes", + "recordingsMaxSizeSaved": "Aufnahmelimit auf {size} MB aktualisiert", "@recordingsOpenFolderError": { "placeholders": { "error": {} @@ -176,33 +204,33 @@ } } }, - "stationOrderTitle": "Station order", - "stationOrderByName": "By name", - "stationOrderByQuality": "By quality", - "stationOrderScopeDescription": "Applies to favorites, searches, nearby stations and quick lists.", - "favoriteGroupsTitle": "Favorite lists", - "favoriteGroupsDescription": "Create short lists to organize your saved stations.", - "favoriteGroupsAdd": "Add list", - "favoriteGroupsEdit": "Edit list", - "favoriteGroupsDelete": "Delete list", - "favoriteGroupsNameLabel": "List name", - "favoriteGroupsNameTooLong": "Maximum 28 characters.", - "favoriteGroupsUnassigned": "Unassigned", - "favoriteGroupsProtectedHint": "Default list: it cannot be edited or deleted.", - "favoriteGroupsCreated": "List created", - "favoriteGroupsUpdated": "List updated", - "favoriteGroupsDeleted": "List deleted; its stations return to Unassigned.", - "favoriteGroupsAssign": "Move to list", - "favoriteGroupsAssignSubtitle": "Current list: {groupName}", - "favoriteGroupsAssigned": "{stationName} moved to {groupName}", - "favoritesTitle": "Favorites", - "favoritesEmptyTitle": "No favorites yet", - "favoritesEmptySubtitle": "Tap the heart on any station to save it to your collection.", - "favoritesHeaderSubtitle": "Organize your collection by lists and keep important radios close.", - "favoritesCollection": "Collection", - "favoritesSavedCount": "{count} saved", - "favoritesRemoveTooltip": "Remove from favorites", - "favoritesRemovedMessage": "{stationName} removed from favorites", + "stationOrderTitle": "Senderreihenfolge", + "stationOrderByName": "Nach Name", + "stationOrderByQuality": "Nach Qualität", + "stationOrderScopeDescription": "Gilt für Favoriten, Suchen, nahegelegene Sender und Schnelllisten.", + "favoriteGroupsTitle": "Favoritenlisten", + "favoriteGroupsDescription": "Erstelle kurze Listen, um deine gespeicherten Sender zu organisieren.", + "favoriteGroupsAdd": "Liste hinzufügen", + "favoriteGroupsEdit": "Liste bearbeiten", + "favoriteGroupsDelete": "Liste löschen", + "favoriteGroupsNameLabel": "Listenname", + "favoriteGroupsNameTooLong": "Maximal 28 Zeichen.", + "favoriteGroupsUnassigned": "Nicht zugewiesen", + "favoriteGroupsProtectedHint": "Standardliste: kann nicht bearbeitet oder gelöscht werden.", + "favoriteGroupsCreated": "Liste erstellt", + "favoriteGroupsUpdated": "Liste aktualisiert", + "favoriteGroupsDeleted": "Liste gelöscht; ihre Sender kehren zu Nicht zugewiesen zurück.", + "favoriteGroupsAssign": "In Liste verschieben", + "favoriteGroupsAssignSubtitle": "Aktuelle Liste: {groupName}", + "favoriteGroupsAssigned": "{stationName} nach {groupName} verschoben", + "favoritesTitle": "Favoriten", + "favoritesEmptyTitle": "Noch keine Favoriten", + "favoritesEmptySubtitle": "Tippe bei einem Sender auf das Herz, um ihn in deiner Sammlung zu speichern.", + "favoritesHeaderSubtitle": "Organisiere deine Sammlung in Listen und halte wichtige Radios griffbereit.", + "favoritesCollection": "Sammlung", + "favoritesSavedCount": "{count} gespeichert", + "favoritesRemoveTooltip": "Aus Favoriten entfernen", + "favoritesRemovedMessage": "{stationName} aus Favoriten entfernt", "@favoriteGroupsAssignSubtitle": { "placeholders": { "groupName": {} @@ -226,7 +254,7 @@ "stationName": {} } }, - "alarmPostponedCurrentExecution": "Alarm postponed for this occurrence.", + "alarmPostponedCurrentExecution": "Alarm für diese Ausführung verschoben.", "searchScreenTitle": "Signal suchen", "searchScreenSubtitle": "Finde Sender nach Name, Land oder Sprache mit schnellen Filtern und hohem Kontrast.", "searchFiltersLabel": "Filter", @@ -257,9 +285,9 @@ "languageNameJapanese": "Japanisch", "languageNameArabic": "Arabisch", "languageNameRussian": "Russisch", - "homeScreenSubtitle": "Live global radio with clean signals, smart favorites, and a show-style visual experience.", - "exploreStations": "Explore stations", - "stationsCount": "{count} stations", + "homeScreenSubtitle": "Live-Weltradio mit klaren Signalen, intelligenten Favoriten und einer visuellen Game-Show-Erfahrung.", + "exploreStations": "Sender erkunden", + "stationsCount": "{count} Radios", "@stationsCount": { "placeholders": { "count": { @@ -267,36 +295,36 @@ } } }, - "qualityHd": "HD quality", - "nearYou": "Near you", - "nearYouInCountry": "Near you ? {country}", + "qualityHd": "HD-Qualität", + "nearYou": "In deiner Nähe", + "nearYouInCountry": "In deiner Nähe · {country}", "@nearYouInCountry": { "placeholders": { "country": {} } }, - "detectAction": "Detect", - "liveRadar": "Live radar", + "detectAction": "Erkennen", + "liveRadar": "Live-Radar", "genresTitle": "Genres", - "retryAction": "Retry", - "noStationsAvailable": "No stations available", - "noStationsAvailableSubtitle": "Try refreshing or choosing another genre to capture a signal again.", + "retryAction": "Erneut versuchen", + "noStationsAvailable": "Keine Sender verfügbar", + "noStationsAvailableSubtitle": "Versuche zu aktualisieren oder ein anderes Genre auszuwählen, um wieder ein Signal zu empfangen.", "genrePop": "Pop", "genreRock": "Rock", "genreJazz": "Jazz", - "genreClassical": "Classical", - "genreElectronic": "Electronic", - "genreNews": "News", + "genreClassical": "Klassik", + "genreElectronic": "Elektronisch", + "genreNews": "Nachrichten", "genreTalk": "Talk", "genreHipHop": "Hip-hop", "genreCountry": "Country", "genreMetal": "Metal", "genreReggae": "Reggae", "genreLatin": "Latin", - "alarmScreenTitle": "Music wake-up", - "alarmScreenSubtitle": "Alarms with radio, safe fallback sound, smart vacations, and the next occurrence always visible.", - "createAlarmAction": "Create alarm", - "alarmsCount": "{count} alarms", + "alarmScreenTitle": "Musikalisch aufwachen", + "alarmScreenSubtitle": "Alarme mit Radio, sicherem Ton, intelligenten Ferien und stets sichtbarer nächster Ausführung.", + "createAlarmAction": "Alarm erstellen", + "alarmsCount": "{count} Alarme", "@alarmsCount": { "placeholders": { "count": { @@ -304,10 +332,10 @@ } } }, - "activeAlarmsWithoutNextTitle": "Active alarms without a next occurrence", - "noActiveAlarms": "No active alarms", - "nextAlarmTitle": "Next alarm", - "activeAlarmsWithoutNextSubtitle": "There are {count} active alarm(s), but they do not currently have a valid future date. Check date, weekdays, and vacations.", + "activeAlarmsWithoutNextTitle": "Aktive Alarme ohne nächste Ausführung", + "noActiveAlarms": "Keine aktiven Alarme", + "nextAlarmTitle": "Nächster Alarm", + "activeAlarmsWithoutNextSubtitle": "Es gibt {count} aktive(n) Alarm(e), aber derzeit kein gültiges zukünftiges Datum. Prüfe Datum, Wochentage und Ferien.", "@activeAlarmsWithoutNextSubtitle": { "placeholders": { "count": { @@ -315,9 +343,9 @@ } } }, - "createAlarmHint": "Create an alarm and PluriWave will calculate the next occurrence automatically.", - "alarmVacationPlay": "Plays during vacations", - "alarmVacationPause": "Paused during vacations", + "createAlarmHint": "Erstelle einen Alarm und PluriWave berechnet automatisch die nächste Ausführung.", + "alarmVacationPlay": "Läutet in den Ferien", + "alarmVacationPause": "In den Ferien pausiert", "alarmFadeInLabel": "Fade-in {seconds}s", "@alarmFadeInLabel": { "placeholders": { @@ -326,61 +354,61 @@ } } }, - "alarmNextExecution": "Next occurrence: {date}", + "alarmNextExecution": "Nächste Ausführung: {date}", "@alarmNextExecution": { "placeholders": { "date": {} } }, - "alarmNoNextExecution": "It has no active next occurrence.", - "alarmSkippedExecution": "One occurrence was skipped: {date}.", + "alarmNoNextExecution": "Keine aktive nächste Ausführung.", + "alarmSkippedExecution": "Eine Ausführung wurde ausgelassen: {date}.", "@alarmSkippedExecution": { "placeholders": { "date": {} } }, - "editAction": "Edit", - "skipNextAction": "Skip next", - "deleteTooltip": "Delete", - "alarmSkippedNoNextSnackbar": "Alarm skipped. There is no next occurrence left.", - "alarmSkippedReturnsSnackbar": "Alarm skipped. It will return on {date}.", + "editAction": "Bearbeiten", + "skipNextAction": "Nächste auslassen", + "deleteTooltip": "Löschen", + "alarmSkippedNoNextSnackbar": "Alarm ausgelassen. Es bleibt keine nächste Ausführung.", + "alarmSkippedReturnsSnackbar": "Alarm ausgelassen. Er kehrt am {date} zurück.", "@alarmSkippedReturnsSnackbar": { "placeholders": { "date": {} } }, - "alarmVacationPausedNoNext": "It is paused for vacations ({vacationName}) and has no next occurrence.", + "alarmVacationPausedNoNext": "Wegen Ferien ({vacationName}) pausiert und ohne nächste Ausführung.", "@alarmVacationPausedNoNext": { "placeholders": { "vacationName": {} } }, - "alarmVacationPausedReturns": "It is paused for vacations ({vacationName}) and returns on {date}.", + "alarmVacationPausedReturns": "Wegen Ferien ({vacationName}) pausiert und kehrt am {date} zurück.", "@alarmVacationPausedReturns": { "placeholders": { "vacationName": {}, "date": {} } }, - "alarmVacationReturns": "With vacations enabled, it will ring again on {date}.", + "alarmVacationReturns": "Mit aktiven Ferien läutet er wieder am {date}.", "@alarmVacationReturns": { "placeholders": { "date": {} } }, - "defaultAlarmName": "Music alarm", - "newAlarmTitle": "New alarm", - "editAlarmTitle": "Edit alarm", + "defaultAlarmName": "Musikalischer Wecker", + "newAlarmTitle": "Neuer Alarm", + "editAlarmTitle": "Alarm bearbeiten", "nameField": "Name", - "timeField": "Time", - "dateField": "Date", - "onceOption": "Once", - "dailyOption": "Daily", - "weekdaysOption": "Weekdays", - "soundAndVolumeSection": "Sound and volume", - "alarmFadeInTitle": "Alarm fade-in", - "alarmFadeInOff": "0 s (no transition)", - "alarmFadeInSummary": "{seconds} s (from 5% to the selected volume)", + "timeField": "Uhrzeit", + "dateField": "Datum", + "onceOption": "Einmal", + "dailyOption": "Täglich", + "weekdaysOption": "Tage", + "soundAndVolumeSection": "Klang und Lautstärke", + "alarmFadeInTitle": "Alarm-Fade-in", + "alarmFadeInOff": "0 s (ohne Übergang)", + "alarmFadeInSummary": "{seconds} s (von 5 % bis zur gewählten Lautstärke)", "@alarmFadeInSummary": { "placeholders": { "seconds": { @@ -388,22 +416,22 @@ } } }, - "internalSafeSoundLabel": "Internal safe sound", - "soundWarmSunrise": "Warm sunrise", - "soundSoftBell": "Soft bell", - "soundDigitalPulse": "Digital pulse", - "favoriteStationLabel": "Favorite station", - "noStationUseInternalSound": "No station: use internal sound", - "saveFavoritesAlarmHint": "Save stations in Favorites to use them as a music alarm.", - "useCurrentStationAction": "Use current station", - "playDuringVacations": "Play during vacations", - "playDuringVacationsHint": "If you turn this off, the next occurrence will jump to the first valid day.", - "saveAlarmAction": "Save alarm", - "chooseOneWeekdayError": "Choose at least one weekday.", - "androidReliabilityReview": "Review Android reliability", + "internalSafeSoundLabel": "Interner Sicherheitston", + "soundWarmSunrise": "Warmer Sonnenaufgang", + "soundSoftBell": "Sanfte Glocke", + "soundDigitalPulse": "Digitaler Puls", + "favoriteStationLabel": "Lieblingssender", + "noStationUseInternalSound": "Kein Sender: internen Ton verwenden", + "saveFavoritesAlarmHint": "Speichere Sender in Favoriten, um sie als musikalischen Alarm zu verwenden.", + "useCurrentStationAction": "Aktuellen Sender verwenden", + "playDuringVacations": "Während der Ferien läuten", + "playDuringVacationsHint": "Wenn du das ausschaltest, springt die nächste Ausführung zum ersten gültigen Tag.", + "saveAlarmAction": "Alarm speichern", + "chooseOneWeekdayError": "Wähle mindestens einen Wochentag.", + "androidReliabilityReview": "Android-Zuverlässigkeit prüfen", "statusOk": "OK", - "statusPending": "pending", - "androidReliabilityStatus": "Reliability: exact {exact} ? notifications {notifications} ? screen {screen}", + "statusPending": "ausstehend", + "androidReliabilityStatus": "Zuverlässigkeit: exakt {exact} · Benachrichtigungen {notifications} · Bildschirm {screen}", "@androidReliabilityStatus": { "placeholders": { "exact": {}, @@ -411,19 +439,165 @@ "screen": {} } }, - "vacationRangesTitle": "Vacation ranges", - "addAction": "Add", - "vacationRangesHint": "If an alarm is set to \"Paused during vacations\", it automatically skips these ranges.", - "noVacationRangesLoaded": "No ranges loaded.", - "deleteRangeTooltip": "Delete range", - "vacationsDefaultName": "Vacation", - "newVacationRangeTitle": "New vacation range", - "startField": "Start", - "endField": "End", - "saveRangeAction": "Save range", - "noAlarmsYetTitle": "There are no alarms yet.", - "noAlarmsYetSubtitle": "Create one to design your musical wake-up.", - "ringingInternalAudioActive": "Playing with internal safe audio.", - "ringingPreparingInternalAudio": "Preparing internal safe audio.", - "stopAlarmAction": "Stop alarm" + "vacationRangesTitle": "Ferienzeiträume", + "addAction": "Hinzufügen", + "vacationRangesHint": "Wenn ein Alarm „In den Ferien pausiert“ hat, werden diese Zeiträume automatisch übersprungen.", + "noVacationRangesLoaded": "Keine Zeiträume geladen.", + "deleteRangeTooltip": "Zeitraum löschen", + "vacationsDefaultName": "Ferien", + "newVacationRangeTitle": "Neuer Ferienzeitraum", + "startField": "Beginn", + "endField": "Ende", + "saveRangeAction": "Zeitraum speichern", + "noAlarmsYetTitle": "Noch keine Alarme.", + "noAlarmsYetSubtitle": "Erstelle einen, um dein musikalisches Aufwachen zu gestalten.", + "ringingInternalAudioActive": "Wiedergabe mit internem Sicherheitston.", + "ringingPreparingInternalAudio": "Interner Sicherheitston wird vorbereitet.", + "stopAlarmAction": "Alarm stoppen", + "pauseAction": "Pausieren", + "miniPlayerOpenLabel": "Wiedergabe für {stationName} öffnen", + "@miniPlayerOpenLabel": { + "placeholders": { + "stationName": {} + } + }, + "playerIconLabel": "Wiedergabe", + "playbackStatusConnecting": "Verbindung wird hergestellt...", + "playbackStatusLive": "Live", + "playbackStatusPaused": "Pausiert", + "playbackStatusConnectionError": "Verbindungsfehler", + "playbackStatusStopped": "Gestoppt", + "stationSemanticLabel": "Sender {stationName}", + "@stationSemanticLabel": { + "placeholders": { + "stationName": {} + } + }, + "favoritesAddTooltip": "Zu Favoriten hinzufügen", + "favoritesAddedMessage": "{stationName} zu Favoriten hinzugefügt", + "@favoritesAddedMessage": { + "placeholders": { + "stationName": {} + } + }, + "stationIconLabel": "Sendersymbol", + "liveNow": "Live", + "equalizerBandLabel": "Band {band}", + "@equalizerBandLabel": { + "placeholders": { + "band": {} + } + }, + "equalizerBandValue": "{value} Dezibel", + "@equalizerBandValue": { + "placeholders": { + "value": {} + } + }, + "equalizerPresetFlat": "Linear", + "equalizerPresetRock": "Rock", + "equalizerPresetPop": "Pop", + "equalizerPresetBassBoost": "Bassverstärkung", + "equalizerPresetJazz": "Jazz", + "equalizerPresetVoice": "Stimme", + "equalizerPresetCustom": "Benutzerdefiniert", + "onboardingTitle": "Willkommen bei PluriWave", + "onboardingNewsTitle": "Neuigkeiten", + "onboardingStartAction": "Loslegen", + "onboardingCloseTooltip": "Schließen", + "radioRecordingError": "Fehler beim Aufnehmen des Radios: {error}", + "@radioRecordingError": { + "placeholders": { + "error": {} + } + }, + "radioApiConnectionError": "Keine Verbindung zur Radio-API", + "radioSearchError": "Suchfehler. Überprüfe deine Verbindung.", + "radioLoadMoreStationsError": "Weitere Sender konnten nicht geladen werden.", + "radioNearbyStationsError": "Nahegelegene Sender konnten nicht erkannt werden. Nutze Filter nach Land.", + "radioCannotPlayStation": "\"{stationName}\" kann nicht wiedergegeben werden", + "@radioCannotPlayStation": { + "placeholders": { + "stationName": {} + } + }, + "recordingSelectStationFirst": "Wähle zuerst einen Sender zum Aufnehmen aus.", + "recordingStartError": "Aufnahme konnte nicht gestartet werden: {error}", + "@recordingStartError": { + "placeholders": { + "error": {} + } + }, + "unsupportedConfigVersion": "Nicht unterstützte Konfigurationsversion", + "audioErrorGeneric": "Wiedergabefehler", + "audioErrorNoInternet": "Keine Internetverbindung", + "audioErrorInvalidUrl": "Die Radio-URL ist ungültig", + "audioErrorNotFound": "Das Radio ist nicht verfügbar (Fehler 404)", + "audioErrorTimeout": "Zeitüberschreitung beim Verbinden", + "audioErrorCannotConnect": "Es kann keine Verbindung zum Radio hergestellt werden", + "audioErrorUnsupportedFormat": "Nicht unterstütztes Stream-Format", + "audioErrorDecode": "Fehler beim Decodieren des Audiostreams", + "audioErrorCleartext": "Dieses Radio verwendet unverschlüsseltes HTTP, was nicht erlaubt ist", + "audioErrorSsl": "Ungültiges SSL-Zertifikat für das Radio", + "audioErrorCannotPlay": "Dieses Radio kann nicht wiedergegeben werden", + "audioErrorUnexpectedPlayback": "Unerwarteter Wiedergabefehler", + "androidExactAlarmScheduleError": "Android konnte keinen exakten Alarm planen. Prüfe die Berechtigung für exakte Alarme.", + "recordingPathEmptyError": "Der Aufnahmepfad darf nicht leer sein", + "recordingMaxSizeInvalidError": "Die maximale Größe muss größer als null sein", + "recordingAlreadyActiveError": "Es läuft bereits eine Aufnahme", + "alarmRingingFallbackActive": "Wiedergabe mit internem Sicherheitsaudio.", + "alarmRingingPreparingFallback": "Internes Sicherheitsaudio wird vorbereitet.", + "alarmRingingTryingStation": "Dein Sender wird mit der bestmöglichen verfügbaren Qualität gestartet.", + "alarmScheduleOnce": "Einmal · {date}", + "@alarmScheduleOnce": { + "placeholders": { + "date": {} + } + }, + "alarmScheduleWeekdays": "Tage: {days}", + "@alarmScheduleWeekdays": { + "placeholders": { + "days": {} + } + }, + "androidReliabilityTitle": "Android-Zuverlässigkeit prüfen", + "closeAction": "Schließen", + "customOption": "Benutzerdefiniert", + "endLabel": "Ende", + "equalizerDisable": "Equalizer deaktivieren", + "helpTitle": "Hilfe und Tutorial", + "helpSubtitle": "Funktionen, Tipps und Neuigkeiten von PluriWave ansehen.", + "indefiniteOption": "Unbegrenzt", + "invalidNumber": "Ungültige Zahl", + "nameLabel": "Name", + "notPlaying": "Wird nicht wiedergegeben", + "oneTimeOption": "Einmal", + "pausePlaybackTooltip": "Wiedergabe pausieren", + "qualityOriginal": "Originalqualität: {quality}", + "@qualityOriginal": { + "placeholders": { + "quality": {} + } + }, + "qualityUnknown": "Qualität nicht angegeben", + "recordAction": "Aufnehmen", + "recordDurationTitle": "Aufnahmedauer", + "recordRadioSubtitle": "Wähle, wie lange aufgenommen werden soll.", + "recordRadioTitle": "Radio aufnehmen", + "recordingActiveTitle": "Radio wird aufgenommen", + "recordingDirectTitle": "Direktaufnahme", + "recordingsOpenFolderPlainError": "Aufnahmeordner konnte nicht geöffnet werden", + "recordingsOpenLatest": "Letzte Aufnahme öffnen", + "recordingsOpenLatestError": "Letzte Aufnahme konnte nicht geöffnet werden", + "startLabel": "Beginn", + "startPlaybackTooltip": "Wiedergabe starten", + "stopAction": "Stoppen", + "stopPlaybackTooltip": "Wiedergabe stoppen", + "weekdayShortMonday": "Mo", + "weekdayShortTuesday": "Di", + "weekdayShortWednesday": "Mi", + "weekdayShortThursday": "Do", + "weekdayShortFriday": "Fr", + "weekdayShortSaturday": "Sa", + "weekdayShortSunday": "So" } diff --git a/lib/l10n/app_en.arb b/lib/l10n/app_en.arb index f99ddfb..7abbb16 100644 --- a/lib/l10n/app_en.arb +++ b/lib/l10n/app_en.arb @@ -16,6 +16,33 @@ "hoursLabel": "Hours", "minutesLabel": "Minutes", "secondsLabel": "Seconds", + "durationHoursMinutesSeconds": "{hours} h {minutes} min {seconds} s", + "@durationHoursMinutesSeconds": { + "placeholders": { + "hours": {}, + "minutes": {}, + "seconds": {} + } + }, + "durationMinutesSeconds": "{minutes} min {seconds} s", + "@durationMinutesSeconds": { + "placeholders": { + "minutes": {}, + "seconds": {} + } + }, + "durationMinutesOnly": "{minutes} min", + "@durationMinutesOnly": { + "placeholders": { + "minutes": {} + } + }, + "durationSecondsOnly": "{seconds} s", + "@durationSecondsOnly": { + "placeholders": { + "seconds": {} + } + }, "saveQuickAccess": "Save as quick access", "startTimer": "Start timer", "skipCurrentAlarmExecution": "Skipped this execution of {alarmName}.", @@ -79,6 +106,7 @@ "deleteAction": "Delete", "addStationTitle": "Add station", "stationNameLabel": "Name *", + "unnamedStation": "Unnamed station", "requiredField": "Required field", "streamUrlLabel": "Stream URL *", "invalidUrl": "Invalid URL", @@ -269,7 +297,7 @@ }, "qualityHd": "HD quality", "nearYou": "Near you", - "nearYouInCountry": "Near you ? {country}", + "nearYouInCountry": "Near you · {country}", "@nearYouInCountry": { "placeholders": { "country": {} @@ -403,7 +431,7 @@ "androidReliabilityReview": "Review Android reliability", "statusOk": "OK", "statusPending": "pending", - "androidReliabilityStatus": "Reliability: exact {exact} ? notifications {notifications} ? screen {screen}", + "androidReliabilityStatus": "Reliability: exact {exact} · notifications {notifications} · screen {screen}", "@androidReliabilityStatus": { "placeholders": { "exact": {}, @@ -425,5 +453,151 @@ "noAlarmsYetSubtitle": "Create one to design your musical wake-up.", "ringingInternalAudioActive": "Playing with internal safe audio.", "ringingPreparingInternalAudio": "Preparing internal safe audio.", - "stopAlarmAction": "Stop alarm" + "stopAlarmAction": "Stop alarm", + "pauseAction": "Pause", + "miniPlayerOpenLabel": "Open player for {stationName}", + "@miniPlayerOpenLabel": { + "placeholders": { + "stationName": {} + } + }, + "playerIconLabel": "Player", + "playbackStatusConnecting": "Connecting...", + "playbackStatusLive": "Live", + "playbackStatusPaused": "Paused", + "playbackStatusConnectionError": "Connection error", + "playbackStatusStopped": "Stopped", + "stationSemanticLabel": "Station {stationName}", + "@stationSemanticLabel": { + "placeholders": { + "stationName": {} + } + }, + "favoritesAddTooltip": "Add to favorites", + "favoritesAddedMessage": "{stationName} added to favorites", + "@favoritesAddedMessage": { + "placeholders": { + "stationName": {} + } + }, + "stationIconLabel": "Station icon", + "liveNow": "Live", + "equalizerBandLabel": "{band} band", + "@equalizerBandLabel": { + "placeholders": { + "band": {} + } + }, + "equalizerBandValue": "{value} decibels", + "@equalizerBandValue": { + "placeholders": { + "value": {} + } + }, + "equalizerPresetFlat": "Flat", + "equalizerPresetRock": "Rock", + "equalizerPresetPop": "Pop", + "equalizerPresetBassBoost": "Bass Boost", + "equalizerPresetJazz": "Jazz", + "equalizerPresetVoice": "Voice", + "equalizerPresetCustom": "Custom", + "onboardingTitle": "Welcome to PluriWave", + "onboardingNewsTitle": "What's new", + "onboardingStartAction": "Start", + "onboardingCloseTooltip": "Close", + "radioRecordingError": "Error recording the radio: {error}", + "@radioRecordingError": { + "placeholders": { + "error": {} + } + }, + "radioApiConnectionError": "No connection to the radio API", + "radioSearchError": "Search error. Check your connection.", + "radioLoadMoreStationsError": "Could not load more stations.", + "radioNearbyStationsError": "We could not detect nearby stations. Use country filters.", + "radioCannotPlayStation": "Cannot play \"{stationName}\"", + "@radioCannotPlayStation": { + "placeholders": { + "stationName": {} + } + }, + "recordingSelectStationFirst": "Select a station before recording.", + "recordingStartError": "Could not start recording: {error}", + "@recordingStartError": { + "placeholders": { + "error": {} + } + }, + "unsupportedConfigVersion": "Unsupported configuration version", + "audioErrorGeneric": "Playback error", + "audioErrorNoInternet": "No internet connection", + "audioErrorInvalidUrl": "The radio URL is not valid", + "audioErrorNotFound": "The radio is not available (404 error)", + "audioErrorTimeout": "Connection timed out", + "audioErrorCannotConnect": "Cannot connect to the radio", + "audioErrorUnsupportedFormat": "Unsupported stream format", + "audioErrorDecode": "Error decoding the audio stream", + "audioErrorCleartext": "This radio uses unencrypted HTTP, which is not allowed", + "audioErrorSsl": "Invalid SSL certificate on the radio", + "audioErrorCannotPlay": "This radio cannot be played", + "audioErrorUnexpectedPlayback": "Unexpected playback error", + "androidExactAlarmScheduleError": "Android could not schedule an exact alarm. Check the exact alarm permission.", + "recordingPathEmptyError": "The recording path cannot be empty", + "recordingMaxSizeInvalidError": "The maximum size must be greater than zero", + "recordingAlreadyActiveError": "A recording is already in progress", + "alarmRingingFallbackActive": "Playing with internal safe audio.", + "alarmRingingPreparingFallback": "Preparing internal safe audio.", + "alarmRingingTryingStation": "Trying to play your station at the highest available quality.", + "alarmScheduleOnce": "Once · {date}", + "@alarmScheduleOnce": { + "placeholders": { + "date": {} + } + }, + "alarmScheduleWeekdays": "Days: {days}", + "@alarmScheduleWeekdays": { + "placeholders": { + "days": {} + } + }, + "androidReliabilityTitle": "Review Android reliability", + "closeAction": "Close", + "customOption": "Custom", + "endLabel": "End", + "equalizerDisable": "Disable equalizer", + "helpTitle": "Help and tutorial", + "helpSubtitle": "Review PluriWave features, tips and what’s new.", + "indefiniteOption": "Indefinite", + "invalidNumber": "Invalid number", + "nameLabel": "Name", + "notPlaying": "Not playing", + "oneTimeOption": "Once", + "pausePlaybackTooltip": "Pause playback", + "qualityOriginal": "Original quality: {quality}", + "@qualityOriginal": { + "placeholders": { + "quality": {} + } + }, + "qualityUnknown": "Quality not reported", + "recordAction": "Record", + "recordDurationTitle": "Recording duration", + "recordRadioSubtitle": "Choose how long you want to record.", + "recordRadioTitle": "Record radio", + "recordingActiveTitle": "Recording radio", + "recordingDirectTitle": "Direct recording", + "recordingsOpenFolderPlainError": "Could not open the recordings folder", + "recordingsOpenLatest": "Open latest recording", + "recordingsOpenLatestError": "Could not open the latest recording", + "startLabel": "Start", + "startPlaybackTooltip": "Start playback", + "stopAction": "Stop", + "stopPlaybackTooltip": "Stop playback", + "weekdayShortMonday": "Mon", + "weekdayShortTuesday": "Tue", + "weekdayShortWednesday": "Wed", + "weekdayShortThursday": "Thu", + "weekdayShortFriday": "Fri", + "weekdayShortSaturday": "Sat", + "weekdayShortSunday": "Sun" } diff --git a/lib/l10n/app_es.arb b/lib/l10n/app_es.arb index 0b1022c..8efd4a3 100644 --- a/lib/l10n/app_es.arb +++ b/lib/l10n/app_es.arb @@ -16,6 +16,33 @@ "hoursLabel": "Horas", "minutesLabel": "Minutos", "secondsLabel": "Segundos", + "durationHoursMinutesSeconds": "{hours} h {minutes} min {seconds} s", + "@durationHoursMinutesSeconds": { + "placeholders": { + "hours": {}, + "minutes": {}, + "seconds": {} + } + }, + "durationMinutesSeconds": "{minutes} min {seconds} s", + "@durationMinutesSeconds": { + "placeholders": { + "minutes": {}, + "seconds": {} + } + }, + "durationMinutesOnly": "{minutes} min", + "@durationMinutesOnly": { + "placeholders": { + "minutes": {} + } + }, + "durationSecondsOnly": "{seconds} s", + "@durationSecondsOnly": { + "placeholders": { + "seconds": {} + } + }, "saveQuickAccess": "Guardar como acceso rápido", "startTimer": "Iniciar timer", "skipCurrentAlarmExecution": "Omitida esta ejecución de {alarmName}.", @@ -79,6 +106,7 @@ "deleteAction": "Eliminar", "addStationTitle": "Añadir emisora", "stationNameLabel": "Nombre *", + "unnamedStation": "Sin nombre", "requiredField": "Campo obligatorio", "streamUrlLabel": "URL del stream *", "invalidUrl": "URL no válida", @@ -425,5 +453,108 @@ "noAlarmsYetSubtitle": "Creá una para diseñar tu despertar musical.", "ringingInternalAudioActive": "Sonando con audio seguro interno.", "ringingPreparingInternalAudio": "Preparando audio seguro interno.", - "stopAlarmAction": "Detener alarma" + "stopAlarmAction": "Detener alarma", + "pauseAction": "Pausar", + "miniPlayerOpenLabel": "Abrir reproductor de {stationName}", + "@miniPlayerOpenLabel": {"placeholders": {"stationName": {}}}, + "playerIconLabel": "Reproductor", + "playbackStatusConnecting": "Conectando...", + "playbackStatusLive": "En directo", + "playbackStatusPaused": "Pausado", + "playbackStatusConnectionError": "Error de conexión", + "playbackStatusStopped": "Detenido", + "stationSemanticLabel": "Emisora {stationName}", + "@stationSemanticLabel": {"placeholders": {"stationName": {}}}, + "favoritesAddTooltip": "Añadir a favoritos", + "favoritesAddedMessage": "{stationName} añadida a favoritos", + "@favoritesAddedMessage": {"placeholders": {"stationName": {}}}, + "stationIconLabel": "Icono de emisora", + "liveNow": "En vivo", + "equalizerBandLabel": "Banda {band}", + "@equalizerBandLabel": {"placeholders": {"band": {}}}, + "equalizerBandValue": "{value} decibelios", + "@equalizerBandValue": {"placeholders": {"value": {}}}, + "equalizerPresetFlat": "Plano", + "equalizerPresetRock": "Rock", + "equalizerPresetPop": "Pop", + "equalizerPresetBassBoost": "Refuerzo de graves", + "equalizerPresetJazz": "Jazz", + "equalizerPresetVoice": "Voz", + "equalizerPresetCustom": "Personalizado", + "onboardingTitle": "Bienvenido a PluriWave", + "onboardingNewsTitle": "Novedades", + "onboardingStartAction": "Empezar", + "onboardingCloseTooltip": "Cerrar", + "radioRecordingError": "Error al grabar la radio: {error}", + "@radioRecordingError": {"placeholders": {"error": {}}}, + "radioApiConnectionError": "Sin conexión a la API de radio", + "radioSearchError": "Error en la búsqueda. Comprueba tu conexión.", + "radioLoadMoreStationsError": "No se pudieron cargar más emisoras.", + "radioNearbyStationsError": "No pudimos detectar emisoras cercanas. Usa filtros por país.", + "radioCannotPlayStation": "No se puede reproducir \"{stationName}\"", + "@radioCannotPlayStation": {"placeholders": {"stationName": {}}}, + "recordingSelectStationFirst": "Primero selecciona una emisora para grabar.", + "recordingStartError": "No se pudo iniciar la grabación: {error}", + "@recordingStartError": {"placeholders": {"error": {}}}, + "unsupportedConfigVersion": "Versión de configuración no compatible", + "audioErrorGeneric": "Error de reproducción", + "audioErrorNoInternet": "Sin conexión a internet", + "audioErrorInvalidUrl": "La URL de la radio no es válida", + "audioErrorNotFound": "La radio no está disponible (error 404)", + "audioErrorTimeout": "Tiempo de espera agotado al conectar", + "audioErrorCannotConnect": "No se puede conectar a la radio", + "audioErrorUnsupportedFormat": "Formato de stream no compatible", + "audioErrorDecode": "Error al decodificar el stream de audio", + "audioErrorCleartext": "Esta radio usa HTTP sin cifrar, y no está permitido", + "audioErrorSsl": "Certificado SSL inválido en la radio", + "audioErrorCannotPlay": "No se puede reproducir esta radio", + "audioErrorUnexpectedPlayback": "Error inesperado al reproducir", + "androidExactAlarmScheduleError": "Android no pudo programar una alarma exacta. Revisa el permiso de alarmas exactas.", + "recordingPathEmptyError": "La ruta de grabación no puede estar vacía", + "recordingMaxSizeInvalidError": "El tamaño máximo debe ser mayor que cero", + "recordingAlreadyActiveError": "Ya hay una grabación en curso", + "alarmRingingFallbackActive": "Sonando con audio seguro interno.", + "alarmRingingPreparingFallback": "Preparando audio seguro interno.", + "alarmRingingTryingStation": "Intentando reproducir tu emisora con máxima calidad disponible.", + "alarmScheduleOnce": "Una vez · {date}", + "@alarmScheduleOnce": {"placeholders": {"date": {}}}, + "alarmScheduleWeekdays": "Días: {days}", + "@alarmScheduleWeekdays": {"placeholders": {"days": {}}}, + "androidReliabilityTitle": "Revisar fiabilidad Android", + "closeAction": "Cerrar", + "customOption": "Personalizada", + "endLabel": "Fin", + "equalizerDisable": "Desactivar ecualizador", + "helpTitle": "Ayuda y tutorial", + "helpSubtitle": "Repasá funciones, consejos y novedades de PluriWave.", + "indefiniteOption": "Indefinida", + "invalidNumber": "Número inválido", + "nameLabel": "Nombre", + "notPlaying": "No está reproduciendo", + "oneTimeOption": "Una vez", + "pausePlaybackTooltip": "Pausar reproducción", + "qualityOriginal": "Calidad original: {quality}", + "@qualityOriginal": {"placeholders": {"quality": {}}}, + "qualityUnknown": "Calidad no informada", + "recordAction": "Grabar", + "recordDurationTitle": "Duración de grabación", + "recordRadioSubtitle": "Elegí cuánto tiempo querés grabar.", + "recordRadioTitle": "Grabar radio", + "recordingActiveTitle": "Grabando radio", + "recordingDirectTitle": "Grabación directa", + "recordingsOpenFolderPlainError": "No se pudo abrir la carpeta de grabaciones", + "recordingsOpenLatest": "Abrir última grabación", + "recordingsOpenLatestError": "No se pudo abrir la última grabación", + "startLabel": "Inicio", + "startPlaybackTooltip": "Iniciar reproducción", + "stopAction": "Parar", + "stopPlaybackTooltip": "Detener reproducción", + "weekdayShortMonday": "Lun", + "weekdayShortTuesday": "Mar", + "weekdayShortWednesday": "Mié", + "weekdayShortThursday": "Jue", + "weekdayShortFriday": "Vie", + "weekdayShortSaturday": "Sáb", + "weekdayShortSunday": "Dom" + } diff --git a/lib/l10n/app_fr.arb b/lib/l10n/app_fr.arb index a671b6d..ad2f552 100644 --- a/lib/l10n/app_fr.arb +++ b/lib/l10n/app_fr.arb @@ -5,103 +5,131 @@ "navSearch": "Recherche", "navFavorites": "Favoris", "navAlarms": "Alarmes", - "navSettings": "Settings", + "navSettings": "Paramètres", "actionOk": "OK", "sleepTimer": "Minuteur de sommeil", - "sleepTimerDescription": "Smooth radio shutdown with an exact countdown.", - "cancelTimer": "Cancel timer", - "optionOther": "Other", - "customDurationTitle": "Custom duration", - "durationGreaterThanZero": "Choose a duration greater than zero.", - "hoursLabel": "Hours", + "sleepTimerDescription": "Arrêt progressif de la radio avec compte à rebours précis.", + "cancelTimer": "Annuler le minuteur", + "optionOther": "Autre", + "customDurationTitle": "Durée personnalisée", + "durationGreaterThanZero": "Choisissez une durée supérieure à zéro.", + "hoursLabel": "Heures", "minutesLabel": "Minutes", - "secondsLabel": "Seconds", - "saveQuickAccess": "Save as quick access", - "startTimer": "Start timer", - "skipCurrentAlarmExecution": "Skipped this execution of {alarmName}.", + "secondsLabel": "Secondes", + "durationHoursMinutesSeconds": "{hours} h {minutes} min {seconds} s", + "@durationHoursMinutesSeconds": { + "placeholders": { + "hours": {}, + "minutes": {}, + "seconds": {} + } + }, + "durationMinutesSeconds": "{minutes} min {seconds} s", + "@durationMinutesSeconds": { + "placeholders": { + "minutes": {}, + "seconds": {} + } + }, + "durationMinutesOnly": "{minutes} min", + "@durationMinutesOnly": { + "placeholders": { + "minutes": {} + } + }, + "durationSecondsOnly": "{seconds} s", + "@durationSecondsOnly": { + "placeholders": { + "seconds": {} + } + }, + "saveQuickAccess": "Enregistrer comme raccourci", + "startTimer": "Démarrer le minuteur", + "skipCurrentAlarmExecution": "Cette exécution de {alarmName} a été ignorée.", "@skipCurrentAlarmExecution": { "placeholders": { "alarmName": {} } }, - "settingsTitle": "Settings", - "settingsSubtitle": "Fine-grained sound control, backups, and custom stations.", + "settingsTitle": "Paramètres", + "settingsSubtitle": "Réglage précis du son, sauvegardes et stations personnalisées.", "languageSectionTitle": "Langue", - "languageSectionDescription": "Choose how the app language is displayed.", - "languageSystemDefault": "System", + "languageSectionDescription": "Choisissez le mode d’affichage de la langue de l’app.", + "languageSystemDefault": "Système", "languageSpanish": "Espagnol", "languageEnglish": "Anglais", - "languageUpdated": "Language updated: {languageName}", + "languageUpdated": "Langue mise à jour : {languageName}", "@languageUpdated": { "placeholders": { "languageName": {} } }, - "languageUpdatedSystem": "Language updated: System", - "timerSectionTitle": "Sleep timer", - "timerSectionAdd": "Add", - "timerSectionDescription": "Customize the quick presets shown when automatically stopping the radio.", - "timerSectionRestoreRecommended": "Restore recommended times", - "newQuickAccessTitle": "New quick access", - "saveQuickAccessButton": "Save quick access", - "settingsSafeStatus": "Safe", - "recordingsSectionTitle": "Recordings", - "recordingsFolderDialogTitle": "Select recordings folder", - "recordingsPathUpdated": "Recording path updated", - "recordingsPathSaveError": "Could not save the path: {error}", - "recordingsDefaultFolderRestored": "The internal default folder will be used", - "recordingsFolderTitle": "Recordings folder", - "recordingsPathCalculating": "Calculating path...", - "recordingsChangePath": "Change path", - "recordingsUseDefaultPath": "Use default path", - "recordingsOriginalStreamHint": "The radio is saved from the original stream, without recompressing.", - "equalizerActive": "Active", - "equalizerDisabled": "Disabled", - "equalizerEnable": "Enable equalizer", - "equalizerRealtimeSubtitle": "Changes are applied in real time to the current station.", - "equalizerPendingSubtitle": "Changes are saved and will apply when Android enables the effect.", - "equalizerPerStationTitle": "Use custom EQ for this favorite", - "equalizerPerStationActive": "Active for {stationName}", - "equalizerPerStationMain": "Using main EQ for {stationName}", - "preferredStationTitle": "Preferred station", - "preferredStationDescription": "Preselected for new alarms and available for quick playback.", - "preferredStationNoStationsTitle": "No stations available yet", - "preferredStationNoStationsSubtitle": "Save favorites or load stations to choose a preferred one.", - "preferredStationAutomaticFallback": "Automatic fallback", - "preferredStationDefaultFavorite": "Default favorite", - "preferredStationCurrent": "Current preferred: {stationName}", - "preferredStationAutoUsing": "No favorites: automatically using {stationName}", - "preferredStationPlay": "Play preferred", - "customStationsTitle": "Custom stations", - "customStationsAdd": "Add", - "customStationsEmpty": "No custom stations.", - "playAction": "Play", - "deleteAction": "Delete", - "addStationTitle": "Add station", - "stationNameLabel": "Name *", - "requiredField": "Required field", - "streamUrlLabel": "Stream URL *", - "invalidUrl": "Invalid URL", - "countryOptionalLabel": "Country (optional)", - "saveStation": "Save station", - "backupSectionTitle": "Backup", - "backupExportTitle": "Export configuration", - "backupExportSubtitle": "Favorites, custom stations, and EQ presets", - "backupImportTitle": "Import configuration", - "backupImportSubtitle": "Restore from a backup file", - "backupShareSubject": "PluriWave — backup", - "backupShareText": "PluriWave configuration exported on {date}", - "backupExportError": "Export error: {error}", - "backupImportConfirmMessage": "This will add favorites, stations, and presets from the file. Continue?", - "backupImportSuccess": "Configuration imported successfully", - "backupImportError": "Import error: {error}", - "appVersionLoading": "Loading version...", - "appVersionSubtitle": "{version} - World radio", - "savedFavoritesTitle": "Saved favorites", - "stationFilterTitle": "Station filter", - "stationFilterSubtitle": "Only stations verified as active", - "backgroundAudioTitle": "Background audio", - "backgroundAudioSubtitle": "Continues when the screen turns off", + "languageUpdatedSystem": "Langue mise à jour : Système", + "timerSectionTitle": "Minuteur de sommeil", + "timerSectionAdd": "Ajouter", + "timerSectionDescription": "Personnalisez les raccourcis affichés lors de l’arrêt automatique de la radio.", + "timerSectionRestoreRecommended": "Restaurer les durées recommandées", + "newQuickAccessTitle": "Nouveau raccourci", + "saveQuickAccessButton": "Enregistrer le raccourci", + "settingsSafeStatus": "Sûr", + "recordingsSectionTitle": "Enregistrements", + "recordingsFolderDialogTitle": "Sélectionnez le dossier d’enregistrement", + "recordingsPathUpdated": "Chemin d’enregistrement mis à jour", + "recordingsPathSaveError": "Impossible d’enregistrer le chemin : {error}", + "recordingsDefaultFolderRestored": "Le dossier interne par défaut sera utilisé", + "recordingsFolderTitle": "Dossier d’enregistrement", + "recordingsPathCalculating": "Calcul du chemin...", + "recordingsChangePath": "Changer le chemin", + "recordingsUseDefaultPath": "Utiliser le chemin par défaut", + "recordingsOriginalStreamHint": "La radio est enregistrée depuis le flux original, sans recompression.", + "equalizerActive": "Actif", + "equalizerDisabled": "Désactivé", + "equalizerEnable": "Activer l’égaliseur", + "equalizerRealtimeSubtitle": "Les changements s’appliquent en temps réel à la station actuelle.", + "equalizerPendingSubtitle": "Les changements sont enregistrés et s’appliqueront quand Android activera l’effet.", + "equalizerPerStationTitle": "Utiliser un EQ propre pour ce favori", + "equalizerPerStationActive": "Actif pour {stationName}", + "equalizerPerStationMain": "EQ principal utilisé pour {stationName}", + "preferredStationTitle": "Station préférée", + "preferredStationDescription": "Présélectionnée lors de la création d’alarmes et disponible en lecture rapide.", + "preferredStationNoStationsTitle": "Aucune station disponible pour le moment", + "preferredStationNoStationsSubtitle": "Enregistrez des favoris ou chargez des stations pour en choisir une préférée.", + "preferredStationAutomaticFallback": "Repli automatique", + "preferredStationDefaultFavorite": "Favori par défaut", + "preferredStationCurrent": "Préférée actuelle : {stationName}", + "preferredStationAutoUsing": "Aucun favori : utilisation automatique de {stationName}", + "preferredStationPlay": "Lire la préférée", + "customStationsTitle": "Stations personnalisées", + "customStationsAdd": "Ajouter", + "customStationsEmpty": "Aucune station personnalisée.", + "playAction": "Lire", + "deleteAction": "Supprimer", + "addStationTitle": "Ajouter une station", + "stationNameLabel": "Nom *", + "unnamedStation": "Station sans nom", + "requiredField": "Champ obligatoire", + "streamUrlLabel": "URL du flux *", + "invalidUrl": "URL non valide", + "countryOptionalLabel": "Pays (facultatif)", + "saveStation": "Enregistrer la station", + "backupSectionTitle": "Sauvegarde", + "backupExportTitle": "Exporter la configuration", + "backupExportSubtitle": "Favoris, stations personnalisées et préréglages d’EQ", + "backupImportTitle": "Importer la configuration", + "backupImportSubtitle": "Restaurer depuis un fichier de sauvegarde", + "backupShareSubject": "PluriWave — sauvegarde", + "backupShareText": "Configuration de PluriWave exportée le {date}", + "backupExportError": "Erreur d’exportation : {error}", + "backupImportConfirmMessage": "Cela ajoutera les favoris, stations et préréglages du fichier. Continuer ?", + "backupImportSuccess": "Configuration importée avec succès", + "backupImportError": "Erreur d’importation : {error}", + "appVersionLoading": "Chargement de la version...", + "appVersionSubtitle": "{version} - Radio mondiale", + "savedFavoritesTitle": "Favoris enregistrés", + "stationFilterTitle": "Filtre de stations", + "stationFilterSubtitle": "Seulement les stations vérifiées comme actives", + "backgroundAudioTitle": "Audio en arrière-plan", + "backgroundAudioSubtitle": "Continue lorsque l’écran s’éteint", "dash": "—", "@recordingsPathSaveError": { "placeholders": { @@ -149,14 +177,14 @@ } }, "cancelAction": "Annuler", - "equalizerTitle": "Equalizer", - "recordingsOpenFolder": "Open folder", - "recordingsOpenFolderError": "Could not open the folder: {error}", - "recordingsMaxSizeTitle": "Maximum recording size", - "recordingsMaxSizeSubtitle": "Current limit: {size} MB", - "recordingsMaxSizeDialogTitle": "Maximum size per recording", - "recordingsMaxSizeMbLabel": "Maximum megabytes", - "recordingsMaxSizeSaved": "Recording limit updated to {size} MB", + "equalizerTitle": "Égaliseur", + "recordingsOpenFolder": "Ouvrir le dossier", + "recordingsOpenFolderError": "Impossible d’ouvrir le dossier : {error}", + "recordingsMaxSizeTitle": "Taille maximale d’enregistrement", + "recordingsMaxSizeSubtitle": "Limite actuelle : {size} Mo", + "recordingsMaxSizeDialogTitle": "Taille maximale par enregistrement", + "recordingsMaxSizeMbLabel": "Mégaoctets maximum", + "recordingsMaxSizeSaved": "Limite d’enregistrement mise à jour à {size} Mo", "@recordingsOpenFolderError": { "placeholders": { "error": {} @@ -176,33 +204,33 @@ } } }, - "stationOrderTitle": "Station order", - "stationOrderByName": "By name", - "stationOrderByQuality": "By quality", - "stationOrderScopeDescription": "Applies to favorites, searches, nearby stations and quick lists.", - "favoriteGroupsTitle": "Favorite lists", - "favoriteGroupsDescription": "Create short lists to organize your saved stations.", - "favoriteGroupsAdd": "Add list", - "favoriteGroupsEdit": "Edit list", - "favoriteGroupsDelete": "Delete list", - "favoriteGroupsNameLabel": "List name", - "favoriteGroupsNameTooLong": "Maximum 28 characters.", - "favoriteGroupsUnassigned": "Unassigned", - "favoriteGroupsProtectedHint": "Default list: it cannot be edited or deleted.", - "favoriteGroupsCreated": "List created", - "favoriteGroupsUpdated": "List updated", - "favoriteGroupsDeleted": "List deleted; its stations return to Unassigned.", - "favoriteGroupsAssign": "Move to list", - "favoriteGroupsAssignSubtitle": "Current list: {groupName}", - "favoriteGroupsAssigned": "{stationName} moved to {groupName}", - "favoritesTitle": "Favorites", - "favoritesEmptyTitle": "No favorites yet", - "favoritesEmptySubtitle": "Tap the heart on any station to save it to your collection.", - "favoritesHeaderSubtitle": "Organize your collection by lists and keep important radios close.", + "stationOrderTitle": "Ordre des stations", + "stationOrderByName": "Par nom", + "stationOrderByQuality": "Par qualité", + "stationOrderScopeDescription": "S’applique aux favoris, recherches, stations proches et listes rapides.", + "favoriteGroupsTitle": "Listes de favoris", + "favoriteGroupsDescription": "Créez de courtes listes pour organiser vos stations enregistrées.", + "favoriteGroupsAdd": "Ajouter une liste", + "favoriteGroupsEdit": "Modifier la liste", + "favoriteGroupsDelete": "Supprimer la liste", + "favoriteGroupsNameLabel": "Nom de la liste", + "favoriteGroupsNameTooLong": "Maximum 28 caractères.", + "favoriteGroupsUnassigned": "Non assigné", + "favoriteGroupsProtectedHint": "Liste par défaut : elle ne peut être ni modifiée ni supprimée.", + "favoriteGroupsCreated": "Liste créée", + "favoriteGroupsUpdated": "Liste mise à jour", + "favoriteGroupsDeleted": "Liste supprimée ; ses stations retournent à Non assigné.", + "favoriteGroupsAssign": "Déplacer vers une liste", + "favoriteGroupsAssignSubtitle": "Liste actuelle : {groupName}", + "favoriteGroupsAssigned": "{stationName} déplacée vers {groupName}", + "favoritesTitle": "Favoris", + "favoritesEmptyTitle": "Aucun favori pour le moment", + "favoritesEmptySubtitle": "Touchez le cœur sur n’importe quelle station pour l’enregistrer dans votre collection.", + "favoritesHeaderSubtitle": "Organisez votre collection par listes et gardez les radios importantes à portée de main.", "favoritesCollection": "Collection", - "favoritesSavedCount": "{count} saved", - "favoritesRemoveTooltip": "Remove from favorites", - "favoritesRemovedMessage": "{stationName} removed from favorites", + "favoritesSavedCount": "{count} enregistrés", + "favoritesRemoveTooltip": "Retirer des favoris", + "favoritesRemovedMessage": "{stationName} retirée des favoris", "@favoriteGroupsAssignSubtitle": { "placeholders": { "groupName": {} @@ -226,7 +254,7 @@ "stationName": {} } }, - "alarmPostponedCurrentExecution": "Alarm postponed for this occurrence.", + "alarmPostponedCurrentExecution": "Alarme reportée pour cette exécution.", "searchScreenTitle": "Rechercher un signal", "searchScreenSubtitle": "Trouvez des stations par nom, pays ou langue grâce à des filtres rapides et à un contraste élevé.", "searchFiltersLabel": "Filtres", @@ -257,9 +285,9 @@ "languageNameJapanese": "japonais", "languageNameArabic": "arabe", "languageNameRussian": "russe", - "homeScreenSubtitle": "Live global radio with clean signals, smart favorites, and a show-style visual experience.", - "exploreStations": "Explore stations", - "stationsCount": "{count} stations", + "homeScreenSubtitle": "Radio mondiale en direct avec des signaux clairs, des favoris intelligents et une expérience visuelle de jeu télévisé.", + "exploreStations": "Explorer les stations", + "stationsCount": "{count} radios", "@stationsCount": { "placeholders": { "count": { @@ -267,36 +295,36 @@ } } }, - "qualityHd": "HD quality", - "nearYou": "Near you", - "nearYouInCountry": "Near you ? {country}", + "qualityHd": "Qualité HD", + "nearYou": "Près de vous", + "nearYouInCountry": "Près de vous · {country}", "@nearYouInCountry": { "placeholders": { "country": {} } }, - "detectAction": "Detect", - "liveRadar": "Live radar", + "detectAction": "Détecter", + "liveRadar": "Radar en direct", "genresTitle": "Genres", - "retryAction": "Retry", - "noStationsAvailable": "No stations available", - "noStationsAvailableSubtitle": "Try refreshing or choosing another genre to capture a signal again.", + "retryAction": "Réessayer", + "noStationsAvailable": "Aucune station disponible", + "noStationsAvailableSubtitle": "Essayez d’actualiser ou de choisir un autre genre pour capter à nouveau un signal.", "genrePop": "Pop", "genreRock": "Rock", "genreJazz": "Jazz", - "genreClassical": "Classical", - "genreElectronic": "Electronic", - "genreNews": "News", - "genreTalk": "Talk", + "genreClassical": "Classique", + "genreElectronic": "Électronique", + "genreNews": "Infos", + "genreTalk": "Débat", "genreHipHop": "Hip-hop", "genreCountry": "Country", "genreMetal": "Metal", "genreReggae": "Reggae", - "genreLatin": "Latin", - "alarmScreenTitle": "Music wake-up", - "alarmScreenSubtitle": "Alarms with radio, safe fallback sound, smart vacations, and the next occurrence always visible.", - "createAlarmAction": "Create alarm", - "alarmsCount": "{count} alarms", + "genreLatin": "Latino", + "alarmScreenTitle": "Réveil musical", + "alarmScreenSubtitle": "Alarmes avec radio, son sécurisé, vacances intelligentes et prochaine exécution toujours visible.", + "createAlarmAction": "Créer une alarme", + "alarmsCount": "{count} alarmes", "@alarmsCount": { "placeholders": { "count": { @@ -304,10 +332,10 @@ } } }, - "activeAlarmsWithoutNextTitle": "Active alarms without a next occurrence", - "noActiveAlarms": "No active alarms", - "nextAlarmTitle": "Next alarm", - "activeAlarmsWithoutNextSubtitle": "There are {count} active alarm(s), but they do not currently have a valid future date. Check date, weekdays, and vacations.", + "activeAlarmsWithoutNextTitle": "Alarmes actives sans prochaine exécution", + "noActiveAlarms": "Aucune alarme active", + "nextAlarmTitle": "Prochaine alarme", + "activeAlarmsWithoutNextSubtitle": "Il y a {count} alarme(s) active(s), mais elles n’ont actuellement aucune date future valide. Vérifiez la date, les jours et les vacances.", "@activeAlarmsWithoutNextSubtitle": { "placeholders": { "count": { @@ -315,10 +343,10 @@ } } }, - "createAlarmHint": "Create an alarm and PluriWave will calculate the next occurrence automatically.", - "alarmVacationPlay": "Plays during vacations", - "alarmVacationPause": "Paused during vacations", - "alarmFadeInLabel": "Fade-in {seconds}s", + "createAlarmHint": "Créez une alarme et PluriWave calculera automatiquement la prochaine exécution.", + "alarmVacationPlay": "Sonne pendant les vacances", + "alarmVacationPause": "En pause pendant les vacances", + "alarmFadeInLabel": "Fondu d’entrée {seconds} s", "@alarmFadeInLabel": { "placeholders": { "seconds": { @@ -326,61 +354,61 @@ } } }, - "alarmNextExecution": "Next occurrence: {date}", + "alarmNextExecution": "Prochaine exécution : {date}", "@alarmNextExecution": { "placeholders": { "date": {} } }, - "alarmNoNextExecution": "It has no active next occurrence.", - "alarmSkippedExecution": "One occurrence was skipped: {date}.", + "alarmNoNextExecution": "Aucune prochaine exécution active.", + "alarmSkippedExecution": "Une exécution a été ignorée : {date}.", "@alarmSkippedExecution": { "placeholders": { "date": {} } }, - "editAction": "Edit", - "skipNextAction": "Skip next", - "deleteTooltip": "Delete", - "alarmSkippedNoNextSnackbar": "Alarm skipped. There is no next occurrence left.", - "alarmSkippedReturnsSnackbar": "Alarm skipped. It will return on {date}.", + "editAction": "Modifier", + "skipNextAction": "Ignorer la suivante", + "deleteTooltip": "Supprimer", + "alarmSkippedNoNextSnackbar": "Alarme ignorée. Il ne reste aucune prochaine exécution.", + "alarmSkippedReturnsSnackbar": "Alarme ignorée. Elle reviendra le {date}.", "@alarmSkippedReturnsSnackbar": { "placeholders": { "date": {} } }, - "alarmVacationPausedNoNext": "It is paused for vacations ({vacationName}) and has no next occurrence.", + "alarmVacationPausedNoNext": "En pause pour vacances ({vacationName}) et sans prochaine exécution.", "@alarmVacationPausedNoNext": { "placeholders": { "vacationName": {} } }, - "alarmVacationPausedReturns": "It is paused for vacations ({vacationName}) and returns on {date}.", + "alarmVacationPausedReturns": "En pause pour vacances ({vacationName}) et revient le {date}.", "@alarmVacationPausedReturns": { "placeholders": { "vacationName": {}, "date": {} } }, - "alarmVacationReturns": "With vacations enabled, it will ring again on {date}.", + "alarmVacationReturns": "Avec les vacances actives, elle sonnera à nouveau le {date}.", "@alarmVacationReturns": { "placeholders": { "date": {} } }, - "defaultAlarmName": "Music alarm", - "newAlarmTitle": "New alarm", - "editAlarmTitle": "Edit alarm", - "nameField": "Name", - "timeField": "Time", + "defaultAlarmName": "Réveil musical", + "newAlarmTitle": "Nouvelle alarme", + "editAlarmTitle": "Modifier l’alarme", + "nameField": "Nom", + "timeField": "Heure", "dateField": "Date", - "onceOption": "Once", - "dailyOption": "Daily", - "weekdaysOption": "Weekdays", - "soundAndVolumeSection": "Sound and volume", - "alarmFadeInTitle": "Alarm fade-in", - "alarmFadeInOff": "0 s (no transition)", - "alarmFadeInSummary": "{seconds} s (from 5% to the selected volume)", + "onceOption": "Une fois", + "dailyOption": "Quotidienne", + "weekdaysOption": "Jours", + "soundAndVolumeSection": "Son et volume", + "alarmFadeInTitle": "Fondu d’entrée de l’alarme", + "alarmFadeInOff": "0 s (sans transition)", + "alarmFadeInSummary": "{seconds} s (de 5 % au volume choisi)", "@alarmFadeInSummary": { "placeholders": { "seconds": { @@ -388,22 +416,22 @@ } } }, - "internalSafeSoundLabel": "Internal safe sound", - "soundWarmSunrise": "Warm sunrise", - "soundSoftBell": "Soft bell", - "soundDigitalPulse": "Digital pulse", - "favoriteStationLabel": "Favorite station", - "noStationUseInternalSound": "No station: use internal sound", - "saveFavoritesAlarmHint": "Save stations in Favorites to use them as a music alarm.", - "useCurrentStationAction": "Use current station", - "playDuringVacations": "Play during vacations", - "playDuringVacationsHint": "If you turn this off, the next occurrence will jump to the first valid day.", - "saveAlarmAction": "Save alarm", - "chooseOneWeekdayError": "Choose at least one weekday.", - "androidReliabilityReview": "Review Android reliability", + "internalSafeSoundLabel": "Son sécurisé interne", + "soundWarmSunrise": "Lever de soleil chaleureux", + "soundSoftBell": "Cloche douce", + "soundDigitalPulse": "Impulsion numérique", + "favoriteStationLabel": "Station favorite", + "noStationUseInternalSound": "Aucune station : utiliser le son interne", + "saveFavoritesAlarmHint": "Enregistrez des stations dans les Favoris pour les utiliser comme alarme musicale.", + "useCurrentStationAction": "Utiliser la station actuelle", + "playDuringVacations": "Sonner pendant les vacances", + "playDuringVacationsHint": "Si vous désactivez cette option, la prochaine exécution passera au premier jour valide.", + "saveAlarmAction": "Enregistrer l’alarme", + "chooseOneWeekdayError": "Choisissez au moins un jour de la semaine.", + "androidReliabilityReview": "Vérifier la fiabilité Android", "statusOk": "OK", - "statusPending": "pending", - "androidReliabilityStatus": "Reliability: exact {exact} ? notifications {notifications} ? screen {screen}", + "statusPending": "en attente", + "androidReliabilityStatus": "Fiabilité : exactes {exact} · notifications {notifications} · écran {screen}", "@androidReliabilityStatus": { "placeholders": { "exact": {}, @@ -411,19 +439,165 @@ "screen": {} } }, - "vacationRangesTitle": "Vacation ranges", - "addAction": "Add", - "vacationRangesHint": "If an alarm is set to \"Paused during vacations\", it automatically skips these ranges.", - "noVacationRangesLoaded": "No ranges loaded.", - "deleteRangeTooltip": "Delete range", - "vacationsDefaultName": "Vacation", - "newVacationRangeTitle": "New vacation range", - "startField": "Start", - "endField": "End", - "saveRangeAction": "Save range", - "noAlarmsYetTitle": "There are no alarms yet.", - "noAlarmsYetSubtitle": "Create one to design your musical wake-up.", - "ringingInternalAudioActive": "Playing with internal safe audio.", - "ringingPreparingInternalAudio": "Preparing internal safe audio.", - "stopAlarmAction": "Stop alarm" + "vacationRangesTitle": "Périodes de vacances", + "addAction": "Ajouter", + "vacationRangesHint": "Si une alarme est en « pause pendant les vacances », ces périodes sont automatiquement ignorées.", + "noVacationRangesLoaded": "Aucune période chargée.", + "deleteRangeTooltip": "Supprimer la période", + "vacationsDefaultName": "Vacances", + "newVacationRangeTitle": "Nouvelle période de vacances", + "startField": "Début", + "endField": "Fin", + "saveRangeAction": "Enregistrer la période", + "noAlarmsYetTitle": "Il n’y a pas encore d’alarmes.", + "noAlarmsYetSubtitle": "Créez-en une pour concevoir votre réveil musical.", + "ringingInternalAudioActive": "Son sécurisé interne en cours.", + "ringingPreparingInternalAudio": "Préparation du son sécurisé interne.", + "stopAlarmAction": "Arrêter l’alarme", + "pauseAction": "Pause", + "miniPlayerOpenLabel": "Ouvrir le lecteur de {stationName}", + "@miniPlayerOpenLabel": { + "placeholders": { + "stationName": {} + } + }, + "playerIconLabel": "Lecteur", + "playbackStatusConnecting": "Connexion...", + "playbackStatusLive": "En direct", + "playbackStatusPaused": "En pause", + "playbackStatusConnectionError": "Erreur de connexion", + "playbackStatusStopped": "Arrêté", + "stationSemanticLabel": "Station {stationName}", + "@stationSemanticLabel": { + "placeholders": { + "stationName": {} + } + }, + "favoritesAddTooltip": "Ajouter aux favoris", + "favoritesAddedMessage": "{stationName} ajoutée aux favoris", + "@favoritesAddedMessage": { + "placeholders": { + "stationName": {} + } + }, + "stationIconLabel": "Icône de station", + "liveNow": "En direct", + "equalizerBandLabel": "Bande {band}", + "@equalizerBandLabel": { + "placeholders": { + "band": {} + } + }, + "equalizerBandValue": "{value} décibels", + "@equalizerBandValue": { + "placeholders": { + "value": {} + } + }, + "equalizerPresetFlat": "Plat", + "equalizerPresetRock": "Rock", + "equalizerPresetPop": "Pop", + "equalizerPresetBassBoost": "Renforcement des basses", + "equalizerPresetJazz": "Jazz", + "equalizerPresetVoice": "Voix", + "equalizerPresetCustom": "Personnalisé", + "onboardingTitle": "Bienvenue dans PluriWave", + "onboardingNewsTitle": "Nouveautés", + "onboardingStartAction": "Commencer", + "onboardingCloseTooltip": "Fermer", + "radioRecordingError": "Erreur lors de l'enregistrement de la radio : {error}", + "@radioRecordingError": { + "placeholders": { + "error": {} + } + }, + "radioApiConnectionError": "Aucune connexion à l'API radio", + "radioSearchError": "Erreur de recherche. Vérifiez votre connexion.", + "radioLoadMoreStationsError": "Impossible de charger plus de stations.", + "radioNearbyStationsError": "Nous n'avons pas pu détecter de stations proches. Utilisez les filtres par pays.", + "radioCannotPlayStation": "Impossible de lire \"{stationName}\"", + "@radioCannotPlayStation": { + "placeholders": { + "stationName": {} + } + }, + "recordingSelectStationFirst": "Sélectionnez d'abord une station à enregistrer.", + "recordingStartError": "Impossible de démarrer l'enregistrement : {error}", + "@recordingStartError": { + "placeholders": { + "error": {} + } + }, + "unsupportedConfigVersion": "Version de configuration non prise en charge", + "audioErrorGeneric": "Erreur de lecture", + "audioErrorNoInternet": "Aucune connexion Internet", + "audioErrorInvalidUrl": "L'URL de la radio n'est pas valide", + "audioErrorNotFound": "La radio n'est pas disponible (erreur 404)", + "audioErrorTimeout": "Délai de connexion dépassé", + "audioErrorCannotConnect": "Impossible de se connecter à la radio", + "audioErrorUnsupportedFormat": "Format de flux non pris en charge", + "audioErrorDecode": "Erreur lors du décodage du flux audio", + "audioErrorCleartext": "Cette radio utilise HTTP non chiffré, ce qui n'est pas autorisé", + "audioErrorSsl": "Certificat SSL invalide pour la radio", + "audioErrorCannotPlay": "Impossible de lire cette radio", + "audioErrorUnexpectedPlayback": "Erreur de lecture inattendue", + "androidExactAlarmScheduleError": "Android n'a pas pu programmer une alarme exacte. Vérifiez l'autorisation des alarmes exactes.", + "recordingPathEmptyError": "Le chemin d'enregistrement ne peut pas être vide", + "recordingMaxSizeInvalidError": "La taille maximale doit être supérieure à zéro", + "recordingAlreadyActiveError": "Un enregistrement est déjà en cours", + "alarmRingingFallbackActive": "Lecture avec l’audio interne sécurisé.", + "alarmRingingPreparingFallback": "Préparation de l’audio interne sécurisé.", + "alarmRingingTryingStation": "Tentative de lecture de votre station avec la meilleure qualité disponible.", + "alarmScheduleOnce": "Une fois · {date}", + "@alarmScheduleOnce": { + "placeholders": { + "date": {} + } + }, + "alarmScheduleWeekdays": "Jours : {days}", + "@alarmScheduleWeekdays": { + "placeholders": { + "days": {} + } + }, + "androidReliabilityTitle": "Vérifier la fiabilité Android", + "closeAction": "Fermer", + "customOption": "Personnalisée", + "endLabel": "Fin", + "equalizerDisable": "Désactiver l’égaliseur", + "helpTitle": "Aide et tutoriel", + "helpSubtitle": "Revoyez les fonctions, conseils et nouveautés de PluriWave.", + "indefiniteOption": "Indéfinie", + "invalidNumber": "Nombre invalide", + "nameLabel": "Nom", + "notPlaying": "Lecture arrêtée", + "oneTimeOption": "Une fois", + "pausePlaybackTooltip": "Mettre en pause", + "qualityOriginal": "Qualité d’origine : {quality}", + "@qualityOriginal": { + "placeholders": { + "quality": {} + } + }, + "qualityUnknown": "Qualité non indiquée", + "recordAction": "Enregistrer", + "recordDurationTitle": "Durée d’enregistrement", + "recordRadioSubtitle": "Choisissez la durée d’enregistrement.", + "recordRadioTitle": "Enregistrer la radio", + "recordingActiveTitle": "Enregistrement de la radio", + "recordingDirectTitle": "Enregistrement direct", + "recordingsOpenFolderPlainError": "Impossible d’ouvrir le dossier des enregistrements", + "recordingsOpenLatest": "Ouvrir le dernier enregistrement", + "recordingsOpenLatestError": "Impossible d’ouvrir le dernier enregistrement", + "startLabel": "Début", + "startPlaybackTooltip": "Démarrer la lecture", + "stopAction": "Arrêter", + "stopPlaybackTooltip": "Arrêter la lecture", + "weekdayShortMonday": "Lun", + "weekdayShortTuesday": "Mar", + "weekdayShortWednesday": "Mer", + "weekdayShortThursday": "Jeu", + "weekdayShortFriday": "Ven", + "weekdayShortSaturday": "Sam", + "weekdayShortSunday": "Dim" } diff --git a/lib/l10n/app_hi.arb b/lib/l10n/app_hi.arb index 85ef4e4..5dfbc41 100644 --- a/lib/l10n/app_hi.arb +++ b/lib/l10n/app_hi.arb @@ -1,107 +1,135 @@ { "@@locale": "hi", "appTitle": "PluriWave", - "navHome": "Home", - "navSearch": "Search", - "navFavorites": "Favorites", - "navAlarms": "Alarms", - "navSettings": "Settings", - "actionOk": "OK", - "sleepTimer": "Sleep timer", - "sleepTimerDescription": "Smooth radio shutdown with an exact countdown.", - "cancelTimer": "Cancel timer", - "optionOther": "Other", - "customDurationTitle": "Custom duration", - "durationGreaterThanZero": "Choose a duration greater than zero.", - "hoursLabel": "Hours", - "minutesLabel": "Minutes", - "secondsLabel": "Seconds", - "saveQuickAccess": "Save as quick access", - "startTimer": "Start timer", - "skipCurrentAlarmExecution": "Skipped this execution of {alarmName}.", + "navHome": "मुखपृष्ठ", + "navSearch": "खोज", + "navFavorites": "पसंदीदा", + "navAlarms": "अलार्म", + "navSettings": "सेटिंग्स", + "actionOk": "ठीक है", + "sleepTimer": "नींद टाइमर", + "sleepTimerDescription": "सटीक उलटी गिनती के साथ रेडियो को धीरे से बंद करना।", + "cancelTimer": "टाइमर रद्द करें", + "optionOther": "अन्य", + "customDurationTitle": "मनचाही अवधि", + "durationGreaterThanZero": "शून्य से अधिक अवधि चुनें।", + "hoursLabel": "घंटे", + "minutesLabel": "मिनट", + "secondsLabel": "सेकंड", + "durationHoursMinutesSeconds": "{hours} ?? {minutes} ?? {seconds} ??", + "@durationHoursMinutesSeconds": { + "placeholders": { + "hours": {}, + "minutes": {}, + "seconds": {} + } + }, + "durationMinutesSeconds": "{minutes} ?? {seconds} ??", + "@durationMinutesSeconds": { + "placeholders": { + "minutes": {}, + "seconds": {} + } + }, + "durationMinutesOnly": "{minutes} ??", + "@durationMinutesOnly": { + "placeholders": { + "minutes": {} + } + }, + "durationSecondsOnly": "{seconds} ??", + "@durationSecondsOnly": { + "placeholders": { + "seconds": {} + } + }, + "saveQuickAccess": "त्वरित पहुँच के रूप में सहेजें", + "startTimer": "टाइमर शुरू करें", + "skipCurrentAlarmExecution": "{alarmName} की यह चाल छोड़ दी गई।", "@skipCurrentAlarmExecution": { "placeholders": { "alarmName": {} } }, - "settingsTitle": "Settings", - "settingsSubtitle": "Fine-grained sound control, backups, and custom stations.", - "languageSectionTitle": "Language", - "languageSectionDescription": "Choose how the app language is displayed.", - "languageSystemDefault": "System", - "languageSpanish": "Spanish", - "languageEnglish": "English", - "languageUpdated": "Language updated: {languageName}", + "settingsTitle": "सेटिंग्स", + "settingsSubtitle": "ध्वनि, बैकअप और मनचाहे स्टेशनों पर बारीक नियंत्रण।", + "languageSectionTitle": "भाषा", + "languageSectionDescription": "ऐप की भाषा कैसे दिखाई जाए, यह चुनें।", + "languageSystemDefault": "सिस्टम", + "languageSpanish": "स्पैनिश", + "languageEnglish": "अंग्रेज़ी", + "languageUpdated": "भाषा अपडेट हुई: {languageName}", "@languageUpdated": { "placeholders": { "languageName": {} } }, - "languageUpdatedSystem": "Language updated: System", - "timerSectionTitle": "Sleep timer", - "timerSectionAdd": "Add", - "timerSectionDescription": "Customize the quick presets shown when automatically stopping the radio.", - "timerSectionRestoreRecommended": "Restore recommended times", - "newQuickAccessTitle": "New quick access", - "saveQuickAccessButton": "Save quick access", - "settingsSafeStatus": "Safe", - "recordingsSectionTitle": "Recordings", - "recordingsFolderDialogTitle": "Select recordings folder", - "recordingsPathUpdated": "Recording path updated", - "recordingsPathSaveError": "Could not save the path: {error}", - "recordingsDefaultFolderRestored": "The internal default folder will be used", - "recordingsFolderTitle": "Recordings folder", - "recordingsPathCalculating": "Calculating path...", - "recordingsChangePath": "Change path", - "recordingsUseDefaultPath": "Use default path", - "recordingsOriginalStreamHint": "The radio is saved from the original stream, without recompressing.", - "equalizerActive": "Active", - "equalizerDisabled": "Disabled", - "equalizerEnable": "Enable equalizer", - "equalizerRealtimeSubtitle": "Changes are applied in real time to the current station.", - "equalizerPendingSubtitle": "Changes are saved and will apply when Android enables the effect.", - "equalizerPerStationTitle": "Use custom EQ for this favorite", - "equalizerPerStationActive": "Active for {stationName}", - "equalizerPerStationMain": "Using main EQ for {stationName}", - "preferredStationTitle": "Preferred station", - "preferredStationDescription": "Preselected for new alarms and available for quick playback.", - "preferredStationNoStationsTitle": "No stations available yet", - "preferredStationNoStationsSubtitle": "Save favorites or load stations to choose a preferred one.", - "preferredStationAutomaticFallback": "Automatic fallback", - "preferredStationDefaultFavorite": "Default favorite", - "preferredStationCurrent": "Current preferred: {stationName}", - "preferredStationAutoUsing": "No favorites: automatically using {stationName}", - "preferredStationPlay": "Play preferred", - "customStationsTitle": "Custom stations", - "customStationsAdd": "Add", - "customStationsEmpty": "No custom stations.", - "playAction": "Play", - "deleteAction": "Delete", - "addStationTitle": "Add station", - "stationNameLabel": "Name *", - "requiredField": "Required field", - "streamUrlLabel": "Stream URL *", - "invalidUrl": "Invalid URL", - "countryOptionalLabel": "Country (optional)", - "saveStation": "Save station", - "backupSectionTitle": "Backup", - "backupExportTitle": "Export configuration", - "backupExportSubtitle": "Favorites, custom stations, and EQ presets", - "backupImportTitle": "Import configuration", - "backupImportSubtitle": "Restore from a backup file", - "backupShareSubject": "PluriWave — backup", - "backupShareText": "PluriWave configuration exported on {date}", - "backupExportError": "Export error: {error}", - "backupImportConfirmMessage": "This will add favorites, stations, and presets from the file. Continue?", - "backupImportSuccess": "Configuration imported successfully", - "backupImportError": "Import error: {error}", - "appVersionLoading": "Loading version...", - "appVersionSubtitle": "{version} - World radio", - "savedFavoritesTitle": "Saved favorites", - "stationFilterTitle": "Station filter", - "stationFilterSubtitle": "Only stations verified as active", - "backgroundAudioTitle": "Background audio", - "backgroundAudioSubtitle": "Continues when the screen turns off", + "languageUpdatedSystem": "भाषा अपडेट हुई: सिस्टम", + "timerSectionTitle": "नींद टाइमर", + "timerSectionAdd": "जोड़ें", + "timerSectionDescription": "रेडियो को अपने-आप बंद करते समय दिखने वाले त्वरित प्रीसेट सजाएँ।", + "timerSectionRestoreRecommended": "अनुशंसित समय वापस लाएँ", + "newQuickAccessTitle": "नई त्वरित पहुँच", + "saveQuickAccessButton": "त्वरित पहुँच सहेजें", + "settingsSafeStatus": "सुरक्षित", + "recordingsSectionTitle": "रिकॉर्डिंग", + "recordingsFolderDialogTitle": "रिकॉर्डिंग फ़ोल्डर चुनें", + "recordingsPathUpdated": "रिकॉर्डिंग पथ अपडेट हुआ", + "recordingsPathSaveError": "पथ सहेजा नहीं जा सका: {error}", + "recordingsDefaultFolderRestored": "डिफ़ॉल्ट आंतरिक फ़ोल्डर इस्तेमाल होगा", + "recordingsFolderTitle": "रिकॉर्डिंग फ़ोल्डर", + "recordingsPathCalculating": "पथ की गणना हो रही है...", + "recordingsChangePath": "पथ बदलें", + "recordingsUseDefaultPath": "डिफ़ॉल्ट पथ इस्तेमाल करें", + "recordingsOriginalStreamHint": "रेडियो मूल स्ट्रीम से सहेजा जाता है, बिना दोबारा संपीड़ित किए।", + "equalizerActive": "सक्रिय", + "equalizerDisabled": "निष्क्रिय", + "equalizerEnable": "इक्वलाइज़र चालू करें", + "equalizerRealtimeSubtitle": "बदलाव वर्तमान स्टेशन पर तुरंत लागू होते हैं।", + "equalizerPendingSubtitle": "बदलाव सहेजे जाते हैं और Android प्रभाव सक्षम होने पर लागू होंगे।", + "equalizerPerStationTitle": "इस पसंदीदा के लिए अपना EQ इस्तेमाल करें", + "equalizerPerStationActive": "{stationName} के लिए सक्रिय", + "equalizerPerStationMain": "{stationName} के लिए मुख्य EQ इस्तेमाल हो रहा है", + "preferredStationTitle": "पसंदीदा स्टेशन", + "preferredStationDescription": "नए अलार्म बनाते समय पहले से चुना जाता है और त्वरित प्लेबैक में चल सकता है।", + "preferredStationNoStationsTitle": "अभी कोई स्टेशन उपलब्ध नहीं है", + "preferredStationNoStationsSubtitle": "पसंदीदा स्टेशन चुनने के लिए पसंदीदा सहेजें या स्टेशन लोड करें।", + "preferredStationAutomaticFallback": "स्वचालित विकल्प", + "preferredStationDefaultFavorite": "डिफ़ॉल्ट पसंदीदा", + "preferredStationCurrent": "वर्तमान पसंदीदा: {stationName}", + "preferredStationAutoUsing": "कोई पसंदीदा नहीं: अपने-आप {stationName} इस्तेमाल हो रहा है", + "preferredStationPlay": "पसंदीदा चलाएँ", + "customStationsTitle": "मनचाहे स्टेशन", + "customStationsAdd": "जोड़ें", + "customStationsEmpty": "कोई मनचाहा स्टेशन नहीं।", + "playAction": "चलाएँ", + "deleteAction": "हटाएँ", + "addStationTitle": "स्टेशन जोड़ें", + "stationNameLabel": "नाम *", + "unnamedStation": "बिना नाम का स्टेशन", + "requiredField": "आवश्यक फ़ील्ड", + "streamUrlLabel": "स्ट्रीम URL *", + "invalidUrl": "अमान्य URL", + "countryOptionalLabel": "देश (वैकल्पिक)", + "saveStation": "स्टेशन सहेजें", + "backupSectionTitle": "बैकअप", + "backupExportTitle": "सेटिंग्स निर्यात करें", + "backupExportSubtitle": "पसंदीदा, मनचाहे स्टेशन और EQ प्रीसेट", + "backupImportTitle": "सेटिंग्स आयात करें", + "backupImportSubtitle": "बैकअप फ़ाइल से पुनर्स्थापित करें", + "backupShareSubject": "PluriWave — बैकअप", + "backupShareText": "{date} को निर्यात की गई PluriWave सेटिंग्स", + "backupExportError": "निर्यात करते समय त्रुटि: {error}", + "backupImportConfirmMessage": "यह फ़ाइल से पसंदीदा, स्टेशन और प्रीसेट जोड़ देगा। जारी रखें?", + "backupImportSuccess": "सेटिंग्स सफलतापूर्वक आयात हुईं", + "backupImportError": "आयात करते समय त्रुटि: {error}", + "appVersionLoading": "संस्करण लोड हो रहा है...", + "appVersionSubtitle": "{version} - विश्व रेडियो", + "savedFavoritesTitle": "सहेजे गए पसंदीदा", + "stationFilterTitle": "स्टेशन फ़िल्टर", + "stationFilterSubtitle": "केवल सक्रिय सत्यापित स्टेशन", + "backgroundAudioTitle": "पृष्ठभूमि ऑडियो", + "backgroundAudioSubtitle": "स्क्रीन बंद होने पर भी जारी रहता है", "dash": "—", "@recordingsPathSaveError": { "placeholders": { @@ -148,15 +176,15 @@ "version": {} } }, - "cancelAction": "Cancel", - "equalizerTitle": "Equalizer", - "recordingsOpenFolder": "Open folder", - "recordingsOpenFolderError": "Could not open the folder: {error}", - "recordingsMaxSizeTitle": "Maximum recording size", - "recordingsMaxSizeSubtitle": "Current limit: {size} MB", - "recordingsMaxSizeDialogTitle": "Maximum size per recording", - "recordingsMaxSizeMbLabel": "Maximum megabytes", - "recordingsMaxSizeSaved": "Recording limit updated to {size} MB", + "cancelAction": "रद्द करें", + "equalizerTitle": "इक्वलाइज़र", + "recordingsOpenFolder": "फ़ोल्डर खोलें", + "recordingsOpenFolderError": "फ़ोल्डर नहीं खुल सका: {error}", + "recordingsMaxSizeTitle": "रिकॉर्डिंग का अधिकतम आकार", + "recordingsMaxSizeSubtitle": "वर्तमान सीमा: {size} MB", + "recordingsMaxSizeDialogTitle": "प्रति रिकॉर्डिंग अधिकतम आकार", + "recordingsMaxSizeMbLabel": "अधिकतम मेगाबाइट", + "recordingsMaxSizeSaved": "रिकॉर्डिंग सीमा {size} MB पर अपडेट हुई", "@recordingsOpenFolderError": { "placeholders": { "error": {} @@ -176,33 +204,33 @@ } } }, - "stationOrderTitle": "Station order", - "stationOrderByName": "By name", - "stationOrderByQuality": "By quality", - "stationOrderScopeDescription": "Applies to favorites, searches, nearby stations and quick lists.", - "favoriteGroupsTitle": "Favorite lists", - "favoriteGroupsDescription": "Create short lists to organize your saved stations.", - "favoriteGroupsAdd": "Add list", - "favoriteGroupsEdit": "Edit list", - "favoriteGroupsDelete": "Delete list", - "favoriteGroupsNameLabel": "List name", - "favoriteGroupsNameTooLong": "Maximum 28 characters.", - "favoriteGroupsUnassigned": "Unassigned", - "favoriteGroupsProtectedHint": "Default list: it cannot be edited or deleted.", - "favoriteGroupsCreated": "List created", - "favoriteGroupsUpdated": "List updated", - "favoriteGroupsDeleted": "List deleted; its stations return to Unassigned.", - "favoriteGroupsAssign": "Move to list", - "favoriteGroupsAssignSubtitle": "Current list: {groupName}", - "favoriteGroupsAssigned": "{stationName} moved to {groupName}", - "favoritesTitle": "Favorites", - "favoritesEmptyTitle": "No favorites yet", - "favoritesEmptySubtitle": "Tap the heart on any station to save it to your collection.", - "favoritesHeaderSubtitle": "Organize your collection by lists and keep important radios close.", - "favoritesCollection": "Collection", - "favoritesSavedCount": "{count} saved", - "favoritesRemoveTooltip": "Remove from favorites", - "favoritesRemovedMessage": "{stationName} removed from favorites", + "stationOrderTitle": "स्टेशन क्रम", + "stationOrderByName": "नाम से", + "stationOrderByQuality": "गुणवत्ता से", + "stationOrderScopeDescription": "पसंदीदा, खोज, पास के स्टेशन और त्वरित सूचियों पर लागू होता है।", + "favoriteGroupsTitle": "पसंदीदा सूचियाँ", + "favoriteGroupsDescription": "सहेजे गए स्टेशनों को व्यवस्थित करने के लिए छोटी सूचियाँ बनाएँ।", + "favoriteGroupsAdd": "सूची जोड़ें", + "favoriteGroupsEdit": "सूची संपादित करें", + "favoriteGroupsDelete": "सूची हटाएँ", + "favoriteGroupsNameLabel": "सूची का नाम", + "favoriteGroupsNameTooLong": "अधिकतम 28 वर्ण।", + "favoriteGroupsUnassigned": "अनिर्धारित", + "favoriteGroupsProtectedHint": "डिफ़ॉल्ट सूची: संपादित या हटाई नहीं जा सकती।", + "favoriteGroupsCreated": "सूची बनाई गई", + "favoriteGroupsUpdated": "सूची अपडेट हुई", + "favoriteGroupsDeleted": "सूची हटाई गई; उसके स्टेशन अनिर्धारित में लौट गए।", + "favoriteGroupsAssign": "सूची में ले जाएँ", + "favoriteGroupsAssignSubtitle": "वर्तमान सूची: {groupName}", + "favoriteGroupsAssigned": "{stationName} को {groupName} में ले जाया गया", + "favoritesTitle": "पसंदीदा", + "favoritesEmptyTitle": "अभी कोई पसंदीदा नहीं", + "favoritesEmptySubtitle": "किसी भी स्टेशन पर दिल दबाकर उसे अपने संग्रह में सहेजें।", + "favoritesHeaderSubtitle": "अपने संग्रह को सूचियों में सजाएँ और महत्वपूर्ण रेडियो पास रखें।", + "favoritesCollection": "संग्रह", + "favoritesSavedCount": "{count} सहेजे गए", + "favoritesRemoveTooltip": "पसंदीदा से हटाएँ", + "favoritesRemovedMessage": "{stationName} पसंदीदा से हटाया गया", "@favoriteGroupsAssignSubtitle": { "placeholders": { "groupName": {} @@ -226,18 +254,18 @@ "stationName": {} } }, - "alarmPostponedCurrentExecution": "Alarm postponed for this occurrence.", + "alarmPostponedCurrentExecution": "इस चाल के लिए अलार्म स्थगित किया गया।", "searchScreenTitle": "सिग्नल खोजें", - "searchScreenSubtitle": "तेज़ फ़िल्टर और उच्च कॉन्ट्रास्ट के साथ नाम, देश या भाषा से स्टेशन खोजें।", + "searchScreenSubtitle": "नाम, देश या भाषा से तेज़ फ़िल्टर और उच्च कंट्रास्ट के साथ रेडियो खोजें।", "searchFiltersLabel": "फ़िल्टर", - "searchHint": "रेडियो होराइज़न, जैज़, समाचार...", + "searchHint": "रेडियो होराइजन, जैज़, समाचार...", "searchCountryFilterLabel": "देश", "searchLanguageFilterLabel": "भाषा", "searchMinQualityFilterLabel": "न्यूनतम गुणवत्ता", - "searchEmptyTitle": "कोई स्टेशन खोजें", - "searchNoResultsTitle": "कोई नतीजा नहीं", - "searchEmptySubtitle": "दुनिया भर के स्टेशन खोजने के लिए ऊपर की बार या चिप्स का इस्तेमाल करें।", - "searchNoResultsSubtitle": "फ़िल्टर हटाकर देखें या सक्रिय स्टेशन खोजने के लिए कोई दूसरा नाम लिखें।", + "searchEmptyTitle": "एक स्टेशन खोजें", + "searchNoResultsTitle": "कोई परिणाम नहीं", + "searchEmptySubtitle": "दुनिया भर के सिग्नल खोजने के लिए ऊपर की बार या चिप्स इस्तेमाल करें।", + "searchNoResultsSubtitle": "सक्रिय सिग्नल पाने के लिए फ़िल्टर हटाएँ या कोई दूसरा नाम लिखें।", "countrySpain": "स्पेन", "countryUsa": "अमेरिका", "countryMexico": "मेक्सिको", @@ -257,9 +285,9 @@ "languageNameJapanese": "जापानी", "languageNameArabic": "अरबी", "languageNameRussian": "रूसी", - "homeScreenSubtitle": "Live global radio with clean signals, smart favorites, and a show-style visual experience.", - "exploreStations": "Explore stations", - "stationsCount": "{count} stations", + "homeScreenSubtitle": "साफ़ सिग्नल, समझदार पसंदीदा और गेम शो जैसी दृश्य अनुभूति के साथ लाइव वैश्विक रेडियो।", + "exploreStations": "स्टेशन देखें", + "stationsCount": "{count} रेडियो", "@stationsCount": { "placeholders": { "count": { @@ -267,36 +295,36 @@ } } }, - "qualityHd": "HD quality", - "nearYou": "Near you", - "nearYouInCountry": "Near you ? {country}", + "qualityHd": "HD गुणवत्ता", + "nearYou": "आपके पास", + "nearYouInCountry": "आपके पास · {country}", "@nearYouInCountry": { "placeholders": { "country": {} } }, - "detectAction": "Detect", - "liveRadar": "Live radar", - "genresTitle": "Genres", - "retryAction": "Retry", - "noStationsAvailable": "No stations available", - "noStationsAvailableSubtitle": "Try refreshing or choosing another genre to capture a signal again.", - "genrePop": "Pop", - "genreRock": "Rock", - "genreJazz": "Jazz", - "genreClassical": "Classical", - "genreElectronic": "Electronic", - "genreNews": "News", - "genreTalk": "Talk", - "genreHipHop": "Hip-hop", - "genreCountry": "Country", - "genreMetal": "Metal", - "genreReggae": "Reggae", - "genreLatin": "Latin", - "alarmScreenTitle": "Music wake-up", - "alarmScreenSubtitle": "Alarms with radio, safe fallback sound, smart vacations, and the next occurrence always visible.", - "createAlarmAction": "Create alarm", - "alarmsCount": "{count} alarms", + "detectAction": "पहचानें", + "liveRadar": "लाइव रडार", + "genresTitle": "शैलियाँ", + "retryAction": "फिर कोशिश करें", + "noStationsAvailable": "कोई स्टेशन उपलब्ध नहीं", + "noStationsAvailableSubtitle": "सिग्नल फिर पकड़ने के लिए रीफ़्रेश करें या दूसरी शैली चुनें।", + "genrePop": "पॉप", + "genreRock": "रॉक", + "genreJazz": "जैज़", + "genreClassical": "शास्त्रीय", + "genreElectronic": "इलेक्ट्रॉनिक", + "genreNews": "समाचार", + "genreTalk": "वार्ता", + "genreHipHop": "हिप-हॉप", + "genreCountry": "कंट्री", + "genreMetal": "मेटल", + "genreReggae": "रेगे", + "genreLatin": "लैटिन", + "alarmScreenTitle": "संगीतमय जागरण", + "alarmScreenSubtitle": "रेडियो अलार्म, सुरक्षित ध्वनि, स्मार्ट छुट्टियाँ और अगली चाल हमेशा दिखाई देती है।", + "createAlarmAction": "अलार्म बनाएँ", + "alarmsCount": "{count} अलार्म", "@alarmsCount": { "placeholders": { "count": { @@ -304,10 +332,10 @@ } } }, - "activeAlarmsWithoutNextTitle": "Active alarms without a next occurrence", - "noActiveAlarms": "No active alarms", - "nextAlarmTitle": "Next alarm", - "activeAlarmsWithoutNextSubtitle": "There are {count} active alarm(s), but they do not currently have a valid future date. Check date, weekdays, and vacations.", + "activeAlarmsWithoutNextTitle": "अगली चाल के बिना सक्रिय अलार्म", + "noActiveAlarms": "कोई सक्रिय अलार्म नहीं", + "nextAlarmTitle": "अगला अलार्म", + "activeAlarmsWithoutNextSubtitle": "{count} सक्रिय अलार्म हैं, लेकिन अभी उनके पास कोई वैध भविष्य तारीख नहीं है। तारीख, दिन और छुट्टियाँ जाँचें।", "@activeAlarmsWithoutNextSubtitle": { "placeholders": { "count": { @@ -315,10 +343,10 @@ } } }, - "createAlarmHint": "Create an alarm and PluriWave will calculate the next occurrence automatically.", - "alarmVacationPlay": "Plays during vacations", - "alarmVacationPause": "Paused during vacations", - "alarmFadeInLabel": "Fade-in {seconds}s", + "createAlarmHint": "एक अलार्म बनाएँ और PluriWave अगली चाल अपने-आप गणना करेगा।", + "alarmVacationPlay": "छुट्टियों में बजे", + "alarmVacationPause": "छुट्टियों में विराम", + "alarmFadeInLabel": "फेड-इन {seconds}से", "@alarmFadeInLabel": { "placeholders": { "seconds": { @@ -326,61 +354,61 @@ } } }, - "alarmNextExecution": "Next occurrence: {date}", + "alarmNextExecution": "अगली चाल: {date}", "@alarmNextExecution": { "placeholders": { "date": {} } }, - "alarmNoNextExecution": "It has no active next occurrence.", - "alarmSkippedExecution": "One occurrence was skipped: {date}.", + "alarmNoNextExecution": "कोई सक्रिय अगली चाल नहीं है।", + "alarmSkippedExecution": "एक चाल छोड़ी गई: {date}।", "@alarmSkippedExecution": { "placeholders": { "date": {} } }, - "editAction": "Edit", - "skipNextAction": "Skip next", - "deleteTooltip": "Delete", - "alarmSkippedNoNextSnackbar": "Alarm skipped. There is no next occurrence left.", - "alarmSkippedReturnsSnackbar": "Alarm skipped. It will return on {date}.", + "editAction": "संपादित करें", + "skipNextAction": "अगला छोड़ें", + "deleteTooltip": "हटाएँ", + "alarmSkippedNoNextSnackbar": "अलार्म छोड़ा गया। कोई अगली चाल बाकी नहीं।", + "alarmSkippedReturnsSnackbar": "अलार्म छोड़ा गया। {date} को वापस आएगा।", "@alarmSkippedReturnsSnackbar": { "placeholders": { "date": {} } }, - "alarmVacationPausedNoNext": "It is paused for vacations ({vacationName}) and has no next occurrence.", + "alarmVacationPausedNoNext": "छुट्टी ({vacationName}) के कारण विराम में है और कोई अगली चाल नहीं है।", "@alarmVacationPausedNoNext": { "placeholders": { "vacationName": {} } }, - "alarmVacationPausedReturns": "It is paused for vacations ({vacationName}) and returns on {date}.", + "alarmVacationPausedReturns": "छुट्टी ({vacationName}) के कारण विराम में है और {date} को लौटेगा।", "@alarmVacationPausedReturns": { "placeholders": { "vacationName": {}, "date": {} } }, - "alarmVacationReturns": "With vacations enabled, it will ring again on {date}.", + "alarmVacationReturns": "छुट्टियाँ सक्रिय होने पर, {date} को फिर बजेगा।", "@alarmVacationReturns": { "placeholders": { "date": {} } }, - "defaultAlarmName": "Music alarm", - "newAlarmTitle": "New alarm", - "editAlarmTitle": "Edit alarm", - "nameField": "Name", - "timeField": "Time", - "dateField": "Date", - "onceOption": "Once", - "dailyOption": "Daily", - "weekdaysOption": "Weekdays", - "soundAndVolumeSection": "Sound and volume", - "alarmFadeInTitle": "Alarm fade-in", - "alarmFadeInOff": "0 s (no transition)", - "alarmFadeInSummary": "{seconds} s (from 5% to the selected volume)", + "defaultAlarmName": "संगीतमय अलार्म", + "newAlarmTitle": "नया अलार्म", + "editAlarmTitle": "अलार्म संपादित करें", + "nameField": "नाम", + "timeField": "समय", + "dateField": "तारीख", + "onceOption": "एक बार", + "dailyOption": "दैनिक", + "weekdaysOption": "दिन", + "soundAndVolumeSection": "ध्वनि और वॉल्यूम", + "alarmFadeInTitle": "अलार्म फेड-इन", + "alarmFadeInOff": "0 से (बिना बदलाव)", + "alarmFadeInSummary": "{seconds} से (5% से चुने हुए वॉल्यूम तक)", "@alarmFadeInSummary": { "placeholders": { "seconds": { @@ -388,22 +416,22 @@ } } }, - "internalSafeSoundLabel": "Internal safe sound", - "soundWarmSunrise": "Warm sunrise", - "soundSoftBell": "Soft bell", - "soundDigitalPulse": "Digital pulse", - "favoriteStationLabel": "Favorite station", - "noStationUseInternalSound": "No station: use internal sound", - "saveFavoritesAlarmHint": "Save stations in Favorites to use them as a music alarm.", - "useCurrentStationAction": "Use current station", - "playDuringVacations": "Play during vacations", - "playDuringVacationsHint": "If you turn this off, the next occurrence will jump to the first valid day.", - "saveAlarmAction": "Save alarm", - "chooseOneWeekdayError": "Choose at least one weekday.", - "androidReliabilityReview": "Review Android reliability", - "statusOk": "OK", - "statusPending": "pending", - "androidReliabilityStatus": "Reliability: exact {exact} ? notifications {notifications} ? screen {screen}", + "internalSafeSoundLabel": "सुरक्षित आंतरिक ध्वनि", + "soundWarmSunrise": "गरम सूर्योदय", + "soundSoftBell": "मुलायम घंटी", + "soundDigitalPulse": "डिजिटल धड़कन", + "favoriteStationLabel": "पसंदीदा स्टेशन", + "noStationUseInternalSound": "कोई स्टेशन नहीं: आंतरिक ध्वनि इस्तेमाल करें", + "saveFavoritesAlarmHint": "उन्हें संगीतमय अलार्म के रूप में इस्तेमाल करने के लिए स्टेशन पसंदीदा में सहेजें।", + "useCurrentStationAction": "वर्तमान स्टेशन इस्तेमाल करें", + "playDuringVacations": "छुट्टियों में बजाएँ", + "playDuringVacationsHint": "इसे बंद करने पर अगली चाल पहले वैध दिन पर चली जाएगी।", + "saveAlarmAction": "अलार्म सहेजें", + "chooseOneWeekdayError": "सप्ताह का कम से कम एक दिन चुनें।", + "androidReliabilityReview": "Android विश्वसनीयता जाँचें", + "statusOk": "ठीक है", + "statusPending": "लंबित", + "androidReliabilityStatus": "विश्वसनीयता: सटीक {exact} · सूचनाएँ {notifications} · स्क्रीन {screen}", "@androidReliabilityStatus": { "placeholders": { "exact": {}, @@ -411,19 +439,165 @@ "screen": {} } }, - "vacationRangesTitle": "Vacation ranges", - "addAction": "Add", - "vacationRangesHint": "If an alarm is set to \"Paused during vacations\", it automatically skips these ranges.", - "noVacationRangesLoaded": "No ranges loaded.", - "deleteRangeTooltip": "Delete range", - "vacationsDefaultName": "Vacation", - "newVacationRangeTitle": "New vacation range", - "startField": "Start", - "endField": "End", - "saveRangeAction": "Save range", - "noAlarmsYetTitle": "There are no alarms yet.", - "noAlarmsYetSubtitle": "Create one to design your musical wake-up.", - "ringingInternalAudioActive": "Playing with internal safe audio.", - "ringingPreparingInternalAudio": "Preparing internal safe audio.", - "stopAlarmAction": "Stop alarm" + "vacationRangesTitle": "छुट्टी की अवधियाँ", + "addAction": "जोड़ें", + "vacationRangesHint": "यदि किसी अलार्म में \"छुट्टियों में विराम\" है, तो ये अवधियाँ अपने-आप छोड़ी जाएँगी।", + "noVacationRangesLoaded": "कोई अवधि लोड नहीं हुई।", + "deleteRangeTooltip": "अवधि हटाएँ", + "vacationsDefaultName": "छुट्टियाँ", + "newVacationRangeTitle": "नई छुट्टी अवधि", + "startField": "शुरुआत", + "endField": "समाप्ति", + "saveRangeAction": "अवधि सहेजें", + "noAlarmsYetTitle": "अभी कोई अलार्म नहीं।", + "noAlarmsYetSubtitle": "अपना संगीतमय जागरण बनाने के लिए एक बनाएँ।", + "ringingInternalAudioActive": "सुरक्षित आंतरिक ध्वनि के साथ बज रहा है।", + "ringingPreparingInternalAudio": "सुरक्षित आंतरिक ध्वनि तैयार हो रही है।", + "stopAlarmAction": "अलार्म रोकें", + "pauseAction": "विराम दें", + "miniPlayerOpenLabel": "{stationName} का प्लेयर खोलें", + "@miniPlayerOpenLabel": { + "placeholders": { + "stationName": {} + } + }, + "playerIconLabel": "प्लेयर", + "playbackStatusConnecting": "कनेक्ट हो रहा है...", + "playbackStatusLive": "लाइव", + "playbackStatusPaused": "विराम पर", + "playbackStatusConnectionError": "कनेक्शन त्रुटि", + "playbackStatusStopped": "बंद", + "stationSemanticLabel": "स्टेशन {stationName}", + "@stationSemanticLabel": { + "placeholders": { + "stationName": {} + } + }, + "favoritesAddTooltip": "पसंदीदा में जोड़ें", + "favoritesAddedMessage": "{stationName} को पसंदीदा में जोड़ा गया", + "@favoritesAddedMessage": { + "placeholders": { + "stationName": {} + } + }, + "stationIconLabel": "स्टेशन आइकन", + "liveNow": "अभी लाइव", + "equalizerBandLabel": "बैंड {band}", + "@equalizerBandLabel": { + "placeholders": { + "band": {} + } + }, + "equalizerBandValue": "{value} डेसिबल", + "@equalizerBandValue": { + "placeholders": { + "value": {} + } + }, + "equalizerPresetFlat": "समतल", + "equalizerPresetRock": "रॉक", + "equalizerPresetPop": "पॉप", + "equalizerPresetBassBoost": "बास बढ़ाएँ", + "equalizerPresetJazz": "जैज़", + "equalizerPresetVoice": "आवाज़", + "equalizerPresetCustom": "कस्टम", + "onboardingTitle": "PluriWave में आपका स्वागत है", + "onboardingNewsTitle": "नया क्या है", + "onboardingStartAction": "शुरू करें", + "onboardingCloseTooltip": "बंद करें", + "radioRecordingError": "रेडियो रिकॉर्ड करते समय त्रुटि: {error}", + "@radioRecordingError": { + "placeholders": { + "error": {} + } + }, + "radioApiConnectionError": "रेडियो एपीआई से कनेक्शन नहीं है", + "radioSearchError": "खोज त्रुटि। अपना कनेक्शन जाँचें।", + "radioLoadMoreStationsError": "और स्टेशन लोड नहीं हो सके।", + "radioNearbyStationsError": "हम आस-पास के स्टेशन नहीं खोज सके। देश के फ़िल्टर इस्तेमाल करें।", + "radioCannotPlayStation": "\"{stationName}\" नहीं चलाया जा सकता", + "@radioCannotPlayStation": { + "placeholders": { + "stationName": {} + } + }, + "recordingSelectStationFirst": "रिकॉर्ड करने से पहले कोई स्टेशन चुनें।", + "recordingStartError": "रिकॉर्डिंग शुरू नहीं हो सकी: {error}", + "@recordingStartError": { + "placeholders": { + "error": {} + } + }, + "unsupportedConfigVersion": "कॉन्फ़िगरेशन संस्करण समर्थित नहीं है", + "audioErrorGeneric": "चलाने में त्रुटि", + "audioErrorNoInternet": "इंटरनेट कनेक्शन नहीं है", + "audioErrorInvalidUrl": "रेडियो का पता मान्य नहीं है", + "audioErrorNotFound": "रेडियो उपलब्ध नहीं है (404 त्रुटि)", + "audioErrorTimeout": "कनेक्शन का समय समाप्त हो गया", + "audioErrorCannotConnect": "रेडियो से कनेक्ट नहीं हो सकता", + "audioErrorUnsupportedFormat": "स्ट्रीम स्वरूप समर्थित नहीं है", + "audioErrorDecode": "ऑडियो स्ट्रीम डिकोड करने में त्रुटि", + "audioErrorCleartext": "यह रेडियो बिना एन्क्रिप्शन वाला HTTP इस्तेमाल करता है, जिसकी अनुमति नहीं है", + "audioErrorSsl": "रेडियो पर SSL प्रमाणपत्र अमान्य है", + "audioErrorCannotPlay": "यह रेडियो नहीं चलाया जा सकता", + "audioErrorUnexpectedPlayback": "चलाते समय अनपेक्षित त्रुटि", + "androidExactAlarmScheduleError": "ऐंड्रॉयड सटीक अलार्म निर्धारित नहीं कर सका। सटीक अलार्म की अनुमति जाँचें।", + "recordingPathEmptyError": "रिकॉर्डिंग पथ खाली नहीं हो सकता", + "recordingMaxSizeInvalidError": "अधिकतम आकार शून्य से बड़ा होना चाहिए", + "recordingAlreadyActiveError": "एक रिकॉर्डिंग पहले से चल रही है", + "alarmRingingFallbackActive": "आंतरिक सुरक्षित ऑडियो के साथ चल रहा है।", + "alarmRingingPreparingFallback": "आंतरिक सुरक्षित ऑडियो तैयार किया जा रहा है।", + "alarmRingingTryingStation": "आपका स्टेशन उपलब्ध सर्वोच्च गुणवत्ता में चलाने की कोशिश की जा रही है।", + "alarmScheduleOnce": "एक बार · {date}", + "@alarmScheduleOnce": { + "placeholders": { + "date": {} + } + }, + "alarmScheduleWeekdays": "दिन: {days}", + "@alarmScheduleWeekdays": { + "placeholders": { + "days": {} + } + }, + "androidReliabilityTitle": "Android विश्वसनीयता जाँचें", + "closeAction": "बंद करें", + "customOption": "कस्टम", + "endLabel": "समाप्ति", + "equalizerDisable": "इक्वलाइज़र बंद करें", + "helpTitle": "मदद और ट्यूटोरियल", + "helpSubtitle": "PluriWave की सुविधाएँ, सुझाव और नया क्या है देखें।", + "indefiniteOption": "अनिश्चित", + "invalidNumber": "अमान्य संख्या", + "nameLabel": "नाम", + "notPlaying": "नहीं चल रहा", + "oneTimeOption": "एक बार", + "pausePlaybackTooltip": "प्लेबैक रोकें", + "qualityOriginal": "मूल गुणवत्ता: {quality}", + "@qualityOriginal": { + "placeholders": { + "quality": {} + } + }, + "qualityUnknown": "गुणवत्ता उपलब्ध नहीं", + "recordAction": "रिकॉर्ड करें", + "recordDurationTitle": "रिकॉर्डिंग अवधि", + "recordRadioSubtitle": "रिकॉर्डिंग की अवधि चुनें।", + "recordRadioTitle": "रेडियो रिकॉर्ड करें", + "recordingActiveTitle": "रेडियो रिकॉर्ड हो रहा है", + "recordingDirectTitle": "सीधी रिकॉर्डिंग", + "recordingsOpenFolderPlainError": "रिकॉर्डिंग फ़ोल्डर नहीं खुल सका", + "recordingsOpenLatest": "नई रिकॉर्डिंग खोलें", + "recordingsOpenLatestError": "नई रिकॉर्डिंग नहीं खुल सकी", + "startLabel": "शुरुआत", + "startPlaybackTooltip": "प्लेबैक शुरू करें", + "stopAction": "रोकें", + "stopPlaybackTooltip": "प्लेबैक रोकें", + "weekdayShortMonday": "सोम", + "weekdayShortTuesday": "मंगल", + "weekdayShortWednesday": "बुध", + "weekdayShortThursday": "गुरु", + "weekdayShortFriday": "शुक्र", + "weekdayShortSaturday": "शनि", + "weekdayShortSunday": "रवि" } diff --git a/lib/l10n/app_id.arb b/lib/l10n/app_id.arb index 5c40cfe..41bf06b 100644 --- a/lib/l10n/app_id.arb +++ b/lib/l10n/app_id.arb @@ -6,28 +6,55 @@ "navFavorites": "Favorit", "navAlarms": "Alarm", "navSettings": "Pengaturan", - "actionOk": "OK", + "actionOk": "Oke", "sleepTimer": "Timer tidur", - "sleepTimerDescription": "Smooth radio shutdown with an exact countdown.", - "cancelTimer": "Cancel timer", - "optionOther": "Other", - "customDurationTitle": "Custom duration", - "durationGreaterThanZero": "Choose a duration greater than zero.", - "hoursLabel": "Hours", - "minutesLabel": "Minutes", - "secondsLabel": "Seconds", - "saveQuickAccess": "Save as quick access", - "startTimer": "Start timer", - "skipCurrentAlarmExecution": "Skipped this execution of {alarmName}.", + "sleepTimerDescription": "Mematikan radio secara lembut dengan hitung mundur yang tepat.", + "cancelTimer": "Batalkan timer", + "optionOther": "Lainnya", + "customDurationTitle": "Durasi khusus", + "durationGreaterThanZero": "Pilih durasi yang lebih besar dari nol.", + "hoursLabel": "Jam", + "minutesLabel": "Menit", + "secondsLabel": "Detik", + "durationHoursMinutesSeconds": "{hours} jam {minutes} mnt {seconds} dtk", + "@durationHoursMinutesSeconds": { + "placeholders": { + "hours": {}, + "minutes": {}, + "seconds": {} + } + }, + "durationMinutesSeconds": "{minutes} mnt {seconds} dtk", + "@durationMinutesSeconds": { + "placeholders": { + "minutes": {}, + "seconds": {} + } + }, + "durationMinutesOnly": "{minutes} mnt", + "@durationMinutesOnly": { + "placeholders": { + "minutes": {} + } + }, + "durationSecondsOnly": "{seconds} dtk", + "@durationSecondsOnly": { + "placeholders": { + "seconds": {} + } + }, + "saveQuickAccess": "Simpan sebagai akses cepat", + "startTimer": "Mulai timer", + "skipCurrentAlarmExecution": "Eksekusi {alarmName} kali ini dilewati.", "@skipCurrentAlarmExecution": { "placeholders": { "alarmName": {} } }, "settingsTitle": "Pengaturan", - "settingsSubtitle": "Kontrol suara, cadangan, dan stasiun khusus secara detail.", + "settingsSubtitle": "Kontrol halus untuk suara, cadangan, dan stasiun khusus.", "languageSectionTitle": "Bahasa", - "languageSectionDescription": "Pilih bahasa tampilan aplikasi.", + "languageSectionDescription": "Pilih bagaimana bahasa aplikasi ditampilkan.", "languageSystemDefault": "Sistem", "languageSpanish": "Spanyol", "languageEnglish": "Inggris", @@ -38,70 +65,71 @@ } }, "languageUpdatedSystem": "Bahasa diperbarui: Sistem", - "timerSectionTitle": "Sleep timer", - "timerSectionAdd": "Add", - "timerSectionDescription": "Customize the quick presets shown when automatically stopping the radio.", - "timerSectionRestoreRecommended": "Restore recommended times", - "newQuickAccessTitle": "New quick access", - "saveQuickAccessButton": "Save quick access", - "settingsSafeStatus": "Safe", - "recordingsSectionTitle": "Recordings", - "recordingsFolderDialogTitle": "Select recordings folder", - "recordingsPathUpdated": "Recording path updated", - "recordingsPathSaveError": "Could not save the path: {error}", - "recordingsDefaultFolderRestored": "The internal default folder will be used", - "recordingsFolderTitle": "Recordings folder", - "recordingsPathCalculating": "Calculating path...", - "recordingsChangePath": "Change path", - "recordingsUseDefaultPath": "Use default path", - "recordingsOriginalStreamHint": "The radio is saved from the original stream, without recompressing.", - "equalizerActive": "Active", - "equalizerDisabled": "Disabled", - "equalizerEnable": "Enable equalizer", - "equalizerRealtimeSubtitle": "Changes are applied in real time to the current station.", - "equalizerPendingSubtitle": "Changes are saved and will apply when Android enables the effect.", - "equalizerPerStationTitle": "Use custom EQ for this favorite", - "equalizerPerStationActive": "Active for {stationName}", - "equalizerPerStationMain": "Using main EQ for {stationName}", - "preferredStationTitle": "Preferred station", - "preferredStationDescription": "Preselected for new alarms and available for quick playback.", - "preferredStationNoStationsTitle": "No stations available yet", - "preferredStationNoStationsSubtitle": "Save favorites or load stations to choose a preferred one.", - "preferredStationAutomaticFallback": "Automatic fallback", - "preferredStationDefaultFavorite": "Default favorite", - "preferredStationCurrent": "Current preferred: {stationName}", - "preferredStationAutoUsing": "No favorites: automatically using {stationName}", - "preferredStationPlay": "Play preferred", - "customStationsTitle": "Custom stations", - "customStationsAdd": "Add", - "customStationsEmpty": "No custom stations.", - "playAction": "Play", - "deleteAction": "Delete", - "addStationTitle": "Add station", - "stationNameLabel": "Name *", - "requiredField": "Required field", - "streamUrlLabel": "Stream URL *", - "invalidUrl": "Invalid URL", - "countryOptionalLabel": "Country (optional)", - "saveStation": "Save station", - "backupSectionTitle": "Backup", - "backupExportTitle": "Export configuration", - "backupExportSubtitle": "Favorites, custom stations, and EQ presets", - "backupImportTitle": "Import configuration", - "backupImportSubtitle": "Restore from a backup file", - "backupShareSubject": "PluriWave — backup", - "backupShareText": "PluriWave configuration exported on {date}", - "backupExportError": "Export error: {error}", - "backupImportConfirmMessage": "This will add favorites, stations, and presets from the file. Continue?", - "backupImportSuccess": "Configuration imported successfully", - "backupImportError": "Import error: {error}", - "appVersionLoading": "Loading version...", - "appVersionSubtitle": "{version} - World radio", - "savedFavoritesTitle": "Saved favorites", - "stationFilterTitle": "Station filter", - "stationFilterSubtitle": "Only stations verified as active", - "backgroundAudioTitle": "Background audio", - "backgroundAudioSubtitle": "Continues when the screen turns off", + "timerSectionTitle": "Timer tidur", + "timerSectionAdd": "Tambah", + "timerSectionDescription": "Sesuaikan pintasan cepat yang muncul saat radio dimatikan otomatis.", + "timerSectionRestoreRecommended": "Pulihkan waktu yang disarankan", + "newQuickAccessTitle": "Akses cepat baru", + "saveQuickAccessButton": "Simpan akses cepat", + "settingsSafeStatus": "Aman", + "recordingsSectionTitle": "Rekaman", + "recordingsFolderDialogTitle": "Pilih folder rekaman", + "recordingsPathUpdated": "Jalur rekaman diperbarui", + "recordingsPathSaveError": "Tidak dapat menyimpan jalur: {error}", + "recordingsDefaultFolderRestored": "Folder internal bawaan akan digunakan", + "recordingsFolderTitle": "Folder rekaman", + "recordingsPathCalculating": "Menghitung jalur...", + "recordingsChangePath": "Ubah jalur", + "recordingsUseDefaultPath": "Gunakan jalur bawaan", + "recordingsOriginalStreamHint": "Radio disimpan dari stream asli, tanpa kompresi ulang.", + "equalizerActive": "Aktif", + "equalizerDisabled": "Nonaktif", + "equalizerEnable": "Aktifkan equalizer", + "equalizerRealtimeSubtitle": "Perubahan diterapkan secara langsung ke stasiun saat ini.", + "equalizerPendingSubtitle": "Perubahan disimpan dan akan diterapkan saat Android mengaktifkan efek.", + "equalizerPerStationTitle": "Gunakan EQ khusus untuk favorit ini", + "equalizerPerStationActive": "Aktif untuk {stationName}", + "equalizerPerStationMain": "Menggunakan EQ utama untuk {stationName}", + "preferredStationTitle": "Stasiun pilihan", + "preferredStationDescription": "Dipilih lebih dulu saat membuat alarm dan dapat dimulai sebagai pemutaran cepat.", + "preferredStationNoStationsTitle": "Belum ada stasiun yang tersedia", + "preferredStationNoStationsSubtitle": "Simpan favorit atau muat stasiun untuk memilih stasiun pilihan.", + "preferredStationAutomaticFallback": "Cadangan otomatis", + "preferredStationDefaultFavorite": "Favorit bawaan", + "preferredStationCurrent": "Pilihan saat ini: {stationName}", + "preferredStationAutoUsing": "Tidak ada favorit: otomatis menggunakan {stationName}", + "preferredStationPlay": "Putar pilihan", + "customStationsTitle": "Stasiun khusus", + "customStationsAdd": "Tambah", + "customStationsEmpty": "Tidak ada stasiun khusus.", + "playAction": "Putar", + "deleteAction": "Hapus", + "addStationTitle": "Tambah stasiun", + "stationNameLabel": "Nama *", + "unnamedStation": "Stasiun tanpa nama", + "requiredField": "Kolom wajib", + "streamUrlLabel": "URL stream *", + "invalidUrl": "URL tidak valid", + "countryOptionalLabel": "Negara (opsional)", + "saveStation": "Simpan stasiun", + "backupSectionTitle": "Cadangan", + "backupExportTitle": "Ekspor pengaturan", + "backupExportSubtitle": "Favorit, stasiun khusus, dan preset EQ", + "backupImportTitle": "Impor pengaturan", + "backupImportSubtitle": "Pulihkan dari berkas cadangan", + "backupShareSubject": "PluriWave — cadangan", + "backupShareText": "Pengaturan PluriWave diekspor pada {date}", + "backupExportError": "Kesalahan saat mengekspor: {error}", + "backupImportConfirmMessage": "Ini akan menambahkan favorit, stasiun, dan preset dari berkas. Lanjutkan?", + "backupImportSuccess": "Pengaturan berhasil diimpor", + "backupImportError": "Kesalahan saat mengimpor: {error}", + "appVersionLoading": "Memuat versi...", + "appVersionSubtitle": "{version} - Radio dunia", + "savedFavoritesTitle": "Favorit tersimpan", + "stationFilterTitle": "Filter stasiun", + "stationFilterSubtitle": "Hanya stasiun yang terverifikasi aktif", + "backgroundAudioTitle": "Audio latar belakang", + "backgroundAudioSubtitle": "Tetap berjalan saat layar dimatikan", "dash": "—", "@recordingsPathSaveError": { "placeholders": { @@ -150,13 +178,13 @@ }, "cancelAction": "Batal", "equalizerTitle": "Equalizer", - "recordingsOpenFolder": "Open folder", - "recordingsOpenFolderError": "Could not open the folder: {error}", - "recordingsMaxSizeTitle": "Maximum recording size", - "recordingsMaxSizeSubtitle": "Current limit: {size} MB", - "recordingsMaxSizeDialogTitle": "Maximum size per recording", - "recordingsMaxSizeMbLabel": "Maximum megabytes", - "recordingsMaxSizeSaved": "Recording limit updated to {size} MB", + "recordingsOpenFolder": "Buka folder", + "recordingsOpenFolderError": "Tidak dapat membuka folder: {error}", + "recordingsMaxSizeTitle": "Ukuran rekaman maksimum", + "recordingsMaxSizeSubtitle": "Batas saat ini: {size} MB", + "recordingsMaxSizeDialogTitle": "Ukuran maksimum per rekaman", + "recordingsMaxSizeMbLabel": "Megabyte maksimum", + "recordingsMaxSizeSaved": "Batas rekaman diperbarui menjadi {size} MB", "@recordingsOpenFolderError": { "placeholders": { "error": {} @@ -176,33 +204,33 @@ } } }, - "stationOrderTitle": "Station order", - "stationOrderByName": "By name", - "stationOrderByQuality": "By quality", - "stationOrderScopeDescription": "Applies to favorites, searches, nearby stations and quick lists.", - "favoriteGroupsTitle": "Favorite lists", - "favoriteGroupsDescription": "Create short lists to organize your saved stations.", - "favoriteGroupsAdd": "Add list", - "favoriteGroupsEdit": "Edit list", - "favoriteGroupsDelete": "Delete list", - "favoriteGroupsNameLabel": "List name", - "favoriteGroupsNameTooLong": "Maximum 28 characters.", - "favoriteGroupsUnassigned": "Unassigned", - "favoriteGroupsProtectedHint": "Default list: it cannot be edited or deleted.", - "favoriteGroupsCreated": "List created", - "favoriteGroupsUpdated": "List updated", - "favoriteGroupsDeleted": "List deleted; its stations return to Unassigned.", - "favoriteGroupsAssign": "Move to list", - "favoriteGroupsAssignSubtitle": "Current list: {groupName}", - "favoriteGroupsAssigned": "{stationName} moved to {groupName}", - "favoritesTitle": "Favorites", - "favoritesEmptyTitle": "No favorites yet", - "favoritesEmptySubtitle": "Tap the heart on any station to save it to your collection.", - "favoritesHeaderSubtitle": "Organize your collection by lists and keep important radios close.", - "favoritesCollection": "Collection", - "favoritesSavedCount": "{count} saved", - "favoritesRemoveTooltip": "Remove from favorites", - "favoritesRemovedMessage": "{stationName} removed from favorites", + "stationOrderTitle": "Urutan stasiun", + "stationOrderByName": "Berdasarkan nama", + "stationOrderByQuality": "Berdasarkan kualitas", + "stationOrderScopeDescription": "Berlaku untuk favorit, pencarian, stasiun terdekat, dan daftar cepat.", + "favoriteGroupsTitle": "Daftar favorit", + "favoriteGroupsDescription": "Buat daftar pendek untuk mengatur stasiun tersimpan.", + "favoriteGroupsAdd": "Tambah daftar", + "favoriteGroupsEdit": "Edit daftar", + "favoriteGroupsDelete": "Hapus daftar", + "favoriteGroupsNameLabel": "Nama daftar", + "favoriteGroupsNameTooLong": "Maksimum 28 karakter.", + "favoriteGroupsUnassigned": "Belum ditetapkan", + "favoriteGroupsProtectedHint": "Daftar bawaan: tidak dapat diedit atau dihapus.", + "favoriteGroupsCreated": "Daftar dibuat", + "favoriteGroupsUpdated": "Daftar diperbarui", + "favoriteGroupsDeleted": "Daftar dihapus; stasiunnya kembali ke Belum ditetapkan.", + "favoriteGroupsAssign": "Pindahkan ke daftar", + "favoriteGroupsAssignSubtitle": "Daftar saat ini: {groupName}", + "favoriteGroupsAssigned": "{stationName} dipindahkan ke {groupName}", + "favoritesTitle": "Favorit", + "favoritesEmptyTitle": "Belum ada favorit", + "favoritesEmptySubtitle": "Ketuk hati di stasiun mana pun untuk menyimpannya ke koleksi Anda.", + "favoritesHeaderSubtitle": "Atur koleksi Anda dengan daftar dan dekatkan radio penting.", + "favoritesCollection": "Koleksi", + "favoritesSavedCount": "{count} tersimpan", + "favoritesRemoveTooltip": "Hapus dari favorit", + "favoritesRemovedMessage": "{stationName} dihapus dari favorit", "@favoriteGroupsAssignSubtitle": { "placeholders": { "groupName": {} @@ -226,23 +254,23 @@ "stationName": {} } }, - "alarmPostponedCurrentExecution": "Alarm postponed for this occurrence.", + "alarmPostponedCurrentExecution": "Alarm ditunda untuk eksekusi ini.", "searchScreenTitle": "Cari sinyal", - "searchScreenSubtitle": "Temukan stasiun berdasarkan nama, negara, atau bahasa dengan filter cepat dan kontras tinggi.", + "searchScreenSubtitle": "Temukan radio berdasarkan nama, negara, atau bahasa dengan filter cepat dan kontras tinggi.", "searchFiltersLabel": "Filter", - "searchHint": "Radio Horizon, jazz, berita...", + "searchHint": "Radio Horizonte, jazz, berita...", "searchCountryFilterLabel": "Negara", "searchLanguageFilterLabel": "Bahasa", "searchMinQualityFilterLabel": "Kualitas minimum", "searchEmptyTitle": "Cari stasiun", "searchNoResultsTitle": "Tidak ada hasil", - "searchEmptySubtitle": "Gunakan bilah atas atau chip untuk menemukan stasiun dari seluruh dunia.", - "searchNoResultsSubtitle": "Coba hapus filter atau ketik nama lain untuk menemukan stasiun yang aktif.", + "searchEmptySubtitle": "Gunakan bilah atas atau chip untuk menemukan sinyal dari seluruh dunia.", + "searchNoResultsSubtitle": "Coba hapus filter atau tulis nama lain untuk menemukan sinyal aktif.", "countrySpain": "Spanyol", "countryUsa": "Amerika Serikat", "countryMexico": "Meksiko", "countryArgentina": "Argentina", - "countryUk": "Britania Raya", + "countryUk": "Inggris Raya", "countryFrance": "Prancis", "countryGermany": "Jerman", "countryItaly": "Italia", @@ -257,9 +285,9 @@ "languageNameJapanese": "Jepang", "languageNameArabic": "Arab", "languageNameRussian": "Rusia", - "homeScreenSubtitle": "Live global radio with clean signals, smart favorites, and a show-style visual experience.", - "exploreStations": "Explore stations", - "stationsCount": "{count} stations", + "homeScreenSubtitle": "Radio global langsung dengan sinyal bersih, favorit cerdas, dan pengalaman visual bergaya kuis.", + "exploreStations": "Jelajahi stasiun", + "stationsCount": "{count} radio", "@stationsCount": { "placeholders": { "count": { @@ -267,36 +295,36 @@ } } }, - "qualityHd": "HD quality", - "nearYou": "Near you", - "nearYouInCountry": "Near you ? {country}", + "qualityHd": "Kualitas HD", + "nearYou": "Di dekat Anda", + "nearYouInCountry": "Di dekat Anda · {country}", "@nearYouInCountry": { "placeholders": { "country": {} } }, - "detectAction": "Detect", - "liveRadar": "Live radar", - "genresTitle": "Genres", - "retryAction": "Retry", - "noStationsAvailable": "No stations available", - "noStationsAvailableSubtitle": "Try refreshing or choosing another genre to capture a signal again.", + "detectAction": "Deteksi", + "liveRadar": "Radar langsung", + "genresTitle": "Genre", + "retryAction": "Coba lagi", + "noStationsAvailable": "Tidak ada stasiun tersedia", + "noStationsAvailableSubtitle": "Coba segarkan atau pilih genre lain untuk menangkap sinyal kembali.", "genrePop": "Pop", "genreRock": "Rock", "genreJazz": "Jazz", - "genreClassical": "Classical", - "genreElectronic": "Electronic", - "genreNews": "News", - "genreTalk": "Talk", + "genreClassical": "Klasik", + "genreElectronic": "Elektronik", + "genreNews": "Berita", + "genreTalk": "Obrolan", "genreHipHop": "Hip-hop", "genreCountry": "Country", "genreMetal": "Metal", "genreReggae": "Reggae", "genreLatin": "Latin", - "alarmScreenTitle": "Music wake-up", - "alarmScreenSubtitle": "Alarms with radio, safe fallback sound, smart vacations, and the next occurrence always visible.", - "createAlarmAction": "Create alarm", - "alarmsCount": "{count} alarms", + "alarmScreenTitle": "Bangun dengan musik", + "alarmScreenSubtitle": "Alarm dengan radio, suara aman, liburan cerdas, dan eksekusi berikutnya selalu terlihat.", + "createAlarmAction": "Buat alarm", + "alarmsCount": "{count} alarm", "@alarmsCount": { "placeholders": { "count": { @@ -304,10 +332,10 @@ } } }, - "activeAlarmsWithoutNextTitle": "Active alarms without a next occurrence", - "noActiveAlarms": "No active alarms", - "nextAlarmTitle": "Next alarm", - "activeAlarmsWithoutNextSubtitle": "There are {count} active alarm(s), but they do not currently have a valid future date. Check date, weekdays, and vacations.", + "activeAlarmsWithoutNextTitle": "Alarm aktif tanpa eksekusi berikutnya", + "noActiveAlarms": "Tidak ada alarm aktif", + "nextAlarmTitle": "Alarm berikutnya", + "activeAlarmsWithoutNextSubtitle": "Ada {count} alarm aktif, tetapi saat ini tidak memiliki tanggal valid di masa depan. Periksa tanggal, hari, dan liburan.", "@activeAlarmsWithoutNextSubtitle": { "placeholders": { "count": { @@ -315,10 +343,10 @@ } } }, - "createAlarmHint": "Create an alarm and PluriWave will calculate the next occurrence automatically.", - "alarmVacationPlay": "Plays during vacations", - "alarmVacationPause": "Paused during vacations", - "alarmFadeInLabel": "Fade-in {seconds}s", + "createAlarmHint": "Buat alarm dan PluriWave akan menghitung eksekusi berikutnya secara otomatis.", + "alarmVacationPlay": "Berbunyi saat liburan", + "alarmVacationPause": "Jeda saat liburan", + "alarmFadeInLabel": "Fade-in {seconds}d", "@alarmFadeInLabel": { "placeholders": { "seconds": { @@ -326,61 +354,61 @@ } } }, - "alarmNextExecution": "Next occurrence: {date}", + "alarmNextExecution": "Eksekusi berikutnya: {date}", "@alarmNextExecution": { "placeholders": { "date": {} } }, - "alarmNoNextExecution": "It has no active next occurrence.", - "alarmSkippedExecution": "One occurrence was skipped: {date}.", + "alarmNoNextExecution": "Tidak memiliki eksekusi aktif berikutnya.", + "alarmSkippedExecution": "Satu eksekusi dilewati: {date}.", "@alarmSkippedExecution": { "placeholders": { "date": {} } }, "editAction": "Edit", - "skipNextAction": "Skip next", - "deleteTooltip": "Delete", - "alarmSkippedNoNextSnackbar": "Alarm skipped. There is no next occurrence left.", - "alarmSkippedReturnsSnackbar": "Alarm skipped. It will return on {date}.", + "skipNextAction": "Lewati berikutnya", + "deleteTooltip": "Hapus", + "alarmSkippedNoNextSnackbar": "Alarm dilewati. Tidak ada eksekusi berikutnya.", + "alarmSkippedReturnsSnackbar": "Alarm dilewati. Akan kembali pada {date}.", "@alarmSkippedReturnsSnackbar": { "placeholders": { "date": {} } }, - "alarmVacationPausedNoNext": "It is paused for vacations ({vacationName}) and has no next occurrence.", + "alarmVacationPausedNoNext": "Dijeda karena liburan ({vacationName}) dan tanpa eksekusi berikutnya.", "@alarmVacationPausedNoNext": { "placeholders": { "vacationName": {} } }, - "alarmVacationPausedReturns": "It is paused for vacations ({vacationName}) and returns on {date}.", + "alarmVacationPausedReturns": "Dijeda karena liburan ({vacationName}) dan akan kembali pada {date}.", "@alarmVacationPausedReturns": { "placeholders": { "vacationName": {}, "date": {} } }, - "alarmVacationReturns": "With vacations enabled, it will ring again on {date}.", + "alarmVacationReturns": "Dengan liburan aktif, akan berbunyi lagi pada {date}.", "@alarmVacationReturns": { "placeholders": { "date": {} } }, - "defaultAlarmName": "Music alarm", - "newAlarmTitle": "New alarm", + "defaultAlarmName": "Alarm musik", + "newAlarmTitle": "Alarm baru", "editAlarmTitle": "Edit alarm", - "nameField": "Name", - "timeField": "Time", - "dateField": "Date", - "onceOption": "Once", - "dailyOption": "Daily", - "weekdaysOption": "Weekdays", - "soundAndVolumeSection": "Sound and volume", - "alarmFadeInTitle": "Alarm fade-in", - "alarmFadeInOff": "0 s (no transition)", - "alarmFadeInSummary": "{seconds} s (from 5% to the selected volume)", + "nameField": "Nama", + "timeField": "Waktu", + "dateField": "Tanggal", + "onceOption": "Sekali", + "dailyOption": "Harian", + "weekdaysOption": "Hari", + "soundAndVolumeSection": "Suara dan volume", + "alarmFadeInTitle": "Fade-in alarm", + "alarmFadeInOff": "0 d (tanpa transisi)", + "alarmFadeInSummary": "{seconds} d (dari 5% ke volume terpilih)", "@alarmFadeInSummary": { "placeholders": { "seconds": { @@ -388,22 +416,22 @@ } } }, - "internalSafeSoundLabel": "Internal safe sound", - "soundWarmSunrise": "Warm sunrise", - "soundSoftBell": "Soft bell", - "soundDigitalPulse": "Digital pulse", - "favoriteStationLabel": "Favorite station", - "noStationUseInternalSound": "No station: use internal sound", - "saveFavoritesAlarmHint": "Save stations in Favorites to use them as a music alarm.", - "useCurrentStationAction": "Use current station", - "playDuringVacations": "Play during vacations", - "playDuringVacationsHint": "If you turn this off, the next occurrence will jump to the first valid day.", - "saveAlarmAction": "Save alarm", - "chooseOneWeekdayError": "Choose at least one weekday.", - "androidReliabilityReview": "Review Android reliability", - "statusOk": "OK", - "statusPending": "pending", - "androidReliabilityStatus": "Reliability: exact {exact} ? notifications {notifications} ? screen {screen}", + "internalSafeSoundLabel": "Suara internal aman", + "soundWarmSunrise": "Matahari terbit hangat", + "soundSoftBell": "Lonceng lembut", + "soundDigitalPulse": "Denyut digital", + "favoriteStationLabel": "Stasiun favorit", + "noStationUseInternalSound": "Tanpa stasiun: gunakan suara internal", + "saveFavoritesAlarmHint": "Simpan stasiun ke Favorit untuk digunakan sebagai alarm musik.", + "useCurrentStationAction": "Gunakan stasiun saat ini", + "playDuringVacations": "Bunyi saat liburan", + "playDuringVacationsHint": "Jika dimatikan, eksekusi berikutnya akan melompat ke hari valid pertama.", + "saveAlarmAction": "Simpan alarm", + "chooseOneWeekdayError": "Pilih setidaknya satu hari dalam seminggu.", + "androidReliabilityReview": "Tinjau keandalan Android", + "statusOk": "Oke", + "statusPending": "tertunda", + "androidReliabilityStatus": "Keandalan: tepat {exact} · notifikasi {notifications} · layar {screen}", "@androidReliabilityStatus": { "placeholders": { "exact": {}, @@ -411,19 +439,165 @@ "screen": {} } }, - "vacationRangesTitle": "Vacation ranges", - "addAction": "Add", - "vacationRangesHint": "If an alarm is set to \"Paused during vacations\", it automatically skips these ranges.", - "noVacationRangesLoaded": "No ranges loaded.", - "deleteRangeTooltip": "Delete range", - "vacationsDefaultName": "Vacation", - "newVacationRangeTitle": "New vacation range", - "startField": "Start", - "endField": "End", - "saveRangeAction": "Save range", - "noAlarmsYetTitle": "There are no alarms yet.", - "noAlarmsYetSubtitle": "Create one to design your musical wake-up.", - "ringingInternalAudioActive": "Playing with internal safe audio.", - "ringingPreparingInternalAudio": "Preparing internal safe audio.", - "stopAlarmAction": "Stop alarm" + "vacationRangesTitle": "Rentang liburan", + "addAction": "Tambah", + "vacationRangesHint": "Jika sebuah alarm memiliki \"Jeda saat liburan\", rentang ini dilewati otomatis.", + "noVacationRangesLoaded": "Tidak ada rentang dimuat.", + "deleteRangeTooltip": "Hapus rentang", + "vacationsDefaultName": "Liburan", + "newVacationRangeTitle": "Rentang liburan baru", + "startField": "Mulai", + "endField": "Akhir", + "saveRangeAction": "Simpan rentang", + "noAlarmsYetTitle": "Belum ada alarm.", + "noAlarmsYetSubtitle": "Buat satu untuk merancang bangun tidur musikal Anda.", + "ringingInternalAudioActive": "Berbunyi dengan audio internal aman.", + "ringingPreparingInternalAudio": "Menyiapkan audio internal aman.", + "stopAlarmAction": "Hentikan alarm", + "pauseAction": "Jeda", + "miniPlayerOpenLabel": "Buka pemutar untuk {stationName}", + "@miniPlayerOpenLabel": { + "placeholders": { + "stationName": {} + } + }, + "playerIconLabel": "Pemutar", + "playbackStatusConnecting": "Menghubungkan...", + "playbackStatusLive": "Siaran langsung", + "playbackStatusPaused": "Dijeda", + "playbackStatusConnectionError": "Kesalahan koneksi", + "playbackStatusStopped": "Dihentikan", + "stationSemanticLabel": "Stasiun {stationName}", + "@stationSemanticLabel": { + "placeholders": { + "stationName": {} + } + }, + "favoritesAddTooltip": "Tambahkan ke favorit", + "favoritesAddedMessage": "{stationName} ditambahkan ke favorit", + "@favoritesAddedMessage": { + "placeholders": { + "stationName": {} + } + }, + "stationIconLabel": "Ikon stasiun", + "liveNow": "Sedang siaran langsung", + "equalizerBandLabel": "Pita {band}", + "@equalizerBandLabel": { + "placeholders": { + "band": {} + } + }, + "equalizerBandValue": "{value} desibel", + "@equalizerBandValue": { + "placeholders": { + "value": {} + } + }, + "equalizerPresetFlat": "Datar", + "equalizerPresetRock": "Rock", + "equalizerPresetPop": "Pop", + "equalizerPresetBassBoost": "Penguat bass", + "equalizerPresetJazz": "Jazz", + "equalizerPresetVoice": "Suara", + "equalizerPresetCustom": "Kustom", + "onboardingTitle": "Selamat datang di PluriWave", + "onboardingNewsTitle": "Yang baru", + "onboardingStartAction": "Mulai", + "onboardingCloseTooltip": "Tutup", + "radioRecordingError": "Kesalahan saat merekam radio: {error}", + "@radioRecordingError": { + "placeholders": { + "error": {} + } + }, + "radioApiConnectionError": "Tidak ada koneksi ke antarmuka pemrograman aplikasi radio", + "radioSearchError": "Kesalahan pencarian. Periksa koneksi Anda.", + "radioLoadMoreStationsError": "Tidak dapat memuat lebih banyak stasiun.", + "radioNearbyStationsError": "Kami tidak dapat mendeteksi stasiun terdekat. Gunakan filter berdasarkan negara.", + "radioCannotPlayStation": "Tidak dapat memutar \"{stationName}\"", + "@radioCannotPlayStation": { + "placeholders": { + "stationName": {} + } + }, + "recordingSelectStationFirst": "Pilih stasiun sebelum merekam.", + "recordingStartError": "Tidak dapat memulai rekaman: {error}", + "@recordingStartError": { + "placeholders": { + "error": {} + } + }, + "unsupportedConfigVersion": "Versi konfigurasi tidak didukung", + "audioErrorGeneric": "Kesalahan pemutaran", + "audioErrorNoInternet": "Tidak ada koneksi internet", + "audioErrorInvalidUrl": "Alamat radio tidak valid", + "audioErrorNotFound": "Radio tidak tersedia (kesalahan 404)", + "audioErrorTimeout": "Waktu koneksi habis", + "audioErrorCannotConnect": "Tidak dapat terhubung ke radio", + "audioErrorUnsupportedFormat": "Format aliran tidak didukung", + "audioErrorDecode": "Kesalahan saat mendekode aliran audio", + "audioErrorCleartext": "Radio ini menggunakan HTTP tanpa enkripsi, dan itu tidak diizinkan", + "audioErrorSsl": "Sertifikat SSL radio tidak valid", + "audioErrorCannotPlay": "Radio ini tidak dapat diputar", + "audioErrorUnexpectedPlayback": "Kesalahan tak terduga saat memutar", + "androidExactAlarmScheduleError": "Android tidak dapat menjadwalkan alarm tepat. Periksa izin alarm tepat.", + "recordingPathEmptyError": "Jalur rekaman tidak boleh kosong", + "recordingMaxSizeInvalidError": "Ukuran maksimum harus lebih besar dari nol", + "recordingAlreadyActiveError": "Sudah ada rekaman yang sedang berlangsung", + "alarmRingingFallbackActive": "Memutar dengan audio internal yang aman.", + "alarmRingingPreparingFallback": "Menyiapkan audio internal yang aman.", + "alarmRingingTryingStation": "Mencoba memutar stasiun Anda dengan kualitas tertinggi yang tersedia.", + "alarmScheduleOnce": "Sekali · {date}", + "@alarmScheduleOnce": { + "placeholders": { + "date": {} + } + }, + "alarmScheduleWeekdays": "Hari: {days}", + "@alarmScheduleWeekdays": { + "placeholders": { + "days": {} + } + }, + "androidReliabilityTitle": "Tinjau keandalan Android", + "closeAction": "Tutup", + "customOption": "Kustom", + "endLabel": "Selesai", + "equalizerDisable": "Nonaktifkan equalizer", + "helpTitle": "Bantuan dan tutorial", + "helpSubtitle": "Tinjau fitur, tips, dan hal baru di PluriWave.", + "indefiniteOption": "Tidak terbatas", + "invalidNumber": "Nomor tidak valid", + "nameLabel": "Nama", + "notPlaying": "Tidak memutar", + "oneTimeOption": "Sekali", + "pausePlaybackTooltip": "Jeda pemutaran", + "qualityOriginal": "Kualitas asli: {quality}", + "@qualityOriginal": { + "placeholders": { + "quality": {} + } + }, + "qualityUnknown": "Kualitas tidak dilaporkan", + "recordAction": "Rekam", + "recordDurationTitle": "Durasi rekaman", + "recordRadioSubtitle": "Pilih berapa lama ingin merekam.", + "recordRadioTitle": "Rekam radio", + "recordingActiveTitle": "Merekam radio", + "recordingDirectTitle": "Perekaman langsung", + "recordingsOpenFolderPlainError": "Tidak dapat membuka folder rekaman", + "recordingsOpenLatest": "Buka rekaman terbaru", + "recordingsOpenLatestError": "Tidak dapat membuka rekaman terbaru", + "startLabel": "Mulai", + "startPlaybackTooltip": "Mulai pemutaran", + "stopAction": "Stop", + "stopPlaybackTooltip": "Hentikan pemutaran", + "weekdayShortMonday": "Sen", + "weekdayShortTuesday": "Sel", + "weekdayShortWednesday": "Rab", + "weekdayShortThursday": "Kam", + "weekdayShortFriday": "Jum", + "weekdayShortSaturday": "Sab", + "weekdayShortSunday": "Min" } diff --git a/lib/l10n/app_it.arb b/lib/l10n/app_it.arb index bcf2b07..0e1fcf3 100644 --- a/lib/l10n/app_it.arb +++ b/lib/l10n/app_it.arb @@ -1,24 +1,51 @@ { "@@locale": "it", "appTitle": "PluriWave", - "navHome": "Home", + "navHome": "Inizio", "navSearch": "Cerca", "navFavorites": "Preferiti", "navAlarms": "Sveglie", "navSettings": "Impostazioni", "actionOk": "OK", "sleepTimer": "Timer sonno", - "sleepTimerDescription": "Smooth radio shutdown with an exact countdown.", - "cancelTimer": "Cancel timer", - "optionOther": "Other", - "customDurationTitle": "Custom duration", - "durationGreaterThanZero": "Choose a duration greater than zero.", - "hoursLabel": "Hours", - "minutesLabel": "Minutes", - "secondsLabel": "Seconds", - "saveQuickAccess": "Save as quick access", - "startTimer": "Start timer", - "skipCurrentAlarmExecution": "Skipped this execution of {alarmName}.", + "sleepTimerDescription": "Spegnimento graduale della radio con conto alla rovescia preciso.", + "cancelTimer": "Annulla timer", + "optionOther": "Altro", + "customDurationTitle": "Durata personalizzata", + "durationGreaterThanZero": "Scegli una durata maggiore di zero.", + "hoursLabel": "Ore", + "minutesLabel": "Minuti", + "secondsLabel": "Secondi", + "durationHoursMinutesSeconds": "{hours} h {minutes} min {seconds} s", + "@durationHoursMinutesSeconds": { + "placeholders": { + "hours": {}, + "minutes": {}, + "seconds": {} + } + }, + "durationMinutesSeconds": "{minutes} min {seconds} s", + "@durationMinutesSeconds": { + "placeholders": { + "minutes": {}, + "seconds": {} + } + }, + "durationMinutesOnly": "{minutes} min", + "@durationMinutesOnly": { + "placeholders": { + "minutes": {} + } + }, + "durationSecondsOnly": "{seconds} s", + "@durationSecondsOnly": { + "placeholders": { + "seconds": {} + } + }, + "saveQuickAccess": "Salva come accesso rapido", + "startTimer": "Avvia timer", + "skipCurrentAlarmExecution": "Questa esecuzione di {alarmName} è stata saltata.", "@skipCurrentAlarmExecution": { "placeholders": { "alarmName": {} @@ -27,7 +54,7 @@ "settingsTitle": "Impostazioni", "settingsSubtitle": "Controllo fine del suono, backup e stazioni personalizzate.", "languageSectionTitle": "Lingua", - "languageSectionDescription": "Choose how the app language is displayed.", + "languageSectionDescription": "Scegli come visualizzare la lingua dell'app.", "languageSystemDefault": "Sistema", "languageSpanish": "Spagnolo", "languageEnglish": "Inglese", @@ -38,70 +65,71 @@ } }, "languageUpdatedSystem": "Lingua aggiornata: Sistema", - "timerSectionTitle": "Sleep timer", - "timerSectionAdd": "Add", - "timerSectionDescription": "Customize the quick presets shown when automatically stopping the radio.", - "timerSectionRestoreRecommended": "Restore recommended times", - "newQuickAccessTitle": "New quick access", - "saveQuickAccessButton": "Save quick access", - "settingsSafeStatus": "Safe", - "recordingsSectionTitle": "Recordings", - "recordingsFolderDialogTitle": "Select recordings folder", - "recordingsPathUpdated": "Recording path updated", - "recordingsPathSaveError": "Could not save the path: {error}", - "recordingsDefaultFolderRestored": "The internal default folder will be used", - "recordingsFolderTitle": "Recordings folder", - "recordingsPathCalculating": "Calculating path...", - "recordingsChangePath": "Change path", - "recordingsUseDefaultPath": "Use default path", - "recordingsOriginalStreamHint": "The radio is saved from the original stream, without recompressing.", - "equalizerActive": "Active", - "equalizerDisabled": "Disabled", - "equalizerEnable": "Enable equalizer", - "equalizerRealtimeSubtitle": "Changes are applied in real time to the current station.", - "equalizerPendingSubtitle": "Changes are saved and will apply when Android enables the effect.", - "equalizerPerStationTitle": "Use custom EQ for this favorite", - "equalizerPerStationActive": "Active for {stationName}", - "equalizerPerStationMain": "Using main EQ for {stationName}", - "preferredStationTitle": "Preferred station", - "preferredStationDescription": "Preselected for new alarms and available for quick playback.", - "preferredStationNoStationsTitle": "No stations available yet", - "preferredStationNoStationsSubtitle": "Save favorites or load stations to choose a preferred one.", - "preferredStationAutomaticFallback": "Automatic fallback", - "preferredStationDefaultFavorite": "Default favorite", - "preferredStationCurrent": "Current preferred: {stationName}", - "preferredStationAutoUsing": "No favorites: automatically using {stationName}", - "preferredStationPlay": "Play preferred", - "customStationsTitle": "Custom stations", - "customStationsAdd": "Add", - "customStationsEmpty": "No custom stations.", - "playAction": "Play", - "deleteAction": "Delete", - "addStationTitle": "Add station", - "stationNameLabel": "Name *", - "requiredField": "Required field", - "streamUrlLabel": "Stream URL *", - "invalidUrl": "Invalid URL", - "countryOptionalLabel": "Country (optional)", - "saveStation": "Save station", + "timerSectionTitle": "Timer sonno", + "timerSectionAdd": "Aggiungi", + "timerSectionDescription": "Personalizza gli accessi rapidi mostrati quando la radio si spegne automaticamente.", + "timerSectionRestoreRecommended": "Ripristina tempi consigliati", + "newQuickAccessTitle": "Nuovo accesso rapido", + "saveQuickAccessButton": "Salva accesso rapido", + "settingsSafeStatus": "Sicuro", + "recordingsSectionTitle": "Registrazioni", + "recordingsFolderDialogTitle": "Seleziona la cartella delle registrazioni", + "recordingsPathUpdated": "Percorso di registrazione aggiornato", + "recordingsPathSaveError": "Impossibile salvare il percorso: {error}", + "recordingsDefaultFolderRestored": "Verrà usata la cartella interna predefinita", + "recordingsFolderTitle": "Cartella di registrazione", + "recordingsPathCalculating": "Calcolo percorso...", + "recordingsChangePath": "Cambia percorso", + "recordingsUseDefaultPath": "Usa percorso predefinito", + "recordingsOriginalStreamHint": "La radio viene salvata dallo stream originale, senza ricompressione.", + "equalizerActive": "Attivo", + "equalizerDisabled": "Disattivato", + "equalizerEnable": "Attiva equalizzatore", + "equalizerRealtimeSubtitle": "Le modifiche vengono applicate in tempo reale all'emittente attuale.", + "equalizerPendingSubtitle": "Le modifiche vengono salvate e saranno applicate quando Android abiliterà l'effetto.", + "equalizerPerStationTitle": "Usa EQ proprio per questo preferito", + "equalizerPerStationActive": "Attivo per {stationName}", + "equalizerPerStationMain": "EQ principale in uso per {stationName}", + "preferredStationTitle": "Emittente preferita", + "preferredStationDescription": "Preselezionata quando crei sveglie e disponibile per la riproduzione rapida.", + "preferredStationNoStationsTitle": "Non ci sono ancora emittenti disponibili", + "preferredStationNoStationsSubtitle": "Salva preferiti o carica emittenti per sceglierne una preferita.", + "preferredStationAutomaticFallback": "Fallback automatico", + "preferredStationDefaultFavorite": "Preferita predefinita", + "preferredStationCurrent": "Preferita attuale: {stationName}", + "preferredStationAutoUsing": "Nessun preferito: uso automatico di {stationName}", + "preferredStationPlay": "Riproduci preferita", + "customStationsTitle": "Emittenti personalizzate", + "customStationsAdd": "Aggiungi", + "customStationsEmpty": "Nessuna emittente personalizzata.", + "playAction": "Riproduci", + "deleteAction": "Elimina", + "addStationTitle": "Aggiungi emittente", + "stationNameLabel": "Nome *", + "unnamedStation": "Stazione senza nome", + "requiredField": "Campo obbligatorio", + "streamUrlLabel": "URL dello stream *", + "invalidUrl": "URL non valido", + "countryOptionalLabel": "Paese (opzionale)", + "saveStation": "Salva emittente", "backupSectionTitle": "Backup", - "backupExportTitle": "Export configuration", - "backupExportSubtitle": "Favorites, custom stations, and EQ presets", - "backupImportTitle": "Import configuration", - "backupImportSubtitle": "Restore from a backup file", + "backupExportTitle": "Esporta configurazione", + "backupExportSubtitle": "Preferiti, emittenti personalizzate e preset EQ", + "backupImportTitle": "Importa configurazione", + "backupImportSubtitle": "Ripristina da un file di backup", "backupShareSubject": "PluriWave — backup", - "backupShareText": "PluriWave configuration exported on {date}", - "backupExportError": "Export error: {error}", - "backupImportConfirmMessage": "This will add favorites, stations, and presets from the file. Continue?", - "backupImportSuccess": "Configuration imported successfully", - "backupImportError": "Import error: {error}", - "appVersionLoading": "Loading version...", - "appVersionSubtitle": "{version} - World radio", - "savedFavoritesTitle": "Saved favorites", - "stationFilterTitle": "Station filter", - "stationFilterSubtitle": "Only stations verified as active", - "backgroundAudioTitle": "Background audio", - "backgroundAudioSubtitle": "Continues when the screen turns off", + "backupShareText": "Configurazione di PluriWave esportata il {date}", + "backupExportError": "Errore durante l'esportazione: {error}", + "backupImportConfirmMessage": "Questo aggiungerà preferiti, emittenti e preset dal file. Continuare?", + "backupImportSuccess": "Configurazione importata correttamente", + "backupImportError": "Errore durante l'importazione: {error}", + "appVersionLoading": "Caricamento versione...", + "appVersionSubtitle": "{version} - Radio mondiale", + "savedFavoritesTitle": "Preferiti salvati", + "stationFilterTitle": "Filtro emittenti", + "stationFilterSubtitle": "Solo emittenti verificate come attive", + "backgroundAudioTitle": "Audio in background", + "backgroundAudioSubtitle": "Continua quando lo schermo si spegne", "dash": "—", "@recordingsPathSaveError": { "placeholders": { @@ -149,14 +177,14 @@ } }, "cancelAction": "Annulla", - "equalizerTitle": "Equalizer", - "recordingsOpenFolder": "Open folder", - "recordingsOpenFolderError": "Could not open the folder: {error}", - "recordingsMaxSizeTitle": "Maximum recording size", - "recordingsMaxSizeSubtitle": "Current limit: {size} MB", - "recordingsMaxSizeDialogTitle": "Maximum size per recording", - "recordingsMaxSizeMbLabel": "Maximum megabytes", - "recordingsMaxSizeSaved": "Recording limit updated to {size} MB", + "equalizerTitle": "Equalizzatore", + "recordingsOpenFolder": "Apri cartella", + "recordingsOpenFolderError": "Impossibile aprire la cartella: {error}", + "recordingsMaxSizeTitle": "Dimensione massima registrazione", + "recordingsMaxSizeSubtitle": "Limite attuale: {size} MB", + "recordingsMaxSizeDialogTitle": "Dimensione massima per registrazione", + "recordingsMaxSizeMbLabel": "Megabyte massimi", + "recordingsMaxSizeSaved": "Limite di registrazione aggiornato a {size} MB", "@recordingsOpenFolderError": { "placeholders": { "error": {} @@ -176,33 +204,33 @@ } } }, - "stationOrderTitle": "Station order", - "stationOrderByName": "By name", - "stationOrderByQuality": "By quality", - "stationOrderScopeDescription": "Applies to favorites, searches, nearby stations and quick lists.", - "favoriteGroupsTitle": "Favorite lists", - "favoriteGroupsDescription": "Create short lists to organize your saved stations.", - "favoriteGroupsAdd": "Add list", - "favoriteGroupsEdit": "Edit list", - "favoriteGroupsDelete": "Delete list", - "favoriteGroupsNameLabel": "List name", - "favoriteGroupsNameTooLong": "Maximum 28 characters.", - "favoriteGroupsUnassigned": "Unassigned", - "favoriteGroupsProtectedHint": "Default list: it cannot be edited or deleted.", - "favoriteGroupsCreated": "List created", - "favoriteGroupsUpdated": "List updated", - "favoriteGroupsDeleted": "List deleted; its stations return to Unassigned.", - "favoriteGroupsAssign": "Move to list", - "favoriteGroupsAssignSubtitle": "Current list: {groupName}", - "favoriteGroupsAssigned": "{stationName} moved to {groupName}", - "favoritesTitle": "Favorites", - "favoritesEmptyTitle": "No favorites yet", - "favoritesEmptySubtitle": "Tap the heart on any station to save it to your collection.", - "favoritesHeaderSubtitle": "Organize your collection by lists and keep important radios close.", - "favoritesCollection": "Collection", - "favoritesSavedCount": "{count} saved", - "favoritesRemoveTooltip": "Remove from favorites", - "favoritesRemovedMessage": "{stationName} removed from favorites", + "stationOrderTitle": "Ordine emittenti", + "stationOrderByName": "Per nome", + "stationOrderByQuality": "Per qualità", + "stationOrderScopeDescription": "Si applica a preferiti, ricerche, emittenti vicine ed elenchi rapidi.", + "favoriteGroupsTitle": "Liste preferiti", + "favoriteGroupsDescription": "Crea liste brevi per organizzare le emittenti salvate.", + "favoriteGroupsAdd": "Aggiungi lista", + "favoriteGroupsEdit": "Modifica lista", + "favoriteGroupsDelete": "Elimina lista", + "favoriteGroupsNameLabel": "Nome della lista", + "favoriteGroupsNameTooLong": "Massimo 28 caratteri.", + "favoriteGroupsUnassigned": "Non assegnate", + "favoriteGroupsProtectedHint": "Lista predefinita: non può essere modificata né eliminata.", + "favoriteGroupsCreated": "Lista creata", + "favoriteGroupsUpdated": "Lista aggiornata", + "favoriteGroupsDeleted": "Lista eliminata; le sue emittenti tornano a Non assegnate.", + "favoriteGroupsAssign": "Sposta in lista", + "favoriteGroupsAssignSubtitle": "Lista attuale: {groupName}", + "favoriteGroupsAssigned": "{stationName} spostata in {groupName}", + "favoritesTitle": "Preferiti", + "favoritesEmptyTitle": "Ancora nessun preferito", + "favoritesEmptySubtitle": "Tocca il cuore su qualsiasi emittente per salvarla nella tua raccolta.", + "favoritesHeaderSubtitle": "Organizza la raccolta in liste e tieni vicine le radio importanti.", + "favoritesCollection": "Raccolta", + "favoritesSavedCount": "{count} salvate", + "favoritesRemoveTooltip": "Rimuovi dai preferiti", + "favoritesRemovedMessage": "{stationName} rimossa dai preferiti", "@favoriteGroupsAssignSubtitle": { "placeholders": { "groupName": {} @@ -226,7 +254,7 @@ "stationName": {} } }, - "alarmPostponedCurrentExecution": "Alarm postponed for this occurrence.", + "alarmPostponedCurrentExecution": "Sveglia posticipata per questa esecuzione.", "searchScreenTitle": "Cerca segnale", "searchScreenSubtitle": "Trova emittenti per nome, Paese o lingua con filtri rapidi e contrasto elevato.", "searchFiltersLabel": "Filtri", @@ -257,9 +285,9 @@ "languageNameJapanese": "giapponese", "languageNameArabic": "arabo", "languageNameRussian": "russo", - "homeScreenSubtitle": "Live global radio with clean signals, smart favorites, and a show-style visual experience.", - "exploreStations": "Explore stations", - "stationsCount": "{count} stations", + "homeScreenSubtitle": "Radio globale in diretta con segnali puliti, preferiti intelligenti e un'esperienza visiva da quiz show.", + "exploreStations": "Esplora emittenti", + "stationsCount": "{count} radio", "@stationsCount": { "placeholders": { "count": { @@ -267,36 +295,36 @@ } } }, - "qualityHd": "HD quality", - "nearYou": "Near you", - "nearYouInCountry": "Near you ? {country}", + "qualityHd": "Qualità HD", + "nearYou": "Vicino a te", + "nearYouInCountry": "Vicino a te · {country}", "@nearYouInCountry": { "placeholders": { "country": {} } }, - "detectAction": "Detect", - "liveRadar": "Live radar", - "genresTitle": "Genres", - "retryAction": "Retry", - "noStationsAvailable": "No stations available", - "noStationsAvailableSubtitle": "Try refreshing or choosing another genre to capture a signal again.", + "detectAction": "Rileva", + "liveRadar": "Radar live", + "genresTitle": "Generi", + "retryAction": "Riprova", + "noStationsAvailable": "Nessuna emittente disponibile", + "noStationsAvailableSubtitle": "Prova ad aggiornare o a scegliere un altro genere per captare di nuovo un segnale.", "genrePop": "Pop", "genreRock": "Rock", "genreJazz": "Jazz", - "genreClassical": "Classical", - "genreElectronic": "Electronic", - "genreNews": "News", + "genreClassical": "Classica", + "genreElectronic": "Elettronica", + "genreNews": "Notizie", "genreTalk": "Talk", "genreHipHop": "Hip-hop", "genreCountry": "Country", "genreMetal": "Metal", "genreReggae": "Reggae", - "genreLatin": "Latin", - "alarmScreenTitle": "Music wake-up", - "alarmScreenSubtitle": "Alarms with radio, safe fallback sound, smart vacations, and the next occurrence always visible.", - "createAlarmAction": "Create alarm", - "alarmsCount": "{count} alarms", + "genreLatin": "Latina", + "alarmScreenTitle": "Risveglio musicale", + "alarmScreenSubtitle": "Sveglie con radio, suono sicuro, vacanze intelligenti e prossima esecuzione sempre visibile.", + "createAlarmAction": "Crea sveglia", + "alarmsCount": "{count} sveglie", "@alarmsCount": { "placeholders": { "count": { @@ -304,10 +332,10 @@ } } }, - "activeAlarmsWithoutNextTitle": "Active alarms without a next occurrence", - "noActiveAlarms": "No active alarms", - "nextAlarmTitle": "Next alarm", - "activeAlarmsWithoutNextSubtitle": "There are {count} active alarm(s), but they do not currently have a valid future date. Check date, weekdays, and vacations.", + "activeAlarmsWithoutNextTitle": "Sveglie attive senza prossima esecuzione", + "noActiveAlarms": "Nessuna sveglia attiva", + "nextAlarmTitle": "Prossima sveglia", + "activeAlarmsWithoutNextSubtitle": "Ci sono {count} sveglia/e attive, ma al momento non hanno una data futura valida. Controlla data, giorni e vacanze.", "@activeAlarmsWithoutNextSubtitle": { "placeholders": { "count": { @@ -315,9 +343,9 @@ } } }, - "createAlarmHint": "Create an alarm and PluriWave will calculate the next occurrence automatically.", - "alarmVacationPlay": "Plays during vacations", - "alarmVacationPause": "Paused during vacations", + "createAlarmHint": "Crea una sveglia e PluriWave calcolerà automaticamente la prossima esecuzione.", + "alarmVacationPlay": "Suona durante le vacanze", + "alarmVacationPause": "Pausa durante le vacanze", "alarmFadeInLabel": "Fade-in {seconds}s", "@alarmFadeInLabel": { "placeholders": { @@ -326,61 +354,61 @@ } } }, - "alarmNextExecution": "Next occurrence: {date}", + "alarmNextExecution": "Prossima esecuzione: {date}", "@alarmNextExecution": { "placeholders": { "date": {} } }, - "alarmNoNextExecution": "It has no active next occurrence.", - "alarmSkippedExecution": "One occurrence was skipped: {date}.", + "alarmNoNextExecution": "Non ha una prossima esecuzione attiva.", + "alarmSkippedExecution": "Un'esecuzione è stata saltata: {date}.", "@alarmSkippedExecution": { "placeholders": { "date": {} } }, - "editAction": "Edit", - "skipNextAction": "Skip next", - "deleteTooltip": "Delete", - "alarmSkippedNoNextSnackbar": "Alarm skipped. There is no next occurrence left.", - "alarmSkippedReturnsSnackbar": "Alarm skipped. It will return on {date}.", + "editAction": "Modifica", + "skipNextAction": "Salta prossima", + "deleteTooltip": "Elimina", + "alarmSkippedNoNextSnackbar": "Sveglia saltata. Non resta alcuna prossima esecuzione.", + "alarmSkippedReturnsSnackbar": "Sveglia saltata. Tornerà il {date}.", "@alarmSkippedReturnsSnackbar": { "placeholders": { "date": {} } }, - "alarmVacationPausedNoNext": "It is paused for vacations ({vacationName}) and has no next occurrence.", + "alarmVacationPausedNoNext": "In pausa per vacanze ({vacationName}) e senza prossima esecuzione.", "@alarmVacationPausedNoNext": { "placeholders": { "vacationName": {} } }, - "alarmVacationPausedReturns": "It is paused for vacations ({vacationName}) and returns on {date}.", + "alarmVacationPausedReturns": "In pausa per vacanze ({vacationName}) e torna il {date}.", "@alarmVacationPausedReturns": { "placeholders": { "vacationName": {}, "date": {} } }, - "alarmVacationReturns": "With vacations enabled, it will ring again on {date}.", + "alarmVacationReturns": "Con le vacanze attive, suonerà di nuovo il {date}.", "@alarmVacationReturns": { "placeholders": { "date": {} } }, - "defaultAlarmName": "Music alarm", - "newAlarmTitle": "New alarm", - "editAlarmTitle": "Edit alarm", - "nameField": "Name", - "timeField": "Time", - "dateField": "Date", - "onceOption": "Once", - "dailyOption": "Daily", - "weekdaysOption": "Weekdays", - "soundAndVolumeSection": "Sound and volume", - "alarmFadeInTitle": "Alarm fade-in", - "alarmFadeInOff": "0 s (no transition)", - "alarmFadeInSummary": "{seconds} s (from 5% to the selected volume)", + "defaultAlarmName": "Sveglia musicale", + "newAlarmTitle": "Nuova sveglia", + "editAlarmTitle": "Modifica sveglia", + "nameField": "Nome", + "timeField": "Ora", + "dateField": "Data", + "onceOption": "Una volta", + "dailyOption": "Giornaliera", + "weekdaysOption": "Giorni", + "soundAndVolumeSection": "Suono e volume", + "alarmFadeInTitle": "Fade-in sveglia", + "alarmFadeInOff": "0 s (senza transizione)", + "alarmFadeInSummary": "{seconds} s (dal 5% al volume scelto)", "@alarmFadeInSummary": { "placeholders": { "seconds": { @@ -388,22 +416,22 @@ } } }, - "internalSafeSoundLabel": "Internal safe sound", - "soundWarmSunrise": "Warm sunrise", - "soundSoftBell": "Soft bell", - "soundDigitalPulse": "Digital pulse", - "favoriteStationLabel": "Favorite station", - "noStationUseInternalSound": "No station: use internal sound", - "saveFavoritesAlarmHint": "Save stations in Favorites to use them as a music alarm.", - "useCurrentStationAction": "Use current station", - "playDuringVacations": "Play during vacations", - "playDuringVacationsHint": "If you turn this off, the next occurrence will jump to the first valid day.", - "saveAlarmAction": "Save alarm", - "chooseOneWeekdayError": "Choose at least one weekday.", - "androidReliabilityReview": "Review Android reliability", + "internalSafeSoundLabel": "Suono sicuro interno", + "soundWarmSunrise": "Alba calda", + "soundSoftBell": "Campana dolce", + "soundDigitalPulse": "Impulso digitale", + "favoriteStationLabel": "Emittente preferita", + "noStationUseInternalSound": "Nessuna emittente: usa suono interno", + "saveFavoritesAlarmHint": "Salva emittenti nei Preferiti per usarle come sveglia musicale.", + "useCurrentStationAction": "Usa emittente attuale", + "playDuringVacations": "Suona durante le vacanze", + "playDuringVacationsHint": "Se lo disattivi, la prossima esecuzione passerà al primo giorno valido.", + "saveAlarmAction": "Salva sveglia", + "chooseOneWeekdayError": "Scegli almeno un giorno della settimana.", + "androidReliabilityReview": "Controlla affidabilità Android", "statusOk": "OK", - "statusPending": "pending", - "androidReliabilityStatus": "Reliability: exact {exact} ? notifications {notifications} ? screen {screen}", + "statusPending": "in sospeso", + "androidReliabilityStatus": "Affidabilità: esatte {exact} · notifiche {notifications} · schermo {screen}", "@androidReliabilityStatus": { "placeholders": { "exact": {}, @@ -411,19 +439,165 @@ "screen": {} } }, - "vacationRangesTitle": "Vacation ranges", - "addAction": "Add", - "vacationRangesHint": "If an alarm is set to \"Paused during vacations\", it automatically skips these ranges.", - "noVacationRangesLoaded": "No ranges loaded.", - "deleteRangeTooltip": "Delete range", - "vacationsDefaultName": "Vacation", - "newVacationRangeTitle": "New vacation range", - "startField": "Start", - "endField": "End", - "saveRangeAction": "Save range", - "noAlarmsYetTitle": "There are no alarms yet.", - "noAlarmsYetSubtitle": "Create one to design your musical wake-up.", - "ringingInternalAudioActive": "Playing with internal safe audio.", - "ringingPreparingInternalAudio": "Preparing internal safe audio.", - "stopAlarmAction": "Stop alarm" + "vacationRangesTitle": "Periodi di vacanza", + "addAction": "Aggiungi", + "vacationRangesHint": "Se una sveglia ha \"Pausa durante le vacanze\", questi periodi vengono saltati automaticamente.", + "noVacationRangesLoaded": "Nessun periodo caricato.", + "deleteRangeTooltip": "Elimina periodo", + "vacationsDefaultName": "Vacanze", + "newVacationRangeTitle": "Nuovo periodo di vacanza", + "startField": "Inizio", + "endField": "Fine", + "saveRangeAction": "Salva periodo", + "noAlarmsYetTitle": "Non ci sono ancora sveglie.", + "noAlarmsYetSubtitle": "Creane una per progettare il tuo risveglio musicale.", + "ringingInternalAudioActive": "Suono sicuro interno in riproduzione.", + "ringingPreparingInternalAudio": "Preparazione del suono sicuro interno.", + "stopAlarmAction": "Ferma sveglia", + "pauseAction": "Pausa", + "miniPlayerOpenLabel": "Apri il lettore per {stationName}", + "@miniPlayerOpenLabel": { + "placeholders": { + "stationName": {} + } + }, + "playerIconLabel": "Lettore", + "playbackStatusConnecting": "Connessione...", + "playbackStatusLive": "In diretta", + "playbackStatusPaused": "In pausa", + "playbackStatusConnectionError": "Errore di connessione", + "playbackStatusStopped": "Interrotto", + "stationSemanticLabel": "Stazione {stationName}", + "@stationSemanticLabel": { + "placeholders": { + "stationName": {} + } + }, + "favoritesAddTooltip": "Aggiungi ai preferiti", + "favoritesAddedMessage": "{stationName} aggiunta ai preferiti", + "@favoritesAddedMessage": { + "placeholders": { + "stationName": {} + } + }, + "stationIconLabel": "Icona della stazione", + "liveNow": "In diretta", + "equalizerBandLabel": "Banda {band}", + "@equalizerBandLabel": { + "placeholders": { + "band": {} + } + }, + "equalizerBandValue": "{value} decibel", + "@equalizerBandValue": { + "placeholders": { + "value": {} + } + }, + "equalizerPresetFlat": "Piatto", + "equalizerPresetRock": "Rock", + "equalizerPresetPop": "Pop", + "equalizerPresetBassBoost": "Potenziamento bassi", + "equalizerPresetJazz": "Jazz", + "equalizerPresetVoice": "Voce", + "equalizerPresetCustom": "Personalizzato", + "onboardingTitle": "Benvenuto in PluriWave", + "onboardingNewsTitle": "Novità", + "onboardingStartAction": "Inizia", + "onboardingCloseTooltip": "Chiudi", + "radioRecordingError": "Errore durante la registrazione della radio: {error}", + "@radioRecordingError": { + "placeholders": { + "error": {} + } + }, + "radioApiConnectionError": "Nessuna connessione all'API radio", + "radioSearchError": "Errore di ricerca. Controlla la connessione.", + "radioLoadMoreStationsError": "Impossibile caricare altre stazioni.", + "radioNearbyStationsError": "Non abbiamo potuto rilevare stazioni vicine. Usa i filtri per paese.", + "radioCannotPlayStation": "Impossibile riprodurre \"{stationName}\"", + "@radioCannotPlayStation": { + "placeholders": { + "stationName": {} + } + }, + "recordingSelectStationFirst": "Seleziona prima una stazione da registrare.", + "recordingStartError": "Impossibile avviare la registrazione: {error}", + "@recordingStartError": { + "placeholders": { + "error": {} + } + }, + "unsupportedConfigVersion": "Versione di configurazione non supportata", + "audioErrorGeneric": "Errore di riproduzione", + "audioErrorNoInternet": "Nessuna connessione a Internet", + "audioErrorInvalidUrl": "L'URL della radio non è valido", + "audioErrorNotFound": "La radio non è disponibile (errore 404)", + "audioErrorTimeout": "Tempo di connessione scaduto", + "audioErrorCannotConnect": "Impossibile connettersi alla radio", + "audioErrorUnsupportedFormat": "Formato stream non supportato", + "audioErrorDecode": "Errore durante la decodifica dello stream audio", + "audioErrorCleartext": "Questa radio usa HTTP non cifrato, non consentito", + "audioErrorSsl": "Certificato SSL non valido per la radio", + "audioErrorCannotPlay": "Questa radio non può essere riprodotta", + "audioErrorUnexpectedPlayback": "Errore di riproduzione imprevisto", + "androidExactAlarmScheduleError": "Android non ha potuto programmare una sveglia esatta. Controlla l'autorizzazione per le sveglie esatte.", + "recordingPathEmptyError": "Il percorso di registrazione non può essere vuoto", + "recordingMaxSizeInvalidError": "La dimensione massima deve essere maggiore di zero", + "recordingAlreadyActiveError": "È già in corso una registrazione", + "alarmRingingFallbackActive": "Riproduzione con audio interno sicuro.", + "alarmRingingPreparingFallback": "Preparazione dell’audio interno sicuro.", + "alarmRingingTryingStation": "Tentativo di riprodurre la tua stazione con la massima qualità disponibile.", + "alarmScheduleOnce": "Una volta · {date}", + "@alarmScheduleOnce": { + "placeholders": { + "date": {} + } + }, + "alarmScheduleWeekdays": "Giorni: {days}", + "@alarmScheduleWeekdays": { + "placeholders": { + "days": {} + } + }, + "androidReliabilityTitle": "Controlla affidabilità Android", + "closeAction": "Chiudi", + "customOption": "Personalizzata", + "endLabel": "Fine", + "equalizerDisable": "Disattiva equalizzatore", + "helpTitle": "Aiuto e tutorial", + "helpSubtitle": "Rivedi funzioni, consigli e novità di PluriWave.", + "indefiniteOption": "Indefinita", + "invalidNumber": "Numero non valido", + "nameLabel": "Nome", + "notPlaying": "Non in riproduzione", + "oneTimeOption": "Una volta", + "pausePlaybackTooltip": "Pausa riproduzione", + "qualityOriginal": "Qualità originale: {quality}", + "@qualityOriginal": { + "placeholders": { + "quality": {} + } + }, + "qualityUnknown": "Qualità non indicata", + "recordAction": "Registra", + "recordDurationTitle": "Durata registrazione", + "recordRadioSubtitle": "Scegli per quanto tempo registrare.", + "recordRadioTitle": "Registra radio", + "recordingActiveTitle": "Registrazione radio", + "recordingDirectTitle": "Registrazione diretta", + "recordingsOpenFolderPlainError": "Impossibile aprire la cartella delle registrazioni", + "recordingsOpenLatest": "Apri ultima registrazione", + "recordingsOpenLatestError": "Impossibile aprire l’ultima registrazione", + "startLabel": "Inizio", + "startPlaybackTooltip": "Avvia riproduzione", + "stopAction": "Ferma", + "stopPlaybackTooltip": "Ferma riproduzione", + "weekdayShortMonday": "Lun", + "weekdayShortTuesday": "Mar", + "weekdayShortWednesday": "Mer", + "weekdayShortThursday": "Gio", + "weekdayShortFriday": "Ven", + "weekdayShortSaturday": "Sab", + "weekdayShortSunday": "Dom" } diff --git a/lib/l10n/app_ja.arb b/lib/l10n/app_ja.arb index 98e549a..24ff672 100644 --- a/lib/l10n/app_ja.arb +++ b/lib/l10n/app_ja.arb @@ -1,107 +1,135 @@ { "@@locale": "ja", "appTitle": "PluriWave", - "navHome": "Home", - "navSearch": "Search", - "navFavorites": "Favorites", - "navAlarms": "Alarms", - "navSettings": "Settings", - "actionOk": "OK", - "sleepTimer": "Sleep timer", - "sleepTimerDescription": "Smooth radio shutdown with an exact countdown.", - "cancelTimer": "Cancel timer", - "optionOther": "Other", - "customDurationTitle": "Custom duration", - "durationGreaterThanZero": "Choose a duration greater than zero.", - "hoursLabel": "Hours", - "minutesLabel": "Minutes", - "secondsLabel": "Seconds", - "saveQuickAccess": "Save as quick access", - "startTimer": "Start timer", - "skipCurrentAlarmExecution": "Skipped this execution of {alarmName}.", + "navHome": "ホーム", + "navSearch": "検索", + "navFavorites": "お気に入り", + "navAlarms": "アラーム", + "navSettings": "設定", + "actionOk": "了解", + "sleepTimer": "スリープタイマー", + "sleepTimerDescription": "正確なカウントダウンでラジオをなめらかに停止します。", + "cancelTimer": "タイマーをキャンセル", + "optionOther": "その他", + "customDurationTitle": "カスタム時間", + "durationGreaterThanZero": "0 より大きい時間を選択してください。", + "hoursLabel": "時間", + "minutesLabel": "分", + "secondsLabel": "秒", + "durationHoursMinutesSeconds": "{hours}?? {minutes}? {seconds}?", + "@durationHoursMinutesSeconds": { + "placeholders": { + "hours": {}, + "minutes": {}, + "seconds": {} + } + }, + "durationMinutesSeconds": "{minutes}? {seconds}?", + "@durationMinutesSeconds": { + "placeholders": { + "minutes": {}, + "seconds": {} + } + }, + "durationMinutesOnly": "{minutes}?", + "@durationMinutesOnly": { + "placeholders": { + "minutes": {} + } + }, + "durationSecondsOnly": "{seconds}?", + "@durationSecondsOnly": { + "placeholders": { + "seconds": {} + } + }, + "saveQuickAccess": "クイックアクセスとして保存", + "startTimer": "タイマーを開始", + "skipCurrentAlarmExecution": "{alarmName} の今回の実行をスキップしました。", "@skipCurrentAlarmExecution": { "placeholders": { "alarmName": {} } }, - "settingsTitle": "Settings", - "settingsSubtitle": "Fine-grained sound control, backups, and custom stations.", - "languageSectionTitle": "Language", - "languageSectionDescription": "Choose how the app language is displayed.", - "languageSystemDefault": "System", - "languageSpanish": "Spanish", - "languageEnglish": "English", - "languageUpdated": "Language updated: {languageName}", + "settingsTitle": "設定", + "settingsSubtitle": "音質、バックアップ、カスタム局を細かく管理します。", + "languageSectionTitle": "言語", + "languageSectionDescription": "アプリの言語表示を選択します。", + "languageSystemDefault": "システム", + "languageSpanish": "スペイン語", + "languageEnglish": "英語", + "languageUpdated": "言語を更新しました: {languageName}", "@languageUpdated": { "placeholders": { "languageName": {} } }, - "languageUpdatedSystem": "Language updated: System", - "timerSectionTitle": "Sleep timer", - "timerSectionAdd": "Add", - "timerSectionDescription": "Customize the quick presets shown when automatically stopping the radio.", - "timerSectionRestoreRecommended": "Restore recommended times", - "newQuickAccessTitle": "New quick access", - "saveQuickAccessButton": "Save quick access", - "settingsSafeStatus": "Safe", - "recordingsSectionTitle": "Recordings", - "recordingsFolderDialogTitle": "Select recordings folder", - "recordingsPathUpdated": "Recording path updated", - "recordingsPathSaveError": "Could not save the path: {error}", - "recordingsDefaultFolderRestored": "The internal default folder will be used", - "recordingsFolderTitle": "Recordings folder", - "recordingsPathCalculating": "Calculating path...", - "recordingsChangePath": "Change path", - "recordingsUseDefaultPath": "Use default path", - "recordingsOriginalStreamHint": "The radio is saved from the original stream, without recompressing.", - "equalizerActive": "Active", - "equalizerDisabled": "Disabled", - "equalizerEnable": "Enable equalizer", - "equalizerRealtimeSubtitle": "Changes are applied in real time to the current station.", - "equalizerPendingSubtitle": "Changes are saved and will apply when Android enables the effect.", - "equalizerPerStationTitle": "Use custom EQ for this favorite", - "equalizerPerStationActive": "Active for {stationName}", - "equalizerPerStationMain": "Using main EQ for {stationName}", - "preferredStationTitle": "Preferred station", - "preferredStationDescription": "Preselected for new alarms and available for quick playback.", - "preferredStationNoStationsTitle": "No stations available yet", - "preferredStationNoStationsSubtitle": "Save favorites or load stations to choose a preferred one.", - "preferredStationAutomaticFallback": "Automatic fallback", - "preferredStationDefaultFavorite": "Default favorite", - "preferredStationCurrent": "Current preferred: {stationName}", - "preferredStationAutoUsing": "No favorites: automatically using {stationName}", - "preferredStationPlay": "Play preferred", - "customStationsTitle": "Custom stations", - "customStationsAdd": "Add", - "customStationsEmpty": "No custom stations.", - "playAction": "Play", - "deleteAction": "Delete", - "addStationTitle": "Add station", - "stationNameLabel": "Name *", - "requiredField": "Required field", - "streamUrlLabel": "Stream URL *", - "invalidUrl": "Invalid URL", - "countryOptionalLabel": "Country (optional)", - "saveStation": "Save station", - "backupSectionTitle": "Backup", - "backupExportTitle": "Export configuration", - "backupExportSubtitle": "Favorites, custom stations, and EQ presets", - "backupImportTitle": "Import configuration", - "backupImportSubtitle": "Restore from a backup file", - "backupShareSubject": "PluriWave — backup", - "backupShareText": "PluriWave configuration exported on {date}", - "backupExportError": "Export error: {error}", - "backupImportConfirmMessage": "This will add favorites, stations, and presets from the file. Continue?", - "backupImportSuccess": "Configuration imported successfully", - "backupImportError": "Import error: {error}", - "appVersionLoading": "Loading version...", - "appVersionSubtitle": "{version} - World radio", - "savedFavoritesTitle": "Saved favorites", - "stationFilterTitle": "Station filter", - "stationFilterSubtitle": "Only stations verified as active", - "backgroundAudioTitle": "Background audio", - "backgroundAudioSubtitle": "Continues when the screen turns off", + "languageUpdatedSystem": "言語を更新しました: システム", + "timerSectionTitle": "スリープタイマー", + "timerSectionAdd": "追加", + "timerSectionDescription": "ラジオを自動停止するときに表示されるクイックプリセットをカスタマイズします。", + "timerSectionRestoreRecommended": "おすすめ時間を復元", + "newQuickAccessTitle": "新しいクイックアクセス", + "saveQuickAccessButton": "クイックアクセスを保存", + "settingsSafeStatus": "安全", + "recordingsSectionTitle": "録音", + "recordingsFolderDialogTitle": "録音フォルダーを選択", + "recordingsPathUpdated": "録音パスを更新しました", + "recordingsPathSaveError": "パスを保存できませんでした: {error}", + "recordingsDefaultFolderRestored": "内部の既定フォルダーを使用します", + "recordingsFolderTitle": "録音フォルダー", + "recordingsPathCalculating": "パスを計算中...", + "recordingsChangePath": "パスを変更", + "recordingsUseDefaultPath": "既定のパスを使用", + "recordingsOriginalStreamHint": "ラジオは元のストリームから、再圧縮せずに保存されます。", + "equalizerActive": "有効", + "equalizerDisabled": "無効", + "equalizerEnable": "イコライザーを有効化", + "equalizerRealtimeSubtitle": "変更は現在の局にリアルタイムで適用されます。", + "equalizerPendingSubtitle": "変更は保存され、Android が効果を有効化したときに適用されます。", + "equalizerPerStationTitle": "このお気に入りに専用EQを使用", + "equalizerPerStationActive": "{stationName} で有効", + "equalizerPerStationMain": "{stationName} でメインEQを使用中", + "preferredStationTitle": "優先局", + "preferredStationDescription": "アラーム作成時に事前選択され、クイック再生でも開始できます。", + "preferredStationNoStationsTitle": "まだ利用できる局がありません", + "preferredStationNoStationsSubtitle": "優先局を選ぶには、お気に入りを保存するか局を読み込んでください。", + "preferredStationAutomaticFallback": "自動フォールバック", + "preferredStationDefaultFavorite": "既定のお気に入り", + "preferredStationCurrent": "現在の優先局: {stationName}", + "preferredStationAutoUsing": "お気に入りなし: {stationName} を自動使用中", + "preferredStationPlay": "優先局を再生", + "customStationsTitle": "カスタム局", + "customStationsAdd": "追加", + "customStationsEmpty": "カスタム局はありません。", + "playAction": "再生", + "deleteAction": "削除", + "addStationTitle": "局を追加", + "stationNameLabel": "名前 *", + "unnamedStation": "無名の放送局", + "requiredField": "必須項目", + "streamUrlLabel": "ストリームURL *", + "invalidUrl": "無効なURL", + "countryOptionalLabel": "国(任意)", + "saveStation": "局を保存", + "backupSectionTitle": "バックアップ", + "backupExportTitle": "設定をエクスポート", + "backupExportSubtitle": "お気に入り、カスタム局、EQプリセット", + "backupImportTitle": "設定をインポート", + "backupImportSubtitle": "バックアップファイルから復元", + "backupShareSubject": "PluriWave — バックアップ", + "backupShareText": "{date} にエクスポートされた PluriWave 設定", + "backupExportError": "エクスポート中にエラー: {error}", + "backupImportConfirmMessage": "ファイル内のお気に入り、局、プリセットを追加します。続行しますか?", + "backupImportSuccess": "設定を正常にインポートしました", + "backupImportError": "インポート中にエラー: {error}", + "appVersionLoading": "バージョンを読み込み中...", + "appVersionSubtitle": "{version} - 世界のラジオ", + "savedFavoritesTitle": "保存済みのお気に入り", + "stationFilterTitle": "局フィルター", + "stationFilterSubtitle": "有効確認済みの局のみ", + "backgroundAudioTitle": "バックグラウンド音声", + "backgroundAudioSubtitle": "画面を消しても継続します", "dash": "—", "@recordingsPathSaveError": { "placeholders": { @@ -148,15 +176,15 @@ "version": {} } }, - "cancelAction": "Cancel", - "equalizerTitle": "Equalizer", - "recordingsOpenFolder": "Open folder", - "recordingsOpenFolderError": "Could not open the folder: {error}", - "recordingsMaxSizeTitle": "Maximum recording size", - "recordingsMaxSizeSubtitle": "Current limit: {size} MB", - "recordingsMaxSizeDialogTitle": "Maximum size per recording", - "recordingsMaxSizeMbLabel": "Maximum megabytes", - "recordingsMaxSizeSaved": "Recording limit updated to {size} MB", + "cancelAction": "キャンセル", + "equalizerTitle": "イコライザー", + "recordingsOpenFolder": "フォルダーを開く", + "recordingsOpenFolderError": "フォルダーを開けませんでした: {error}", + "recordingsMaxSizeTitle": "録音の最大サイズ", + "recordingsMaxSizeSubtitle": "現在の上限: {size} MB", + "recordingsMaxSizeDialogTitle": "録音ごとの最大サイズ", + "recordingsMaxSizeMbLabel": "最大メガバイト", + "recordingsMaxSizeSaved": "録音上限を {size} MB に更新しました", "@recordingsOpenFolderError": { "placeholders": { "error": {} @@ -176,33 +204,33 @@ } } }, - "stationOrderTitle": "Station order", - "stationOrderByName": "By name", - "stationOrderByQuality": "By quality", - "stationOrderScopeDescription": "Applies to favorites, searches, nearby stations and quick lists.", - "favoriteGroupsTitle": "Favorite lists", - "favoriteGroupsDescription": "Create short lists to organize your saved stations.", - "favoriteGroupsAdd": "Add list", - "favoriteGroupsEdit": "Edit list", - "favoriteGroupsDelete": "Delete list", - "favoriteGroupsNameLabel": "List name", - "favoriteGroupsNameTooLong": "Maximum 28 characters.", - "favoriteGroupsUnassigned": "Unassigned", - "favoriteGroupsProtectedHint": "Default list: it cannot be edited or deleted.", - "favoriteGroupsCreated": "List created", - "favoriteGroupsUpdated": "List updated", - "favoriteGroupsDeleted": "List deleted; its stations return to Unassigned.", - "favoriteGroupsAssign": "Move to list", - "favoriteGroupsAssignSubtitle": "Current list: {groupName}", - "favoriteGroupsAssigned": "{stationName} moved to {groupName}", - "favoritesTitle": "Favorites", - "favoritesEmptyTitle": "No favorites yet", - "favoritesEmptySubtitle": "Tap the heart on any station to save it to your collection.", - "favoritesHeaderSubtitle": "Organize your collection by lists and keep important radios close.", - "favoritesCollection": "Collection", - "favoritesSavedCount": "{count} saved", - "favoritesRemoveTooltip": "Remove from favorites", - "favoritesRemovedMessage": "{stationName} removed from favorites", + "stationOrderTitle": "局の並び順", + "stationOrderByName": "名前順", + "stationOrderByQuality": "品質順", + "stationOrderScopeDescription": "お気に入り、検索、近くの局、クイック一覧に適用されます。", + "favoriteGroupsTitle": "お気に入りリスト", + "favoriteGroupsDescription": "保存した局を整理する短いリストを作成します。", + "favoriteGroupsAdd": "リストを追加", + "favoriteGroupsEdit": "リストを編集", + "favoriteGroupsDelete": "リストを削除", + "favoriteGroupsNameLabel": "リスト名", + "favoriteGroupsNameTooLong": "最大28文字です。", + "favoriteGroupsUnassigned": "未割り当て", + "favoriteGroupsProtectedHint": "既定のリスト: 編集または削除できません。", + "favoriteGroupsCreated": "リストを作成しました", + "favoriteGroupsUpdated": "リストを更新しました", + "favoriteGroupsDeleted": "リストを削除しました。局は未割り当てに戻りました。", + "favoriteGroupsAssign": "リストへ移動", + "favoriteGroupsAssignSubtitle": "現在のリスト: {groupName}", + "favoriteGroupsAssigned": "{stationName} を {groupName} に移動しました", + "favoritesTitle": "お気に入り", + "favoritesEmptyTitle": "まだお気に入りはありません", + "favoritesEmptySubtitle": "任意の局でハートをタップしてコレクションに保存します。", + "favoritesHeaderSubtitle": "コレクションをリストで整理し、大事なラジオを近くに置きましょう。", + "favoritesCollection": "コレクション", + "favoritesSavedCount": "{count} 件保存済み", + "favoritesRemoveTooltip": "お気に入りから削除", + "favoritesRemovedMessage": "{stationName} をお気に入りから削除しました", "@favoriteGroupsAssignSubtitle": { "placeholders": { "groupName": {} @@ -226,23 +254,23 @@ "stationName": {} } }, - "alarmPostponedCurrentExecution": "Alarm postponed for this occurrence.", - "searchScreenTitle": "放送局を探す", - "searchScreenSubtitle": "名前・国・言語から、すばやい絞り込みと高コントラスト表示で放送局を見つけましょう。", - "searchFiltersLabel": "絞り込み", - "searchHint": "Radio Horizon、ジャズ、ニュース...", + "alarmPostponedCurrentExecution": "この実行のアラームを延期しました。", + "searchScreenTitle": "電波を探す", + "searchScreenSubtitle": "名前、国、言語で、すばやいフィルターと高コントラスト表示からラジオを見つけます。", + "searchFiltersLabel": "フィルター", + "searchHint": "ラジオ・オリゾンテ、ジャズ、ニュース...", "searchCountryFilterLabel": "国", "searchLanguageFilterLabel": "言語", "searchMinQualityFilterLabel": "最低品質", - "searchEmptyTitle": "放送局を検索", + "searchEmptyTitle": "局を検索", "searchNoResultsTitle": "結果がありません", - "searchEmptySubtitle": "上部のバーやチップを使って、世界中の放送局を見つけましょう。", - "searchNoResultsSubtitle": "フィルターを減らすか別の名前で入力して、配信中の放送局を探してみましょう。", + "searchEmptySubtitle": "上部バーやチップを使って、世界中の電波を見つけましょう。", + "searchNoResultsSubtitle": "有効な電波を見つけるには、フィルターを外すか別の名前を入力してください。", "countrySpain": "スペイン", - "countryUsa": "アメリカ", + "countryUsa": "米国", "countryMexico": "メキシコ", "countryArgentina": "アルゼンチン", - "countryUk": "イギリス", + "countryUk": "英国", "countryFrance": "フランス", "countryGermany": "ドイツ", "countryItaly": "イタリア", @@ -257,9 +285,9 @@ "languageNameJapanese": "日本語", "languageNameArabic": "アラビア語", "languageNameRussian": "ロシア語", - "homeScreenSubtitle": "Live global radio with clean signals, smart favorites, and a show-style visual experience.", - "exploreStations": "Explore stations", - "stationsCount": "{count} stations", + "homeScreenSubtitle": "クリアな電波、スマートなお気に入り、クイズ番組風のビジュアル体験を備えたライブ世界ラジオ。", + "exploreStations": "局を探す", + "stationsCount": "{count} 局", "@stationsCount": { "placeholders": { "count": { @@ -267,36 +295,36 @@ } } }, - "qualityHd": "HD quality", - "nearYou": "Near you", - "nearYouInCountry": "Near you ? {country}", + "qualityHd": "HD品質", + "nearYou": "近く", + "nearYouInCountry": "近く · {country}", "@nearYouInCountry": { "placeholders": { "country": {} } }, - "detectAction": "Detect", - "liveRadar": "Live radar", - "genresTitle": "Genres", - "retryAction": "Retry", - "noStationsAvailable": "No stations available", - "noStationsAvailableSubtitle": "Try refreshing or choosing another genre to capture a signal again.", - "genrePop": "Pop", - "genreRock": "Rock", - "genreJazz": "Jazz", - "genreClassical": "Classical", - "genreElectronic": "Electronic", - "genreNews": "News", - "genreTalk": "Talk", - "genreHipHop": "Hip-hop", - "genreCountry": "Country", - "genreMetal": "Metal", - "genreReggae": "Reggae", - "genreLatin": "Latin", - "alarmScreenTitle": "Music wake-up", - "alarmScreenSubtitle": "Alarms with radio, safe fallback sound, smart vacations, and the next occurrence always visible.", - "createAlarmAction": "Create alarm", - "alarmsCount": "{count} alarms", + "detectAction": "検出", + "liveRadar": "ライブレーダー", + "genresTitle": "ジャンル", + "retryAction": "再試行", + "noStationsAvailable": "利用できる局がありません", + "noStationsAvailableSubtitle": "再読み込みするか別のジャンルを選んで、もう一度電波をつかまえてください。", + "genrePop": "ポップ", + "genreRock": "ロック", + "genreJazz": "ジャズ", + "genreClassical": "クラシック", + "genreElectronic": "電子音楽", + "genreNews": "ニュース", + "genreTalk": "トーク", + "genreHipHop": "ヒップホップ", + "genreCountry": "カントリー", + "genreMetal": "メタル", + "genreReggae": "レゲエ", + "genreLatin": "ラテン", + "alarmScreenTitle": "音楽で目覚める", + "alarmScreenSubtitle": "ラジオアラーム、安全な音、スマート休暇、次回実行を常に表示します。", + "createAlarmAction": "アラームを作成", + "alarmsCount": "{count} 件のアラーム", "@alarmsCount": { "placeholders": { "count": { @@ -304,10 +332,10 @@ } } }, - "activeAlarmsWithoutNextTitle": "Active alarms without a next occurrence", - "noActiveAlarms": "No active alarms", - "nextAlarmTitle": "Next alarm", - "activeAlarmsWithoutNextSubtitle": "There are {count} active alarm(s), but they do not currently have a valid future date. Check date, weekdays, and vacations.", + "activeAlarmsWithoutNextTitle": "次回実行がない有効なアラーム", + "noActiveAlarms": "有効なアラームはありません", + "nextAlarmTitle": "次のアラーム", + "activeAlarmsWithoutNextSubtitle": "{count} 件の有効なアラームがありますが、現在は有効な未来の日付がありません。日付、曜日、休暇を確認してください。", "@activeAlarmsWithoutNextSubtitle": { "placeholders": { "count": { @@ -315,10 +343,10 @@ } } }, - "createAlarmHint": "Create an alarm and PluriWave will calculate the next occurrence automatically.", - "alarmVacationPlay": "Plays during vacations", - "alarmVacationPause": "Paused during vacations", - "alarmFadeInLabel": "Fade-in {seconds}s", + "createAlarmHint": "アラームを作成すると、PluriWave が次回実行を自動計算します。", + "alarmVacationPlay": "休暇中も鳴らす", + "alarmVacationPause": "休暇中は一時停止", + "alarmFadeInLabel": "フェードイン {seconds}秒", "@alarmFadeInLabel": { "placeholders": { "seconds": { @@ -326,61 +354,61 @@ } } }, - "alarmNextExecution": "Next occurrence: {date}", + "alarmNextExecution": "次回実行: {date}", "@alarmNextExecution": { "placeholders": { "date": {} } }, - "alarmNoNextExecution": "It has no active next occurrence.", - "alarmSkippedExecution": "One occurrence was skipped: {date}.", + "alarmNoNextExecution": "有効な次回実行はありません。", + "alarmSkippedExecution": "1 回の実行をスキップしました: {date}。", "@alarmSkippedExecution": { "placeholders": { "date": {} } }, - "editAction": "Edit", - "skipNextAction": "Skip next", - "deleteTooltip": "Delete", - "alarmSkippedNoNextSnackbar": "Alarm skipped. There is no next occurrence left.", - "alarmSkippedReturnsSnackbar": "Alarm skipped. It will return on {date}.", + "editAction": "編集", + "skipNextAction": "次回をスキップ", + "deleteTooltip": "削除", + "alarmSkippedNoNextSnackbar": "アラームをスキップしました。次回実行は残っていません。", + "alarmSkippedReturnsSnackbar": "アラームをスキップしました。{date} に戻ります。", "@alarmSkippedReturnsSnackbar": { "placeholders": { "date": {} } }, - "alarmVacationPausedNoNext": "It is paused for vacations ({vacationName}) and has no next occurrence.", + "alarmVacationPausedNoNext": "休暇({vacationName})で一時停止中、次回実行はありません。", "@alarmVacationPausedNoNext": { "placeholders": { "vacationName": {} } }, - "alarmVacationPausedReturns": "It is paused for vacations ({vacationName}) and returns on {date}.", + "alarmVacationPausedReturns": "休暇({vacationName})で一時停止中、{date} に戻ります。", "@alarmVacationPausedReturns": { "placeholders": { "vacationName": {}, "date": {} } }, - "alarmVacationReturns": "With vacations enabled, it will ring again on {date}.", + "alarmVacationReturns": "休暇が有効なため、{date} に再び鳴ります。", "@alarmVacationReturns": { "placeholders": { "date": {} } }, - "defaultAlarmName": "Music alarm", - "newAlarmTitle": "New alarm", - "editAlarmTitle": "Edit alarm", - "nameField": "Name", - "timeField": "Time", - "dateField": "Date", - "onceOption": "Once", - "dailyOption": "Daily", - "weekdaysOption": "Weekdays", - "soundAndVolumeSection": "Sound and volume", - "alarmFadeInTitle": "Alarm fade-in", - "alarmFadeInOff": "0 s (no transition)", - "alarmFadeInSummary": "{seconds} s (from 5% to the selected volume)", + "defaultAlarmName": "音楽アラーム", + "newAlarmTitle": "新しいアラーム", + "editAlarmTitle": "アラームを編集", + "nameField": "名前", + "timeField": "時刻", + "dateField": "日付", + "onceOption": "1回", + "dailyOption": "毎日", + "weekdaysOption": "曜日", + "soundAndVolumeSection": "音と音量", + "alarmFadeInTitle": "アラームのフェードイン", + "alarmFadeInOff": "0 秒(切り替えなし)", + "alarmFadeInSummary": "{seconds} 秒(5% から選択音量まで)", "@alarmFadeInSummary": { "placeholders": { "seconds": { @@ -388,22 +416,22 @@ } } }, - "internalSafeSoundLabel": "Internal safe sound", - "soundWarmSunrise": "Warm sunrise", - "soundSoftBell": "Soft bell", - "soundDigitalPulse": "Digital pulse", - "favoriteStationLabel": "Favorite station", - "noStationUseInternalSound": "No station: use internal sound", - "saveFavoritesAlarmHint": "Save stations in Favorites to use them as a music alarm.", - "useCurrentStationAction": "Use current station", - "playDuringVacations": "Play during vacations", - "playDuringVacationsHint": "If you turn this off, the next occurrence will jump to the first valid day.", - "saveAlarmAction": "Save alarm", - "chooseOneWeekdayError": "Choose at least one weekday.", - "androidReliabilityReview": "Review Android reliability", - "statusOk": "OK", - "statusPending": "pending", - "androidReliabilityStatus": "Reliability: exact {exact} ? notifications {notifications} ? screen {screen}", + "internalSafeSoundLabel": "安全な内部音", + "soundWarmSunrise": "暖かな日の出", + "soundSoftBell": "やさしいベル", + "soundDigitalPulse": "デジタルパルス", + "favoriteStationLabel": "お気に入り局", + "noStationUseInternalSound": "局なし: 内部音を使用", + "saveFavoritesAlarmHint": "音楽アラームとして使うには、局をお気に入りに保存してください。", + "useCurrentStationAction": "現在の局を使用", + "playDuringVacations": "休暇中も鳴らす", + "playDuringVacationsHint": "オフにすると、次回実行は最初の有効日にスキップされます。", + "saveAlarmAction": "アラームを保存", + "chooseOneWeekdayError": "少なくとも曜日を1つ選択してください。", + "androidReliabilityReview": "Android の信頼性を確認", + "statusOk": "良好", + "statusPending": "保留中", + "androidReliabilityStatus": "信頼性: 正確 {exact} · 通知 {notifications} · 画面 {screen}", "@androidReliabilityStatus": { "placeholders": { "exact": {}, @@ -411,19 +439,165 @@ "screen": {} } }, - "vacationRangesTitle": "Vacation ranges", - "addAction": "Add", - "vacationRangesHint": "If an alarm is set to \"Paused during vacations\", it automatically skips these ranges.", - "noVacationRangesLoaded": "No ranges loaded.", - "deleteRangeTooltip": "Delete range", - "vacationsDefaultName": "Vacation", - "newVacationRangeTitle": "New vacation range", - "startField": "Start", - "endField": "End", - "saveRangeAction": "Save range", - "noAlarmsYetTitle": "There are no alarms yet.", - "noAlarmsYetSubtitle": "Create one to design your musical wake-up.", - "ringingInternalAudioActive": "Playing with internal safe audio.", - "ringingPreparingInternalAudio": "Preparing internal safe audio.", - "stopAlarmAction": "Stop alarm" + "vacationRangesTitle": "休暇期間", + "addAction": "追加", + "vacationRangesHint": "アラームが「休暇中は一時停止」の場合、これらの期間は自動的にスキップされます。", + "noVacationRangesLoaded": "読み込まれた期間はありません。", + "deleteRangeTooltip": "期間を削除", + "vacationsDefaultName": "休暇", + "newVacationRangeTitle": "新しい休暇期間", + "startField": "開始", + "endField": "終了", + "saveRangeAction": "期間を保存", + "noAlarmsYetTitle": "まだアラームはありません。", + "noAlarmsYetSubtitle": "音楽で目覚める体験を作るために、アラームを作成しましょう。", + "ringingInternalAudioActive": "安全な内部音で鳴っています。", + "ringingPreparingInternalAudio": "安全な内部音を準備中です。", + "stopAlarmAction": "アラームを停止", + "pauseAction": "一時停止", + "miniPlayerOpenLabel": "{stationName}のプレーヤーを開く", + "@miniPlayerOpenLabel": { + "placeholders": { + "stationName": {} + } + }, + "playerIconLabel": "プレーヤー", + "playbackStatusConnecting": "接続中...", + "playbackStatusLive": "ライブ", + "playbackStatusPaused": "一時停止中", + "playbackStatusConnectionError": "接続エラー", + "playbackStatusStopped": "停止中", + "stationSemanticLabel": "ラジオ局 {stationName}", + "@stationSemanticLabel": { + "placeholders": { + "stationName": {} + } + }, + "favoritesAddTooltip": "お気に入りに追加", + "favoritesAddedMessage": "{stationName}をお気に入りに追加しました", + "@favoritesAddedMessage": { + "placeholders": { + "stationName": {} + } + }, + "stationIconLabel": "ラジオ局アイコン", + "liveNow": "ライブ", + "equalizerBandLabel": "{band}バンド", + "@equalizerBandLabel": { + "placeholders": { + "band": {} + } + }, + "equalizerBandValue": "{value} デシベル", + "@equalizerBandValue": { + "placeholders": { + "value": {} + } + }, + "equalizerPresetFlat": "フラット", + "equalizerPresetRock": "ロック", + "equalizerPresetPop": "ポップ", + "equalizerPresetBassBoost": "低音ブースト", + "equalizerPresetJazz": "ジャズ", + "equalizerPresetVoice": "音声", + "equalizerPresetCustom": "カスタム", + "onboardingTitle": "PluriWaveへようこそ", + "onboardingNewsTitle": "新機能", + "onboardingStartAction": "始める", + "onboardingCloseTooltip": "閉じる", + "radioRecordingError": "ラジオの録音エラー: {error}", + "@radioRecordingError": { + "placeholders": { + "error": {} + } + }, + "radioApiConnectionError": "ラジオAPIに接続できません", + "radioSearchError": "検索エラーです。接続を確認してください。", + "radioLoadMoreStationsError": "これ以上ラジオ局を読み込めませんでした。", + "radioNearbyStationsError": "近くのラジオ局を検出できませんでした。国フィルターを使用してください。", + "radioCannotPlayStation": "\"{stationName}\"を再生できません", + "@radioCannotPlayStation": { + "placeholders": { + "stationName": {} + } + }, + "recordingSelectStationFirst": "録音するにはまずラジオ局を選択してください。", + "recordingStartError": "録音を開始できませんでした: {error}", + "@recordingStartError": { + "placeholders": { + "error": {} + } + }, + "unsupportedConfigVersion": "サポートされていない設定バージョンです", + "audioErrorGeneric": "再生エラー", + "audioErrorNoInternet": "インターネット接続がありません", + "audioErrorInvalidUrl": "ラジオのURLが無効です", + "audioErrorNotFound": "ラジオは利用できません(404エラー)", + "audioErrorTimeout": "接続がタイムアウトしました", + "audioErrorCannotConnect": "ラジオに接続できません", + "audioErrorUnsupportedFormat": "サポートされていないストリーム形式です", + "audioErrorDecode": "音声ストリームのデコード中にエラーが発生しました", + "audioErrorCleartext": "このラジオは暗号化されていないHTTPを使用しているため、許可されていません", + "audioErrorSsl": "ラジオのSSL証明書が無効です", + "audioErrorCannotPlay": "このラジオは再生できません", + "audioErrorUnexpectedPlayback": "再生中に予期しないエラーが発生しました", + "androidExactAlarmScheduleError": "Androidで正確なアラームをスケジュールできませんでした。正確なアラームの権限を確認してください。", + "recordingPathEmptyError": "録音パスを空にすることはできません", + "recordingMaxSizeInvalidError": "最大サイズは0より大きくする必要があります", + "recordingAlreadyActiveError": "すでに録音が進行中です", + "alarmRingingFallbackActive": "内部の安全な音声で再生しています。", + "alarmRingingPreparingFallback": "内部の安全な音声を準備しています。", + "alarmRingingTryingStation": "利用可能な最高音質で放送局の再生を試みています。", + "alarmScheduleOnce": "1回 · {date}", + "@alarmScheduleOnce": { + "placeholders": { + "date": {} + } + }, + "alarmScheduleWeekdays": "曜日: {days}", + "@alarmScheduleWeekdays": { + "placeholders": { + "days": {} + } + }, + "androidReliabilityTitle": "Androidの信頼性を確認", + "closeAction": "閉じる", + "customOption": "カスタム", + "endLabel": "終了", + "equalizerDisable": "イコライザーを無効化", + "helpTitle": "ヘルプとチュートリアル", + "helpSubtitle": "PluriWaveの機能、ヒント、新着情報を確認できます。", + "indefiniteOption": "無期限", + "invalidNumber": "無効な数値", + "nameLabel": "名前", + "notPlaying": "再生していません", + "oneTimeOption": "1回", + "pausePlaybackTooltip": "再生を一時停止", + "qualityOriginal": "元の音質: {quality}", + "@qualityOriginal": { + "placeholders": { + "quality": {} + } + }, + "qualityUnknown": "音質情報なし", + "recordAction": "録音", + "recordDurationTitle": "録音時間", + "recordRadioSubtitle": "録音する時間を選んでください。", + "recordRadioTitle": "ラジオを録音", + "recordingActiveTitle": "ラジオを録音中", + "recordingDirectTitle": "ダイレクト録音", + "recordingsOpenFolderPlainError": "録音フォルダーを開けませんでした", + "recordingsOpenLatest": "最新の録音を開く", + "recordingsOpenLatestError": "最新の録音を開けませんでした", + "startLabel": "開始", + "startPlaybackTooltip": "再生を開始", + "stopAction": "停止", + "stopPlaybackTooltip": "再生を停止", + "weekdayShortMonday": "月", + "weekdayShortTuesday": "火", + "weekdayShortWednesday": "水", + "weekdayShortThursday": "木", + "weekdayShortFriday": "金", + "weekdayShortSaturday": "土", + "weekdayShortSunday": "日" } diff --git a/lib/l10n/app_localizations_ext.dart b/lib/l10n/app_localizations_ext.dart index 5566652..47812bb 100644 --- a/lib/l10n/app_localizations_ext.dart +++ b/lib/l10n/app_localizations_ext.dart @@ -22,911 +22,356 @@ extension PluriAppLocalizationsExt on AppLocalizations { String _pick(Map values) => values[_lang()] ?? values['en'] ?? values.values.first; - String get searchScreenTitle => _pick({ - 'es': 'Buscar señal', - 'en': 'Search station', - 'fr': 'Rechercher une station', - 'de': 'Sender suchen', - 'it': 'Cerca stazione', - 'pt': 'Buscar estação', - 'ru': 'Поиск станций', - 'ja': '放送局を探す', - 'zh': '搜索电台', - 'ar': 'ابحث عن محطة', - 'hi': 'स्टेशन खोजें', - 'bn': 'স্টেশন খুঁজুন', - 'id': 'Cari stasiun', - }); - - String get searchScreenSubtitle => _pick({ - 'es': 'Encontrá radios por nombre, país o idioma con filtros rápidos y alto contraste.', - 'en': 'Find stations by name, country, or language with quick filters and high contrast.', - 'fr': 'Trouvez des stations par nom, pays ou langue avec des filtres rapides et un contraste élevé.', - 'de': 'Finde Sender nach Name, Land oder Sprache mit schnellen Filtern und hohem Kontrast.', - 'it': 'Trova stazioni per nome, paese o lingua con filtri rapidi e alto contrasto.', - 'pt': 'Encontre estações por nome, país ou idioma com filtros rápidos e alto contraste.', - 'ru': 'Ищите станции по названию, стране или языку с быстрыми фильтрами и высокой контрастностью.', - 'ja': '名前・国・言語で放送局を検索できます。すばやいフィルターと高コントラスト表示に対応しています。', - 'zh': '可按名称、国家或语言查找电台,并提供快速筛选和高对比度显示。', - 'ar': 'اعثر على المحطات حسب الاسم أو البلد أو اللغة باستخدام فلاتر سريعة وتباين عالٍ.', - 'hi': 'नाम, देश या भाषा के आधार पर स्टेशन खोजें, तेज़ फ़िल्टर और उच्च कंट्रास्ट के साथ।', - 'bn': 'নাম, দেশ বা ভাষা অনুযায়ী স্টেশন খুঁজুন—দ্রুত ফিল্টার ও উচ্চ কনট্রাস্টসহ।', - 'id': 'Temukan stasiun berdasarkan nama, negara, atau bahasa dengan filter cepat dan kontras tinggi.', - }); - - String get searchFiltersLabel => _pick({ - 'es': 'Filtros', - 'en': 'Filters', - 'fr': 'Filtres', - 'de': 'Filter', - 'it': 'Filtri', - 'pt': 'Filtros', - 'ru': 'Фильтры', - 'ja': '絞り込み', - 'zh': '筛选', - 'ar': 'الفلاتر', - 'hi': 'फ़िल्टर', - 'bn': 'ফিল্টার', - 'id': 'Filter', - }); - - String get searchHint => _pick({ - 'es': 'Nombre de emisora, país o idioma', - 'en': 'Station name, country, or language', - 'fr': 'Nom de la station, pays ou langue', - 'de': 'Sendername, Land oder Sprache', - 'it': 'Nome stazione, paese o lingua', - 'pt': 'Nome da estação, país ou idioma', - 'ru': 'Название станции, страна или язык', - 'ja': '放送局名・国・言語', - 'zh': '电台名、国家或语言', - 'ar': 'اسم المحطة أو البلد أو اللغة', - 'hi': 'स्टेशन का नाम, देश या भाषा', - 'bn': 'স্টেশনের নাম, দেশ বা ভাষা', - 'id': 'Nama stasiun, negara, atau bahasa', - }); - - String get searchCountryFilterLabel => _pick({ - 'es': 'País', - 'en': 'Country', - 'fr': 'Pays', - 'de': 'Land', - 'it': 'Paese', - 'pt': 'País', - 'ru': 'Страна', - 'ja': '国', - 'zh': '国家', - 'ar': 'البلد', - 'hi': 'देश', - 'bn': 'দেশ', - 'id': 'Negara', - }); - - String get searchLanguageFilterLabel => _pick({ - 'es': 'Idioma', - 'en': 'Language', - 'fr': 'Langue', - 'de': 'Sprache', - 'it': 'Lingua', - 'pt': 'Idioma', - 'ru': 'Язык', - 'ja': '言語', - 'zh': '语言', - 'ar': 'اللغة', - 'hi': 'भाषा', - 'bn': 'ভাষা', - 'id': 'Bahasa', - }); - - String get searchMinQualityFilterLabel => _pick({ - 'es': 'Calidad mínima', - 'en': 'Minimum quality', - 'fr': 'Qualité minimale', - 'de': 'Mindestqualität', - 'it': 'Qualità minima', - 'pt': 'Qualidade mínima', - 'ru': 'Минимальное качество', - 'ja': '最低音質', - 'zh': '最低质量', - 'ar': 'الحد الأدنى للجودة', - 'hi': 'न्यूनतम गुणवत्ता', - 'bn': 'সর্বনিম্ন মান', - 'id': 'Kualitas minimum', - }); - - String get searchEmptyTitle => _pick({ - 'es': 'Buscá una emisora', - 'en': 'Search for a station', - 'fr': 'Rechercher une station', - 'de': 'Suche nach einem Sender', - 'it': 'Cerca una stazione', - 'pt': 'Busque uma estação', - 'ru': 'Найдите станцию', - 'ja': '放送局を検索', - 'zh': '搜索电台', - 'ar': 'ابحث عن محطة', - 'hi': 'किसी स्टेशन को खोजें', - 'bn': 'একটি স্টেশন খুঁজুন', - 'id': 'Cari sebuah stasiun', - }); - - String get searchNoResultsTitle => _pick({ - 'es': 'Sin resultados', - 'en': 'No results', - 'fr': 'Aucun résultat', - 'de': 'Keine Ergebnisse', - 'it': 'Nessun risultato', - 'pt': 'Sem resultados', - 'ru': 'Ничего не найдено', - 'ja': '結果がありません', - 'zh': '没有结果', - 'ar': 'لا توجد نتائج', - 'hi': 'कोई परिणाम नहीं', - 'bn': 'কোনও ফলাফল নেই', - 'id': 'Tidak ada hasil', - }); - - String get searchEmptySubtitle => _pick({ - 'es': 'Usá la barra superior o los chips para descubrir señales de todo el mundo.', - 'en': 'Use the top bar or the chips to discover stations from around the world.', - 'fr': 'Utilisez la barre supérieure ou les filtres pour découvrir des stations du monde entier.', - 'de': 'Nutze die obere Leiste oder die Chips, um Sender aus aller Welt zu entdecken.', - 'it': 'Usa la barra superiore o i filtri per scoprire stazioni da tutto il mondo.', - 'pt': 'Use a barra superior ou os chips para descobrir estações do mundo todo.', - 'ru': 'Используйте верхнюю строку или фильтры, чтобы находить станции со всего мира.', - 'ja': '上部バーやチップを使って、世界中の放送局を見つけましょう。', - 'zh': '使用顶部搜索栏或筛选标签,发现来自世界各地的电台。', - 'ar': 'استخدم الشريط العلوي أو الشرائح لاكتشاف محطات من جميع أنحاء العالم.', - 'hi': 'दुनिया भर के स्टेशन खोजने के लिए ऊपर की बार या चिप्स का उपयोग करें।', - 'bn': 'সারা বিশ্বের স্টেশন খুঁজতে উপরের বার বা চিপগুলো ব্যবহার করুন।', - 'id': 'Gunakan bilah atas atau chip untuk menemukan stasiun dari seluruh dunia.', - }); - - String get searchNoResultsSubtitle => _pick({ - 'es': 'Probá quitar filtros o escribir otro nombre para encontrar una señal activa.', - 'en': 'Try removing filters or typing another name to find an active station.', - 'fr': 'Essayez de retirer des filtres ou de saisir un autre nom pour trouver une station active.', - 'de': 'Versuche, Filter zu entfernen oder einen anderen Namen einzugeben, um einen aktiven Sender zu finden.', - 'it': 'Prova a rimuovere i filtri o a digitare un altro nome per trovare una stazione attiva.', - 'pt': 'Tente remover os filtros ou digitar outro nome para encontrar uma estação ativa.', - 'ru': 'Попробуйте убрать фильтры или ввести другое название, чтобы найти активную станцию.', - 'ja': 'フィルターを減らすか別の名前を入力して、再生可能な放送局を探してみてください。', - 'zh': '试着移除筛选条件或输入其他名称,以找到可用电台。', - 'ar': 'جرّب إزالة بعض الفلاتر أو كتابة اسم آخر للعثور على محطة نشطة.', - 'hi': 'सक्रिय स्टेशन खोजने के लिए फ़िल्टर हटाएँ या कोई दूसरा नाम लिखें।', - 'bn': 'সক্রিয় স্টেশন খুঁজতে কিছু ফিল্টার সরান বা অন্য নাম লিখুন।', - 'id': 'Coba hapus filter atau ketik nama lain untuk menemukan stasiun yang aktif.', - }); - - String get countrySpain => _pick({ - 'es': 'España', - 'en': 'Spain', - 'fr': 'Espagne', - 'de': 'Spanien', - 'it': 'Spagna', - 'pt': 'Espanha', - 'ru': 'Испания', - 'ja': 'スペイン', - 'zh': '西班牙', - 'ar': 'إسبانيا', - 'hi': 'स्पेन', - 'bn': 'স্পেন', - 'id': 'Spanyol', - }); - - String get countryUsa => _pick({ - 'es': 'Estados Unidos', - 'en': 'United States', - 'fr': 'États-Unis', - 'de': 'Vereinigte Staaten', - 'it': 'Stati Uniti', - 'pt': 'Estados Unidos', - 'ru': 'США', - 'ja': 'アメリカ合衆国', - 'zh': '美国', - 'ar': 'الولايات المتحدة', - 'hi': 'संयुक्त राज्य', - 'bn': 'যুক্তরাষ্ট্র', - 'id': 'Amerika Serikat', - }); - - String get countryMexico => _pick({ - 'es': 'México', - 'en': 'Mexico', - 'fr': 'Mexique', - 'de': 'Mexiko', - 'it': 'Messico', - 'pt': 'México', - 'ru': 'Мексика', - 'ja': 'メキシコ', - 'zh': '墨西哥', - 'ar': 'المكسيك', - 'hi': 'मेक्सिको', - 'bn': 'মেক্সিকো', - 'id': 'Meksiko', - }); - - String get countryArgentina => _pick({ - 'es': 'Argentina', - 'en': 'Argentina', - 'fr': 'Argentine', - 'de': 'Argentinien', - 'it': 'Argentina', - 'pt': 'Argentina', - 'ru': 'Аргентина', - 'ja': 'アルゼンチン', - 'zh': '阿根廷', - 'ar': 'الأرجنتين', - 'hi': 'अर्जेंटीना', - 'bn': 'আর্জেন্টিনা', - 'id': 'Argentina', - }); - - String get countryUk => _pick({ - 'es': 'Reino Unido', - 'en': 'United Kingdom', - 'fr': 'Royaume-Uni', - 'de': 'Vereinigtes Königreich', - 'it': 'Regno Unito', - 'pt': 'Reino Unido', - 'ru': 'Великобритания', - 'ja': 'イギリス', - 'zh': '英国', - 'ar': 'المملكة المتحدة', - 'hi': 'यूनाइटेड किंगडम', - 'bn': 'যুক্তরাজ্য', - 'id': 'Britania Raya', - }); - - String get countryFrance => _pick({ - 'es': 'Francia', - 'en': 'France', - 'fr': 'France', - 'de': 'Frankreich', - 'it': 'Francia', - 'pt': 'França', - 'ru': 'Франция', - 'ja': 'フランス', - 'zh': '法国', - 'ar': 'فرنسا', - 'hi': 'फ़्रांस', - 'bn': 'ফ্রান্স', - 'id': 'Prancis', - }); - - String get countryGermany => _pick({ - 'es': 'Alemania', - 'en': 'Germany', - 'fr': 'Allemagne', - 'de': 'Deutschland', - 'it': 'Germania', - 'pt': 'Alemanha', - 'ru': 'Германия', - 'ja': 'ドイツ', - 'zh': '德国', - 'ar': 'ألمانيا', - 'hi': 'जर्मनी', - 'bn': 'জার্মানি', - 'id': 'Jerman', - }); - - String get countryItaly => _pick({ - 'es': 'Italia', - 'en': 'Italy', - 'fr': 'Italie', - 'de': 'Italien', - 'it': 'Italia', - 'pt': 'Itália', - 'ru': 'Италия', - 'ja': 'イタリア', - 'zh': '意大利', - 'ar': 'إيطاليا', - 'hi': 'इटली', - 'bn': 'ইতালি', - 'id': 'Italia', - }); - - String get countryBrazil => _pick({ - 'es': 'Brasil', - 'en': 'Brazil', - 'fr': 'Brésil', - 'de': 'Brasilien', - 'it': 'Brasile', - 'pt': 'Brasil', - 'ru': 'Бразилия', - 'ja': 'ブラジル', - 'zh': '巴西', - 'ar': 'البرازيل', - 'hi': 'ब्राज़ील', - 'bn': 'ব্রাজিল', - 'id': 'Brasil', - }); - - String get countryJapan => _pick({ - 'es': 'Japón', - 'en': 'Japan', - 'fr': 'Japon', - 'de': 'Japan', - 'it': 'Giappone', - 'pt': 'Japão', - 'ru': 'Япония', - 'ja': '日本', - 'zh': '日本', - 'ar': 'اليابان', - 'hi': 'जापान', - 'bn': 'জাপান', - 'id': 'Jepang', - }); - - String get languageNameSpanish => _pick({ - 'es': 'Español', - 'en': 'Spanish', - 'fr': 'Espagnol', - 'de': 'Spanisch', - 'it': 'Spagnolo', - 'pt': 'Espanhol', - 'ru': 'Испанский', - 'ja': 'スペイン語', - 'zh': '西班牙语', - 'ar': 'الإسبانية', - 'hi': 'स्पेनिश', - 'bn': 'স্প্যানিশ', - 'id': 'Spanyol', - }); - - String get languageNameEnglish => _pick({ - 'es': 'Inglés', - 'en': 'English', - 'fr': 'Anglais', - 'de': 'Englisch', - 'it': 'Inglese', - 'pt': 'Inglês', - 'ru': 'Английский', - 'ja': '英語', - 'zh': '英语', - 'ar': 'الإنجليزية', - 'hi': 'अंग्रेज़ी', - 'bn': 'ইংরেজি', - 'id': 'Inggris', - }); - - String get languageNameFrench => _pick({ - 'es': 'Francés', - 'en': 'French', - 'fr': 'Français', - 'de': 'Französisch', - 'it': 'Francese', - 'pt': 'Francês', - 'ru': 'Французский', - 'ja': 'フランス語', - 'zh': '法语', - 'ar': 'الفرنسية', - 'hi': 'फ़्रेंच', - 'bn': 'ফরাসি', - 'id': 'Prancis', - }); - - String get languageNameGerman => _pick({ - 'es': 'Alemán', - 'en': 'German', - 'fr': 'Allemand', - 'de': 'Deutsch', - 'it': 'Tedesco', - 'pt': 'Alemão', - 'ru': 'Немецкий', - 'ja': 'ドイツ語', - 'zh': '德语', - 'ar': 'الألمانية', - 'hi': 'जर्मन', - 'bn': 'জার্মান', - 'id': 'Jerman', - }); - - String get languageNamePortuguese => _pick({ - 'es': 'Portugués', - 'en': 'Portuguese', - 'fr': 'Portugais', - 'de': 'Portugiesisch', - 'it': 'Portoghese', - 'pt': 'Português', - 'ru': 'Португальский', - 'ja': 'ポルトガル語', - 'zh': '葡萄牙语', - 'ar': 'البرتغالية', - 'hi': 'पुर्तगाली', - 'bn': 'পর্তুগিজ', - 'id': 'Portugis', - }); - - String get languageNameItalian => _pick({ - 'es': 'Italiano', - 'en': 'Italian', - 'fr': 'Italien', - 'de': 'Italienisch', - 'it': 'Italiano', - 'pt': 'Italiano', - 'ru': 'Итальянский', - 'ja': 'イタリア語', - 'zh': '意大利语', - 'ar': 'الإيطالية', - 'hi': 'इतालवी', - 'bn': 'ইতালীয়', - 'id': 'Italia', - }); - - String get languageNameJapanese => _pick({ - 'es': 'Japonés', - 'en': 'Japanese', - 'fr': 'Japonais', - 'de': 'Japanisch', - 'it': 'Giapponese', - 'pt': 'Japonês', - 'ru': 'Японский', - 'ja': '日本語', - 'zh': '日语', - 'ar': 'اليابانية', - 'hi': 'जापानी', - 'bn': 'জাপানি', - 'id': 'Jepang', - }); - - String get languageNameArabic => _pick({ - 'es': 'Árabe', - 'en': 'Arabic', - 'fr': 'Arabe', - 'de': 'Arabisch', - 'it': 'Arabo', - 'pt': 'Árabe', - 'ru': 'Арабский', - 'ja': 'アラビア語', - 'zh': '阿拉伯语', - 'ar': 'العربية', - 'hi': 'अरबी', - 'bn': 'আরবি', - 'id': 'Arab', - }); - - String get languageNameRussian => _pick({ - 'es': 'Ruso', - 'en': 'Russian', - 'fr': 'Russe', - 'de': 'Russisch', - 'it': 'Russo', - 'pt': 'Russo', - 'ru': 'Русский', - 'ja': 'ロシア語', - 'zh': '俄语', - 'ar': 'الروسية', - 'hi': 'रूसी', - 'bn': 'রুশ', - 'id': 'Rusia', - }); - - String get homeScreenSubtitle => _pick({ - 'es': 'Radio global en vivo con señales limpias, favoritos inteligentes y una experiencia visual de concurso.', - 'en': 'Live global radio with clean signals, smart favorites, and a show-style visual experience.', - 'fr': 'Radio mondiale en direct avec des signaux propres, des favoris intelligents et une expérience visuelle façon show.', - 'de': 'Weltweites Live-Radio mit sauberen Signalen, intelligenten Favoriten und einem showartigen visuellen Erlebnis.', - 'it': 'Radio globale in diretta con segnali puliti, preferiti intelligenti e un’esperienza visiva in stile show.', - 'pt': 'Rádio global ao vivo com sinais limpos, favoritos inteligentes e uma experiência visual em estilo de show.', - 'ru': 'Глобальное радио в прямом эфире с чистым сигналом, умными избранными и зрелищным визуальным стилем.', - 'ja': 'クリアな受信、賢いお気に入り、ショーのような演出で世界中のラジオをライブで楽しめます。', - 'zh': '全球直播电台,拥有清晰信号、智能收藏和富有节目感的视觉体验。', - 'ar': 'إذاعة عالمية مباشرة بإشارات نقية ومفضلة ذكية وتجربة بصرية بطابع استعراضي.', - 'hi': 'साफ सिग्नल, स्मार्ट पसंदीदा और शो-जैसे दृश्य अनुभव के साथ वैश्विक लाइव रेडियो।', - 'bn': 'পরিষ্কার সিগন্যাল, স্মার্ট ফেভারিট এবং শো-ধাঁচের ভিজ্যুয়াল অভিজ্ঞতাসহ বিশ্বজুড়ে লাইভ রেডিও।', - 'id': 'Radio global langsung dengan sinyal jernih, favorit cerdas, dan pengalaman visual bergaya pertunjukan.', - }); - - String get exploreStations => _pick({ - 'es': 'Explorar emisoras', - 'en': 'Explore stations', - 'fr': 'Explorer les stations', - 'de': 'Sender entdecken', - 'it': 'Esplora stazioni', - 'pt': 'Explorar estações', - 'ru': 'Исследовать станции', - 'ja': '放送局を探す', - 'zh': '探索电台', - 'ar': 'استكشاف المحطات', - 'hi': 'स्टेशन खोजें', - 'bn': 'স্টেশন ঘুরে দেখুন', - 'id': 'Jelajahi stasiun', - }); - - String homeStationsCount(int count) => _pick({ - 'es': '$count radios', - 'en': '$count stations', - 'fr': '$count stations', - 'de': '$count Sender', - 'it': '$count stazioni', - 'pt': '$count estações', - 'ru': '$count станций', - 'ja': '$count 局', - 'zh': '$count 个电台', - 'ar': '$count محطة', - 'hi': '$count स्टेशन', - 'bn': '$count স্টেশন', - 'id': '$count stasiun', - }); - - String get qualityHd => _pick({ - 'es': 'Calidad HD', - 'en': 'HD quality', - 'fr': 'Qualité HD', - 'de': 'HD-Qualität', - 'it': 'Qualità HD', - 'pt': 'Qualidade HD', - 'ru': 'HD-качество', - 'ja': 'HD音質', - 'zh': '高清音质', - 'ar': 'جودة HD', - 'hi': 'HD गुणवत्ता', - 'bn': 'এইচডি মান', - 'id': 'Kualitas HD', - }); - - String get nearYou => _pick({ - 'es': 'Cerca de vos', - 'en': 'Near you', - 'fr': 'Près de vous', - 'de': 'In deiner Nähe', - 'it': 'Vicino a te', - 'pt': 'Perto de você', - 'ru': 'Рядом с вами', - 'ja': '近くの放送局', - 'zh': '你附近的电台', - 'ar': 'بالقرب منك', - 'hi': 'आपके पास', - 'bn': 'আপনার কাছাকাছি', - 'id': 'Di dekat Anda', - }); - - String nearYouInCountry(String country) => _pick({ - 'es': 'Cerca de vos · $country', - 'en': 'Near you · $country', - 'fr': 'Près de vous · $country', - 'de': 'In deiner Nähe · $country', - 'it': 'Vicino a te · $country', - 'pt': 'Perto de você · $country', - 'ru': 'Рядом с вами · $country', - 'ja': '近くの放送局 · $country', - 'zh': '你附近的电台 · $country', - 'ar': 'بالقرب منك · $country', - 'hi': 'आपके पास · $country', - 'bn': 'আপনার কাছাকাছি · $country', - 'id': 'Di dekat Anda · $country', - }); - - String get detectAction => _pick({ - 'es': 'Detectar', - 'en': 'Detect', - 'fr': 'Détecter', - 'de': 'Erkennen', - 'it': 'Rileva', - 'pt': 'Detectar', - 'ru': 'Определить', - 'ja': '検出', - 'zh': '检测', - 'ar': 'اكتشف', - 'hi': 'पता लगाएँ', - 'bn': 'সনাক্ত করুন', - 'id': 'Deteksi', - }); - - String get liveRadar => _pick({ - 'es': 'Radar en directo', - 'en': 'Live radar', - 'fr': 'Radar en direct', - 'de': 'Live-Radar', - 'it': 'Radar in diretta', - 'pt': 'Radar ao vivo', - 'ru': 'Радар в прямом эфире', - 'ja': 'ライブレーダー', - 'zh': '实时雷达', - 'ar': 'رادار مباشر', - 'hi': 'लाइव रडार', - 'bn': 'লাইভ রাডার', - 'id': 'Radar langsung', - }); - - String get genresTitle => _pick({ - 'es': 'Géneros', - 'en': 'Genres', - 'fr': 'Genres', - 'de': 'Genres', - 'it': 'Generi', - 'pt': 'Gêneros', - 'ru': 'Жанры', - 'ja': 'ジャンル', - 'zh': '流派', - 'ar': 'الأنواع', - 'hi': 'शैलियाँ', - 'bn': 'ধরন', - 'id': 'Genre', - }); - - String get retryAction => _pick({ - 'es': 'Reintentar', - 'en': 'Retry', - 'fr': 'Réessayer', - 'de': 'Erneut versuchen', - 'it': 'Riprova', - 'pt': 'Tentar de novo', - 'ru': 'Повторить', - 'ja': '再試行', - 'zh': '重试', - 'ar': 'إعادة المحاولة', - 'hi': 'फिर से प्रयास करें', - 'bn': 'আবার চেষ্টা করুন', - 'id': 'Coba lagi', - }); - - String get noStationsAvailable => _pick({ - 'es': 'No hay emisoras disponibles', - 'en': 'No stations available', - 'fr': 'Aucune station disponible', - 'de': 'Keine Sender verfügbar', - 'it': 'Nessuna stazione disponibile', - 'pt': 'Nenhuma estação disponível', - 'ru': 'Нет доступных станций', - 'ja': '利用できる放送局がありません', - 'zh': '没有可用电台', - 'ar': 'لا توجد محطات متاحة', - 'hi': 'कोई स्टेशन उपलब्ध नहीं है', - 'bn': 'কোনও স্টেশন উপলব্ধ নেই', - 'id': 'Tidak ada stasiun tersedia', - }); - - String get noStationsAvailableSubtitle => _pick({ - 'es': 'Probá refrescar o elegir otro género para volver a capturar señal.', - 'en': 'Try refreshing or choosing another genre to lock onto a station again.', - 'fr': 'Essayez d’actualiser ou de choisir un autre genre pour retrouver un signal.', - 'de': 'Versuche es mit Aktualisieren oder wähle ein anderes Genre, um wieder ein Signal zu finden.', - 'it': 'Prova ad aggiornare o a scegliere un altro genere per ritrovare un segnale.', - 'pt': 'Tente atualizar ou escolher outro gênero para captar o sinal novamente.', - 'ru': 'Попробуйте обновить список или выбрать другой жанр, чтобы снова поймать сигнал.', - 'ja': '更新するか別のジャンルを選んで、もう一度受信を試してください。', - 'zh': '请尝试刷新,或选择其他流派以重新捕获信号。', - 'ar': 'حاول التحديث أو اختيار نوع آخر لالتقاط الإشارة من جديد.', - 'hi': 'फिर से सिग्नल पाने के लिए रिफ्रेश करें या कोई दूसरी शैली चुनें।', - 'bn': 'আবার সিগন্যাল পেতে রিফ্রেশ করুন বা অন্য কোনও ধরন বেছে নিন।', - 'id': 'Coba segarkan atau pilih genre lain untuk menangkap sinyal lagi.', - }); - - String genreName(String tag) => switch (tag) { - 'pop' => _pick({'es': 'Pop', 'en': 'Pop', 'fr': 'Pop', 'de': 'Pop', 'it': 'Pop', 'pt': 'Pop', 'ru': 'Поп', 'ja': 'ポップ', 'zh': '流行', 'ar': 'بوب', 'hi': 'पॉप', 'bn': 'পপ', 'id': 'Pop'}), - 'rock' => _pick({'es': 'Rock', 'en': 'Rock', 'fr': 'Rock', 'de': 'Rock', 'it': 'Rock', 'pt': 'Rock', 'ru': 'Рок', 'ja': 'ロック', 'zh': '摇滚', 'ar': 'روك', 'hi': 'रॉक', 'bn': 'রক', 'id': 'Rock'}), - 'jazz' => _pick({'es': 'Jazz', 'en': 'Jazz', 'fr': 'Jazz', 'de': 'Jazz', 'it': 'Jazz', 'pt': 'Jazz', 'ru': 'Джаз', 'ja': 'ジャズ', 'zh': '爵士', 'ar': 'جاز', 'hi': 'जैज़', 'bn': 'জ্যাজ', 'id': 'Jazz'}), - 'classical' => _pick({'es': 'Clásica', 'en': 'Classical', 'fr': 'Classique', 'de': 'Klassik', 'it': 'Classica', 'pt': 'Clássica', 'ru': 'Классика', 'ja': 'クラシック', 'zh': '古典', 'ar': 'كلاسيكي', 'hi': 'शास्त्रीय', 'bn': 'শাস্ত্রীয়', 'id': 'Klasik'}), - 'electronic' => _pick({'es': 'Electrónica', 'en': 'Electronic', 'fr': 'Électronique', 'de': 'Elektronisch', 'it': 'Elettronica', 'pt': 'Eletrônica', 'ru': 'Электроника', 'ja': 'エレクトロ', 'zh': '电子', 'ar': 'إلكتروني', 'hi': 'इलेक्ट्रॉनिक', 'bn': 'ইলেকট্রনিক', 'id': 'Elektronik'}), - 'news' => _pick({'es': 'Noticias', 'en': 'News', 'fr': 'Infos', 'de': 'Nachrichten', 'it': 'Notizie', 'pt': 'Notícias', 'ru': 'Новости', 'ja': 'ニュース', 'zh': '新闻', 'ar': 'أخبار', 'hi': 'समाचार', 'bn': 'সংবাদ', 'id': 'Berita'}), - 'talk' => _pick({'es': 'Hablada', 'en': 'Talk', 'fr': 'Débat', 'de': 'Talk', 'it': 'Talk', 'pt': 'Talk', 'ru': 'Разговоры', 'ja': 'トーク', 'zh': '谈话', 'ar': 'حواري', 'hi': 'टॉक', 'bn': 'টক', 'id': 'Obrolan'}), - 'hip-hop' => _pick({'es': 'Hip-hop', 'en': 'Hip-hop', 'fr': 'Hip-hop', 'de': 'Hip-Hop', 'it': 'Hip-hop', 'pt': 'Hip-hop', 'ru': 'Хип-хоп', 'ja': 'ヒップホップ', 'zh': '嘻哈', 'ar': 'هيب هوب', 'hi': 'हिप-हॉप', 'bn': 'হিপ-হপ', 'id': 'Hip-hop'}), - 'country' => _pick({'es': 'Country', 'en': 'Country', 'fr': 'Country', 'de': 'Country', 'it': 'Country', 'pt': 'Country', 'ru': 'Кантри', 'ja': 'カントリー', 'zh': '乡村', 'ar': 'كانتري', 'hi': 'कंट्री', 'bn': 'কান্ট্রি', 'id': 'Country'}), - 'metal' => _pick({'es': 'Metal', 'en': 'Metal', 'fr': 'Metal', 'de': 'Metal', 'it': 'Metal', 'pt': 'Metal', 'ru': 'Метал', 'ja': 'メタル', 'zh': '金属', 'ar': 'ميتال', 'hi': 'मेटल', 'bn': 'মেটাল', 'id': 'Metal'}), - 'reggae' => _pick({'es': 'Reggae', 'en': 'Reggae', 'fr': 'Reggae', 'de': 'Reggae', 'it': 'Reggae', 'pt': 'Reggae', 'ru': 'Регги', 'ja': 'レゲエ', 'zh': '雷鬼', 'ar': 'ريغي', 'hi': 'रेगे', 'bn': 'রেগে', 'id': 'Reggae'}), - 'latin' => _pick({'es': 'Latina', 'en': 'Latin', 'fr': 'Latine', 'de': 'Latein', 'it': 'Latina', 'pt': 'Latina', 'ru': 'Латина', 'ja': 'ラテン', 'zh': '拉丁', 'ar': 'لاتيني', 'hi': 'लैटिन', 'bn': 'লাতিন', 'id': 'Latin'}), - _ => tag, - }; - - String get alarmRingingFallbackActive => _pick({ - 'es': 'Sonando con audio seguro interno.', - 'en': 'Playing with internal safe audio.', - 'fr': 'Lecture avec l’audio interne sécurisé.', - 'de': 'Wiedergabe mit internem Sicherheitsaudio.', - 'it': 'Riproduzione con audio interno sicuro.', - 'pt': 'Tocando com áudio interno seguro.', - 'ru': 'Воспроизведение с внутренним безопасным аудио.', - 'ja': '内部の安全な音声で再生しています。', - 'zh': '正在使用内部安全音频播放。', - 'ar': 'يعمل الآن باستخدام الصوت الداخلي الآمن.', - 'hi': 'आंतरिक सुरक्षित ऑडियो के साथ चल रहा है।', - 'bn': 'অভ্যন্তরীণ নিরাপদ অডিও দিয়ে চলছে।', - 'id': 'Memutar dengan audio internal yang aman.', - }); - - String get alarmRingingTryingStation => _pick({ - 'es': 'Intentando reproducir tu emisora con máxima calidad disponible.', - 'en': 'Trying to play your station at the highest available quality.', - 'fr': 'Tentative de lecture de votre station avec la meilleure qualité disponible.', - 'de': 'Dein Sender wird mit der bestmöglichen verfügbaren Qualität gestartet.', - 'it': 'Tentativo di riprodurre la tua stazione con la massima qualità disponibile.', - 'pt': 'Tentando reproduzir sua estação com a maior qualidade disponível.', - 'ru': 'Пытаемся воспроизвести вашу станцию в максимально доступном качестве.', - 'ja': '利用可能な最高音質で放送局の再生を試みています。', - 'zh': '正在尝试以最高可用音质播放你的电台。', - 'ar': 'جارٍ محاولة تشغيل محطتك بأعلى جودة متاحة.', - 'hi': 'आपका स्टेशन उपलब्ध सर्वोच्च गुणवत्ता में चलाने की कोशिश की जा रही है।', - 'bn': 'আপনার স্টেশন সর্বোচ্চ উপলভ্য মানে চালানোর চেষ্টা করা হচ্ছে।', - 'id': 'Mencoba memutar stasiun Anda dengan kualitas tertinggi yang tersedia.', - }); - - String get alarmRingingPreparingFallback => _pick({ - 'es': 'Preparando audio seguro interno.', - 'en': 'Preparing internal safe audio.', - 'fr': 'Préparation de l’audio interne sécurisé.', - 'de': 'Internes Sicherheitsaudio wird vorbereitet.', - 'it': 'Preparazione dell’audio interno sicuro.', - 'pt': 'Preparando áudio interno seguro.', - 'ru': 'Подготавливается внутреннее безопасное аудио.', - 'ja': '内部の安全な音声を準備しています。', - 'zh': '正在准备内部安全音频。', - 'ar': 'جارٍ تجهيز الصوت الداخلي الآمن.', - 'hi': 'आंतरिक सुरक्षित ऑडियो तैयार किया जा रहा है।', - 'bn': 'অভ্যন্তরীণ নিরাপদ অডিও প্রস্তুত করা হচ্ছে।', - 'id': 'Menyiapkan audio internal yang aman.', - }); - - String get alarmScreenTitle => _pick({ - 'es': 'Despertar musical', 'en': 'Music wake-up', 'fr': 'Réveil musical', 'de': 'Musikalischer Wecker', 'it': 'Sveglia musicale', 'pt': 'Despertar musical', 'ru': 'Музыкальный будильник', 'ja': '音楽アラーム', 'zh': '音乐闹钟', 'ar': 'استيقاظ موسيقي', 'hi': 'संगीत अलार्म', 'bn': 'সঙ্গীত অ্যালার্ম', 'id': 'Alarm musik', - }); - - String get alarmScreenSubtitle => _pick({ - 'es': 'Alarmas con radio, sonido seguro, vacaciones inteligentes y próxima ejecución siempre visible.', - 'en': 'Radio alarms with safe audio, smart vacations, and the next occurrence always visible.', - 'fr': 'Alarmes radio avec audio sécurisé, vacances intelligentes et prochaine exécution toujours visible.', - 'de': 'Radioalarme mit Sicherheitsaudio, intelligenten Urlaubsregeln und stets sichtbarer nächster Ausführung.', - 'it': 'Sveglie radio con audio sicuro, vacanze intelligenti e prossima esecuzione sempre visibile.', - 'pt': 'Alarmes com rádio, áudio seguro, férias inteligentes e próxima execução sempre visível.', - 'ru': 'Радиобудильники с безопасным звуком, умным режимом отпуска и всегда видимым следующим запуском.', - 'ja': 'ラジオ、セーフ音声、スマート休暇設定、次回実行を常に表示するアラームです。', - 'zh': '支持电台、安全音频、智能假期和始终可见下次执行时间的闹钟。', - 'ar': 'منبهات بالراديو وصوت آمن وإجازات ذكية مع عرض التشغيل التالي دائمًا.', - 'hi': 'रेडियो, सुरक्षित ऑडियो, स्मार्ट छुट्टियों और हमेशा दिखने वाली अगली घंटी के साथ अलार्म।', - 'bn': 'রেডিও, নিরাপদ অডিও, স্মার্ট ছুটি এবং সবসময় দৃশ্যমান পরবর্তী সময়সহ অ্যালার্ম।', - 'id': 'Alarm radio dengan audio aman, liburan cerdas, dan jadwal berikutnya selalu terlihat.', - }); - - String get createAlarmAction => _pick({'es':'Crear alarma','en':'Create alarm','fr':'Créer une alarme','de':'Alarm erstellen','it':'Crea sveglia','pt':'Criar alarme','ru':'Создать будильник','ja':'アラームを作成','zh':'创建闹钟','ar':'إنشاء منبه','hi':'अलार्म बनाएँ','bn':'অ্যালার্ম তৈরি করুন','id':'Buat alarm'}); - String alarmsCount(int count) => _pick({'es':'$count alarmas','en':'$count alarms','fr':'$count alarmes','de':'$count Alarme','it':'$count sveglie','pt':'$count alarmes','ru':'$count будильников','ja':'$count 件のアラーム','zh':'$count 个闹钟','ar':'$count منبه','hi':'$count अलार्म','bn':'$count অ্যালার্ম','id':'$count alarm'}); - String get activeAlarmsWithoutNextTitle => _pick({'es':'Alarmas activas sin próxima ejecución','en':'Active alarms without a next occurrence','fr':'Alarmes actives sans prochaine exécution','de':'Aktive Alarme ohne nächste Ausführung','it':'Sveglie attive senza prossima esecuzione','pt':'Alarmes ativos sem próxima execução','ru':'Активные будильники без следующего запуска','ja':'次回実行のない有効なアラーム','zh':'没有下次执行的活动闹钟','ar':'منبهات نشطة بلا تشغيل تالٍ','hi':'अगली घंटी बिना सक्रिय अलार्म','bn':'পরবর্তী সময় ছাড়া সক্রিয় অ্যালার্ম','id':'Alarm aktif tanpa jadwal berikutnya'}); - String get activeAlarmsNoneTitle => _pick({'es':'Sin alarmas activas','en':'No active alarms','fr':'Aucune alarme active','de':'Keine aktiven Alarme','it':'Nessuna sveglia attiva','pt':'Sem alarmes ativos','ru':'Нет активных будильников','ja':'有効なアラームはありません','zh':'没有活动闹钟','ar':'لا توجد منبهات نشطة','hi':'कोई सक्रिय अलार्म नहीं','bn':'কোনও সক্রিয় অ্যালার্ম নেই','id':'Tidak ada alarm aktif'}); - String get nextAlarmTitle => _pick({'es':'Próxima alarma','en':'Next alarm','fr':'Prochaine alarme','de':'Nächster Alarm','it':'Prossima sveglia','pt':'Próximo alarme','ru':'Следующий будильник','ja':'次のアラーム','zh':'下一个闹钟','ar':'المنبه التالي','hi':'अगला अलार्म','bn':'পরবর্তী অ্যালার্ম','id':'Alarm berikutnya'}); - String activeAlarmsWithoutNextSubtitle(int count) => _pick({'es':'Hay $count alarma(s) activas, pero ahora mismo no tienen una fecha futura válida. Revisá fecha, días y vacaciones.','en':'There are $count active alarm(s), but they do not currently have a valid future date. Check date, days, and vacations.','fr':'Il y a $count alarme(s) active(s), mais aucune date future valide pour le moment. Vérifiez la date, les jours et les vacances.','de':'Es gibt $count aktive(n) Alarm(e), aber aktuell kein gültiges zukünftiges Datum. Prüfe Datum, Tage und Urlaub.','it':'Ci sono $count sveglia/e attive, ma al momento senza una data futura valida. Controlla data, giorni e vacanze.','pt':'Há $count alarme(s) ativo(s), mas sem uma data futura válida no momento. Revise data, dias e férias.','ru':'Есть $count активных будильников, но сейчас у них нет корректной будущей даты. Проверьте дату, дни и отпуск.','ja':'有効なアラームが $count 件ありますが、現在有効な将来日時がありません。日付、曜日、休暇を確認してください。','zh':'有 $count 个活动闹钟,但当前没有有效的未来日期。请检查日期、星期和假期。','ar':'يوجد $count منبه نشط، لكنها لا تملك حاليًا تاريخًا مستقبليًا صالحًا. راجع التاريخ والأيام والإجازات.','hi':'$count सक्रिय अलार्म हैं, लेकिन अभी इनके पास मान्य भविष्य की तारीख नहीं है। तारीख, दिन और छुट्टियाँ जाँचें।','bn':'$count টি সক্রিয় অ্যালার্ম আছে, কিন্তু এখন কোনও বৈধ ভবিষ্যৎ তারিখ নেই। তারিখ, দিন ও ছুটি দেখুন।','id':'Ada $count alarm aktif, tetapi saat ini tidak memiliki tanggal mendatang yang valid. Periksa tanggal, hari, dan liburan.'}); - String get createAlarmHint => _pick({'es':'Creá una alarma y PluriWave calculará la siguiente ejecución automáticamente.','en':'Create an alarm and PluriWave will calculate the next occurrence automatically.','fr':'Créez une alarme et PluriWave calculera automatiquement la prochaine exécution.','de':'Erstelle einen Alarm und PluriWave berechnet die nächste Ausführung automatisch.','it':'Crea una sveglia e PluriWave calcolerà automaticamente la prossima esecuzione.','pt':'Crie um alarme e o PluriWave calculará automaticamente a próxima execução.','ru':'Создайте будильник, и PluriWave автоматически рассчитает следующий запуск.','ja':'アラームを作成すると、PluriWave が次回実行を自動計算します。','zh':'创建闹钟后,PluriWave 会自动计算下次执行时间。','ar':'أنشئ منبهًا وسيحسب PluriWave التشغيل التالي تلقائيًا.','hi':'अलार्म बनाएँ और PluriWave अगली घंटी अपने-आप गणना करेगा।','bn':'একটি অ্যালার্ম তৈরি করুন, PluriWave স্বয়ংক্রিয়ভাবে পরবর্তী সময় হিসাব করবে।','id':'Buat alarm dan PluriWave akan menghitung jadwal berikutnya secara otomatis.'}); - String alarmNextSummary(String name, String date) => '$name · $date'; - - String get alarmVacationPlay => _pick({'es':'Suena en vacaciones','en':'Plays during vacations','fr':'Sonne pendant les vacances','de':'Klingelt im Urlaub','it':'Suona durante le vacanze','pt':'Toca durante as férias','ru':'Срабатывает во время отпуска','ja':'休暇中も鳴らす','zh':'假期中响铃','ar':'يعمل أثناء الإجازات','hi':'छुट्टियों में बजेगा','bn':'ছুটির সময় বাজবে','id':'Berbunyi saat liburan'}); - String get alarmVacationPause => _pick({'es':'Pausa en vacaciones','en':'Pause during vacations','fr':'Pause pendant les vacances','de':'Im Urlaub pausieren','it':'Pausa durante le vacanze','pt':'Pausar durante as férias','ru':'Пауза во время отпуска','ja':'休暇中は一時停止','zh':'假期中暂停','ar':'إيقاف أثناء الإجازات','hi':'छुट्टियों में विराम','bn':'ছুটির সময় বিরতি','id':'Jeda saat liburan'}); - String fadeInSeconds(int seconds) => _pick({'es':'Fade-in $seconds s','en':'Fade-in $seconds s','fr':'Fondu entrant $seconds s','de':'Fade-in $seconds s','it':'Fade-in $seconds s','pt':'Fade-in $seconds s','ru':'Плавное начало $seconds с','ja':'フェードイン $seconds 秒','zh':'淡入 $seconds 秒','ar':'تدرّج صوتي $seconds ث','hi':'फ़ेड-इन $seconds सेकंड','bn':'ফেড-ইন $seconds সেকেন্ড','id':'Fade-in $seconds dtk'}); - String alarmNextExecution(String date) => _pick({'es':'Siguiente ejecución: $date','en':'Next occurrence: $date','fr':'Prochaine exécution : $date','de':'Nächste Ausführung: $date','it':'Prossima esecuzione: $date','pt':'Próxima execução: $date','ru':'Следующий запуск: $date','ja':'次回実行: $date','zh':'下次执行:$date','ar':'التشغيل التالي: $date','hi':'अगली घंटी: $date','bn':'পরবর্তী সময়: $date','id':'Jadwal berikutnya: $date'}); - String get alarmNoNextExecution => _pick({'es':'No tiene próxima ejecución activa.','en':'No active next occurrence.','fr':'Aucune prochaine exécution active.','de':'Keine aktive nächste Ausführung.','it':'Nessuna prossima esecuzione attiva.','pt':'Não há próxima execução ativa.','ru':'Нет активного следующего запуска.','ja':'有効な次回実行はありません。','zh':'没有活动的下次执行。','ar':'لا يوجد تشغيل تالٍ نشط.','hi':'कोई सक्रिय अगली घंटी नहीं है।','bn':'কোনও সক্রিয় পরবর্তী সময় নেই।','id':'Tidak ada jadwal berikutnya yang aktif.'}); - String alarmSkippedExecution(String date) => _pick({'es':'Una ejecución fue omitida: $date.','en':'One occurrence was skipped: $date.','fr':'Une exécution a été ignorée : $date.','de':'Eine Ausführung wurde übersprungen: $date.','it':'Un’esecuzione è stata saltata: $date.','pt':'Uma execução foi ignorada: $date.','ru':'Один запуск был пропущен: $date.','ja':'1回の実行をスキップしました: $date。','zh':'已跳过一次执行:$date。','ar':'تم تخطي تشغيل واحد: $date.','hi':'एक घंटी छोड़ी गई: $date।','bn':'একটি সময় বাদ দেওয়া হয়েছে: $date।','id':'Satu jadwal dilewati: $date.'}); - String get editAction => _pick({'es':'Editar','en':'Edit','fr':'Modifier','de':'Bearbeiten','it':'Modifica','pt':'Editar','ru':'Изменить','ja':'編集','zh':'编辑','ar':'تعديل','hi':'संपादित करें','bn':'সম্পাদনা','id':'Edit'}); - String get skipNextAction => _pick({'es':'Omitir siguiente','en':'Skip next','fr':'Ignorer la suivante','de':'Nächsten überspringen','it':'Salta prossima','pt':'Ignorar próximo','ru':'Пропустить следующий','ja':'次回をスキップ','zh':'跳过下一次','ar':'تخطي التالي','hi':'अगला छोड़ें','bn':'পরেরটি বাদ দিন','id':'Lewati berikutnya'}); - String get alarmSkippedNoNextSnackbar => _pick({'es':'Alarma omitida. No queda próxima ejecución.','en':'Alarm skipped. No next occurrence remains.','fr':'Alarme ignorée. Il ne reste aucune prochaine exécution.','de':'Alarm übersprungen. Es bleibt keine nächste Ausführung.','it':'Sveglia saltata. Non resta alcuna prossima esecuzione.','pt':'Alarme ignorado. Não resta próxima execução.','ru':'Будильник пропущен. Следующего запуска не осталось.','ja':'アラームをスキップしました。次回実行はありません。','zh':'闹钟已跳过。没有剩余的下次执行。','ar':'تم تخطي المنبه. لا يوجد تشغيل تالٍ.','hi':'अलार्म छोड़ा गया। अगली घंटी नहीं बची।','bn':'অ্যালার্ম বাদ দেওয়া হয়েছে। আর কোনও পরবর্তী সময় নেই।','id':'Alarm dilewati. Tidak ada jadwal berikutnya.'}); - String alarmSkippedReturnsSnackbar(String date) => _pick({'es':'Alarma omitida. Volverá el $date.','en':'Alarm skipped. It will return on $date.','fr':'Alarme ignorée. Elle reviendra le $date.','de':'Alarm übersprungen. Er kehrt am $date zurück.','it':'Sveglia saltata. Tornerà il $date.','pt':'Alarme ignorado. Voltará em $date.','ru':'Будильник пропущен. Он вернётся $date.','ja':'アラームをスキップしました。$date に戻ります。','zh':'闹钟已跳过。将在 $date 返回。','ar':'تم تخطي المنبه. سيعود في $date.','hi':'अलार्म छोड़ा गया। यह $date को वापस आएगा।','bn':'অ্যালার্ম বাদ দেওয়া হয়েছে। এটি $date তারিখে ফিরবে।','id':'Alarm dilewati. Akan kembali pada $date.'}); - String get deleteAction => _pick({'es':'Eliminar','en':'Delete','fr':'Supprimer','de':'Löschen','it':'Elimina','pt':'Excluir','ru':'Удалить','ja':'削除','zh':'删除','ar':'حذف','hi':'हटाएँ','bn':'মুছুন','id':'Hapus'}); - String alarmVacationPausedNoNext(String name) => _pick({'es':'Está pausada por vacaciones ($name) y sin próxima ejecución.','en':'Paused for vacation ($name) with no next occurrence.','fr':'En pause pour vacances ($name) et sans prochaine exécution.','de':'Wegen Urlaub pausiert ($name) und ohne nächste Ausführung.','it':'In pausa per vacanze ($name) e senza prossima esecuzione.','pt':'Pausado por férias ($name) e sem próxima execução.','ru':'Приостановлен из-за отпуска ($name), следующего запуска нет.','ja':'休暇($name)のため一時停止中で、次回実行はありません。','zh':'因假期($name)暂停,且没有下次执行。','ar':'متوقف بسبب الإجازة ($name) ولا يوجد تشغيل تالٍ.','hi':'छुट्टी ($name) के कारण रुका है और अगली घंटी नहीं है।','bn':'ছুটি ($name) কারণে বিরত, কোনও পরবর্তী সময় নেই।','id':'Dijeda karena liburan ($name) dan tidak ada jadwal berikutnya.'}); - String alarmVacationPausedReturns(String name, String date) => _pick({'es':'Está pausada por vacaciones ($name) y vuelve el $date.','en':'Paused for vacation ($name) and returns on $date.','fr':'En pause pour vacances ($name) et revient le $date.','de':'Wegen Urlaub pausiert ($name) und kehrt am $date zurück.','it':'In pausa per vacanze ($name) e torna il $date.','pt':'Pausado por férias ($name) e volta em $date.','ru':'Приостановлен из-за отпуска ($name) и вернётся $date.','ja':'休暇($name)のため一時停止中で、$date に再開します。','zh':'因假期($name)暂停,将在 $date 恢复。','ar':'متوقف بسبب الإجازة ($name) وسيعود في $date.','hi':'छुट्टी ($name) के कारण रुका है और $date को लौटेगा।','bn':'ছুটি ($name) কারণে বিরত, $date তারিখে ফিরবে।','id':'Dijeda karena liburan ($name) dan kembali pada $date.'}); - String alarmVacationReturns(String date) => _pick({'es':'Con vacaciones activas, volverá a sonar el $date.','en':'With vacations active, it will ring again on $date.','fr':'Avec les vacances actives, elle sonnera à nouveau le $date.','de':'Bei aktivem Urlaub klingelt er wieder am $date.','it':'Con le vacanze attive, suonerà di nuovo il $date.','pt':'Com férias ativas, tocará novamente em $date.','ru':'При активном отпуске снова сработает $date.','ja':'休暇設定が有効なため、$date に再度鳴ります。','zh':'假期启用时,将在 $date 再次响铃。','ar':'مع تفعيل الإجازات، سيعمل مرة أخرى في $date.','hi':'छुट्टियाँ सक्रिय होने पर यह $date को फिर बजेगा।','bn':'ছুটি সক্রিয় থাকলে এটি $date তারিখে আবার বাজবে।','id':'Dengan liburan aktif, alarm akan berbunyi lagi pada $date.'}); - - String get defaultAlarmName => _pick({'es':'Despertador musical','en':'Music alarm','fr':'Réveil musical','de':'Musikalischer Wecker','it':'Sveglia musicale','pt':'Despertador musical','ru':'Музыкальный будильник','ja':'音楽アラーム','zh':'音乐闹钟','ar':'منبه موسيقي','hi':'संगीत अलार्म','bn':'সঙ্গীত অ্যালার্ম','id':'Alarm musik'}); - String get newAlarmTitle => _pick({'es':'Nueva alarma','en':'New alarm','fr':'Nouvelle alarme','de':'Neuer Alarm','it':'Nuova sveglia','pt':'Novo alarme','ru':'Новый будильник','ja':'新しいアラーム','zh':'新建闹钟','ar':'منبه جديد','hi':'नया अलार्म','bn':'নতুন অ্যালার্ম','id':'Alarm baru'}); - String get editAlarmTitle => _pick({'es':'Editar alarma','en':'Edit alarm','fr':'Modifier l’alarme','de':'Alarm bearbeiten','it':'Modifica sveglia','pt':'Editar alarme','ru':'Изменить будильник','ja':'アラームを編集','zh':'编辑闹钟','ar':'تعديل المنبه','hi':'अलार्म संपादित करें','bn':'অ্যালার্ম সম্পাদনা','id':'Edit alarm'}); - String get nameLabel => _pick({'es':'Nombre','en':'Name','fr':'Nom','de':'Name','it':'Nome','pt':'Nome','ru':'Название','ja':'名前','zh':'名称','ar':'الاسم','hi':'नाम','bn':'নাম','id':'Nama'}); - String get timeLabel => _pick({'es':'Hora','en':'Time','fr':'Heure','de':'Uhrzeit','it':'Ora','pt':'Hora','ru':'Время','ja':'時刻','zh':'时间','ar':'الوقت','hi':'समय','bn':'সময়','id':'Waktu'}); - String get dateLabel => _pick({'es':'Fecha','en':'Date','fr':'Date','de':'Datum','it':'Data','pt':'Data','ru':'Дата','ja':'日付','zh':'日期','ar':'التاريخ','hi':'तारीख','bn':'তারিখ','id':'Tanggal'}); - String get oneTimeOption => _pick({'es':'Una vez','en':'Once','fr':'Une fois','de':'Einmal','it':'Una volta','pt':'Uma vez','ru':'Один раз','ja':'1回','zh':'一次','ar':'مرة واحدة','hi':'एक बार','bn':'একবার','id':'Sekali'}); - String get dailyOption => _pick({'es':'Diaria','en':'Daily','fr':'Tous les jours','de':'Täglich','it':'Giornaliera','pt':'Diário','ru':'Ежедневно','ja':'毎日','zh':'每天','ar':'يوميًا','hi':'रोज़','bn':'প্রতিদিন','id':'Harian'}); - String get weekdaysOption => _pick({'es':'Días','en':'Days','fr':'Jours','de':'Tage','it':'Giorni','pt':'Dias','ru':'Дни','ja':'曜日','zh':'星期','ar':'الأيام','hi':'दिन','bn':'দিন','id':'Hari'}); - String get soundAndVolumeTitle => _pick({'es':'Sonido y volumen','en':'Sound and volume','fr':'Son et volume','de':'Ton und Lautstärke','it':'Suono e volume','pt':'Som e volume','ru':'Звук и громкость','ja':'サウンドと音量','zh':'声音和音量','ar':'الصوت ومستوى الصوت','hi':'ध्वनि और वॉल्यूम','bn':'শব্দ ও ভলিউম','id':'Suara dan volume'}); - String get alarmFadeInTitle => _pick({'es':'Fade-in de alarma','en':'Alarm fade-in','fr':'Fondu entrant de l’alarme','de':'Alarm-Fade-in','it':'Fade-in della sveglia','pt':'Fade-in do alarme','ru':'Плавное начало будильника','ja':'アラームのフェードイン','zh':'闹钟淡入','ar':'تدرّج صوت المنبه','hi':'अलार्म फ़ेड-इन','bn':'অ্যালার্ম ফেড-ইন','id':'Fade-in alarm'}); - String get alarmFadeInOff => _pick({'es':'0 s (sin transición)','en':'0 s (no transition)','fr':'0 s (sans transition)','de':'0 s (ohne Übergang)','it':'0 s (senza transizione)','pt':'0 s (sem transição)','ru':'0 с (без перехода)','ja':'0秒(遷移なし)','zh':'0 秒(无过渡)','ar':'0 ث (بلا انتقال)','hi':'0 सेकंड (कोई बदलाव नहीं)','bn':'0 সেকেন্ড (কোনও ট্রানজিশন নেই)','id':'0 dtk (tanpa transisi)'}); - String alarmFadeInProgress(int seconds) => _pick({'es':'$seconds s (de 5% al volumen elegido)','en':'$seconds s (from 5% to the chosen volume)','fr':'$seconds s (de 5 % au volume choisi)','de':'$seconds s (von 5 % zur gewählten Lautstärke)','it':'$seconds s (dal 5% al volume scelto)','pt':'$seconds s (de 5% até o volume escolhido)','ru':'$seconds с (от 5% до выбранной громкости)','ja':'$seconds 秒(5%から選択した音量へ)','zh':'$seconds 秒(从 5% 到所选音量)','ar':'$seconds ث (من 5% إلى المستوى المختار)','hi':'$seconds सेकंड (5% से चुने हुए वॉल्यूम तक)','bn':'$seconds সেকেন্ড (5% থেকে নির্বাচিত ভলিউমে)','id':'$seconds dtk (dari 5% ke volume pilihan)'}); - String get soundInternalSafe => _pick({'es':'Sonido seguro interno','en':'Internal safe sound','fr':'Son interne sécurisé','de':'Interner Sicherheitston','it':'Suono interno sicuro','pt':'Som interno seguro','ru':'Внутренний безопасный звук','ja':'内部セーフサウンド','zh':'内部安全声音','ar':'صوت داخلي آمن','hi':'आंतरिक सुरक्षित ध्वनि','bn':'অভ্যন্তরীণ নিরাপদ শব্দ','id':'Suara internal aman'}); - String get soundWarmSunrise => _pick({'es':'Amanecer cálido','en':'Warm sunrise','fr':'Aube chaleureuse','de':'Warmer Sonnenaufgang','it':'Alba calda','pt':'Amanhecer quente','ru':'Тёплый рассвет','ja':'暖かな日の出','zh':'温暖日出','ar':'شروق دافئ','hi':'गर्म सूर्योदय','bn':'উষ্ণ সূর্যোদয়','id':'Fajar hangat'}); - String get soundSoftBell => _pick({'es':'Campana suave','en':'Soft bell','fr':'Cloche douce','de':'Sanfte Glocke','it':'Campana leggera','pt':'Sino suave','ru':'Мягкий колокол','ja':'やさしいベル','zh':'柔和铃声','ar':'جرس هادئ','hi':'मृदु घंटी','bn':'নরম ঘণ্টা','id':'Lonceng lembut'}); - String get soundDigitalPulse => _pick({'es':'Pulso digital','en':'Digital pulse','fr':'Impulsion numérique','de':'Digitaler Puls','it':'Impulso digitale','pt':'Pulso digital','ru':'Цифровой пульс','ja':'デジタルパルス','zh':'数字脉冲','ar':'نبض رقمي','hi':'डिजिटल पल्स','bn':'ডিজিটাল পালস','id':'Pulsa digital'}); - String get favoriteStationLabel => _pick({'es':'Emisora favorita','en':'Favorite station','fr':'Station favorite','de':'Lieblingssender','it':'Stazione preferita','pt':'Estação favorita','ru':'Избранная станция','ja':'お気に入りの放送局','zh':'收藏电台','ar':'المحطة المفضلة','hi':'पसंदीदा स्टेशन','bn':'প্রিয় স্টেশন','id':'Stasiun favorit'}); - String get noStationUseInternalSound => _pick({'es':'Sin emisora: usar sonido interno','en':'No station: use internal sound','fr':'Aucune station : utiliser le son interne','de':'Kein Sender: internen Ton verwenden','it':'Nessuna stazione: usa suono interno','pt':'Sem estação: usar som interno','ru':'Без станции: использовать внутренний звук','ja':'放送局なし: 内部サウンドを使用','zh':'无电台:使用内部声音','ar':'بلا محطة: استخدام الصوت الداخلي','hi':'कोई स्टेशन नहीं: आंतरिक ध्वनि उपयोग करें','bn':'স্টেশন নেই: অভ্যন্তরীণ শব্দ ব্যবহার করুন','id':'Tanpa stasiun: gunakan suara internal'}); - String get saveFavoritesAlarmHint => _pick({'es':'Guardá emisoras en Favoritos para usarlas como alarma musical.','en':'Save stations to Favorites to use them as a music alarm.','fr':'Enregistrez des stations dans les favoris pour les utiliser comme alarme musicale.','de':'Speichere Sender in Favoriten, um sie als musikalischen Alarm zu verwenden.','it':'Salva le stazioni nei preferiti per usarle come sveglia musicale.','pt':'Salve estações nos Favoritos para usá-las como alarme musical.','ru':'Сохраните станции в избранное, чтобы использовать их как музыкальный будильник.','ja':'音楽アラームとして使うには、放送局をお気に入りに保存してください。','zh':'将电台保存到收藏夹,以用作音乐闹钟。','ar':'احفظ المحطات في المفضلة لاستخدامها كمنبه موسيقي.','hi':'संगीत अलार्म के रूप में उपयोग करने के लिए स्टेशनों को पसंदीदा में सहेजें।','bn':'সঙ্গীত অ্যালার্ম হিসেবে ব্যবহার করতে স্টেশনগুলো ফেভারিটে সংরক্ষণ করুন।','id':'Simpan stasiun ke Favorit untuk digunakan sebagai alarm musik.'}); - String get useCurrentStationAction => _pick({'es':'Usar emisora actual','en':'Use current station','fr':'Utiliser la station actuelle','de':'Aktuellen Sender verwenden','it':'Usa stazione attuale','pt':'Usar estação atual','ru':'Использовать текущую станцию','ja':'現在の放送局を使う','zh':'使用当前电台','ar':'استخدام المحطة الحالية','hi':'वर्तमान स्टेशन उपयोग करें','bn':'বর্তমান স্টেশন ব্যবহার করুন','id':'Gunakan stasiun saat ini'}); - String get playDuringVacations => _pick({'es':'Sonar durante vacaciones','en':'Play during vacations','fr':'Sonner pendant les vacances','de':'Im Urlaub klingeln','it':'Suona durante le vacanze','pt':'Tocar durante as férias','ru':'Звонить во время отпуска','ja':'休暇中も鳴らす','zh':'假期中响铃','ar':'التشغيل أثناء الإجازات','hi':'छुट्टियों में बजाएँ','bn':'ছুটির সময় বাজান','id':'Berbunyi saat liburan'}); - String get playDuringVacationsHint => _pick({'es':'Si lo apagás, la próxima ejecución saltará al primer día válido.','en':'If you turn this off, the next occurrence will skip to the first valid day.','fr':'Si vous désactivez cette option, la prochaine exécution passera au premier jour valide.','de':'Wenn du dies deaktivierst, springt die nächste Ausführung auf den ersten gültigen Tag.','it':'Se lo disattivi, la prossima esecuzione passerà al primo giorno valido.','pt':'Se você desativar, a próxima execução saltará para o primeiro dia válido.','ru':'Если отключить, следующий запуск перейдёт на первый допустимый день.','ja':'オフにすると、次回実行は最初の有効日にスキップされます。','zh':'关闭后,下次执行将跳到第一个有效日期。','ar':'إذا أوقفته، سيتخطى التشغيل التالي إلى أول يوم صالح.','hi':'इसे बंद करने पर अगली घंटी पहले मान्य दिन पर चली जाएगी।','bn':'এটি বন্ধ করলে পরবর্তী সময় প্রথম বৈধ দিনে চলে যাবে।','id':'Jika dimatikan, jadwal berikutnya akan melompat ke hari valid pertama.'}); - String get saveAlarmAction => _pick({'es':'Guardar alarma','en':'Save alarm','fr':'Enregistrer l’alarme','de':'Alarm speichern','it':'Salva sveglia','pt':'Salvar alarme','ru':'Сохранить будильник','ja':'アラームを保存','zh':'保存闹钟','ar':'حفظ المنبه','hi':'अलार्म सहेजें','bn':'অ্যালার্ম সংরক্ষণ করুন','id':'Simpan alarm'}); - String get chooseOneWeekdayError => _pick({'es':'Elegí al menos un día de la semana.','en':'Choose at least one weekday.','fr':'Choisissez au moins un jour de la semaine.','de':'Wähle mindestens einen Wochentag.','it':'Scegli almeno un giorno della settimana.','pt':'Escolha pelo menos um dia da semana.','ru':'Выберите хотя бы один день недели.','ja':'曜日を少なくとも1つ選択してください。','zh':'请至少选择一个星期几。','ar':'اختر يومًا واحدًا على الأقل من الأسبوع.','hi':'सप्ताह का कम से कम एक दिन चुनें।','bn':'সপ্তাহের অন্তত একটি দিন বেছে নিন।','id':'Pilih setidaknya satu hari dalam seminggu.'}); - - String get androidReliabilityTitle => _pick({'es':'Revisar fiabilidad Android','en':'Review Android reliability','fr':'Vérifier la fiabilité Android','de':'Android-Zuverlässigkeit prüfen','it':'Controlla affidabilità Android','pt':'Revisar confiabilidade Android','ru':'Проверить надёжность Android','ja':'Androidの信頼性を確認','zh':'检查 Android 可靠性','ar':'مراجعة موثوقية Android','hi':'Android विश्वसनीयता जाँचें','bn':'Android নির্ভরযোগ্যতা দেখুন','id':'Tinjau keandalan Android'}); - String androidReliabilityStatus(String exact, String notifications, String screen) => _pick({'es':'Fiabilidad: exactas $exact · notificaciones $notifications · pantalla $screen','en':'Reliability: exact $exact · notifications $notifications · screen $screen','fr':'Fiabilité : exactes $exact · notifications $notifications · écran $screen','de':'Zuverlässigkeit: exakt $exact · Benachrichtigungen $notifications · Bildschirm $screen','it':'Affidabilità: esatte $exact · notifiche $notifications · schermo $screen','pt':'Confiabilidade: exatos $exact · notificações $notifications · tela $screen','ru':'Надёжность: точные $exact · уведомления $notifications · экран $screen','ja':'信頼性: 正確 $exact · 通知 $notifications · 画面 $screen','zh':'可靠性:精确 $exact · 通知 $notifications · 屏幕 $screen','ar':'الموثوقية: الدقة $exact · الإشعارات $notifications · الشاشة $screen','hi':'विश्वसनीयता: सटीक $exact · सूचनाएँ $notifications · स्क्रीन $screen','bn':'নির্ভরযোগ্যতা: নির্ভুল $exact · নোটিফিকেশন $notifications · স্ক্রিন $screen','id':'Keandalan: tepat $exact · notifikasi $notifications · layar $screen'}); - String get statusOk => _pick({'es':'OK','en':'OK','fr':'OK','de':'OK','it':'OK','pt':'OK','ru':'OK','ja':'OK','zh':'OK','ar':'OK','hi':'OK','bn':'OK','id':'OK'}); - String get statusPending => _pick({'es':'pendiente','en':'pending','fr':'en attente','de':'ausstehend','it':'in sospeso','pt':'pendente','ru':'ожидает','ja':'保留中','zh':'待处理','ar':'معلّق','hi':'लंबित','bn':'অপেক্ষমাণ','id':'tertunda'}); - - String get vacationRangesTitle => _pick({'es':'Rangos de vacaciones','en':'Vacation ranges','fr':'Périodes de vacances','de':'Urlaubszeiträume','it':'Intervalli di vacanza','pt':'Períodos de férias','ru':'Периоды отпуска','ja':'休暇期間','zh':'假期范围','ar':'نطاقات الإجازة','hi':'छुट्टी की अवधियाँ','bn':'ছুটির সময়সীমা','id':'Rentang liburan'}); - String get addAction => _pick({'es':'Agregar','en':'Add','fr':'Ajouter','de':'Hinzufügen','it':'Aggiungi','pt':'Adicionar','ru':'Добавить','ja':'追加','zh':'添加','ar':'إضافة','hi':'जोड़ें','bn':'যোগ করুন','id':'Tambah'}); - String get vacationRangesHint => _pick({'es':'Si una alarma tiene "Pausa en vacaciones", se salta automáticamente estos rangos.','en':'If an alarm has “Pause during vacations”, it automatically skips these ranges.','fr':'Si une alarme a « Pause pendant les vacances », elle ignore automatiquement ces périodes.','de':'Wenn ein Alarm „Im Urlaub pausieren“ nutzt, überspringt er diese Zeiträume automatisch.','it':'Se una sveglia ha “Pausa durante le vacanze”, salta automaticamente questi intervalli.','pt':'Se um alarme tiver “Pausar durante as férias”, ele ignora automaticamente estes períodos.','ru':'Если у будильника включена «Пауза во время отпуска», он автоматически пропускает эти периоды.','ja':'アラームが「休暇中は一時停止」の場合、これらの期間は自動的にスキップされます。','zh':'如果闹钟启用了“假期中暂停”,会自动跳过这些范围。','ar':'إذا كان المنبه مضبوطًا على “إيقاف أثناء الإجازات”، فسيتخطى هذه النطاقات تلقائيًا.','hi':'अगर अलार्म में “छुट्टियों में विराम” है, तो ये अवधियाँ अपने-आप छोड़ दी जाएँगी।','bn':'অ্যালার্মে “ছুটির সময় বিরতি” থাকলে এই সময়সীমাগুলো স্বয়ংক্রিয়ভাবে বাদ যাবে।','id':'Jika alarm memakai “Jeda saat liburan”, rentang ini otomatis dilewati.'}); - String get vacationRangesEmpty => _pick({'es':'Sin rangos cargados.','en':'No ranges loaded.','fr':'Aucune période chargée.','de':'Keine Zeiträume geladen.','it':'Nessun intervallo caricato.','pt':'Nenhum período carregado.','ru':'Периоды не добавлены.','ja':'期間が登録されていません。','zh':'没有已加载的范围。','ar':'لا توجد نطاقات محملة.','hi':'कोई अवधि लोड नहीं है।','bn':'কোনও সময়সীমা লোড নেই।','id':'Belum ada rentang.'}); - String get deleteRangeAction => _pick({'es':'Eliminar rango','en':'Delete range','fr':'Supprimer la période','de':'Zeitraum löschen','it':'Elimina intervallo','pt':'Excluir período','ru':'Удалить период','ja':'期間を削除','zh':'删除范围','ar':'حذف النطاق','hi':'अवधि हटाएँ','bn':'সময়সীমা মুছুন','id':'Hapus rentang'}); - String get vacationsDefaultName => _pick({'es':'Vacaciones','en':'Vacations','fr':'Vacances','de':'Urlaub','it':'Vacanze','pt':'Férias','ru':'Отпуск','ja':'休暇','zh':'假期','ar':'إجازة','hi':'छुट्टियाँ','bn':'ছুটি','id':'Liburan'}); - String get newVacationRangeTitle => _pick({'es':'Nuevo rango de vacaciones','en':'New vacation range','fr':'Nouvelle période de vacances','de':'Neuer Urlaubszeitraum','it':'Nuovo intervallo di vacanza','pt':'Novo período de férias','ru':'Новый период отпуска','ja':'新しい休暇期間','zh':'新建假期范围','ar':'نطاق إجازة جديد','hi':'नई छुट्टी अवधि','bn':'নতুন ছুটির সময়সীমা','id':'Rentang liburan baru'}); - String get startLabel => _pick({'es':'Inicio','en':'Start','fr':'Début','de':'Start','it':'Inizio','pt':'Início','ru':'Начало','ja':'開始','zh':'开始','ar':'البداية','hi':'शुरुआत','bn':'শুরু','id':'Mulai'}); - String get endLabel => _pick({'es':'Fin','en':'End','fr':'Fin','de':'Ende','it':'Fine','pt':'Fim','ru':'Конец','ja':'終了','zh':'结束','ar':'النهاية','hi':'समाप्ति','bn':'শেষ','id':'Selesai'}); - String get saveRangeAction => _pick({'es':'Guardar rango','en':'Save range','fr':'Enregistrer la période','de':'Zeitraum speichern','it':'Salva intervallo','pt':'Salvar período','ru':'Сохранить период','ja':'期間を保存','zh':'保存范围','ar':'حفظ النطاق','hi':'अवधि सहेजें','bn':'সময় সংরক্ষণ করুন','id':'Simpan rentang'}); - String get noAlarmsYetTitle => _pick({'es':'Todavía no hay alarmas.','en':'There are no alarms yet.','fr':'Il n’y a pas encore d’alarmes.','de':'Es gibt noch keine Alarme.','it':'Non ci sono ancora sveglie.','pt':'Ainda não há alarmes.','ru':'Будильников пока нет.','ja':'アラームはまだありません。','zh':'还没有闹钟。','ar':'لا توجد منبهات بعد.','hi':'अभी कोई अलार्म नहीं है।','bn':'এখনও কোনও অ্যালার্ম নেই।','id':'Belum ada alarm.'}); - String get noAlarmsYetSubtitle => _pick({'es':'Creá una para diseñar tu despertar musical.','en':'Create one to design your music wake-up.','fr':'Créez-en une pour composer votre réveil musical.','de':'Erstelle einen, um dein musikalisches Aufwachen zu gestalten.','it':'Creane una per progettare il tuo risveglio musicale.','pt':'Crie um para montar seu despertar musical.','ru':'Создайте будильник, чтобы настроить музыкальное пробуждение.','ja':'音楽で目覚める体験を作るには、アラームを作成してください。','zh':'创建一个闹钟,设计你的音乐唤醒体验。','ar':'أنشئ واحدًا لتصميم استيقاظك الموسيقي.','hi':'अपना संगीत अलार्म बनाने के लिए एक बनाएँ।','bn':'আপনার সঙ্গীত অ্যালার্ম সাজাতে একটি তৈরি করুন।','id':'Buat satu untuk merancang bangun tidur dengan musik.'}); - - String alarmScheduleOnce(String date) => _pick({'es':'Una vez · $date','en':'Once · $date','fr':'Une fois · $date','de':'Einmal · $date','it':'Una volta · $date','pt':'Uma vez · $date','ru':'Один раз · $date','ja':'1回 · $date','zh':'一次 · $date','ar':'مرة واحدة · $date','hi':'एक बार · $date','bn':'একবার · $date','id':'Sekali · $date'}); - String alarmScheduleWeekdays(String days) => _pick({'es':'Días: $days','en':'Days: $days','fr':'Jours : $days','de':'Tage: $days','it':'Giorni: $days','pt':'Dias: $days','ru':'Дни: $days','ja':'曜日: $days','zh':'星期:$days','ar':'الأيام: $days','hi':'दिन: $days','bn':'দিন: $days','id':'Hari: $days'}); - String weekdayShort(int day) => switch (day) { - DateTime.monday => _pick({'es':'Lun','en':'Mon','fr':'Lun','de':'Mo','it':'Lun','pt':'Seg','ru':'Пн','ja':'月','zh':'周一','ar':'الإثنين','hi':'सोम','bn':'সোম','id':'Sen'}), - DateTime.tuesday => _pick({'es':'Mar','en':'Tue','fr':'Mar','de':'Di','it':'Mar','pt':'Ter','ru':'Вт','ja':'火','zh':'周二','ar':'الثلاثاء','hi':'मंगल','bn':'মঙ্গল','id':'Sel'}), - DateTime.wednesday => _pick({'es':'Mié','en':'Wed','fr':'Mer','de':'Mi','it':'Mer','pt':'Qua','ru':'Ср','ja':'水','zh':'周三','ar':'الأربعاء','hi':'बुध','bn':'বুধ','id':'Rab'}), - DateTime.thursday => _pick({'es':'Jue','en':'Thu','fr':'Jeu','de':'Do','it':'Gio','pt':'Qui','ru':'Чт','ja':'木','zh':'周四','ar':'الخميس','hi':'गुरु','bn':'বৃহস্পতি','id':'Kam'}), - DateTime.friday => _pick({'es':'Vie','en':'Fri','fr':'Ven','de':'Fr','it':'Ven','pt':'Sex','ru':'Пт','ja':'金','zh':'周五','ar':'الجمعة','hi':'शुक्र','bn':'শুক্র','id':'Jum'}), - DateTime.saturday => _pick({'es':'Sáb','en':'Sat','fr':'Sam','de':'Sa','it':'Sab','pt':'Sáb','ru':'Сб','ja':'土','zh':'周六','ar':'السبت','hi':'शनि','bn':'শনি','id':'Sab'}), - DateTime.sunday => _pick({'es':'Dom','en':'Sun','fr':'Dim','de':'So','it':'Dom','pt':'Dom','ru':'Вс','ja':'日','zh':'周日','ar':'الأحد','hi':'रवि','bn':'রবি','id':'Min'}), - _ => '?', - }; String weekdayLong(int day) => switch (day) { - DateTime.monday => _pick({'es':'lunes','en':'Monday','fr':'lundi','de':'Montag','it':'lunedì','pt':'segunda-feira','ru':'понедельник','ja':'月曜日','zh':'星期一','ar':'الإثنين','hi':'सोमवार','bn':'সোমবার','id':'Senin'}), - DateTime.tuesday => _pick({'es':'martes','en':'Tuesday','fr':'mardi','de':'Dienstag','it':'martedì','pt':'terça-feira','ru':'вторник','ja':'火曜日','zh':'星期二','ar':'الثلاثاء','hi':'मंगलवार','bn':'মঙ্গলবার','id':'Selasa'}), - DateTime.wednesday => _pick({'es':'miércoles','en':'Wednesday','fr':'mercredi','de':'Mittwoch','it':'mercoledì','pt':'quarta-feira','ru':'среда','ja':'水曜日','zh':'星期三','ar':'الأربعاء','hi':'बुधवार','bn':'বুধবার','id':'Rabu'}), - DateTime.thursday => _pick({'es':'jueves','en':'Thursday','fr':'jeudi','de':'Donnerstag','it':'giovedì','pt':'quinta-feira','ru':'четверг','ja':'木曜日','zh':'星期四','ar':'الخميس','hi':'गुरुवार','bn':'বৃহস্পতিবার','id':'Kamis'}), - DateTime.friday => _pick({'es':'viernes','en':'Friday','fr':'vendredi','de':'Freitag','it':'venerdì','pt':'sexta-feira','ru':'пятница','ja':'金曜日','zh':'星期五','ar':'الجمعة','hi':'शुक्रवार','bn':'শুক্রবার','id':'Jumat'}), - DateTime.saturday => _pick({'es':'sábado','en':'Saturday','fr':'samedi','de':'Samstag','it':'sabato','pt':'sábado','ru':'суббота','ja':'土曜日','zh':'星期六','ar':'السبت','hi':'शनिवार','bn':'শনিবার','id':'Sabtu'}), - DateTime.sunday => _pick({'es':'domingo','en':'Sunday','fr':'dimanche','de':'Sonntag','it':'domenica','pt':'domingo','ru':'воскресенье','ja':'日曜日','zh':'星期日','ar':'الأحد','hi':'रविवार','bn':'রবিবার','id':'Minggu'}), - _ => _pick({'es':'día','en':'day','fr':'jour','de':'Tag','it':'giorno','pt':'dia','ru':'день','ja':'日','zh':'日','ar':'يوم','hi':'दिन','bn':'দিন','id':'hari'}), + DateTime.monday => _pick({ + 'es': 'lunes', + 'en': 'Monday', + 'fr': 'lundi', + 'de': 'Montag', + 'it': 'lunedì', + 'pt': 'segunda-feira', + 'ru': 'понедельник', + 'ja': '月曜日', + 'zh': '星期一', + 'ar': 'الإثنين', + 'hi': 'सोमवार', + 'bn': 'সোমবার', + 'id': 'Senin', + }), + DateTime.tuesday => _pick({ + 'es': 'martes', + 'en': 'Tuesday', + 'fr': 'mardi', + 'de': 'Dienstag', + 'it': 'martedì', + 'pt': 'terça-feira', + 'ru': 'вторник', + 'ja': '火曜日', + 'zh': '星期二', + 'ar': 'الثلاثاء', + 'hi': 'मंगलवार', + 'bn': 'মঙ্গলবার', + 'id': 'Selasa', + }), + DateTime.wednesday => _pick({ + 'es': 'miércoles', + 'en': 'Wednesday', + 'fr': 'mercredi', + 'de': 'Mittwoch', + 'it': 'mercoledì', + 'pt': 'quarta-feira', + 'ru': 'среда', + 'ja': '水曜日', + 'zh': '星期三', + 'ar': 'الأربعاء', + 'hi': 'बुधवार', + 'bn': 'বুধবার', + 'id': 'Rabu', + }), + DateTime.thursday => _pick({ + 'es': 'jueves', + 'en': 'Thursday', + 'fr': 'jeudi', + 'de': 'Donnerstag', + 'it': 'giovedì', + 'pt': 'quinta-feira', + 'ru': 'четверг', + 'ja': '木曜日', + 'zh': '星期四', + 'ar': 'الخميس', + 'hi': 'गुरुवार', + 'bn': 'বৃহস্পতিবার', + 'id': 'Kamis', + }), + DateTime.friday => _pick({ + 'es': 'viernes', + 'en': 'Friday', + 'fr': 'vendredi', + 'de': 'Freitag', + 'it': 'venerdì', + 'pt': 'sexta-feira', + 'ru': 'пятница', + 'ja': '金曜日', + 'zh': '星期五', + 'ar': 'الجمعة', + 'hi': 'शुक्रवार', + 'bn': 'শুক্রবার', + 'id': 'Jumat', + }), + DateTime.saturday => _pick({ + 'es': 'sábado', + 'en': 'Saturday', + 'fr': 'samedi', + 'de': 'Samstag', + 'it': 'sabato', + 'pt': 'sábado', + 'ru': 'суббота', + 'ja': '土曜日', + 'zh': '星期六', + 'ar': 'السبت', + 'hi': 'शनिवार', + 'bn': 'শনিবার', + 'id': 'Sabtu', + }), + DateTime.sunday => _pick({ + 'es': 'domingo', + 'en': 'Sunday', + 'fr': 'dimanche', + 'de': 'Sonntag', + 'it': 'domenica', + 'pt': 'domingo', + 'ru': 'воскресенье', + 'ja': '日曜日', + 'zh': '星期日', + 'ar': 'الأحد', + 'hi': 'रविवार', + 'bn': 'রবিবার', + 'id': 'Minggu', + }), + _ => _pick({ + 'es': 'día', + 'en': 'day', + 'fr': 'jour', + 'de': 'Tag', + 'it': 'giorno', + 'pt': 'dia', + 'ru': 'день', + 'ja': '日', + 'zh': '日', + 'ar': 'يوم', + 'hi': 'दिन', + 'bn': 'দিন', + 'id': 'hari', + }), }; String monthName(int month) => switch (month) { - 1 => _pick({'es':'enero','en':'January','fr':'janvier','de':'Januar','it':'gennaio','pt':'janeiro','ru':'января','ja':'1月','zh':'1月','ar':'يناير','hi':'जनवरी','bn':'জানুয়ারি','id':'Januari'}), - 2 => _pick({'es':'febrero','en':'February','fr':'février','de':'Februar','it':'febbraio','pt':'fevereiro','ru':'февраля','ja':'2月','zh':'2月','ar':'فبراير','hi':'फ़रवरी','bn':'ফেব্রুয়ারি','id':'Februari'}), - 3 => _pick({'es':'marzo','en':'March','fr':'mars','de':'März','it':'marzo','pt':'março','ru':'марта','ja':'3月','zh':'3月','ar':'مارس','hi':'मार्च','bn':'মার্চ','id':'Maret'}), - 4 => _pick({'es':'abril','en':'April','fr':'avril','de':'April','it':'aprile','pt':'abril','ru':'апреля','ja':'4月','zh':'4月','ar':'أبريل','hi':'अप्रैल','bn':'এপ্রিল','id':'April'}), - 5 => _pick({'es':'mayo','en':'May','fr':'mai','de':'Mai','it':'maggio','pt':'maio','ru':'мая','ja':'5月','zh':'5月','ar':'مايو','hi':'मई','bn':'মে','id':'Mei'}), - 6 => _pick({'es':'junio','en':'June','fr':'juin','de':'Juni','it':'giugno','pt':'junho','ru':'июня','ja':'6月','zh':'6月','ar':'يونيو','hi':'जून','bn':'জুন','id':'Juni'}), - 7 => _pick({'es':'julio','en':'July','fr':'juillet','de':'Juli','it':'luglio','pt':'julho','ru':'июля','ja':'7月','zh':'7月','ar':'يوليو','hi':'जुलाई','bn':'জুলাই','id':'Juli'}), - 8 => _pick({'es':'agosto','en':'August','fr':'août','de':'August','it':'agosto','pt':'agosto','ru':'августа','ja':'8月','zh':'8月','ar':'أغسطس','hi':'अगस्त','bn':'আগস্ট','id':'Agustus'}), - 9 => _pick({'es':'septiembre','en':'September','fr':'septembre','de':'September','it':'settembre','pt':'setembro','ru':'сентября','ja':'9月','zh':'9月','ar':'سبتمبر','hi':'सितंबर','bn':'সেপ্টেম্বর','id':'September'}), - 10 => _pick({'es':'octubre','en':'October','fr':'octobre','de':'Oktober','it':'ottobre','pt':'outubro','ru':'октября','ja':'10月','zh':'10月','ar':'أكتوبر','hi':'अक्टूबर','bn':'অক্টোবর','id':'Oktober'}), - 11 => _pick({'es':'noviembre','en':'November','fr':'novembre','de':'November','it':'novembre','pt':'novembro','ru':'ноября','ja':'11月','zh':'11月','ar':'نوفمبر','hi':'नवंबर','bn':'নভেম্বর','id':'November'}), - 12 => _pick({'es':'diciembre','en':'December','fr':'décembre','de':'Dezember','it':'dicembre','pt':'dezembro','ru':'декабря','ja':'12月','zh':'12月','ar':'ديسمبر','hi':'दिसंबर','bn':'ডিসেম্বর','id':'Desember'}), - _ => _pick({'es':'mes','en':'month','fr':'mois','de':'Monat','it':'mese','pt':'mês','ru':'месяц','ja':'月','zh':'月','ar':'شهر','hi':'महीना','bn':'মাস','id':'bulan'}), + 1 => _pick({ + 'es': 'enero', + 'en': 'January', + 'fr': 'janvier', + 'de': 'Januar', + 'it': 'gennaio', + 'pt': 'janeiro', + 'ru': 'января', + 'ja': '1月', + 'zh': '1月', + 'ar': 'يناير', + 'hi': 'जनवरी', + 'bn': 'জানুয়ারি', + 'id': 'Januari', + }), + 2 => _pick({ + 'es': 'febrero', + 'en': 'February', + 'fr': 'février', + 'de': 'Februar', + 'it': 'febbraio', + 'pt': 'fevereiro', + 'ru': 'февраля', + 'ja': '2月', + 'zh': '2月', + 'ar': 'فبراير', + 'hi': 'फ़रवरी', + 'bn': 'ফেব্রুয়ারি', + 'id': 'Februari', + }), + 3 => _pick({ + 'es': 'marzo', + 'en': 'March', + 'fr': 'mars', + 'de': 'März', + 'it': 'marzo', + 'pt': 'março', + 'ru': 'марта', + 'ja': '3月', + 'zh': '3月', + 'ar': 'مارس', + 'hi': 'मार्च', + 'bn': 'মার্চ', + 'id': 'Maret', + }), + 4 => _pick({ + 'es': 'abril', + 'en': 'April', + 'fr': 'avril', + 'de': 'April', + 'it': 'aprile', + 'pt': 'abril', + 'ru': 'апреля', + 'ja': '4月', + 'zh': '4月', + 'ar': 'أبريل', + 'hi': 'अप्रैल', + 'bn': 'এপ্রিল', + 'id': 'April', + }), + 5 => _pick({ + 'es': 'mayo', + 'en': 'May', + 'fr': 'mai', + 'de': 'Mai', + 'it': 'maggio', + 'pt': 'maio', + 'ru': 'мая', + 'ja': '5月', + 'zh': '5月', + 'ar': 'مايو', + 'hi': 'मई', + 'bn': 'মে', + 'id': 'Mei', + }), + 6 => _pick({ + 'es': 'junio', + 'en': 'June', + 'fr': 'juin', + 'de': 'Juni', + 'it': 'giugno', + 'pt': 'junho', + 'ru': 'июня', + 'ja': '6月', + 'zh': '6月', + 'ar': 'يونيو', + 'hi': 'जून', + 'bn': 'জুন', + 'id': 'Juni', + }), + 7 => _pick({ + 'es': 'julio', + 'en': 'July', + 'fr': 'juillet', + 'de': 'Juli', + 'it': 'luglio', + 'pt': 'julho', + 'ru': 'июля', + 'ja': '7月', + 'zh': '7月', + 'ar': 'يوليو', + 'hi': 'जुलाई', + 'bn': 'জুলাই', + 'id': 'Juli', + }), + 8 => _pick({ + 'es': 'agosto', + 'en': 'August', + 'fr': 'août', + 'de': 'August', + 'it': 'agosto', + 'pt': 'agosto', + 'ru': 'августа', + 'ja': '8月', + 'zh': '8月', + 'ar': 'أغسطس', + 'hi': 'अगस्त', + 'bn': 'আগস্ট', + 'id': 'Agustus', + }), + 9 => _pick({ + 'es': 'septiembre', + 'en': 'September', + 'fr': 'septembre', + 'de': 'September', + 'it': 'settembre', + 'pt': 'setembro', + 'ru': 'сентября', + 'ja': '9月', + 'zh': '9月', + 'ar': 'سبتمبر', + 'hi': 'सितंबर', + 'bn': 'সেপ্টেম্বর', + 'id': 'September', + }), + 10 => _pick({ + 'es': 'octubre', + 'en': 'October', + 'fr': 'octobre', + 'de': 'Oktober', + 'it': 'ottobre', + 'pt': 'outubro', + 'ru': 'октября', + 'ja': '10月', + 'zh': '10月', + 'ar': 'أكتوبر', + 'hi': 'अक्टूबर', + 'bn': 'অক্টোবর', + 'id': 'Oktober', + }), + 11 => _pick({ + 'es': 'noviembre', + 'en': 'November', + 'fr': 'novembre', + 'de': 'November', + 'it': 'novembre', + 'pt': 'novembro', + 'ru': 'ноября', + 'ja': '11月', + 'zh': '11月', + 'ar': 'نوفمبر', + 'hi': 'नवंबर', + 'bn': 'নভেম্বর', + 'id': 'November', + }), + 12 => _pick({ + 'es': 'diciembre', + 'en': 'December', + 'fr': 'décembre', + 'de': 'Dezember', + 'it': 'dicembre', + 'pt': 'dezembro', + 'ru': 'декабря', + 'ja': '12月', + 'zh': '12月', + 'ar': 'ديسمبر', + 'hi': 'दिसंबर', + 'bn': 'ডিসেম্বর', + 'id': 'Desember', + }), + _ => _pick({ + 'es': 'mes', + 'en': 'month', + 'fr': 'mois', + 'de': 'Monat', + 'it': 'mese', + 'pt': 'mês', + 'ru': 'месяц', + 'ja': '月', + 'zh': '月', + 'ar': 'شهر', + 'hi': 'महीना', + 'bn': 'মাস', + 'id': 'bulan', + }), }; String dateTimeSentence(DateTime date) { final local = date.toLocal(); - final hm = '${local.hour.toString().padLeft(2, '0')}:${local.minute.toString().padLeft(2, '0')}'; + final hm = + '${local.hour.toString().padLeft(2, '0')}:${local.minute.toString().padLeft(2, '0')}'; return _pick({ - 'es':'${weekdayLong(local.weekday)} ${local.day} de ${monthName(local.month)} a las $hm', - 'en':'${weekdayLong(local.weekday)}, ${monthName(local.month)} ${local.day} at $hm', - 'fr':'${weekdayLong(local.weekday)} ${local.day} ${monthName(local.month)} à $hm', - 'de':'${weekdayLong(local.weekday)}, ${local.day}. ${monthName(local.month)} um $hm', - 'it':'${weekdayLong(local.weekday)} ${local.day} ${monthName(local.month)} alle $hm', - 'pt':'${weekdayLong(local.weekday)}, ${local.day} de ${monthName(local.month)} às $hm', - 'ru':'${weekdayLong(local.weekday)}, ${local.day} ${monthName(local.month)} в $hm', - 'ja':'${monthName(local.month)}${local.day}日(${weekdayLong(local.weekday)})$hm', - 'zh':'${monthName(local.month)}${local.day}日 ${weekdayLong(local.weekday)} $hm', - 'ar':'${weekdayLong(local.weekday)} ${local.day} ${monthName(local.month)} في $hm', - 'hi':'${weekdayLong(local.weekday)}, ${local.day} ${monthName(local.month)} $hm बजे', - 'bn':'${weekdayLong(local.weekday)}, ${local.day} ${monthName(local.month)} $hm', - 'id':'${weekdayLong(local.weekday)}, ${local.day} ${monthName(local.month)} pukul $hm', + 'es': + '${weekdayLong(local.weekday)} ${local.day} de ${monthName(local.month)} a las $hm', + 'en': + '${weekdayLong(local.weekday)}, ${monthName(local.month)} ${local.day} at $hm', + 'fr': + '${weekdayLong(local.weekday)} ${local.day} ${monthName(local.month)} à $hm', + 'de': + '${weekdayLong(local.weekday)}, ${local.day}. ${monthName(local.month)} um $hm', + 'it': + '${weekdayLong(local.weekday)} ${local.day} ${monthName(local.month)} alle $hm', + 'pt': + '${weekdayLong(local.weekday)}, ${local.day} de ${monthName(local.month)} às $hm', + 'ru': + '${weekdayLong(local.weekday)}, ${local.day} ${monthName(local.month)} в $hm', + 'ja': + '${monthName(local.month)}${local.day}日(${weekdayLong(local.weekday)})$hm', + 'zh': + '${monthName(local.month)}${local.day}日 ${weekdayLong(local.weekday)} $hm', + 'ar': + '${weekdayLong(local.weekday)} ${local.day} ${monthName(local.month)} في $hm', + 'hi': + '${weekdayLong(local.weekday)}, ${local.day} ${monthName(local.month)} $hm बजे', + 'bn': + '${weekdayLong(local.weekday)}, ${local.day} ${monthName(local.month)} $hm', + 'id': + '${weekdayLong(local.weekday)}, ${local.day} ${monthName(local.month)} pukul $hm', }); } - - String get closeAction => _pick({'es':'Cerrar','en':'Close','fr':'Fermer','de':'Schließen','it':'Chiudi','pt':'Fechar','ru':'Закрыть','ja':'閉じる','zh':'关闭','ar':'إغلاق','hi':'बंद करें','bn':'বন্ধ করুন','id':'Tutup'}); - String get equalizerDisable => _pick({'es':'Desactivar ecualizador','en':'Disable equalizer','fr':'Désactiver l’égaliseur','de':'Equalizer deaktivieren','it':'Disattiva equalizzatore','pt':'Desativar equalizador','ru':'Отключить эквалайзер','ja':'イコライザーを無効化','zh':'关闭均衡器','ar':'تعطيل المعادل','hi':'इक्वलाइज़र बंद करें','bn':'ইকুয়ালাইজার বন্ধ করুন','id':'Nonaktifkan equalizer'}); - String get favoritesAddTooltip => _pick({'es':'Añadir a favoritos','en':'Add to favorites','fr':'Ajouter aux favoris','de':'Zu Favoriten hinzufügen','it':'Aggiungi ai preferiti','pt':'Adicionar aos favoritos','ru':'Добавить в избранное','ja':'お気に入りに追加','zh':'添加到收藏','ar':'إضافة إلى المفضلة','hi':'पसंदीदा में जोड़ें','bn':'ফেভারিটে যোগ করুন','id':'Tambahkan ke favorit'}); - String get qualityUnknown => _pick({'es':'Calidad no informada','en':'Quality not reported','fr':'Qualité non indiquée','de':'Qualität nicht angegeben','it':'Qualità non indicata','pt':'Qualidade não informada','ru':'Качество не указано','ja':'音質情報なし','zh':'未提供质量信息','ar':'الجودة غير مذكورة','hi':'गुणवत्ता उपलब्ध नहीं','bn':'মান জানানো নেই','id':'Kualitas tidak dilaporkan'}); - String qualityOriginal(String quality) => _pick({'es':'Calidad original: $quality','en':'Original quality: $quality','fr':'Qualité d’origine : $quality','de':'Originalqualität: $quality','it':'Qualità originale: $quality','pt':'Qualidade original: $quality','ru':'Исходное качество: $quality','ja':'元の音質: $quality','zh':'原始质量:$quality','ar':'الجودة الأصلية: $quality','hi':'मूल गुणवत्ता: $quality','bn':'মূল মান: $quality','id':'Kualitas asli: $quality'}); - String get recordingActiveTitle => _pick({'es':'Grabando radio','en':'Recording radio','fr':'Enregistrement de la radio','de':'Radio wird aufgenommen','it':'Registrazione radio','pt':'Gravando rádio','ru':'Запись радио','ja':'ラジオを録音中','zh':'正在录制电台','ar':'جارٍ تسجيل الراديو','hi':'रेडियो रिकॉर्ड हो रहा है','bn':'রেডিও রেকর্ড হচ্ছে','id':'Merekam radio'}); - String get recordingDirectTitle => _pick({'es':'Grabación directa','en':'Direct recording','fr':'Enregistrement direct','de':'Direktaufnahme','it':'Registrazione diretta','pt':'Gravação direta','ru':'Прямая запись','ja':'ダイレクト録音','zh':'直接录制','ar':'تسجيل مباشر','hi':'सीधी रिकॉर्डिंग','bn':'সরাসরি রেকর্ডিং','id':'Perekaman langsung'}); - String get stopAction => _pick({'es':'Parar','en':'Stop','fr':'Arrêter','de':'Stoppen','it':'Ferma','pt':'Parar','ru':'Остановить','ja':'停止','zh':'停止','ar':'إيقاف','hi':'रोकें','bn':'থামান','id':'Stop'}); - String get recordAction => _pick({'es':'Grabar','en':'Record','fr':'Enregistrer','de':'Aufnehmen','it':'Registra','pt':'Gravar','ru':'Записать','ja':'録音','zh':'录制','ar':'تسجيل','hi':'रिकॉर्ड करें','bn':'রেকর্ড করুন','id':'Rekam'}); - String get recordingsOpenLatest => _pick({'es':'Abrir última grabación','en':'Open latest recording','fr':'Ouvrir le dernier enregistrement','de':'Letzte Aufnahme öffnen','it':'Apri ultima registrazione','pt':'Abrir última gravação','ru':'Открыть последнюю запись','ja':'最新の録音を開く','zh':'打开最新录音','ar':'فتح آخر تسجيل','hi':'नई रिकॉर्डिंग खोलें','bn':'সর্বশেষ রেকর্ডিং খুলুন','id':'Buka rekaman terbaru'}); - String get recordingsOpenLatestError => _pick({'es':'No se pudo abrir la última grabación','en':'Could not open the latest recording','fr':'Impossible d’ouvrir le dernier enregistrement','de':'Letzte Aufnahme konnte nicht geöffnet werden','it':'Impossibile aprire l’ultima registrazione','pt':'Não foi possível abrir a última gravação','ru':'Не удалось открыть последнюю запись','ja':'最新の録音を開けませんでした','zh':'无法打开最新录音','ar':'تعذر فتح آخر تسجيل','hi':'नई रिकॉर्डिंग नहीं खुल सकी','bn':'সর্বশেষ রেকর্ডিং খোলা যায়নি','id':'Tidak dapat membuka rekaman terbaru'}); - String get recordingsOpenFolderPlainError => _pick({'es':'No se pudo abrir la carpeta de grabaciones','en':'Could not open the recordings folder','fr':'Impossible d’ouvrir le dossier des enregistrements','de':'Aufnahmeordner konnte nicht geöffnet werden','it':'Impossibile aprire la cartella delle registrazioni','pt':'Não foi possível abrir a pasta de gravações','ru':'Не удалось открыть папку записей','ja':'録音フォルダーを開けませんでした','zh':'无法打开录音文件夹','ar':'تعذر فتح مجلد التسجيلات','hi':'रिकॉर्डिंग फ़ोल्डर नहीं खुल सका','bn':'রেকর্ডিং ফোল্ডার খোলা যায়নি','id':'Tidak dapat membuka folder rekaman'}); - String get recordRadioTitle => _pick({'es':'Grabar radio','en':'Record radio','fr':'Enregistrer la radio','de':'Radio aufnehmen','it':'Registra radio','pt':'Gravar rádio','ru':'Записать радио','ja':'ラジオを録音','zh':'录制电台','ar':'تسجيل الراديو','hi':'रेडियो रिकॉर्ड करें','bn':'রেডিও রেকর্ড করুন','id':'Rekam radio'}); - String get recordRadioSubtitle => _pick({'es':'Elegí cuánto tiempo querés grabar.','en':'Choose how long you want to record.','fr':'Choisissez la durée d’enregistrement.','de':'Wähle, wie lange aufgenommen werden soll.','it':'Scegli per quanto tempo registrare.','pt':'Escolha por quanto tempo deseja gravar.','ru':'Выберите длительность записи.','ja':'録音する時間を選んでください。','zh':'选择要录制多长时间。','ar':'اختر مدة التسجيل.','hi':'रिकॉर्डिंग की अवधि चुनें।','bn':'কতক্ষণ রেকর্ড করতে চান বেছে নিন।','id':'Pilih berapa lama ingin merekam.'}); - String get indefiniteOption => _pick({'es':'Indefinida','en':'Indefinite','fr':'Indéfinie','de':'Unbegrenzt','it':'Indefinita','pt':'Indefinida','ru':'Без ограничения','ja':'無期限','zh':'不限时','ar':'غير محدد','hi':'अनिश्चित','bn':'অনির্দিষ্ট','id':'Tidak terbatas'}); - String get customOption => _pick({'es':'Personalizada','en':'Custom','fr':'Personnalisée','de':'Benutzerdefiniert','it':'Personalizzata','pt':'Personalizada','ru':'Своя','ja':'カスタム','zh':'自定义','ar':'مخصص','hi':'कस्टम','bn':'কাস্টম','id':'Kustom'}); - String get recordDurationTitle => _pick({'es':'Duración de grabación','en':'Recording duration','fr':'Durée d’enregistrement','de':'Aufnahmedauer','it':'Durata registrazione','pt':'Duração da gravação','ru':'Длительность записи','ja':'録音時間','zh':'录制时长','ar':'مدة التسجيل','hi':'रिकॉर्डिंग अवधि','bn':'রেকর্ডিং সময়কাল','id':'Durasi rekaman'}); - String get invalidNumber => _pick({'es':'Número inválido','en':'Invalid number','fr':'Nombre invalide','de':'Ungültige Zahl','it':'Numero non valido','pt':'Número inválido','ru':'Недопустимое число','ja':'無効な数値','zh':'数字无效','ar':'رقم غير صالح','hi':'अमान्य संख्या','bn':'অবৈধ সংখ্যা','id':'Nomor tidak valid'}); - String get playerPlaybackErrorTitle => _pick({'es':'No se puede reproducir esta radio','en':'This station cannot be played','fr':'Impossible de lire cette radio','de':'Dieser Sender kann nicht wiedergegeben werden','it':'Impossibile riprodurre questa radio','pt':'Não é possível reproduzir esta rádio','ru':'Не удаётся воспроизвести эту станцию','ja':'このラジオは再生できません','zh':'无法播放此电台','ar':'لا يمكن تشغيل هذه المحطة','hi':'यह रेडियो नहीं चलाया जा सकता','bn':'এই রেডিও চালানো যাচ্ছে না','id':'Radio ini tidak dapat diputar'}); - String get stopPlaybackTooltip => _pick({'es':'Detener reproducción','en':'Stop playback','fr':'Arrêter la lecture','de':'Wiedergabe stoppen','it':'Ferma riproduzione','pt':'Parar reprodução','ru':'Остановить воспроизведение','ja':'再生を停止','zh':'停止播放','ar':'إيقاف التشغيل','hi':'प्लेबैक रोकें','bn':'প্লেব্যাক থামান','id':'Hentikan pemutaran'}); - String get pausePlaybackTooltip => _pick({'es':'Pausar reproducción','en':'Pause playback','fr':'Mettre en pause','de':'Wiedergabe pausieren','it':'Pausa riproduzione','pt':'Pausar reprodução','ru':'Пауза','ja':'再生を一時停止','zh':'暂停播放','ar':'إيقاف مؤقت','hi':'प्लेबैक रोकें','bn':'প্লেব্যাক বিরতি','id':'Jeda pemutaran'}); - String get startPlaybackTooltip => _pick({'es':'Iniciar reproducción','en':'Start playback','fr':'Démarrer la lecture','de':'Wiedergabe starten','it':'Avvia riproduzione','pt':'Iniciar reprodução','ru':'Начать воспроизведение','ja':'再生を開始','zh':'开始播放','ar':'بدء التشغيل','hi':'प्लेबैक शुरू करें','bn':'প্লেব্যাক শুরু করুন','id':'Mulai pemutaran'}); - String get liveNow => _pick({'es':'En vivo','en':'Live','fr':'En direct','de':'Live','it':'In diretta','pt':'Ao vivo','ru':'В эфире','ja':'ライブ','zh':'直播','ar':'مباشر','hi':'लाइव','bn':'লাইভ','id':'Langsung'}); - String get notPlaying => _pick({'es':'No está reproduciendo','en':'Not playing','fr':'Lecture arrêtée','de':'Wird nicht wiedergegeben','it':'Non in riproduzione','pt':'Não está reproduzindo','ru':'Не воспроизводится','ja':'再生していません','zh':'未播放','ar':'لا يتم التشغيل','hi':'नहीं चल रहा','bn':'চলছে না','id':'Tidak memutar'}); - String get helpTitle => _pick({'es':'Ayuda y tutorial','en':'Help and tutorial','fr':'Aide et tutoriel','de':'Hilfe und Tutorial','it':'Aiuto e tutorial','pt':'Ajuda e tutorial','ru':'Помощь и руководство','ja':'ヘルプとチュートリアル','zh':'帮助和教程','ar':'المساعدة والشرح','hi':'मदद और ट्यूटोरियल','bn':'সহায়তা ও টিউটোরিয়াল','id':'Bantuan dan tutorial'}); - String get helpSubtitle => _pick({'es':'Repasá funciones, consejos y novedades de PluriWave.','en':'Review PluriWave features, tips and what’s new.','fr':'Revoyez les fonctions, conseils et nouveautés de PluriWave.','de':'Funktionen, Tipps und Neuigkeiten von PluriWave ansehen.','it':'Rivedi funzioni, consigli e novità di PluriWave.','pt':'Revê funções, dicas e novidades do PluriWave.','ru':'Посмотрите функции, советы и новости PluriWave.','ja':'PluriWaveの機能、ヒント、新着情報を確認できます。','zh':'查看 PluriWave 的功能、技巧和新内容。','ar':'راجع ميزات PluriWave والنصائح والمستجدات.','hi':'PluriWave की सुविधाएँ, सुझाव और नया क्या है देखें।','bn':'PluriWave-এর ফিচার, টিপস ও নতুন বিষয়গুলো দেখুন।','id':'Tinjau fitur, tips, dan hal baru di PluriWave.'}); } diff --git a/lib/l10n/app_pt.arb b/lib/l10n/app_pt.arb index 44a9331..4ee9da3 100644 --- a/lib/l10n/app_pt.arb +++ b/lib/l10n/app_pt.arb @@ -1,36 +1,63 @@ { "@@locale": "pt", "appTitle": "PluriWave", - "navHome": "Home", + "navHome": "Início", "navSearch": "Buscar", "navFavorites": "Favoritos", "navAlarms": "Alarmes", - "navSettings": "Settings", + "navSettings": "Configurações", "actionOk": "OK", "sleepTimer": "Timer de sono", - "sleepTimerDescription": "Smooth radio shutdown with an exact countdown.", - "cancelTimer": "Cancel timer", - "optionOther": "Other", - "customDurationTitle": "Custom duration", - "durationGreaterThanZero": "Choose a duration greater than zero.", - "hoursLabel": "Hours", - "minutesLabel": "Minutes", - "secondsLabel": "Seconds", - "saveQuickAccess": "Save as quick access", - "startTimer": "Start timer", - "skipCurrentAlarmExecution": "Skipped this execution of {alarmName}.", + "sleepTimerDescription": "Desligamento suave da rádio com contagem regressiva exata.", + "cancelTimer": "Cancelar timer", + "optionOther": "Outro", + "customDurationTitle": "Duração personalizada", + "durationGreaterThanZero": "Escolha uma duração maior que zero.", + "hoursLabel": "Horas", + "minutesLabel": "Minutos", + "secondsLabel": "Segundos", + "durationHoursMinutesSeconds": "{hours} h {minutes} min {seconds} s", + "@durationHoursMinutesSeconds": { + "placeholders": { + "hours": {}, + "minutes": {}, + "seconds": {} + } + }, + "durationMinutesSeconds": "{minutes} min {seconds} s", + "@durationMinutesSeconds": { + "placeholders": { + "minutes": {}, + "seconds": {} + } + }, + "durationMinutesOnly": "{minutes} min", + "@durationMinutesOnly": { + "placeholders": { + "minutes": {} + } + }, + "durationSecondsOnly": "{seconds} s", + "@durationSecondsOnly": { + "placeholders": { + "seconds": {} + } + }, + "saveQuickAccess": "Salvar como acesso rápido", + "startTimer": "Iniciar timer", + "skipCurrentAlarmExecution": "Esta execução de {alarmName} foi ignorada.", "@skipCurrentAlarmExecution": { "placeholders": { "alarmName": {} } }, - "settingsTitle": "Settings", - "settingsSubtitle": "Fine-grained sound control, backups, and custom stations.", + "settingsTitle": "Configurações", + "settingsSubtitle": "Controle fino de som, backups e estações personalizadas.", "languageSectionTitle": "Idioma", - "languageSectionDescription": "Choose how the app language is displayed.", + "languageSectionDescription": "Escolha como o idioma do app é exibido.", "languageSystemDefault": "Sistema", "languageSpanish": "Espanhol", - "languageEnglish": "English", + "languageEnglish": "Inglês", "languageUpdated": "Idioma atualizado: {languageName}", "@languageUpdated": { "placeholders": { @@ -38,70 +65,71 @@ } }, "languageUpdatedSystem": "Idioma atualizado: Sistema", - "timerSectionTitle": "Sleep timer", - "timerSectionAdd": "Add", - "timerSectionDescription": "Customize the quick presets shown when automatically stopping the radio.", - "timerSectionRestoreRecommended": "Restore recommended times", - "newQuickAccessTitle": "New quick access", - "saveQuickAccessButton": "Save quick access", - "settingsSafeStatus": "Safe", - "recordingsSectionTitle": "Recordings", - "recordingsFolderDialogTitle": "Select recordings folder", - "recordingsPathUpdated": "Recording path updated", - "recordingsPathSaveError": "Could not save the path: {error}", - "recordingsDefaultFolderRestored": "The internal default folder will be used", - "recordingsFolderTitle": "Recordings folder", - "recordingsPathCalculating": "Calculating path...", - "recordingsChangePath": "Change path", - "recordingsUseDefaultPath": "Use default path", - "recordingsOriginalStreamHint": "The radio is saved from the original stream, without recompressing.", - "equalizerActive": "Active", - "equalizerDisabled": "Disabled", - "equalizerEnable": "Enable equalizer", - "equalizerRealtimeSubtitle": "Changes are applied in real time to the current station.", - "equalizerPendingSubtitle": "Changes are saved and will apply when Android enables the effect.", - "equalizerPerStationTitle": "Use custom EQ for this favorite", - "equalizerPerStationActive": "Active for {stationName}", - "equalizerPerStationMain": "Using main EQ for {stationName}", - "preferredStationTitle": "Preferred station", - "preferredStationDescription": "Preselected for new alarms and available for quick playback.", - "preferredStationNoStationsTitle": "No stations available yet", - "preferredStationNoStationsSubtitle": "Save favorites or load stations to choose a preferred one.", - "preferredStationAutomaticFallback": "Automatic fallback", - "preferredStationDefaultFavorite": "Default favorite", - "preferredStationCurrent": "Current preferred: {stationName}", - "preferredStationAutoUsing": "No favorites: automatically using {stationName}", - "preferredStationPlay": "Play preferred", - "customStationsTitle": "Custom stations", - "customStationsAdd": "Add", - "customStationsEmpty": "No custom stations.", - "playAction": "Play", - "deleteAction": "Delete", - "addStationTitle": "Add station", - "stationNameLabel": "Name *", - "requiredField": "Required field", - "streamUrlLabel": "Stream URL *", - "invalidUrl": "Invalid URL", - "countryOptionalLabel": "Country (optional)", - "saveStation": "Save station", + "timerSectionTitle": "Timer de sono", + "timerSectionAdd": "Adicionar", + "timerSectionDescription": "Personalize os acessos rápidos exibidos ao desligar a rádio automaticamente.", + "timerSectionRestoreRecommended": "Restaurar tempos recomendados", + "newQuickAccessTitle": "Novo acesso rápido", + "saveQuickAccessButton": "Salvar acesso rápido", + "settingsSafeStatus": "Seguro", + "recordingsSectionTitle": "Gravações", + "recordingsFolderDialogTitle": "Selecione a pasta de gravações", + "recordingsPathUpdated": "Caminho de gravação atualizado", + "recordingsPathSaveError": "Não foi possível salvar o caminho: {error}", + "recordingsDefaultFolderRestored": "A pasta interna padrão será usada", + "recordingsFolderTitle": "Pasta de gravação", + "recordingsPathCalculating": "Calculando caminho...", + "recordingsChangePath": "Alterar caminho", + "recordingsUseDefaultPath": "Usar caminho padrão", + "recordingsOriginalStreamHint": "A rádio é salva a partir do stream original, sem recompressão.", + "equalizerActive": "Ativo", + "equalizerDisabled": "Desativado", + "equalizerEnable": "Ativar equalizador", + "equalizerRealtimeSubtitle": "As alterações são aplicadas em tempo real à estação atual.", + "equalizerPendingSubtitle": "As alterações são salvas e serão aplicadas quando o Android habilitar o efeito.", + "equalizerPerStationTitle": "Usar EQ próprio para este favorito", + "equalizerPerStationActive": "Ativo para {stationName}", + "equalizerPerStationMain": "Usando o EQ principal para {stationName}", + "preferredStationTitle": "Estação preferida", + "preferredStationDescription": "Pré-selecionada ao criar alarmes e disponível para reprodução rápida.", + "preferredStationNoStationsTitle": "Ainda não há estações disponíveis", + "preferredStationNoStationsSubtitle": "Salve favoritas ou carregue estações para escolher uma preferida.", + "preferredStationAutomaticFallback": "Fallback automático", + "preferredStationDefaultFavorite": "Favorita padrão", + "preferredStationCurrent": "Preferida atual: {stationName}", + "preferredStationAutoUsing": "Sem favoritas: usando automaticamente {stationName}", + "preferredStationPlay": "Reproduzir preferida", + "customStationsTitle": "Estações personalizadas", + "customStationsAdd": "Adicionar", + "customStationsEmpty": "Não há estações personalizadas.", + "playAction": "Reproduzir", + "deleteAction": "Excluir", + "addStationTitle": "Adicionar estação", + "stationNameLabel": "Nome *", + "unnamedStation": "Estação sem nome", + "requiredField": "Campo obrigatório", + "streamUrlLabel": "URL do stream *", + "invalidUrl": "URL inválida", + "countryOptionalLabel": "País (opcional)", + "saveStation": "Salvar estação", "backupSectionTitle": "Backup", - "backupExportTitle": "Export configuration", - "backupExportSubtitle": "Favorites, custom stations, and EQ presets", - "backupImportTitle": "Import configuration", - "backupImportSubtitle": "Restore from a backup file", + "backupExportTitle": "Exportar configuração", + "backupExportSubtitle": "Favoritos, estações personalizadas e presets de EQ", + "backupImportTitle": "Importar configuração", + "backupImportSubtitle": "Restaurar a partir de um arquivo de backup", "backupShareSubject": "PluriWave — backup", - "backupShareText": "PluriWave configuration exported on {date}", - "backupExportError": "Export error: {error}", - "backupImportConfirmMessage": "This will add favorites, stations, and presets from the file. Continue?", - "backupImportSuccess": "Configuration imported successfully", - "backupImportError": "Import error: {error}", - "appVersionLoading": "Loading version...", - "appVersionSubtitle": "{version} - World radio", - "savedFavoritesTitle": "Saved favorites", - "stationFilterTitle": "Station filter", - "stationFilterSubtitle": "Only stations verified as active", - "backgroundAudioTitle": "Background audio", - "backgroundAudioSubtitle": "Continues when the screen turns off", + "backupShareText": "Configuração do PluriWave exportada em {date}", + "backupExportError": "Erro ao exportar: {error}", + "backupImportConfirmMessage": "Isso adicionará favoritos, estações e presets do arquivo. Continuar?", + "backupImportSuccess": "Configuração importada com sucesso", + "backupImportError": "Erro ao importar: {error}", + "appVersionLoading": "Carregando versão...", + "appVersionSubtitle": "{version} - Rádio mundial", + "savedFavoritesTitle": "Favoritos salvos", + "stationFilterTitle": "Filtro de estações", + "stationFilterSubtitle": "Apenas estações verificadas como ativas", + "backgroundAudioTitle": "Áudio em segundo plano", + "backgroundAudioSubtitle": "Continua ao desligar a tela", "dash": "—", "@recordingsPathSaveError": { "placeholders": { @@ -149,14 +177,14 @@ } }, "cancelAction": "Cancelar", - "equalizerTitle": "Equalizer", - "recordingsOpenFolder": "Open folder", - "recordingsOpenFolderError": "Could not open the folder: {error}", - "recordingsMaxSizeTitle": "Maximum recording size", - "recordingsMaxSizeSubtitle": "Current limit: {size} MB", - "recordingsMaxSizeDialogTitle": "Maximum size per recording", - "recordingsMaxSizeMbLabel": "Maximum megabytes", - "recordingsMaxSizeSaved": "Recording limit updated to {size} MB", + "equalizerTitle": "Equalizador", + "recordingsOpenFolder": "Abrir pasta", + "recordingsOpenFolderError": "Não foi possível abrir a pasta: {error}", + "recordingsMaxSizeTitle": "Tamanho máximo da gravação", + "recordingsMaxSizeSubtitle": "Limite atual: {size} MB", + "recordingsMaxSizeDialogTitle": "Tamanho máximo por gravação", + "recordingsMaxSizeMbLabel": "Megabytes máximos", + "recordingsMaxSizeSaved": "Limite de gravação atualizado para {size} MB", "@recordingsOpenFolderError": { "placeholders": { "error": {} @@ -176,33 +204,33 @@ } } }, - "stationOrderTitle": "Station order", - "stationOrderByName": "By name", - "stationOrderByQuality": "By quality", - "stationOrderScopeDescription": "Applies to favorites, searches, nearby stations and quick lists.", - "favoriteGroupsTitle": "Favorite lists", - "favoriteGroupsDescription": "Create short lists to organize your saved stations.", - "favoriteGroupsAdd": "Add list", - "favoriteGroupsEdit": "Edit list", - "favoriteGroupsDelete": "Delete list", - "favoriteGroupsNameLabel": "List name", - "favoriteGroupsNameTooLong": "Maximum 28 characters.", - "favoriteGroupsUnassigned": "Unassigned", - "favoriteGroupsProtectedHint": "Default list: it cannot be edited or deleted.", - "favoriteGroupsCreated": "List created", - "favoriteGroupsUpdated": "List updated", - "favoriteGroupsDeleted": "List deleted; its stations return to Unassigned.", - "favoriteGroupsAssign": "Move to list", - "favoriteGroupsAssignSubtitle": "Current list: {groupName}", - "favoriteGroupsAssigned": "{stationName} moved to {groupName}", - "favoritesTitle": "Favorites", - "favoritesEmptyTitle": "No favorites yet", - "favoritesEmptySubtitle": "Tap the heart on any station to save it to your collection.", - "favoritesHeaderSubtitle": "Organize your collection by lists and keep important radios close.", - "favoritesCollection": "Collection", - "favoritesSavedCount": "{count} saved", - "favoritesRemoveTooltip": "Remove from favorites", - "favoritesRemovedMessage": "{stationName} removed from favorites", + "stationOrderTitle": "Ordem das estações", + "stationOrderByName": "Por nome", + "stationOrderByQuality": "Por qualidade", + "stationOrderScopeDescription": "Aplica-se a favoritos, buscas, estações próximas e listas rápidas.", + "favoriteGroupsTitle": "Listas de favoritos", + "favoriteGroupsDescription": "Crie listas curtas para organizar suas estações salvas.", + "favoriteGroupsAdd": "Adicionar lista", + "favoriteGroupsEdit": "Editar lista", + "favoriteGroupsDelete": "Excluir lista", + "favoriteGroupsNameLabel": "Nome da lista", + "favoriteGroupsNameTooLong": "Máximo de 28 caracteres.", + "favoriteGroupsUnassigned": "Sem atribuição", + "favoriteGroupsProtectedHint": "Lista padrão: não pode ser editada nem excluída.", + "favoriteGroupsCreated": "Lista criada", + "favoriteGroupsUpdated": "Lista atualizada", + "favoriteGroupsDeleted": "Lista excluída; suas estações voltam para Sem atribuição.", + "favoriteGroupsAssign": "Mover para lista", + "favoriteGroupsAssignSubtitle": "Lista atual: {groupName}", + "favoriteGroupsAssigned": "{stationName} movida para {groupName}", + "favoritesTitle": "Favoritos", + "favoritesEmptyTitle": "Ainda sem favoritos", + "favoritesEmptySubtitle": "Toque no coração em qualquer estação para salvá-la na sua coleção.", + "favoritesHeaderSubtitle": "Organize sua coleção por listas e mantenha as rádios importantes por perto.", + "favoritesCollection": "Coleção", + "favoritesSavedCount": "{count} salvas", + "favoritesRemoveTooltip": "Remover dos favoritos", + "favoritesRemovedMessage": "{stationName} removida dos favoritos", "@favoriteGroupsAssignSubtitle": { "placeholders": { "groupName": {} @@ -226,7 +254,7 @@ "stationName": {} } }, - "alarmPostponedCurrentExecution": "Alarm postponed for this occurrence.", + "alarmPostponedCurrentExecution": "Alarme adiado para esta execução.", "searchScreenTitle": "Buscar sinal", "searchScreenSubtitle": "Encontre estações por nome, país ou idioma com filtros rápidos e contraste elevado.", "searchFiltersLabel": "Filtros", @@ -257,9 +285,9 @@ "languageNameJapanese": "japonês", "languageNameArabic": "árabe", "languageNameRussian": "russo", - "homeScreenSubtitle": "Live global radio with clean signals, smart favorites, and a show-style visual experience.", - "exploreStations": "Explore stations", - "stationsCount": "{count} stations", + "homeScreenSubtitle": "Rádio global ao vivo com sinais limpos, favoritos inteligentes e uma experiência visual de game show.", + "exploreStations": "Explorar estações", + "stationsCount": "{count} rádios", "@stationsCount": { "placeholders": { "count": { @@ -267,36 +295,36 @@ } } }, - "qualityHd": "HD quality", - "nearYou": "Near you", - "nearYouInCountry": "Near you ? {country}", + "qualityHd": "Qualidade HD", + "nearYou": "Perto de você", + "nearYouInCountry": "Perto de você · {country}", "@nearYouInCountry": { "placeholders": { "country": {} } }, - "detectAction": "Detect", - "liveRadar": "Live radar", - "genresTitle": "Genres", - "retryAction": "Retry", - "noStationsAvailable": "No stations available", - "noStationsAvailableSubtitle": "Try refreshing or choosing another genre to capture a signal again.", + "detectAction": "Detectar", + "liveRadar": "Radar ao vivo", + "genresTitle": "Gêneros", + "retryAction": "Tentar novamente", + "noStationsAvailable": "Não há estações disponíveis", + "noStationsAvailableSubtitle": "Tente atualizar ou escolher outro gênero para captar sinal novamente.", "genrePop": "Pop", "genreRock": "Rock", "genreJazz": "Jazz", - "genreClassical": "Classical", - "genreElectronic": "Electronic", - "genreNews": "News", - "genreTalk": "Talk", + "genreClassical": "Clássica", + "genreElectronic": "Eletrônica", + "genreNews": "Notícias", + "genreTalk": "Conversa", "genreHipHop": "Hip-hop", "genreCountry": "Country", "genreMetal": "Metal", "genreReggae": "Reggae", - "genreLatin": "Latin", - "alarmScreenTitle": "Music wake-up", - "alarmScreenSubtitle": "Alarms with radio, safe fallback sound, smart vacations, and the next occurrence always visible.", - "createAlarmAction": "Create alarm", - "alarmsCount": "{count} alarms", + "genreLatin": "Latina", + "alarmScreenTitle": "Despertar musical", + "alarmScreenSubtitle": "Alarmes com rádio, som seguro, férias inteligentes e próxima execução sempre visível.", + "createAlarmAction": "Criar alarme", + "alarmsCount": "{count} alarmes", "@alarmsCount": { "placeholders": { "count": { @@ -304,10 +332,10 @@ } } }, - "activeAlarmsWithoutNextTitle": "Active alarms without a next occurrence", - "noActiveAlarms": "No active alarms", - "nextAlarmTitle": "Next alarm", - "activeAlarmsWithoutNextSubtitle": "There are {count} active alarm(s), but they do not currently have a valid future date. Check date, weekdays, and vacations.", + "activeAlarmsWithoutNextTitle": "Alarmes ativos sem próxima execução", + "noActiveAlarms": "Sem alarmes ativos", + "nextAlarmTitle": "Próximo alarme", + "activeAlarmsWithoutNextSubtitle": "Há {count} alarme(s) ativos, mas no momento não têm uma data futura válida. Verifique data, dias e férias.", "@activeAlarmsWithoutNextSubtitle": { "placeholders": { "count": { @@ -315,9 +343,9 @@ } } }, - "createAlarmHint": "Create an alarm and PluriWave will calculate the next occurrence automatically.", - "alarmVacationPlay": "Plays during vacations", - "alarmVacationPause": "Paused during vacations", + "createAlarmHint": "Crie um alarme e o PluriWave calculará automaticamente a próxima execução.", + "alarmVacationPlay": "Toca durante as férias", + "alarmVacationPause": "Pausa nas férias", "alarmFadeInLabel": "Fade-in {seconds}s", "@alarmFadeInLabel": { "placeholders": { @@ -326,61 +354,61 @@ } } }, - "alarmNextExecution": "Next occurrence: {date}", + "alarmNextExecution": "Próxima execução: {date}", "@alarmNextExecution": { "placeholders": { "date": {} } }, - "alarmNoNextExecution": "It has no active next occurrence.", - "alarmSkippedExecution": "One occurrence was skipped: {date}.", + "alarmNoNextExecution": "Não há próxima execução ativa.", + "alarmSkippedExecution": "Uma execução foi ignorada: {date}.", "@alarmSkippedExecution": { "placeholders": { "date": {} } }, - "editAction": "Edit", - "skipNextAction": "Skip next", - "deleteTooltip": "Delete", - "alarmSkippedNoNextSnackbar": "Alarm skipped. There is no next occurrence left.", - "alarmSkippedReturnsSnackbar": "Alarm skipped. It will return on {date}.", + "editAction": "Editar", + "skipNextAction": "Ignorar próxima", + "deleteTooltip": "Excluir", + "alarmSkippedNoNextSnackbar": "Alarme ignorado. Não resta próxima execução.", + "alarmSkippedReturnsSnackbar": "Alarme ignorado. Voltará em {date}.", "@alarmSkippedReturnsSnackbar": { "placeholders": { "date": {} } }, - "alarmVacationPausedNoNext": "It is paused for vacations ({vacationName}) and has no next occurrence.", + "alarmVacationPausedNoNext": "Está pausado por férias ({vacationName}) e sem próxima execução.", "@alarmVacationPausedNoNext": { "placeholders": { "vacationName": {} } }, - "alarmVacationPausedReturns": "It is paused for vacations ({vacationName}) and returns on {date}.", + "alarmVacationPausedReturns": "Está pausado por férias ({vacationName}) e volta em {date}.", "@alarmVacationPausedReturns": { "placeholders": { "vacationName": {}, "date": {} } }, - "alarmVacationReturns": "With vacations enabled, it will ring again on {date}.", + "alarmVacationReturns": "Com férias ativas, tocará novamente em {date}.", "@alarmVacationReturns": { "placeholders": { "date": {} } }, - "defaultAlarmName": "Music alarm", - "newAlarmTitle": "New alarm", - "editAlarmTitle": "Edit alarm", - "nameField": "Name", - "timeField": "Time", - "dateField": "Date", - "onceOption": "Once", - "dailyOption": "Daily", - "weekdaysOption": "Weekdays", - "soundAndVolumeSection": "Sound and volume", - "alarmFadeInTitle": "Alarm fade-in", - "alarmFadeInOff": "0 s (no transition)", - "alarmFadeInSummary": "{seconds} s (from 5% to the selected volume)", + "defaultAlarmName": "Despertador musical", + "newAlarmTitle": "Novo alarme", + "editAlarmTitle": "Editar alarme", + "nameField": "Nome", + "timeField": "Hora", + "dateField": "Data", + "onceOption": "Uma vez", + "dailyOption": "Diária", + "weekdaysOption": "Dias", + "soundAndVolumeSection": "Som e volume", + "alarmFadeInTitle": "Fade-in do alarme", + "alarmFadeInOff": "0 s (sem transição)", + "alarmFadeInSummary": "{seconds} s (de 5% ao volume escolhido)", "@alarmFadeInSummary": { "placeholders": { "seconds": { @@ -388,22 +416,22 @@ } } }, - "internalSafeSoundLabel": "Internal safe sound", - "soundWarmSunrise": "Warm sunrise", - "soundSoftBell": "Soft bell", - "soundDigitalPulse": "Digital pulse", - "favoriteStationLabel": "Favorite station", - "noStationUseInternalSound": "No station: use internal sound", - "saveFavoritesAlarmHint": "Save stations in Favorites to use them as a music alarm.", - "useCurrentStationAction": "Use current station", - "playDuringVacations": "Play during vacations", - "playDuringVacationsHint": "If you turn this off, the next occurrence will jump to the first valid day.", - "saveAlarmAction": "Save alarm", - "chooseOneWeekdayError": "Choose at least one weekday.", - "androidReliabilityReview": "Review Android reliability", + "internalSafeSoundLabel": "Som seguro interno", + "soundWarmSunrise": "Amanhecer acolhedor", + "soundSoftBell": "Sino suave", + "soundDigitalPulse": "Pulso digital", + "favoriteStationLabel": "Estação favorita", + "noStationUseInternalSound": "Sem estação: usar som interno", + "saveFavoritesAlarmHint": "Salve estações nos Favoritos para usá-las como alarme musical.", + "useCurrentStationAction": "Usar estação atual", + "playDuringVacations": "Tocar durante as férias", + "playDuringVacationsHint": "Se você desativar, a próxima execução saltará para o primeiro dia válido.", + "saveAlarmAction": "Salvar alarme", + "chooseOneWeekdayError": "Escolha pelo menos um dia da semana.", + "androidReliabilityReview": "Revisar confiabilidade Android", "statusOk": "OK", - "statusPending": "pending", - "androidReliabilityStatus": "Reliability: exact {exact} ? notifications {notifications} ? screen {screen}", + "statusPending": "pendente", + "androidReliabilityStatus": "Confiabilidade: exatos {exact} · notificações {notifications} · tela {screen}", "@androidReliabilityStatus": { "placeholders": { "exact": {}, @@ -411,19 +439,165 @@ "screen": {} } }, - "vacationRangesTitle": "Vacation ranges", - "addAction": "Add", - "vacationRangesHint": "If an alarm is set to \"Paused during vacations\", it automatically skips these ranges.", - "noVacationRangesLoaded": "No ranges loaded.", - "deleteRangeTooltip": "Delete range", - "vacationsDefaultName": "Vacation", - "newVacationRangeTitle": "New vacation range", - "startField": "Start", - "endField": "End", - "saveRangeAction": "Save range", - "noAlarmsYetTitle": "There are no alarms yet.", - "noAlarmsYetSubtitle": "Create one to design your musical wake-up.", - "ringingInternalAudioActive": "Playing with internal safe audio.", - "ringingPreparingInternalAudio": "Preparing internal safe audio.", - "stopAlarmAction": "Stop alarm" + "vacationRangesTitle": "Períodos de férias", + "addAction": "Adicionar", + "vacationRangesHint": "Se um alarme tiver \"Pausa nas férias\", estes períodos serão ignorados automaticamente.", + "noVacationRangesLoaded": "Nenhum período carregado.", + "deleteRangeTooltip": "Excluir período", + "vacationsDefaultName": "Férias", + "newVacationRangeTitle": "Novo período de férias", + "startField": "Início", + "endField": "Fim", + "saveRangeAction": "Salvar período", + "noAlarmsYetTitle": "Ainda não há alarmes.", + "noAlarmsYetSubtitle": "Crie um para configurar seu despertar musical.", + "ringingInternalAudioActive": "Tocando com som seguro interno.", + "ringingPreparingInternalAudio": "Preparando som seguro interno.", + "stopAlarmAction": "Parar alarme", + "pauseAction": "Pausar", + "miniPlayerOpenLabel": "Abrir reprodutor de {stationName}", + "@miniPlayerOpenLabel": { + "placeholders": { + "stationName": {} + } + }, + "playerIconLabel": "Reprodutor", + "playbackStatusConnecting": "Conectando...", + "playbackStatusLive": "Ao vivo", + "playbackStatusPaused": "Pausado", + "playbackStatusConnectionError": "Erro de conexão", + "playbackStatusStopped": "Parado", + "stationSemanticLabel": "Estação {stationName}", + "@stationSemanticLabel": { + "placeholders": { + "stationName": {} + } + }, + "favoritesAddTooltip": "Adicionar aos favoritos", + "favoritesAddedMessage": "{stationName} adicionada aos favoritos", + "@favoritesAddedMessage": { + "placeholders": { + "stationName": {} + } + }, + "stationIconLabel": "Ícone da estação", + "liveNow": "Ao vivo", + "equalizerBandLabel": "Banda {band}", + "@equalizerBandLabel": { + "placeholders": { + "band": {} + } + }, + "equalizerBandValue": "{value} decibéis", + "@equalizerBandValue": { + "placeholders": { + "value": {} + } + }, + "equalizerPresetFlat": "Plano", + "equalizerPresetRock": "Rock", + "equalizerPresetPop": "Pop", + "equalizerPresetBassBoost": "Reforço de graves", + "equalizerPresetJazz": "Jazz", + "equalizerPresetVoice": "Voz", + "equalizerPresetCustom": "Personalizado", + "onboardingTitle": "Bem-vindo ao PluriWave", + "onboardingNewsTitle": "Novidades", + "onboardingStartAction": "Começar", + "onboardingCloseTooltip": "Fechar", + "radioRecordingError": "Erro ao gravar a rádio: {error}", + "@radioRecordingError": { + "placeholders": { + "error": {} + } + }, + "radioApiConnectionError": "Sem conexão com a API de rádio", + "radioSearchError": "Erro na busca. Verifique sua conexão.", + "radioLoadMoreStationsError": "Não foi possível carregar mais estações.", + "radioNearbyStationsError": "Não foi possível detectar estações próximas. Use filtros por país.", + "radioCannotPlayStation": "Não é possível reproduzir \"{stationName}\"", + "@radioCannotPlayStation": { + "placeholders": { + "stationName": {} + } + }, + "recordingSelectStationFirst": "Primeiro selecione uma estação para gravar.", + "recordingStartError": "Não foi possível iniciar a gravação: {error}", + "@recordingStartError": { + "placeholders": { + "error": {} + } + }, + "unsupportedConfigVersion": "Versão de configuração não compatível", + "audioErrorGeneric": "Erro de reprodução", + "audioErrorNoInternet": "Sem conexão com a internet", + "audioErrorInvalidUrl": "A URL da rádio não é válida", + "audioErrorNotFound": "A rádio não está disponível (erro 404)", + "audioErrorTimeout": "Tempo esgotado ao conectar", + "audioErrorCannotConnect": "Não é possível conectar à rádio", + "audioErrorUnsupportedFormat": "Formato de stream não compatível", + "audioErrorDecode": "Erro ao decodificar o stream de áudio", + "audioErrorCleartext": "Esta rádio usa HTTP sem criptografia, o que não é permitido", + "audioErrorSsl": "Certificado SSL inválido na rádio", + "audioErrorCannotPlay": "Não é possível reproduzir esta rádio", + "audioErrorUnexpectedPlayback": "Erro inesperado ao reproduzir", + "androidExactAlarmScheduleError": "O Android não conseguiu agendar um alarme exato. Verifique a permissão de alarmes exatos.", + "recordingPathEmptyError": "O caminho de gravação não pode estar vazio", + "recordingMaxSizeInvalidError": "O tamanho máximo deve ser maior que zero", + "recordingAlreadyActiveError": "Já há uma gravação em andamento", + "alarmRingingFallbackActive": "Tocando com áudio interno seguro.", + "alarmRingingPreparingFallback": "Preparando áudio interno seguro.", + "alarmRingingTryingStation": "Tentando reproduzir sua estação com a maior qualidade disponível.", + "alarmScheduleOnce": "Uma vez · {date}", + "@alarmScheduleOnce": { + "placeholders": { + "date": {} + } + }, + "alarmScheduleWeekdays": "Dias: {days}", + "@alarmScheduleWeekdays": { + "placeholders": { + "days": {} + } + }, + "androidReliabilityTitle": "Revisar confiabilidade Android", + "closeAction": "Fechar", + "customOption": "Personalizada", + "endLabel": "Fim", + "equalizerDisable": "Desativar equalizador", + "helpTitle": "Ajuda e tutorial", + "helpSubtitle": "Revê funções, dicas e novidades do PluriWave.", + "indefiniteOption": "Indefinida", + "invalidNumber": "Número inválido", + "nameLabel": "Nome", + "notPlaying": "Não está reproduzindo", + "oneTimeOption": "Uma vez", + "pausePlaybackTooltip": "Pausar reprodução", + "qualityOriginal": "Qualidade original: {quality}", + "@qualityOriginal": { + "placeholders": { + "quality": {} + } + }, + "qualityUnknown": "Qualidade não informada", + "recordAction": "Gravar", + "recordDurationTitle": "Duração da gravação", + "recordRadioSubtitle": "Escolha por quanto tempo deseja gravar.", + "recordRadioTitle": "Gravar rádio", + "recordingActiveTitle": "Gravando rádio", + "recordingDirectTitle": "Gravação direta", + "recordingsOpenFolderPlainError": "Não foi possível abrir a pasta de gravações", + "recordingsOpenLatest": "Abrir última gravação", + "recordingsOpenLatestError": "Não foi possível abrir a última gravação", + "startLabel": "Início", + "startPlaybackTooltip": "Iniciar reprodução", + "stopAction": "Parar", + "stopPlaybackTooltip": "Parar reprodução", + "weekdayShortMonday": "Seg", + "weekdayShortTuesday": "Ter", + "weekdayShortWednesday": "Qua", + "weekdayShortThursday": "Qui", + "weekdayShortFriday": "Sex", + "weekdayShortSaturday": "Sáb", + "weekdayShortSunday": "Dom" } diff --git a/lib/l10n/app_ru.arb b/lib/l10n/app_ru.arb index 0513ff5..82de129 100644 --- a/lib/l10n/app_ru.arb +++ b/lib/l10n/app_ru.arb @@ -1,107 +1,135 @@ { "@@locale": "ru", "appTitle": "PluriWave", - "navHome": "Home", - "navSearch": "Search", - "navFavorites": "Favorites", - "navAlarms": "Alarms", - "navSettings": "Settings", - "actionOk": "OK", - "sleepTimer": "Sleep timer", - "sleepTimerDescription": "Smooth radio shutdown with an exact countdown.", - "cancelTimer": "Cancel timer", - "optionOther": "Other", - "customDurationTitle": "Custom duration", - "durationGreaterThanZero": "Choose a duration greater than zero.", - "hoursLabel": "Hours", - "minutesLabel": "Minutes", - "secondsLabel": "Seconds", - "saveQuickAccess": "Save as quick access", - "startTimer": "Start timer", - "skipCurrentAlarmExecution": "Skipped this execution of {alarmName}.", + "navHome": "Главная", + "navSearch": "Поиск", + "navFavorites": "Избранное", + "navAlarms": "Будильники", + "navSettings": "Настройки", + "actionOk": "ОК", + "sleepTimer": "Таймер сна", + "sleepTimerDescription": "Плавное выключение радио с точным обратным отсчётом.", + "cancelTimer": "Отменить таймер", + "optionOther": "Другое", + "customDurationTitle": "Своя длительность", + "durationGreaterThanZero": "Выберите длительность больше нуля.", + "hoursLabel": "Часы", + "minutesLabel": "Минуты", + "secondsLabel": "Секунды", + "durationHoursMinutesSeconds": "{hours} ? {minutes} ??? {seconds} ?", + "@durationHoursMinutesSeconds": { + "placeholders": { + "hours": {}, + "minutes": {}, + "seconds": {} + } + }, + "durationMinutesSeconds": "{minutes} ??? {seconds} ?", + "@durationMinutesSeconds": { + "placeholders": { + "minutes": {}, + "seconds": {} + } + }, + "durationMinutesOnly": "{minutes} ???", + "@durationMinutesOnly": { + "placeholders": { + "minutes": {} + } + }, + "durationSecondsOnly": "{seconds} ?", + "@durationSecondsOnly": { + "placeholders": { + "seconds": {} + } + }, + "saveQuickAccess": "Сохранить как быстрый доступ", + "startTimer": "Запустить таймер", + "skipCurrentAlarmExecution": "Этот запуск {alarmName} пропущен.", "@skipCurrentAlarmExecution": { "placeholders": { "alarmName": {} } }, - "settingsTitle": "Settings", - "settingsSubtitle": "Fine-grained sound control, backups, and custom stations.", - "languageSectionTitle": "Language", - "languageSectionDescription": "Choose how the app language is displayed.", - "languageSystemDefault": "System", - "languageSpanish": "Spanish", - "languageEnglish": "English", - "languageUpdated": "Language updated: {languageName}", + "settingsTitle": "Настройки", + "settingsSubtitle": "Точная настройка звука, резервных копий и пользовательских станций.", + "languageSectionTitle": "Язык", + "languageSectionDescription": "Выберите, как отображается язык приложения.", + "languageSystemDefault": "Система", + "languageSpanish": "Испанский", + "languageEnglish": "Английский", + "languageUpdated": "Язык обновлён: {languageName}", "@languageUpdated": { "placeholders": { "languageName": {} } }, - "languageUpdatedSystem": "Language updated: System", - "timerSectionTitle": "Sleep timer", - "timerSectionAdd": "Add", - "timerSectionDescription": "Customize the quick presets shown when automatically stopping the radio.", - "timerSectionRestoreRecommended": "Restore recommended times", - "newQuickAccessTitle": "New quick access", - "saveQuickAccessButton": "Save quick access", - "settingsSafeStatus": "Safe", - "recordingsSectionTitle": "Recordings", - "recordingsFolderDialogTitle": "Select recordings folder", - "recordingsPathUpdated": "Recording path updated", - "recordingsPathSaveError": "Could not save the path: {error}", - "recordingsDefaultFolderRestored": "The internal default folder will be used", - "recordingsFolderTitle": "Recordings folder", - "recordingsPathCalculating": "Calculating path...", - "recordingsChangePath": "Change path", - "recordingsUseDefaultPath": "Use default path", - "recordingsOriginalStreamHint": "The radio is saved from the original stream, without recompressing.", - "equalizerActive": "Active", - "equalizerDisabled": "Disabled", - "equalizerEnable": "Enable equalizer", - "equalizerRealtimeSubtitle": "Changes are applied in real time to the current station.", - "equalizerPendingSubtitle": "Changes are saved and will apply when Android enables the effect.", - "equalizerPerStationTitle": "Use custom EQ for this favorite", - "equalizerPerStationActive": "Active for {stationName}", - "equalizerPerStationMain": "Using main EQ for {stationName}", - "preferredStationTitle": "Preferred station", - "preferredStationDescription": "Preselected for new alarms and available for quick playback.", - "preferredStationNoStationsTitle": "No stations available yet", - "preferredStationNoStationsSubtitle": "Save favorites or load stations to choose a preferred one.", - "preferredStationAutomaticFallback": "Automatic fallback", - "preferredStationDefaultFavorite": "Default favorite", - "preferredStationCurrent": "Current preferred: {stationName}", - "preferredStationAutoUsing": "No favorites: automatically using {stationName}", - "preferredStationPlay": "Play preferred", - "customStationsTitle": "Custom stations", - "customStationsAdd": "Add", - "customStationsEmpty": "No custom stations.", - "playAction": "Play", - "deleteAction": "Delete", - "addStationTitle": "Add station", - "stationNameLabel": "Name *", - "requiredField": "Required field", - "streamUrlLabel": "Stream URL *", - "invalidUrl": "Invalid URL", - "countryOptionalLabel": "Country (optional)", - "saveStation": "Save station", - "backupSectionTitle": "Backup", - "backupExportTitle": "Export configuration", - "backupExportSubtitle": "Favorites, custom stations, and EQ presets", - "backupImportTitle": "Import configuration", - "backupImportSubtitle": "Restore from a backup file", - "backupShareSubject": "PluriWave — backup", - "backupShareText": "PluriWave configuration exported on {date}", - "backupExportError": "Export error: {error}", - "backupImportConfirmMessage": "This will add favorites, stations, and presets from the file. Continue?", - "backupImportSuccess": "Configuration imported successfully", - "backupImportError": "Import error: {error}", - "appVersionLoading": "Loading version...", - "appVersionSubtitle": "{version} - World radio", - "savedFavoritesTitle": "Saved favorites", - "stationFilterTitle": "Station filter", - "stationFilterSubtitle": "Only stations verified as active", - "backgroundAudioTitle": "Background audio", - "backgroundAudioSubtitle": "Continues when the screen turns off", + "languageUpdatedSystem": "Язык обновлён: система", + "timerSectionTitle": "Таймер сна", + "timerSectionAdd": "Добавить", + "timerSectionDescription": "Настройте быстрые пресеты, которые появляются при автоматическом выключении радио.", + "timerSectionRestoreRecommended": "Восстановить рекомендуемое время", + "newQuickAccessTitle": "Новый быстрый доступ", + "saveQuickAccessButton": "Сохранить быстрый доступ", + "settingsSafeStatus": "Безопасно", + "recordingsSectionTitle": "Записи", + "recordingsFolderDialogTitle": "Выберите папку для записей", + "recordingsPathUpdated": "Путь записи обновлён", + "recordingsPathSaveError": "Не удалось сохранить путь: {error}", + "recordingsDefaultFolderRestored": "Будет использована внутренняя папка по умолчанию", + "recordingsFolderTitle": "Папка записей", + "recordingsPathCalculating": "Вычисление пути...", + "recordingsChangePath": "Изменить путь", + "recordingsUseDefaultPath": "Использовать путь по умолчанию", + "recordingsOriginalStreamHint": "Радио сохраняется из исходного потока без повторного сжатия.", + "equalizerActive": "Активно", + "equalizerDisabled": "Отключено", + "equalizerEnable": "Включить эквалайзер", + "equalizerRealtimeSubtitle": "Изменения применяются к текущей станции в реальном времени.", + "equalizerPendingSubtitle": "Изменения сохраняются и применятся, когда Android включит эффект.", + "equalizerPerStationTitle": "Использовать свой EQ для этого избранного", + "equalizerPerStationActive": "Активно для {stationName}", + "equalizerPerStationMain": "Используется основной EQ для {stationName}", + "preferredStationTitle": "Предпочитаемая станция", + "preferredStationDescription": "Предварительно выбирается при создании будильников и доступна для быстрого воспроизведения.", + "preferredStationNoStationsTitle": "Пока нет доступных станций", + "preferredStationNoStationsSubtitle": "Сохраните избранные или загрузите станции, чтобы выбрать предпочитаемую.", + "preferredStationAutomaticFallback": "Автоматический резерв", + "preferredStationDefaultFavorite": "Избранное по умолчанию", + "preferredStationCurrent": "Текущая предпочитаемая: {stationName}", + "preferredStationAutoUsing": "Нет избранных: автоматически используется {stationName}", + "preferredStationPlay": "Воспроизвести предпочитаемую", + "customStationsTitle": "Пользовательские станции", + "customStationsAdd": "Добавить", + "customStationsEmpty": "Пользовательских станций нет.", + "playAction": "Воспроизвести", + "deleteAction": "Удалить", + "addStationTitle": "Добавить станцию", + "stationNameLabel": "Название *", + "unnamedStation": "Станция без названия", + "requiredField": "Обязательное поле", + "streamUrlLabel": "URL потока *", + "invalidUrl": "Недопустимый URL", + "countryOptionalLabel": "Страна (необязательно)", + "saveStation": "Сохранить станцию", + "backupSectionTitle": "Резервная копия", + "backupExportTitle": "Экспортировать настройки", + "backupExportSubtitle": "Избранное, пользовательские станции и пресеты EQ", + "backupImportTitle": "Импортировать настройки", + "backupImportSubtitle": "Восстановить из файла резервной копии", + "backupShareSubject": "PluriWave — резервная копия", + "backupShareText": "Настройки PluriWave, экспортированные {date}", + "backupExportError": "Ошибка при экспорте: {error}", + "backupImportConfirmMessage": "Это добавит избранное, станции и пресеты из файла. Продолжить?", + "backupImportSuccess": "Настройки успешно импортированы", + "backupImportError": "Ошибка при импорте: {error}", + "appVersionLoading": "Загрузка версии...", + "appVersionSubtitle": "{version} — мировое радио", + "savedFavoritesTitle": "Сохранённое избранное", + "stationFilterTitle": "Фильтр станций", + "stationFilterSubtitle": "Только станции, подтверждённые как активные", + "backgroundAudioTitle": "Фоновое аудио", + "backgroundAudioSubtitle": "Продолжается при выключенном экране", "dash": "—", "@recordingsPathSaveError": { "placeholders": { @@ -148,15 +176,15 @@ "version": {} } }, - "cancelAction": "Cancel", - "equalizerTitle": "Equalizer", - "recordingsOpenFolder": "Open folder", - "recordingsOpenFolderError": "Could not open the folder: {error}", - "recordingsMaxSizeTitle": "Maximum recording size", - "recordingsMaxSizeSubtitle": "Current limit: {size} MB", - "recordingsMaxSizeDialogTitle": "Maximum size per recording", - "recordingsMaxSizeMbLabel": "Maximum megabytes", - "recordingsMaxSizeSaved": "Recording limit updated to {size} MB", + "cancelAction": "Отмена", + "equalizerTitle": "Эквалайзер", + "recordingsOpenFolder": "Открыть папку", + "recordingsOpenFolderError": "Не удалось открыть папку: {error}", + "recordingsMaxSizeTitle": "Максимальный размер записи", + "recordingsMaxSizeSubtitle": "Текущий лимит: {size} МБ", + "recordingsMaxSizeDialogTitle": "Максимальный размер одной записи", + "recordingsMaxSizeMbLabel": "Максимум мегабайт", + "recordingsMaxSizeSaved": "Лимит записи обновлён до {size} МБ", "@recordingsOpenFolderError": { "placeholders": { "error": {} @@ -176,33 +204,33 @@ } } }, - "stationOrderTitle": "Station order", - "stationOrderByName": "By name", - "stationOrderByQuality": "By quality", - "stationOrderScopeDescription": "Applies to favorites, searches, nearby stations and quick lists.", - "favoriteGroupsTitle": "Favorite lists", - "favoriteGroupsDescription": "Create short lists to organize your saved stations.", - "favoriteGroupsAdd": "Add list", - "favoriteGroupsEdit": "Edit list", - "favoriteGroupsDelete": "Delete list", - "favoriteGroupsNameLabel": "List name", - "favoriteGroupsNameTooLong": "Maximum 28 characters.", - "favoriteGroupsUnassigned": "Unassigned", - "favoriteGroupsProtectedHint": "Default list: it cannot be edited or deleted.", - "favoriteGroupsCreated": "List created", - "favoriteGroupsUpdated": "List updated", - "favoriteGroupsDeleted": "List deleted; its stations return to Unassigned.", - "favoriteGroupsAssign": "Move to list", - "favoriteGroupsAssignSubtitle": "Current list: {groupName}", - "favoriteGroupsAssigned": "{stationName} moved to {groupName}", - "favoritesTitle": "Favorites", - "favoritesEmptyTitle": "No favorites yet", - "favoritesEmptySubtitle": "Tap the heart on any station to save it to your collection.", - "favoritesHeaderSubtitle": "Organize your collection by lists and keep important radios close.", - "favoritesCollection": "Collection", - "favoritesSavedCount": "{count} saved", - "favoritesRemoveTooltip": "Remove from favorites", - "favoritesRemovedMessage": "{stationName} removed from favorites", + "stationOrderTitle": "Порядок станций", + "stationOrderByName": "По названию", + "stationOrderByQuality": "По качеству", + "stationOrderScopeDescription": "Применяется к избранному, поиску, ближайшим станциям и быстрым спискам.", + "favoriteGroupsTitle": "Списки избранного", + "favoriteGroupsDescription": "Создавайте короткие списки, чтобы упорядочить сохранённые станции.", + "favoriteGroupsAdd": "Добавить список", + "favoriteGroupsEdit": "Изменить список", + "favoriteGroupsDelete": "Удалить список", + "favoriteGroupsNameLabel": "Название списка", + "favoriteGroupsNameTooLong": "Максимум 28 символов.", + "favoriteGroupsUnassigned": "Без списка", + "favoriteGroupsProtectedHint": "Список по умолчанию: нельзя изменить или удалить.", + "favoriteGroupsCreated": "Список создан", + "favoriteGroupsUpdated": "Список обновлён", + "favoriteGroupsDeleted": "Список удалён; его станции вернулись в «Без списка».", + "favoriteGroupsAssign": "Переместить в список", + "favoriteGroupsAssignSubtitle": "Текущий список: {groupName}", + "favoriteGroupsAssigned": "{stationName} перемещена в {groupName}", + "favoritesTitle": "Избранное", + "favoritesEmptyTitle": "Избранного пока нет", + "favoritesEmptySubtitle": "Нажмите на сердце у любой станции, чтобы сохранить её в коллекцию.", + "favoritesHeaderSubtitle": "Организуйте коллекцию по спискам и держите важные радио под рукой.", + "favoritesCollection": "Коллекция", + "favoritesSavedCount": "{count} сохранено", + "favoritesRemoveTooltip": "Удалить из избранного", + "favoritesRemovedMessage": "{stationName} удалена из избранного", "@favoriteGroupsAssignSubtitle": { "placeholders": { "groupName": {} @@ -226,18 +254,18 @@ "stationName": {} } }, - "alarmPostponedCurrentExecution": "Alarm postponed for this occurrence.", - "searchScreenTitle": "Поиск станций", - "searchScreenSubtitle": "Ищите станции по названию, стране или языку с быстрыми фильтрами и высоким контрастом.", + "alarmPostponedCurrentExecution": "Будильник отложен для этого запуска.", + "searchScreenTitle": "Поиск сигнала", + "searchScreenSubtitle": "Находите радио по названию, стране или языку с быстрыми фильтрами и высокой контрастностью.", "searchFiltersLabel": "Фильтры", - "searchHint": "Radio Horizon, джаз, новости...", + "searchHint": "Радио Горизонт, джаз, новости...", "searchCountryFilterLabel": "Страна", "searchLanguageFilterLabel": "Язык", "searchMinQualityFilterLabel": "Минимальное качество", "searchEmptyTitle": "Найдите станцию", - "searchNoResultsTitle": "Ничего не найдено", - "searchEmptySubtitle": "Используйте верхнюю строку и быстрые кнопки, чтобы открыть станции со всего мира.", - "searchNoResultsSubtitle": "Попробуйте убрать фильтры или ввести другое название, чтобы найти активную станцию.", + "searchNoResultsTitle": "Нет результатов", + "searchEmptySubtitle": "Используйте верхнюю строку или чипы, чтобы находить сигналы со всего мира.", + "searchNoResultsSubtitle": "Попробуйте убрать фильтры или ввести другое название, чтобы найти активный сигнал.", "countrySpain": "Испания", "countryUsa": "США", "countryMexico": "Мексика", @@ -248,18 +276,18 @@ "countryItaly": "Италия", "countryBrazil": "Бразилия", "countryJapan": "Япония", - "languageNameSpanish": "Испанский", - "languageNameEnglish": "Английский", - "languageNameFrench": "Французский", - "languageNameGerman": "Немецкий", - "languageNamePortuguese": "Португальский", - "languageNameItalian": "Итальянский", - "languageNameJapanese": "Японский", - "languageNameArabic": "Арабский", - "languageNameRussian": "Русский", - "homeScreenSubtitle": "Live global radio with clean signals, smart favorites, and a show-style visual experience.", - "exploreStations": "Explore stations", - "stationsCount": "{count} stations", + "languageNameSpanish": "испанский", + "languageNameEnglish": "английский", + "languageNameFrench": "французский", + "languageNameGerman": "немецкий", + "languageNamePortuguese": "португальский", + "languageNameItalian": "итальянский", + "languageNameJapanese": "японский", + "languageNameArabic": "арабский", + "languageNameRussian": "русский", + "homeScreenSubtitle": "Глобальное радио в прямом эфире с чистыми сигналами, умным избранным и визуальным стилем телевикторины.", + "exploreStations": "Изучить станции", + "stationsCount": "{count} радиостанций", "@stationsCount": { "placeholders": { "count": { @@ -267,36 +295,36 @@ } } }, - "qualityHd": "HD quality", - "nearYou": "Near you", - "nearYouInCountry": "Near you ? {country}", + "qualityHd": "HD-качество", + "nearYou": "Рядом с вами", + "nearYouInCountry": "Рядом с вами · {country}", "@nearYouInCountry": { "placeholders": { "country": {} } }, - "detectAction": "Detect", - "liveRadar": "Live radar", - "genresTitle": "Genres", - "retryAction": "Retry", - "noStationsAvailable": "No stations available", - "noStationsAvailableSubtitle": "Try refreshing or choosing another genre to capture a signal again.", - "genrePop": "Pop", - "genreRock": "Rock", - "genreJazz": "Jazz", - "genreClassical": "Classical", - "genreElectronic": "Electronic", - "genreNews": "News", - "genreTalk": "Talk", - "genreHipHop": "Hip-hop", - "genreCountry": "Country", - "genreMetal": "Metal", - "genreReggae": "Reggae", - "genreLatin": "Latin", - "alarmScreenTitle": "Music wake-up", - "alarmScreenSubtitle": "Alarms with radio, safe fallback sound, smart vacations, and the next occurrence always visible.", - "createAlarmAction": "Create alarm", - "alarmsCount": "{count} alarms", + "detectAction": "Определить", + "liveRadar": "Радар в эфире", + "genresTitle": "Жанры", + "retryAction": "Повторить", + "noStationsAvailable": "Нет доступных станций", + "noStationsAvailableSubtitle": "Попробуйте обновить или выбрать другой жанр, чтобы снова поймать сигнал.", + "genrePop": "Поп", + "genreRock": "Рок", + "genreJazz": "Джаз", + "genreClassical": "Классика", + "genreElectronic": "Электронная", + "genreNews": "Новости", + "genreTalk": "Разговорные", + "genreHipHop": "Хип-хоп", + "genreCountry": "Кантри", + "genreMetal": "Метал", + "genreReggae": "Регги", + "genreLatin": "Латинская", + "alarmScreenTitle": "Музыкальное пробуждение", + "alarmScreenSubtitle": "Будильники с радио, безопасным звуком, умными отпусками и всегда видимым следующим запуском.", + "createAlarmAction": "Создать будильник", + "alarmsCount": "{count} будильников", "@alarmsCount": { "placeholders": { "count": { @@ -304,10 +332,10 @@ } } }, - "activeAlarmsWithoutNextTitle": "Active alarms without a next occurrence", - "noActiveAlarms": "No active alarms", - "nextAlarmTitle": "Next alarm", - "activeAlarmsWithoutNextSubtitle": "There are {count} active alarm(s), but they do not currently have a valid future date. Check date, weekdays, and vacations.", + "activeAlarmsWithoutNextTitle": "Активные будильники без следующего запуска", + "noActiveAlarms": "Нет активных будильников", + "nextAlarmTitle": "Следующий будильник", + "activeAlarmsWithoutNextSubtitle": "Есть {count} активных будильников, но сейчас у них нет допустимой будущей даты. Проверьте дату, дни и отпуска.", "@activeAlarmsWithoutNextSubtitle": { "placeholders": { "count": { @@ -315,10 +343,10 @@ } } }, - "createAlarmHint": "Create an alarm and PluriWave will calculate the next occurrence automatically.", - "alarmVacationPlay": "Plays during vacations", - "alarmVacationPause": "Paused during vacations", - "alarmFadeInLabel": "Fade-in {seconds}s", + "createAlarmHint": "Создайте будильник, и PluriWave автоматически рассчитает следующий запуск.", + "alarmVacationPlay": "Звонит в отпуске", + "alarmVacationPause": "Пауза в отпуске", + "alarmFadeInLabel": "Плавное усиление {seconds}с", "@alarmFadeInLabel": { "placeholders": { "seconds": { @@ -326,61 +354,61 @@ } } }, - "alarmNextExecution": "Next occurrence: {date}", + "alarmNextExecution": "Следующий запуск: {date}", "@alarmNextExecution": { "placeholders": { "date": {} } }, - "alarmNoNextExecution": "It has no active next occurrence.", - "alarmSkippedExecution": "One occurrence was skipped: {date}.", + "alarmNoNextExecution": "Нет активного следующего запуска.", + "alarmSkippedExecution": "Один запуск был пропущен: {date}.", "@alarmSkippedExecution": { "placeholders": { "date": {} } }, - "editAction": "Edit", - "skipNextAction": "Skip next", - "deleteTooltip": "Delete", - "alarmSkippedNoNextSnackbar": "Alarm skipped. There is no next occurrence left.", - "alarmSkippedReturnsSnackbar": "Alarm skipped. It will return on {date}.", + "editAction": "Изменить", + "skipNextAction": "Пропустить следующий", + "deleteTooltip": "Удалить", + "alarmSkippedNoNextSnackbar": "Будильник пропущен. Следующего запуска нет.", + "alarmSkippedReturnsSnackbar": "Будильник пропущен. Вернётся {date}.", "@alarmSkippedReturnsSnackbar": { "placeholders": { "date": {} } }, - "alarmVacationPausedNoNext": "It is paused for vacations ({vacationName}) and has no next occurrence.", + "alarmVacationPausedNoNext": "Приостановлен из-за отпуска ({vacationName}) и без следующего запуска.", "@alarmVacationPausedNoNext": { "placeholders": { "vacationName": {} } }, - "alarmVacationPausedReturns": "It is paused for vacations ({vacationName}) and returns on {date}.", + "alarmVacationPausedReturns": "Приостановлен из-за отпуска ({vacationName}) и вернётся {date}.", "@alarmVacationPausedReturns": { "placeholders": { "vacationName": {}, "date": {} } }, - "alarmVacationReturns": "With vacations enabled, it will ring again on {date}.", + "alarmVacationReturns": "С активным отпуском снова прозвучит {date}.", "@alarmVacationReturns": { "placeholders": { "date": {} } }, - "defaultAlarmName": "Music alarm", - "newAlarmTitle": "New alarm", - "editAlarmTitle": "Edit alarm", - "nameField": "Name", - "timeField": "Time", - "dateField": "Date", - "onceOption": "Once", - "dailyOption": "Daily", - "weekdaysOption": "Weekdays", - "soundAndVolumeSection": "Sound and volume", - "alarmFadeInTitle": "Alarm fade-in", - "alarmFadeInOff": "0 s (no transition)", - "alarmFadeInSummary": "{seconds} s (from 5% to the selected volume)", + "defaultAlarmName": "Музыкальный будильник", + "newAlarmTitle": "Новый будильник", + "editAlarmTitle": "Изменить будильник", + "nameField": "Название", + "timeField": "Время", + "dateField": "Дата", + "onceOption": "Один раз", + "dailyOption": "Ежедневно", + "weekdaysOption": "Дни", + "soundAndVolumeSection": "Звук и громкость", + "alarmFadeInTitle": "Плавное усиление будильника", + "alarmFadeInOff": "0 с (без перехода)", + "alarmFadeInSummary": "{seconds} с (с 5% до выбранной громкости)", "@alarmFadeInSummary": { "placeholders": { "seconds": { @@ -388,22 +416,22 @@ } } }, - "internalSafeSoundLabel": "Internal safe sound", - "soundWarmSunrise": "Warm sunrise", - "soundSoftBell": "Soft bell", - "soundDigitalPulse": "Digital pulse", - "favoriteStationLabel": "Favorite station", - "noStationUseInternalSound": "No station: use internal sound", - "saveFavoritesAlarmHint": "Save stations in Favorites to use them as a music alarm.", - "useCurrentStationAction": "Use current station", - "playDuringVacations": "Play during vacations", - "playDuringVacationsHint": "If you turn this off, the next occurrence will jump to the first valid day.", - "saveAlarmAction": "Save alarm", - "chooseOneWeekdayError": "Choose at least one weekday.", - "androidReliabilityReview": "Review Android reliability", - "statusOk": "OK", - "statusPending": "pending", - "androidReliabilityStatus": "Reliability: exact {exact} ? notifications {notifications} ? screen {screen}", + "internalSafeSoundLabel": "Безопасный внутренний звук", + "soundWarmSunrise": "Тёплый рассвет", + "soundSoftBell": "Мягкий колокольчик", + "soundDigitalPulse": "Цифровой импульс", + "favoriteStationLabel": "Избранная станция", + "noStationUseInternalSound": "Без станции: использовать внутренний звук", + "saveFavoritesAlarmHint": "Сохраните станции в избранное, чтобы использовать их как музыкальный будильник.", + "useCurrentStationAction": "Использовать текущую станцию", + "playDuringVacations": "Звонить во время отпусков", + "playDuringVacationsHint": "Если выключить, следующий запуск перейдёт на первый допустимый день.", + "saveAlarmAction": "Сохранить будильник", + "chooseOneWeekdayError": "Выберите хотя бы один день недели.", + "androidReliabilityReview": "Проверить надёжность Android", + "statusOk": "ОК", + "statusPending": "ожидает", + "androidReliabilityStatus": "Надёжность: точные {exact} · уведомления {notifications} · экран {screen}", "@androidReliabilityStatus": { "placeholders": { "exact": {}, @@ -411,19 +439,165 @@ "screen": {} } }, - "vacationRangesTitle": "Vacation ranges", - "addAction": "Add", - "vacationRangesHint": "If an alarm is set to \"Paused during vacations\", it automatically skips these ranges.", - "noVacationRangesLoaded": "No ranges loaded.", - "deleteRangeTooltip": "Delete range", - "vacationsDefaultName": "Vacation", - "newVacationRangeTitle": "New vacation range", - "startField": "Start", - "endField": "End", - "saveRangeAction": "Save range", - "noAlarmsYetTitle": "There are no alarms yet.", - "noAlarmsYetSubtitle": "Create one to design your musical wake-up.", - "ringingInternalAudioActive": "Playing with internal safe audio.", - "ringingPreparingInternalAudio": "Preparing internal safe audio.", - "stopAlarmAction": "Stop alarm" + "vacationRangesTitle": "Периоды отпусков", + "addAction": "Добавить", + "vacationRangesHint": "Если у будильника включена «Пауза в отпуске», эти периоды будут автоматически пропущены.", + "noVacationRangesLoaded": "Периоды не загружены.", + "deleteRangeTooltip": "Удалить период", + "vacationsDefaultName": "Отпуск", + "newVacationRangeTitle": "Новый период отпуска", + "startField": "Начало", + "endField": "Конец", + "saveRangeAction": "Сохранить период", + "noAlarmsYetTitle": "Будильников пока нет.", + "noAlarmsYetSubtitle": "Создайте один, чтобы настроить своё музыкальное пробуждение.", + "ringingInternalAudioActive": "Звонит с безопасным внутренним звуком.", + "ringingPreparingInternalAudio": "Подготовка безопасного внутреннего звука.", + "stopAlarmAction": "Остановить будильник", + "pauseAction": "Пауза", + "miniPlayerOpenLabel": "Открыть плеер для {stationName}", + "@miniPlayerOpenLabel": { + "placeholders": { + "stationName": {} + } + }, + "playerIconLabel": "Плеер", + "playbackStatusConnecting": "Подключение...", + "playbackStatusLive": "В эфире", + "playbackStatusPaused": "Приостановлено", + "playbackStatusConnectionError": "Ошибка подключения", + "playbackStatusStopped": "Остановлено", + "stationSemanticLabel": "Станция {stationName}", + "@stationSemanticLabel": { + "placeholders": { + "stationName": {} + } + }, + "favoritesAddTooltip": "Добавить в избранное", + "favoritesAddedMessage": "{stationName} добавлена в избранное", + "@favoritesAddedMessage": { + "placeholders": { + "stationName": {} + } + }, + "stationIconLabel": "Значок станции", + "liveNow": "В эфире", + "equalizerBandLabel": "Полоса {band}", + "@equalizerBandLabel": { + "placeholders": { + "band": {} + } + }, + "equalizerBandValue": "{value} дБ", + "@equalizerBandValue": { + "placeholders": { + "value": {} + } + }, + "equalizerPresetFlat": "Плоский", + "equalizerPresetRock": "Рок", + "equalizerPresetPop": "Поп", + "equalizerPresetBassBoost": "Усиление басов", + "equalizerPresetJazz": "Джаз", + "equalizerPresetVoice": "Голос", + "equalizerPresetCustom": "Пользовательский", + "onboardingTitle": "Добро пожаловать в PluriWave", + "onboardingNewsTitle": "Что нового", + "onboardingStartAction": "Начать", + "onboardingCloseTooltip": "Закрыть", + "radioRecordingError": "Ошибка записи радио: {error}", + "@radioRecordingError": { + "placeholders": { + "error": {} + } + }, + "radioApiConnectionError": "Нет подключения к API радио", + "radioSearchError": "Ошибка поиска. Проверьте подключение.", + "radioLoadMoreStationsError": "Не удалось загрузить больше станций.", + "radioNearbyStationsError": "Не удалось обнаружить ближайшие станции. Используйте фильтры по стране.", + "radioCannotPlayStation": "Невозможно воспроизвести \"{stationName}\"", + "@radioCannotPlayStation": { + "placeholders": { + "stationName": {} + } + }, + "recordingSelectStationFirst": "Сначала выберите станцию для записи.", + "recordingStartError": "Не удалось начать запись: {error}", + "@recordingStartError": { + "placeholders": { + "error": {} + } + }, + "unsupportedConfigVersion": "Неподдерживаемая версия конфигурации", + "audioErrorGeneric": "Ошибка воспроизведения", + "audioErrorNoInternet": "Нет подключения к интернету", + "audioErrorInvalidUrl": "URL радио недействителен", + "audioErrorNotFound": "Радио недоступно (ошибка 404)", + "audioErrorTimeout": "Время ожидания подключения истекло", + "audioErrorCannotConnect": "Не удалось подключиться к радио", + "audioErrorUnsupportedFormat": "Неподдерживаемый формат потока", + "audioErrorDecode": "Ошибка декодирования аудиопотока", + "audioErrorCleartext": "Это радио использует незашифрованный HTTP, что не разрешено", + "audioErrorSsl": "Недействительный SSL-сертификат у радио", + "audioErrorCannotPlay": "Это радио невозможно воспроизвести", + "audioErrorUnexpectedPlayback": "Неожиданная ошибка воспроизведения", + "androidExactAlarmScheduleError": "Android не смог запланировать точный будильник. Проверьте разрешение для точных будильников.", + "recordingPathEmptyError": "Путь записи не может быть пустым", + "recordingMaxSizeInvalidError": "Максимальный размер должен быть больше нуля", + "recordingAlreadyActiveError": "Запись уже выполняется", + "alarmRingingFallbackActive": "Воспроизведение с внутренним безопасным аудио.", + "alarmRingingPreparingFallback": "Подготавливается внутреннее безопасное аудио.", + "alarmRingingTryingStation": "Пытаемся воспроизвести вашу станцию в максимально доступном качестве.", + "alarmScheduleOnce": "Один раз · {date}", + "@alarmScheduleOnce": { + "placeholders": { + "date": {} + } + }, + "alarmScheduleWeekdays": "Дни: {days}", + "@alarmScheduleWeekdays": { + "placeholders": { + "days": {} + } + }, + "androidReliabilityTitle": "Проверить надёжность Android", + "closeAction": "Закрыть", + "customOption": "Своя", + "endLabel": "Конец", + "equalizerDisable": "Отключить эквалайзер", + "helpTitle": "Помощь и руководство", + "helpSubtitle": "Посмотрите функции, советы и новости PluriWave.", + "indefiniteOption": "Без ограничения", + "invalidNumber": "Недопустимое число", + "nameLabel": "Название", + "notPlaying": "Не воспроизводится", + "oneTimeOption": "Один раз", + "pausePlaybackTooltip": "Пауза", + "qualityOriginal": "Исходное качество: {quality}", + "@qualityOriginal": { + "placeholders": { + "quality": {} + } + }, + "qualityUnknown": "Качество не указано", + "recordAction": "Записать", + "recordDurationTitle": "Длительность записи", + "recordRadioSubtitle": "Выберите длительность записи.", + "recordRadioTitle": "Записать радио", + "recordingActiveTitle": "Запись радио", + "recordingDirectTitle": "Прямая запись", + "recordingsOpenFolderPlainError": "Не удалось открыть папку записей", + "recordingsOpenLatest": "Открыть последнюю запись", + "recordingsOpenLatestError": "Не удалось открыть последнюю запись", + "startLabel": "Начало", + "startPlaybackTooltip": "Начать воспроизведение", + "stopAction": "Остановить", + "stopPlaybackTooltip": "Остановить воспроизведение", + "weekdayShortMonday": "Пн", + "weekdayShortTuesday": "Вт", + "weekdayShortWednesday": "Ср", + "weekdayShortThursday": "Чт", + "weekdayShortFriday": "Пт", + "weekdayShortSaturday": "Сб", + "weekdayShortSunday": "Вс" } diff --git a/lib/l10n/app_zh.arb b/lib/l10n/app_zh.arb index d948b86..c4843ce 100644 --- a/lib/l10n/app_zh.arb +++ b/lib/l10n/app_zh.arb @@ -1,107 +1,135 @@ { "@@locale": "zh", "appTitle": "PluriWave", - "navHome": "Home", - "navSearch": "Search", - "navFavorites": "Favorites", - "navAlarms": "Alarms", - "navSettings": "Settings", - "actionOk": "OK", - "sleepTimer": "Sleep timer", - "sleepTimerDescription": "Smooth radio shutdown with an exact countdown.", - "cancelTimer": "Cancel timer", - "optionOther": "Other", - "customDurationTitle": "Custom duration", - "durationGreaterThanZero": "Choose a duration greater than zero.", - "hoursLabel": "Hours", - "minutesLabel": "Minutes", - "secondsLabel": "Seconds", - "saveQuickAccess": "Save as quick access", - "startTimer": "Start timer", - "skipCurrentAlarmExecution": "Skipped this execution of {alarmName}.", + "navHome": "首页", + "navSearch": "搜索", + "navFavorites": "收藏", + "navAlarms": "闹钟", + "navSettings": "设置", + "actionOk": "确定", + "sleepTimer": "睡眠定时器", + "sleepTimerDescription": "通过精准倒计时平滑关闭电台。", + "cancelTimer": "取消定时器", + "optionOther": "其他", + "customDurationTitle": "自定义时长", + "durationGreaterThanZero": "请选择大于零的时长。", + "hoursLabel": "小时", + "minutesLabel": "分钟", + "secondsLabel": "秒", + "durationHoursMinutesSeconds": "{hours} ?? {minutes} ? {seconds} ?", + "@durationHoursMinutesSeconds": { + "placeholders": { + "hours": {}, + "minutes": {}, + "seconds": {} + } + }, + "durationMinutesSeconds": "{minutes} ? {seconds} ?", + "@durationMinutesSeconds": { + "placeholders": { + "minutes": {}, + "seconds": {} + } + }, + "durationMinutesOnly": "{minutes} ?", + "@durationMinutesOnly": { + "placeholders": { + "minutes": {} + } + }, + "durationSecondsOnly": "{seconds} ?", + "@durationSecondsOnly": { + "placeholders": { + "seconds": {} + } + }, + "saveQuickAccess": "保存为快捷入口", + "startTimer": "启动定时器", + "skipCurrentAlarmExecution": "已跳过 {alarmName} 本次执行。", "@skipCurrentAlarmExecution": { "placeholders": { "alarmName": {} } }, - "settingsTitle": "Settings", - "settingsSubtitle": "Fine-grained sound control, backups, and custom stations.", - "languageSectionTitle": "Language", - "languageSectionDescription": "Choose how the app language is displayed.", - "languageSystemDefault": "System", - "languageSpanish": "Spanish", - "languageEnglish": "English", - "languageUpdated": "Language updated: {languageName}", + "settingsTitle": "设置", + "settingsSubtitle": "精细控制声音、备份和自定义电台。", + "languageSectionTitle": "语言", + "languageSectionDescription": "选择应用语言的显示方式。", + "languageSystemDefault": "系统", + "languageSpanish": "西班牙语", + "languageEnglish": "英语", + "languageUpdated": "语言已更新:{languageName}", "@languageUpdated": { "placeholders": { "languageName": {} } }, - "languageUpdatedSystem": "Language updated: System", - "timerSectionTitle": "Sleep timer", - "timerSectionAdd": "Add", - "timerSectionDescription": "Customize the quick presets shown when automatically stopping the radio.", - "timerSectionRestoreRecommended": "Restore recommended times", - "newQuickAccessTitle": "New quick access", - "saveQuickAccessButton": "Save quick access", - "settingsSafeStatus": "Safe", - "recordingsSectionTitle": "Recordings", - "recordingsFolderDialogTitle": "Select recordings folder", - "recordingsPathUpdated": "Recording path updated", - "recordingsPathSaveError": "Could not save the path: {error}", - "recordingsDefaultFolderRestored": "The internal default folder will be used", - "recordingsFolderTitle": "Recordings folder", - "recordingsPathCalculating": "Calculating path...", - "recordingsChangePath": "Change path", - "recordingsUseDefaultPath": "Use default path", - "recordingsOriginalStreamHint": "The radio is saved from the original stream, without recompressing.", - "equalizerActive": "Active", - "equalizerDisabled": "Disabled", - "equalizerEnable": "Enable equalizer", - "equalizerRealtimeSubtitle": "Changes are applied in real time to the current station.", - "equalizerPendingSubtitle": "Changes are saved and will apply when Android enables the effect.", - "equalizerPerStationTitle": "Use custom EQ for this favorite", - "equalizerPerStationActive": "Active for {stationName}", - "equalizerPerStationMain": "Using main EQ for {stationName}", - "preferredStationTitle": "Preferred station", - "preferredStationDescription": "Preselected for new alarms and available for quick playback.", - "preferredStationNoStationsTitle": "No stations available yet", - "preferredStationNoStationsSubtitle": "Save favorites or load stations to choose a preferred one.", - "preferredStationAutomaticFallback": "Automatic fallback", - "preferredStationDefaultFavorite": "Default favorite", - "preferredStationCurrent": "Current preferred: {stationName}", - "preferredStationAutoUsing": "No favorites: automatically using {stationName}", - "preferredStationPlay": "Play preferred", - "customStationsTitle": "Custom stations", - "customStationsAdd": "Add", - "customStationsEmpty": "No custom stations.", - "playAction": "Play", - "deleteAction": "Delete", - "addStationTitle": "Add station", - "stationNameLabel": "Name *", - "requiredField": "Required field", - "streamUrlLabel": "Stream URL *", - "invalidUrl": "Invalid URL", - "countryOptionalLabel": "Country (optional)", - "saveStation": "Save station", - "backupSectionTitle": "Backup", - "backupExportTitle": "Export configuration", - "backupExportSubtitle": "Favorites, custom stations, and EQ presets", - "backupImportTitle": "Import configuration", - "backupImportSubtitle": "Restore from a backup file", - "backupShareSubject": "PluriWave — backup", - "backupShareText": "PluriWave configuration exported on {date}", - "backupExportError": "Export error: {error}", - "backupImportConfirmMessage": "This will add favorites, stations, and presets from the file. Continue?", - "backupImportSuccess": "Configuration imported successfully", - "backupImportError": "Import error: {error}", - "appVersionLoading": "Loading version...", - "appVersionSubtitle": "{version} - World radio", - "savedFavoritesTitle": "Saved favorites", - "stationFilterTitle": "Station filter", - "stationFilterSubtitle": "Only stations verified as active", - "backgroundAudioTitle": "Background audio", - "backgroundAudioSubtitle": "Continues when the screen turns off", + "languageUpdatedSystem": "语言已更新:系统", + "timerSectionTitle": "睡眠定时器", + "timerSectionAdd": "添加", + "timerSectionDescription": "自定义自动关闭电台时显示的快捷预设。", + "timerSectionRestoreRecommended": "恢复推荐时长", + "newQuickAccessTitle": "新的快捷入口", + "saveQuickAccessButton": "保存快捷入口", + "settingsSafeStatus": "安全", + "recordingsSectionTitle": "录音", + "recordingsFolderDialogTitle": "选择录音文件夹", + "recordingsPathUpdated": "录音路径已更新", + "recordingsPathSaveError": "无法保存路径:{error}", + "recordingsDefaultFolderRestored": "将使用默认内部文件夹", + "recordingsFolderTitle": "录音文件夹", + "recordingsPathCalculating": "正在计算路径...", + "recordingsChangePath": "更改路径", + "recordingsUseDefaultPath": "使用默认路径", + "recordingsOriginalStreamHint": "电台将从原始音频流保存,不重新编码。", + "equalizerActive": "已启用", + "equalizerDisabled": "已停用", + "equalizerEnable": "启用均衡器", + "equalizerRealtimeSubtitle": "更改会实时应用到当前电台。", + "equalizerPendingSubtitle": "更改已保存,并会在 Android 启用该效果后应用。", + "equalizerPerStationTitle": "为此收藏使用专属均衡器", + "equalizerPerStationActive": "已为 {stationName} 启用", + "equalizerPerStationMain": "正在为 {stationName} 使用主均衡器", + "preferredStationTitle": "首选电台", + "preferredStationDescription": "创建闹钟时会预先选择,也可用于快速播放。", + "preferredStationNoStationsTitle": "暂时没有可用电台", + "preferredStationNoStationsSubtitle": "请先收藏或加载电台,再选择首选电台。", + "preferredStationAutomaticFallback": "自动后备", + "preferredStationDefaultFavorite": "默认收藏", + "preferredStationCurrent": "当前首选:{stationName}", + "preferredStationAutoUsing": "没有收藏:自动使用 {stationName}", + "preferredStationPlay": "播放首选电台", + "customStationsTitle": "自定义电台", + "customStationsAdd": "添加", + "customStationsEmpty": "没有自定义电台。", + "playAction": "播放", + "deleteAction": "删除", + "addStationTitle": "添加电台", + "stationNameLabel": "名称 *", + "unnamedStation": "未命名电台", + "requiredField": "必填字段", + "streamUrlLabel": "音频流 URL *", + "invalidUrl": "URL 无效", + "countryOptionalLabel": "国家/地区(可选)", + "saveStation": "保存电台", + "backupSectionTitle": "备份", + "backupExportTitle": "导出配置", + "backupExportSubtitle": "收藏、自定义电台和均衡器预设", + "backupImportTitle": "导入配置", + "backupImportSubtitle": "从备份文件恢复", + "backupShareSubject": "PluriWave — 备份", + "backupShareText": "PluriWave 配置已于 {date} 导出", + "backupExportError": "导出错误:{error}", + "backupImportConfirmMessage": "这会添加文件中的收藏、电台和预设。要继续吗?", + "backupImportSuccess": "配置已成功导入", + "backupImportError": "导入错误:{error}", + "appVersionLoading": "正在加载版本...", + "appVersionSubtitle": "{version} - 全球电台", + "savedFavoritesTitle": "已保存的收藏", + "stationFilterTitle": "电台筛选", + "stationFilterSubtitle": "仅显示已验证为活跃的电台", + "backgroundAudioTitle": "后台音频", + "backgroundAudioSubtitle": "屏幕关闭后继续播放", "dash": "—", "@recordingsPathSaveError": { "placeholders": { @@ -148,15 +176,15 @@ "version": {} } }, - "cancelAction": "Cancel", - "equalizerTitle": "Equalizer", - "recordingsOpenFolder": "Open folder", - "recordingsOpenFolderError": "Could not open the folder: {error}", - "recordingsMaxSizeTitle": "Maximum recording size", - "recordingsMaxSizeSubtitle": "Current limit: {size} MB", - "recordingsMaxSizeDialogTitle": "Maximum size per recording", - "recordingsMaxSizeMbLabel": "Maximum megabytes", - "recordingsMaxSizeSaved": "Recording limit updated to {size} MB", + "cancelAction": "取消", + "equalizerTitle": "均衡器", + "recordingsOpenFolder": "打开文件夹", + "recordingsOpenFolderError": "无法打开文件夹:{error}", + "recordingsMaxSizeTitle": "最大录音大小", + "recordingsMaxSizeSubtitle": "当前限制:{size} MB", + "recordingsMaxSizeDialogTitle": "每段录音的最大大小", + "recordingsMaxSizeMbLabel": "最大兆字节数", + "recordingsMaxSizeSaved": "录音限制已更新为 {size} MB", "@recordingsOpenFolderError": { "placeholders": { "error": {} @@ -176,33 +204,33 @@ } } }, - "stationOrderTitle": "Station order", - "stationOrderByName": "By name", - "stationOrderByQuality": "By quality", - "stationOrderScopeDescription": "Applies to favorites, searches, nearby stations and quick lists.", - "favoriteGroupsTitle": "Favorite lists", - "favoriteGroupsDescription": "Create short lists to organize your saved stations.", - "favoriteGroupsAdd": "Add list", - "favoriteGroupsEdit": "Edit list", - "favoriteGroupsDelete": "Delete list", - "favoriteGroupsNameLabel": "List name", - "favoriteGroupsNameTooLong": "Maximum 28 characters.", - "favoriteGroupsUnassigned": "Unassigned", - "favoriteGroupsProtectedHint": "Default list: it cannot be edited or deleted.", - "favoriteGroupsCreated": "List created", - "favoriteGroupsUpdated": "List updated", - "favoriteGroupsDeleted": "List deleted; its stations return to Unassigned.", - "favoriteGroupsAssign": "Move to list", - "favoriteGroupsAssignSubtitle": "Current list: {groupName}", - "favoriteGroupsAssigned": "{stationName} moved to {groupName}", - "favoritesTitle": "Favorites", - "favoritesEmptyTitle": "No favorites yet", - "favoritesEmptySubtitle": "Tap the heart on any station to save it to your collection.", - "favoritesHeaderSubtitle": "Organize your collection by lists and keep important radios close.", - "favoritesCollection": "Collection", - "favoritesSavedCount": "{count} saved", - "favoritesRemoveTooltip": "Remove from favorites", - "favoritesRemovedMessage": "{stationName} removed from favorites", + "stationOrderTitle": "电台排序", + "stationOrderByName": "按名称", + "stationOrderByQuality": "按质量", + "stationOrderScopeDescription": "适用于收藏、搜索、附近电台和快捷列表。", + "favoriteGroupsTitle": "收藏列表", + "favoriteGroupsDescription": "创建短列表来整理已保存的电台。", + "favoriteGroupsAdd": "添加列表", + "favoriteGroupsEdit": "编辑列表", + "favoriteGroupsDelete": "删除列表", + "favoriteGroupsNameLabel": "列表名称", + "favoriteGroupsNameTooLong": "最多 28 个字符。", + "favoriteGroupsUnassigned": "未分配", + "favoriteGroupsProtectedHint": "默认列表:不能编辑或删除。", + "favoriteGroupsCreated": "列表已创建", + "favoriteGroupsUpdated": "列表已更新", + "favoriteGroupsDeleted": "列表已删除;其中的电台已回到未分配。", + "favoriteGroupsAssign": "移动到列表", + "favoriteGroupsAssignSubtitle": "当前列表:{groupName}", + "favoriteGroupsAssigned": "{stationName} 已移动到 {groupName}", + "favoritesTitle": "收藏", + "favoritesEmptyTitle": "还没有收藏", + "favoritesEmptySubtitle": "点按任意电台上的爱心,将它保存到你的收藏。", + "favoritesHeaderSubtitle": "按列表整理你的收藏,把重要电台放在手边。", + "favoritesCollection": "收藏集", + "favoritesSavedCount": "已保存 {count} 个", + "favoritesRemoveTooltip": "从收藏中移除", + "favoritesRemovedMessage": "{stationName} 已从收藏中移除", "@favoriteGroupsAssignSubtitle": { "placeholders": { "groupName": {} @@ -226,18 +254,18 @@ "stationName": {} } }, - "alarmPostponedCurrentExecution": "Alarm postponed for this occurrence.", - "searchScreenTitle": "搜索电台", + "alarmPostponedCurrentExecution": "本次闹钟已推迟。", + "searchScreenTitle": "搜索信号", "searchScreenSubtitle": "按名称、国家/地区或语言查找电台,支持快速筛选和高对比度显示。", "searchFiltersLabel": "筛选", - "searchHint": "Radio Horizon、爵士、新闻...", + "searchHint": "地平线电台、爵士、新闻...", "searchCountryFilterLabel": "国家/地区", "searchLanguageFilterLabel": "语言", "searchMinQualityFilterLabel": "最低质量", "searchEmptyTitle": "搜索电台", "searchNoResultsTitle": "没有结果", - "searchEmptySubtitle": "使用顶部搜索栏或筛选标签,发现来自世界各地的电台。", - "searchNoResultsSubtitle": "试着减少筛选条件,或换个名称搜索,找到正在播出的电台。", + "searchEmptySubtitle": "使用顶部搜索栏或筛选标签,发现世界各地的电台信号。", + "searchNoResultsSubtitle": "尝试减少筛选条件,或换个名称搜索,找到正在播出的电台。", "countrySpain": "西班牙", "countryUsa": "美国", "countryMexico": "墨西哥", @@ -257,9 +285,9 @@ "languageNameJapanese": "日语", "languageNameArabic": "阿拉伯语", "languageNameRussian": "俄语", - "homeScreenSubtitle": "Live global radio with clean signals, smart favorites, and a show-style visual experience.", - "exploreStations": "Explore stations", - "stationsCount": "{count} stations", + "homeScreenSubtitle": "全球直播电台,清晰信号、智能收藏和竞赛风格的视觉体验。", + "exploreStations": "探索电台", + "stationsCount": "{count} 个电台", "@stationsCount": { "placeholders": { "count": { @@ -267,36 +295,36 @@ } } }, - "qualityHd": "HD quality", - "nearYou": "Near you", - "nearYouInCountry": "Near you ? {country}", + "qualityHd": "高清音质", + "nearYou": "你附近", + "nearYouInCountry": "你附近 · {country}", "@nearYouInCountry": { "placeholders": { "country": {} } }, - "detectAction": "Detect", - "liveRadar": "Live radar", - "genresTitle": "Genres", - "retryAction": "Retry", - "noStationsAvailable": "No stations available", - "noStationsAvailableSubtitle": "Try refreshing or choosing another genre to capture a signal again.", - "genrePop": "Pop", - "genreRock": "Rock", - "genreJazz": "Jazz", - "genreClassical": "Classical", - "genreElectronic": "Electronic", - "genreNews": "News", - "genreTalk": "Talk", - "genreHipHop": "Hip-hop", - "genreCountry": "Country", - "genreMetal": "Metal", - "genreReggae": "Reggae", - "genreLatin": "Latin", - "alarmScreenTitle": "Music wake-up", - "alarmScreenSubtitle": "Alarms with radio, safe fallback sound, smart vacations, and the next occurrence always visible.", - "createAlarmAction": "Create alarm", - "alarmsCount": "{count} alarms", + "detectAction": "检测", + "liveRadar": "直播雷达", + "genresTitle": "类型", + "retryAction": "重试", + "noStationsAvailable": "没有可用电台", + "noStationsAvailableSubtitle": "尝试刷新或选择其他类型,重新捕捉信号。", + "genrePop": "流行", + "genreRock": "摇滚", + "genreJazz": "爵士", + "genreClassical": "古典", + "genreElectronic": "电子", + "genreNews": "新闻", + "genreTalk": "谈话", + "genreHipHop": "嘻哈", + "genreCountry": "乡村", + "genreMetal": "金属", + "genreReggae": "雷鬼", + "genreLatin": "拉丁", + "alarmScreenTitle": "音乐唤醒", + "alarmScreenSubtitle": "带电台、安全声音、智能假期和始终可见下次执行时间的闹钟。", + "createAlarmAction": "创建闹钟", + "alarmsCount": "{count} 个闹钟", "@alarmsCount": { "placeholders": { "count": { @@ -304,10 +332,10 @@ } } }, - "activeAlarmsWithoutNextTitle": "Active alarms without a next occurrence", - "noActiveAlarms": "No active alarms", - "nextAlarmTitle": "Next alarm", - "activeAlarmsWithoutNextSubtitle": "There are {count} active alarm(s), but they do not currently have a valid future date. Check date, weekdays, and vacations.", + "activeAlarmsWithoutNextTitle": "没有下次执行时间的活跃闹钟", + "noActiveAlarms": "没有活跃闹钟", + "nextAlarmTitle": "下一个闹钟", + "activeAlarmsWithoutNextSubtitle": "有 {count} 个活跃闹钟,但现在没有有效的未来日期。请检查日期、星期和假期。", "@activeAlarmsWithoutNextSubtitle": { "placeholders": { "count": { @@ -315,10 +343,10 @@ } } }, - "createAlarmHint": "Create an alarm and PluriWave will calculate the next occurrence automatically.", - "alarmVacationPlay": "Plays during vacations", - "alarmVacationPause": "Paused during vacations", - "alarmFadeInLabel": "Fade-in {seconds}s", + "createAlarmHint": "创建闹钟后,PluriWave 会自动计算下次执行时间。", + "alarmVacationPlay": "假期时响铃", + "alarmVacationPause": "假期时暂停", + "alarmFadeInLabel": "渐入 {seconds}s", "@alarmFadeInLabel": { "placeholders": { "seconds": { @@ -326,61 +354,61 @@ } } }, - "alarmNextExecution": "Next occurrence: {date}", + "alarmNextExecution": "下次执行:{date}", "@alarmNextExecution": { "placeholders": { "date": {} } }, - "alarmNoNextExecution": "It has no active next occurrence.", - "alarmSkippedExecution": "One occurrence was skipped: {date}.", + "alarmNoNextExecution": "没有活跃的下次执行。", + "alarmSkippedExecution": "已跳过一次执行:{date}。", "@alarmSkippedExecution": { "placeholders": { "date": {} } }, - "editAction": "Edit", - "skipNextAction": "Skip next", - "deleteTooltip": "Delete", - "alarmSkippedNoNextSnackbar": "Alarm skipped. There is no next occurrence left.", - "alarmSkippedReturnsSnackbar": "Alarm skipped. It will return on {date}.", + "editAction": "编辑", + "skipNextAction": "跳过下一个", + "deleteTooltip": "删除", + "alarmSkippedNoNextSnackbar": "已跳过闹钟。没有剩余的下次执行。", + "alarmSkippedReturnsSnackbar": "已跳过闹钟。将于 {date} 恢复。", "@alarmSkippedReturnsSnackbar": { "placeholders": { "date": {} } }, - "alarmVacationPausedNoNext": "It is paused for vacations ({vacationName}) and has no next occurrence.", + "alarmVacationPausedNoNext": "因假期({vacationName})暂停,且没有下次执行。", "@alarmVacationPausedNoNext": { "placeholders": { "vacationName": {} } }, - "alarmVacationPausedReturns": "It is paused for vacations ({vacationName}) and returns on {date}.", + "alarmVacationPausedReturns": "因假期({vacationName})暂停,将于 {date} 恢复。", "@alarmVacationPausedReturns": { "placeholders": { "vacationName": {}, "date": {} } }, - "alarmVacationReturns": "With vacations enabled, it will ring again on {date}.", + "alarmVacationReturns": "假期启用时,将于 {date} 再次响铃。", "@alarmVacationReturns": { "placeholders": { "date": {} } }, - "defaultAlarmName": "Music alarm", - "newAlarmTitle": "New alarm", - "editAlarmTitle": "Edit alarm", - "nameField": "Name", - "timeField": "Time", - "dateField": "Date", - "onceOption": "Once", - "dailyOption": "Daily", - "weekdaysOption": "Weekdays", - "soundAndVolumeSection": "Sound and volume", - "alarmFadeInTitle": "Alarm fade-in", - "alarmFadeInOff": "0 s (no transition)", - "alarmFadeInSummary": "{seconds} s (from 5% to the selected volume)", + "defaultAlarmName": "音乐闹钟", + "newAlarmTitle": "新闹钟", + "editAlarmTitle": "编辑闹钟", + "nameField": "名称", + "timeField": "时间", + "dateField": "日期", + "onceOption": "一次", + "dailyOption": "每天", + "weekdaysOption": "星期", + "soundAndVolumeSection": "声音和音量", + "alarmFadeInTitle": "闹钟渐入", + "alarmFadeInOff": "0 s(无过渡)", + "alarmFadeInSummary": "{seconds} s(从 5% 到所选音量)", "@alarmFadeInSummary": { "placeholders": { "seconds": { @@ -388,22 +416,22 @@ } } }, - "internalSafeSoundLabel": "Internal safe sound", - "soundWarmSunrise": "Warm sunrise", - "soundSoftBell": "Soft bell", - "soundDigitalPulse": "Digital pulse", - "favoriteStationLabel": "Favorite station", - "noStationUseInternalSound": "No station: use internal sound", - "saveFavoritesAlarmHint": "Save stations in Favorites to use them as a music alarm.", - "useCurrentStationAction": "Use current station", - "playDuringVacations": "Play during vacations", - "playDuringVacationsHint": "If you turn this off, the next occurrence will jump to the first valid day.", - "saveAlarmAction": "Save alarm", - "chooseOneWeekdayError": "Choose at least one weekday.", - "androidReliabilityReview": "Review Android reliability", - "statusOk": "OK", - "statusPending": "pending", - "androidReliabilityStatus": "Reliability: exact {exact} ? notifications {notifications} ? screen {screen}", + "internalSafeSoundLabel": "内部安全声音", + "soundWarmSunrise": "温暖日出", + "soundSoftBell": "柔和铃声", + "soundDigitalPulse": "数字脉冲", + "favoriteStationLabel": "收藏电台", + "noStationUseInternalSound": "无电台:使用内部声音", + "saveFavoritesAlarmHint": "将电台保存到收藏,即可把它们用作音乐闹钟。", + "useCurrentStationAction": "使用当前电台", + "playDuringVacations": "假期期间响铃", + "playDuringVacationsHint": "如果关闭,下次执行会跳到第一个有效日期。", + "saveAlarmAction": "保存闹钟", + "chooseOneWeekdayError": "请至少选择一周中的一天。", + "androidReliabilityReview": "检查 Android 可靠性", + "statusOk": "正常", + "statusPending": "待处理", + "androidReliabilityStatus": "可靠性:精确闹钟 {exact} · 通知 {notifications} · 屏幕 {screen}", "@androidReliabilityStatus": { "placeholders": { "exact": {}, @@ -411,19 +439,165 @@ "screen": {} } }, - "vacationRangesTitle": "Vacation ranges", - "addAction": "Add", - "vacationRangesHint": "If an alarm is set to \"Paused during vacations\", it automatically skips these ranges.", - "noVacationRangesLoaded": "No ranges loaded.", - "deleteRangeTooltip": "Delete range", - "vacationsDefaultName": "Vacation", - "newVacationRangeTitle": "New vacation range", - "startField": "Start", - "endField": "End", - "saveRangeAction": "Save range", - "noAlarmsYetTitle": "There are no alarms yet.", - "noAlarmsYetSubtitle": "Create one to design your musical wake-up.", - "ringingInternalAudioActive": "Playing with internal safe audio.", - "ringingPreparingInternalAudio": "Preparing internal safe audio.", - "stopAlarmAction": "Stop alarm" + "vacationRangesTitle": "假期范围", + "addAction": "添加", + "vacationRangesHint": "如果闹钟设置为“假期时暂停”,会自动跳过这些范围。", + "noVacationRangesLoaded": "未加载范围。", + "deleteRangeTooltip": "删除范围", + "vacationsDefaultName": "假期", + "newVacationRangeTitle": "新的假期范围", + "startField": "开始", + "endField": "结束", + "saveRangeAction": "保存范围", + "noAlarmsYetTitle": "还没有闹钟。", + "noAlarmsYetSubtitle": "创建一个,设计你的音乐唤醒。", + "ringingInternalAudioActive": "正在使用内部安全音频响铃。", + "ringingPreparingInternalAudio": "正在准备内部安全音频。", + "stopAlarmAction": "停止闹钟", + "pauseAction": "暂停", + "miniPlayerOpenLabel": "打开 {stationName} 的播放器", + "@miniPlayerOpenLabel": { + "placeholders": { + "stationName": {} + } + }, + "playerIconLabel": "播放器", + "playbackStatusConnecting": "正在连接...", + "playbackStatusLive": "直播中", + "playbackStatusPaused": "已暂停", + "playbackStatusConnectionError": "连接错误", + "playbackStatusStopped": "已停止", + "stationSemanticLabel": "电台 {stationName}", + "@stationSemanticLabel": { + "placeholders": { + "stationName": {} + } + }, + "favoritesAddTooltip": "添加到收藏", + "favoritesAddedMessage": "已将 {stationName} 添加到收藏", + "@favoritesAddedMessage": { + "placeholders": { + "stationName": {} + } + }, + "stationIconLabel": "电台图标", + "liveNow": "直播中", + "equalizerBandLabel": "{band} 频段", + "@equalizerBandLabel": { + "placeholders": { + "band": {} + } + }, + "equalizerBandValue": "{value} 分贝", + "@equalizerBandValue": { + "placeholders": { + "value": {} + } + }, + "equalizerPresetFlat": "平直", + "equalizerPresetRock": "摇滚", + "equalizerPresetPop": "流行", + "equalizerPresetBassBoost": "低音增强", + "equalizerPresetJazz": "爵士", + "equalizerPresetVoice": "人声", + "equalizerPresetCustom": "自定义", + "onboardingTitle": "欢迎使用 PluriWave", + "onboardingNewsTitle": "新功能", + "onboardingStartAction": "开始", + "onboardingCloseTooltip": "关闭", + "radioRecordingError": "录制电台时出错:{error}", + "@radioRecordingError": { + "placeholders": { + "error": {} + } + }, + "radioApiConnectionError": "无法连接到电台 API", + "radioSearchError": "搜索出错。请检查你的连接。", + "radioLoadMoreStationsError": "无法加载更多电台。", + "radioNearbyStationsError": "未能检测到附近的电台。请使用国家/地区筛选器。", + "radioCannotPlayStation": "无法播放“{stationName}”", + "@radioCannotPlayStation": { + "placeholders": { + "stationName": {} + } + }, + "recordingSelectStationFirst": "请先选择一个电台再录制。", + "recordingStartError": "无法开始录制:{error}", + "@recordingStartError": { + "placeholders": { + "error": {} + } + }, + "unsupportedConfigVersion": "不支持的配置版本", + "audioErrorGeneric": "播放错误", + "audioErrorNoInternet": "无互联网连接", + "audioErrorInvalidUrl": "电台 URL 无效", + "audioErrorNotFound": "该电台不可用(404 错误)", + "audioErrorTimeout": "连接超时", + "audioErrorCannotConnect": "无法连接到电台", + "audioErrorUnsupportedFormat": "不支持的音频流格式", + "audioErrorDecode": "解码音频流时出错", + "audioErrorCleartext": "此电台使用未加密的 HTTP,不被允许", + "audioErrorSsl": "电台的 SSL 证书无效", + "audioErrorCannotPlay": "无法播放此电台", + "audioErrorUnexpectedPlayback": "播放时出现意外错误", + "androidExactAlarmScheduleError": "Android 无法安排精确闹钟。请检查精确闹钟权限。", + "recordingPathEmptyError": "录制路径不能为空", + "recordingMaxSizeInvalidError": "最大大小必须大于零", + "recordingAlreadyActiveError": "已有录制正在进行", + "alarmRingingFallbackActive": "正在使用内部安全音频播放。", + "alarmRingingPreparingFallback": "正在准备内部安全音频。", + "alarmRingingTryingStation": "正在尝试以最高可用音质播放你的电台。", + "alarmScheduleOnce": "一次 · {date}", + "@alarmScheduleOnce": { + "placeholders": { + "date": {} + } + }, + "alarmScheduleWeekdays": "星期:{days}", + "@alarmScheduleWeekdays": { + "placeholders": { + "days": {} + } + }, + "androidReliabilityTitle": "检查 Android 可靠性", + "closeAction": "关闭", + "customOption": "自定义", + "endLabel": "结束", + "equalizerDisable": "关闭均衡器", + "helpTitle": "帮助和教程", + "helpSubtitle": "查看 PluriWave 的功能、技巧和新内容。", + "indefiniteOption": "不限时", + "invalidNumber": "数字无效", + "nameLabel": "名称", + "notPlaying": "未播放", + "oneTimeOption": "一次", + "pausePlaybackTooltip": "暂停播放", + "qualityOriginal": "原始质量:{quality}", + "@qualityOriginal": { + "placeholders": { + "quality": {} + } + }, + "qualityUnknown": "未提供质量信息", + "recordAction": "录制", + "recordDurationTitle": "录制时长", + "recordRadioSubtitle": "选择要录制多长时间。", + "recordRadioTitle": "录制电台", + "recordingActiveTitle": "正在录制电台", + "recordingDirectTitle": "直接录制", + "recordingsOpenFolderPlainError": "无法打开录音文件夹", + "recordingsOpenLatest": "打开最新录音", + "recordingsOpenLatestError": "无法打开最新录音", + "startLabel": "开始", + "startPlaybackTooltip": "开始播放", + "stopAction": "停止", + "stopPlaybackTooltip": "停止播放", + "weekdayShortMonday": "周一", + "weekdayShortTuesday": "周二", + "weekdayShortWednesday": "周三", + "weekdayShortThursday": "周四", + "weekdayShortFriday": "周五", + "weekdayShortSaturday": "周六", + "weekdayShortSunday": "周日" } diff --git a/lib/l10n/display_names.dart b/lib/l10n/display_names.dart new file mode 100644 index 0000000..49c5150 --- /dev/null +++ b/lib/l10n/display_names.dart @@ -0,0 +1,29 @@ +import 'gen/app_localizations.dart'; + +const _legacyAlarmName = 'Alarma musical'; +const _legacyVacationName = 'Vacaciones'; +const _legacyUnnamedStation = 'Sin nombre'; + +String localizedAlarmName(AppLocalizations l10n, String rawName) { + final name = rawName.trim(); + if (name.isEmpty || name == _legacyAlarmName) { + return l10n.defaultAlarmName; + } + return name; +} + +String localizedVacationName(AppLocalizations l10n, String rawName) { + final name = rawName.trim(); + if (name.isEmpty || name == _legacyVacationName) { + return l10n.vacationsDefaultName; + } + return name; +} + +String localizedStationName(AppLocalizations l10n, String rawName) { + final name = rawName.trim(); + if (name.isEmpty || name == _legacyUnnamedStation) { + return l10n.unnamedStation; + } + return name; +} diff --git a/lib/l10n/gen/app_localizations.dart b/lib/l10n/gen/app_localizations.dart index f2c7536..26603dc 100644 --- a/lib/l10n/gen/app_localizations.dart +++ b/lib/l10n/gen/app_localizations.dart @@ -216,6 +216,34 @@ abstract class AppLocalizations { /// **'Segundos'** String get secondsLabel; + /// No description provided for @durationHoursMinutesSeconds. + /// + /// In es, this message translates to: + /// **'{hours} h {minutes} min {seconds} s'** + String durationHoursMinutesSeconds( + Object hours, + Object minutes, + Object seconds, + ); + + /// No description provided for @durationMinutesSeconds. + /// + /// In es, this message translates to: + /// **'{minutes} min {seconds} s'** + String durationMinutesSeconds(Object minutes, Object seconds); + + /// No description provided for @durationMinutesOnly. + /// + /// In es, this message translates to: + /// **'{minutes} min'** + String durationMinutesOnly(Object minutes); + + /// No description provided for @durationSecondsOnly. + /// + /// In es, this message translates to: + /// **'{seconds} s'** + String durationSecondsOnly(Object seconds); + /// No description provided for @saveQuickAccess. /// /// In es, this message translates to: @@ -534,6 +562,12 @@ abstract class AppLocalizations { /// **'Nombre *'** String get stationNameLabel; + /// No description provided for @unnamedStation. + /// + /// In es, this message translates to: + /// **'Sin nombre'** + String get unnamedStation; + /// No description provided for @requiredField. /// /// In es, this message translates to: @@ -893,6 +927,1288 @@ abstract class AppLocalizations { /// In es, this message translates to: /// **'{stationName} eliminada de favoritos'** String favoritesRemovedMessage(Object stationName); + + /// No description provided for @alarmPostponedCurrentExecution. + /// + /// In es, this message translates to: + /// **'Alarma pospuesta para esta ejecución.'** + String get alarmPostponedCurrentExecution; + + /// No description provided for @searchScreenTitle. + /// + /// In es, this message translates to: + /// **'Buscar señal'** + String get searchScreenTitle; + + /// No description provided for @searchScreenSubtitle. + /// + /// In es, this message translates to: + /// **'Encontrá radios por nombre, país o idioma con filtros rápidos y alto contraste.'** + String get searchScreenSubtitle; + + /// No description provided for @searchFiltersLabel. + /// + /// In es, this message translates to: + /// **'Filtros'** + String get searchFiltersLabel; + + /// No description provided for @searchHint. + /// + /// In es, this message translates to: + /// **'Radio Horizonte, jazz, noticias...'** + String get searchHint; + + /// No description provided for @searchCountryFilterLabel. + /// + /// In es, this message translates to: + /// **'País'** + String get searchCountryFilterLabel; + + /// No description provided for @searchLanguageFilterLabel. + /// + /// In es, this message translates to: + /// **'Idioma'** + String get searchLanguageFilterLabel; + + /// No description provided for @searchMinQualityFilterLabel. + /// + /// In es, this message translates to: + /// **'Calidad mínima'** + String get searchMinQualityFilterLabel; + + /// No description provided for @searchEmptyTitle. + /// + /// In es, this message translates to: + /// **'Buscá una emisora'** + String get searchEmptyTitle; + + /// No description provided for @searchNoResultsTitle. + /// + /// In es, this message translates to: + /// **'Sin resultados'** + String get searchNoResultsTitle; + + /// No description provided for @searchEmptySubtitle. + /// + /// In es, this message translates to: + /// **'Usá la barra superior o los chips para descubrir señales de todo el mundo.'** + String get searchEmptySubtitle; + + /// No description provided for @searchNoResultsSubtitle. + /// + /// In es, this message translates to: + /// **'Probá quitar filtros o escribir otro nombre para encontrar una señal activa.'** + String get searchNoResultsSubtitle; + + /// No description provided for @countrySpain. + /// + /// In es, this message translates to: + /// **'España'** + String get countrySpain; + + /// No description provided for @countryUsa. + /// + /// In es, this message translates to: + /// **'EE. UU.'** + String get countryUsa; + + /// No description provided for @countryMexico. + /// + /// In es, this message translates to: + /// **'México'** + String get countryMexico; + + /// No description provided for @countryArgentina. + /// + /// In es, this message translates to: + /// **'Argentina'** + String get countryArgentina; + + /// No description provided for @countryUk. + /// + /// In es, this message translates to: + /// **'Reino Unido'** + String get countryUk; + + /// No description provided for @countryFrance. + /// + /// In es, this message translates to: + /// **'Francia'** + String get countryFrance; + + /// No description provided for @countryGermany. + /// + /// In es, this message translates to: + /// **'Alemania'** + String get countryGermany; + + /// No description provided for @countryItaly. + /// + /// In es, this message translates to: + /// **'Italia'** + String get countryItaly; + + /// No description provided for @countryBrazil. + /// + /// In es, this message translates to: + /// **'Brasil'** + String get countryBrazil; + + /// No description provided for @countryJapan. + /// + /// In es, this message translates to: + /// **'Japón'** + String get countryJapan; + + /// No description provided for @languageNameSpanish. + /// + /// In es, this message translates to: + /// **'Español'** + String get languageNameSpanish; + + /// No description provided for @languageNameEnglish. + /// + /// In es, this message translates to: + /// **'Inglés'** + String get languageNameEnglish; + + /// No description provided for @languageNameFrench. + /// + /// In es, this message translates to: + /// **'Francés'** + String get languageNameFrench; + + /// No description provided for @languageNameGerman. + /// + /// In es, this message translates to: + /// **'Alemán'** + String get languageNameGerman; + + /// No description provided for @languageNamePortuguese. + /// + /// In es, this message translates to: + /// **'Portugués'** + String get languageNamePortuguese; + + /// No description provided for @languageNameItalian. + /// + /// In es, this message translates to: + /// **'Italiano'** + String get languageNameItalian; + + /// No description provided for @languageNameJapanese. + /// + /// In es, this message translates to: + /// **'Japonés'** + String get languageNameJapanese; + + /// No description provided for @languageNameArabic. + /// + /// In es, this message translates to: + /// **'Árabe'** + String get languageNameArabic; + + /// No description provided for @languageNameRussian. + /// + /// In es, this message translates to: + /// **'Ruso'** + String get languageNameRussian; + + /// No description provided for @homeScreenSubtitle. + /// + /// In es, this message translates to: + /// **'Radio global en vivo con señales limpias, favoritos inteligentes y una experiencia visual de concurso.'** + String get homeScreenSubtitle; + + /// No description provided for @exploreStations. + /// + /// In es, this message translates to: + /// **'Explorar emisoras'** + String get exploreStations; + + /// No description provided for @stationsCount. + /// + /// In es, this message translates to: + /// **'{count} radios'** + String stationsCount(int count); + + /// No description provided for @qualityHd. + /// + /// In es, this message translates to: + /// **'Calidad HD'** + String get qualityHd; + + /// No description provided for @nearYou. + /// + /// In es, this message translates to: + /// **'Cerca de vos'** + String get nearYou; + + /// No description provided for @nearYouInCountry. + /// + /// In es, this message translates to: + /// **'Cerca de vos · {country}'** + String nearYouInCountry(Object country); + + /// No description provided for @detectAction. + /// + /// In es, this message translates to: + /// **'Detectar'** + String get detectAction; + + /// No description provided for @liveRadar. + /// + /// In es, this message translates to: + /// **'Radar en directo'** + String get liveRadar; + + /// No description provided for @genresTitle. + /// + /// In es, this message translates to: + /// **'Géneros'** + String get genresTitle; + + /// No description provided for @retryAction. + /// + /// In es, this message translates to: + /// **'Reintentar'** + String get retryAction; + + /// No description provided for @noStationsAvailable. + /// + /// In es, this message translates to: + /// **'No hay emisoras disponibles'** + String get noStationsAvailable; + + /// No description provided for @noStationsAvailableSubtitle. + /// + /// In es, this message translates to: + /// **'Probá refrescar o elegir otro género para volver a capturar señal.'** + String get noStationsAvailableSubtitle; + + /// No description provided for @genrePop. + /// + /// In es, this message translates to: + /// **'Pop'** + String get genrePop; + + /// No description provided for @genreRock. + /// + /// In es, this message translates to: + /// **'Rock'** + String get genreRock; + + /// No description provided for @genreJazz. + /// + /// In es, this message translates to: + /// **'Jazz'** + String get genreJazz; + + /// No description provided for @genreClassical. + /// + /// In es, this message translates to: + /// **'Clásica'** + String get genreClassical; + + /// No description provided for @genreElectronic. + /// + /// In es, this message translates to: + /// **'Electrónica'** + String get genreElectronic; + + /// No description provided for @genreNews. + /// + /// In es, this message translates to: + /// **'Noticias'** + String get genreNews; + + /// No description provided for @genreTalk. + /// + /// In es, this message translates to: + /// **'Charlas'** + String get genreTalk; + + /// No description provided for @genreHipHop. + /// + /// In es, this message translates to: + /// **'Hip-hop'** + String get genreHipHop; + + /// No description provided for @genreCountry. + /// + /// In es, this message translates to: + /// **'Country'** + String get genreCountry; + + /// No description provided for @genreMetal. + /// + /// In es, this message translates to: + /// **'Metal'** + String get genreMetal; + + /// No description provided for @genreReggae. + /// + /// In es, this message translates to: + /// **'Reggae'** + String get genreReggae; + + /// No description provided for @genreLatin. + /// + /// In es, this message translates to: + /// **'Latina'** + String get genreLatin; + + /// No description provided for @alarmScreenTitle. + /// + /// In es, this message translates to: + /// **'Despertar musical'** + String get alarmScreenTitle; + + /// No description provided for @alarmScreenSubtitle. + /// + /// In es, this message translates to: + /// **'Alarmas con radio, sonido seguro, vacaciones inteligentes y próxima ejecución siempre visible.'** + String get alarmScreenSubtitle; + + /// No description provided for @createAlarmAction. + /// + /// In es, this message translates to: + /// **'Crear alarma'** + String get createAlarmAction; + + /// No description provided for @alarmsCount. + /// + /// In es, this message translates to: + /// **'{count} alarmas'** + String alarmsCount(int count); + + /// No description provided for @activeAlarmsWithoutNextTitle. + /// + /// In es, this message translates to: + /// **'Alarmas activas sin próxima ejecución'** + String get activeAlarmsWithoutNextTitle; + + /// No description provided for @noActiveAlarms. + /// + /// In es, this message translates to: + /// **'Sin alarmas activas'** + String get noActiveAlarms; + + /// No description provided for @nextAlarmTitle. + /// + /// In es, this message translates to: + /// **'Próxima alarma'** + String get nextAlarmTitle; + + /// No description provided for @activeAlarmsWithoutNextSubtitle. + /// + /// In es, this message translates to: + /// **'Hay {count} alarma(s) activas, pero ahora mismo no tienen una fecha futura válida. Revisá fecha, días y vacaciones.'** + String activeAlarmsWithoutNextSubtitle(int count); + + /// No description provided for @createAlarmHint. + /// + /// In es, this message translates to: + /// **'Creá una alarma y PluriWave calculará la siguiente ejecución automáticamente.'** + String get createAlarmHint; + + /// No description provided for @alarmVacationPlay. + /// + /// In es, this message translates to: + /// **'Suena en vacaciones'** + String get alarmVacationPlay; + + /// No description provided for @alarmVacationPause. + /// + /// In es, this message translates to: + /// **'Pausa en vacaciones'** + String get alarmVacationPause; + + /// No description provided for @alarmFadeInLabel. + /// + /// In es, this message translates to: + /// **'Fade-in {seconds}s'** + String alarmFadeInLabel(int seconds); + + /// No description provided for @alarmNextExecution. + /// + /// In es, this message translates to: + /// **'Siguiente ejecución: {date}'** + String alarmNextExecution(Object date); + + /// No description provided for @alarmNoNextExecution. + /// + /// In es, this message translates to: + /// **'No tiene próxima ejecución activa.'** + String get alarmNoNextExecution; + + /// No description provided for @alarmSkippedExecution. + /// + /// In es, this message translates to: + /// **'Una ejecución fue omitida: {date}.'** + String alarmSkippedExecution(Object date); + + /// No description provided for @editAction. + /// + /// In es, this message translates to: + /// **'Editar'** + String get editAction; + + /// No description provided for @skipNextAction. + /// + /// In es, this message translates to: + /// **'Omitir siguiente'** + String get skipNextAction; + + /// No description provided for @deleteTooltip. + /// + /// In es, this message translates to: + /// **'Eliminar'** + String get deleteTooltip; + + /// No description provided for @alarmSkippedNoNextSnackbar. + /// + /// In es, this message translates to: + /// **'Alarma omitida. No queda próxima ejecución.'** + String get alarmSkippedNoNextSnackbar; + + /// No description provided for @alarmSkippedReturnsSnackbar. + /// + /// In es, this message translates to: + /// **'Alarma omitida. Volverá el {date}.'** + String alarmSkippedReturnsSnackbar(Object date); + + /// No description provided for @alarmVacationPausedNoNext. + /// + /// In es, this message translates to: + /// **'Está pausada por vacaciones ({vacationName}) y sin próxima ejecución.'** + String alarmVacationPausedNoNext(Object vacationName); + + /// No description provided for @alarmVacationPausedReturns. + /// + /// In es, this message translates to: + /// **'Está pausada por vacaciones ({vacationName}) y vuelve el {date}.'** + String alarmVacationPausedReturns(Object vacationName, Object date); + + /// No description provided for @alarmVacationReturns. + /// + /// In es, this message translates to: + /// **'Con vacaciones activas, volverá a sonar el {date}.'** + String alarmVacationReturns(Object date); + + /// No description provided for @defaultAlarmName. + /// + /// In es, this message translates to: + /// **'Despertador musical'** + String get defaultAlarmName; + + /// No description provided for @newAlarmTitle. + /// + /// In es, this message translates to: + /// **'Nueva alarma'** + String get newAlarmTitle; + + /// No description provided for @editAlarmTitle. + /// + /// In es, this message translates to: + /// **'Editar alarma'** + String get editAlarmTitle; + + /// No description provided for @nameField. + /// + /// In es, this message translates to: + /// **'Nombre'** + String get nameField; + + /// No description provided for @timeField. + /// + /// In es, this message translates to: + /// **'Hora'** + String get timeField; + + /// No description provided for @dateField. + /// + /// In es, this message translates to: + /// **'Fecha'** + String get dateField; + + /// No description provided for @onceOption. + /// + /// In es, this message translates to: + /// **'Una vez'** + String get onceOption; + + /// No description provided for @dailyOption. + /// + /// In es, this message translates to: + /// **'Diaria'** + String get dailyOption; + + /// No description provided for @weekdaysOption. + /// + /// In es, this message translates to: + /// **'Días'** + String get weekdaysOption; + + /// No description provided for @soundAndVolumeSection. + /// + /// In es, this message translates to: + /// **'Sonido y volumen'** + String get soundAndVolumeSection; + + /// No description provided for @alarmFadeInTitle. + /// + /// In es, this message translates to: + /// **'Fade-in de alarma'** + String get alarmFadeInTitle; + + /// No description provided for @alarmFadeInOff. + /// + /// In es, this message translates to: + /// **'0 s (sin transición)'** + String get alarmFadeInOff; + + /// No description provided for @alarmFadeInSummary. + /// + /// In es, this message translates to: + /// **'{seconds} s (de 5% al volumen elegido)'** + String alarmFadeInSummary(int seconds); + + /// No description provided for @internalSafeSoundLabel. + /// + /// In es, this message translates to: + /// **'Sonido seguro interno'** + String get internalSafeSoundLabel; + + /// No description provided for @soundWarmSunrise. + /// + /// In es, this message translates to: + /// **'Amanecer cálido'** + String get soundWarmSunrise; + + /// No description provided for @soundSoftBell. + /// + /// In es, this message translates to: + /// **'Campana suave'** + String get soundSoftBell; + + /// No description provided for @soundDigitalPulse. + /// + /// In es, this message translates to: + /// **'Pulso digital'** + String get soundDigitalPulse; + + /// No description provided for @favoriteStationLabel. + /// + /// In es, this message translates to: + /// **'Emisora favorita'** + String get favoriteStationLabel; + + /// No description provided for @noStationUseInternalSound. + /// + /// In es, this message translates to: + /// **'Sin emisora: usar sonido interno'** + String get noStationUseInternalSound; + + /// No description provided for @saveFavoritesAlarmHint. + /// + /// In es, this message translates to: + /// **'Guardá emisoras en Favoritos para usarlas como alarma musical.'** + String get saveFavoritesAlarmHint; + + /// No description provided for @useCurrentStationAction. + /// + /// In es, this message translates to: + /// **'Usar emisora actual'** + String get useCurrentStationAction; + + /// No description provided for @playDuringVacations. + /// + /// In es, this message translates to: + /// **'Sonar durante vacaciones'** + String get playDuringVacations; + + /// No description provided for @playDuringVacationsHint. + /// + /// In es, this message translates to: + /// **'Si lo apagás, la próxima ejecución saltará al primer día válido.'** + String get playDuringVacationsHint; + + /// No description provided for @saveAlarmAction. + /// + /// In es, this message translates to: + /// **'Guardar alarma'** + String get saveAlarmAction; + + /// No description provided for @chooseOneWeekdayError. + /// + /// In es, this message translates to: + /// **'Elegí al menos un día de la semana.'** + String get chooseOneWeekdayError; + + /// No description provided for @androidReliabilityReview. + /// + /// In es, this message translates to: + /// **'Revisar fiabilidad Android'** + String get androidReliabilityReview; + + /// No description provided for @statusOk. + /// + /// In es, this message translates to: + /// **'OK'** + String get statusOk; + + /// No description provided for @statusPending. + /// + /// In es, this message translates to: + /// **'pendiente'** + String get statusPending; + + /// No description provided for @androidReliabilityStatus. + /// + /// In es, this message translates to: + /// **'Fiabilidad: exactas {exact} · notificaciones {notifications} · pantalla {screen}'** + String androidReliabilityStatus( + Object exact, + Object notifications, + Object screen, + ); + + /// No description provided for @vacationRangesTitle. + /// + /// In es, this message translates to: + /// **'Rangos de vacaciones'** + String get vacationRangesTitle; + + /// No description provided for @addAction. + /// + /// In es, this message translates to: + /// **'Agregar'** + String get addAction; + + /// No description provided for @vacationRangesHint. + /// + /// In es, this message translates to: + /// **'Si una alarma tiene \"Pausa en vacaciones\", se salta automáticamente estos rangos.'** + String get vacationRangesHint; + + /// No description provided for @noVacationRangesLoaded. + /// + /// In es, this message translates to: + /// **'Sin rangos cargados.'** + String get noVacationRangesLoaded; + + /// No description provided for @deleteRangeTooltip. + /// + /// In es, this message translates to: + /// **'Eliminar rango'** + String get deleteRangeTooltip; + + /// No description provided for @vacationsDefaultName. + /// + /// In es, this message translates to: + /// **'Vacaciones'** + String get vacationsDefaultName; + + /// No description provided for @newVacationRangeTitle. + /// + /// In es, this message translates to: + /// **'Nuevo rango de vacaciones'** + String get newVacationRangeTitle; + + /// No description provided for @startField. + /// + /// In es, this message translates to: + /// **'Inicio'** + String get startField; + + /// No description provided for @endField. + /// + /// In es, this message translates to: + /// **'Fin'** + String get endField; + + /// No description provided for @saveRangeAction. + /// + /// In es, this message translates to: + /// **'Guardar rango'** + String get saveRangeAction; + + /// No description provided for @noAlarmsYetTitle. + /// + /// In es, this message translates to: + /// **'Todavía no hay alarmas.'** + String get noAlarmsYetTitle; + + /// No description provided for @noAlarmsYetSubtitle. + /// + /// In es, this message translates to: + /// **'Creá una para diseñar tu despertar musical.'** + String get noAlarmsYetSubtitle; + + /// No description provided for @ringingInternalAudioActive. + /// + /// In es, this message translates to: + /// **'Sonando con audio seguro interno.'** + String get ringingInternalAudioActive; + + /// No description provided for @ringingPreparingInternalAudio. + /// + /// In es, this message translates to: + /// **'Preparando audio seguro interno.'** + String get ringingPreparingInternalAudio; + + /// No description provided for @stopAlarmAction. + /// + /// In es, this message translates to: + /// **'Detener alarma'** + String get stopAlarmAction; + + /// No description provided for @pauseAction. + /// + /// In es, this message translates to: + /// **'Pausar'** + String get pauseAction; + + /// No description provided for @miniPlayerOpenLabel. + /// + /// In es, this message translates to: + /// **'Abrir reproductor de {stationName}'** + String miniPlayerOpenLabel(Object stationName); + + /// No description provided for @playerIconLabel. + /// + /// In es, this message translates to: + /// **'Reproductor'** + String get playerIconLabel; + + /// No description provided for @playbackStatusConnecting. + /// + /// In es, this message translates to: + /// **'Conectando...'** + String get playbackStatusConnecting; + + /// No description provided for @playbackStatusLive. + /// + /// In es, this message translates to: + /// **'En directo'** + String get playbackStatusLive; + + /// No description provided for @playbackStatusPaused. + /// + /// In es, this message translates to: + /// **'Pausado'** + String get playbackStatusPaused; + + /// No description provided for @playbackStatusConnectionError. + /// + /// In es, this message translates to: + /// **'Error de conexión'** + String get playbackStatusConnectionError; + + /// No description provided for @playbackStatusStopped. + /// + /// In es, this message translates to: + /// **'Detenido'** + String get playbackStatusStopped; + + /// No description provided for @stationSemanticLabel. + /// + /// In es, this message translates to: + /// **'Emisora {stationName}'** + String stationSemanticLabel(Object stationName); + + /// No description provided for @favoritesAddTooltip. + /// + /// In es, this message translates to: + /// **'Añadir a favoritos'** + String get favoritesAddTooltip; + + /// No description provided for @favoritesAddedMessage. + /// + /// In es, this message translates to: + /// **'{stationName} añadida a favoritos'** + String favoritesAddedMessage(Object stationName); + + /// No description provided for @stationIconLabel. + /// + /// In es, this message translates to: + /// **'Icono de emisora'** + String get stationIconLabel; + + /// No description provided for @liveNow. + /// + /// In es, this message translates to: + /// **'En vivo'** + String get liveNow; + + /// No description provided for @equalizerBandLabel. + /// + /// In es, this message translates to: + /// **'Banda {band}'** + String equalizerBandLabel(Object band); + + /// No description provided for @equalizerBandValue. + /// + /// In es, this message translates to: + /// **'{value} decibelios'** + String equalizerBandValue(Object value); + + /// No description provided for @equalizerPresetFlat. + /// + /// In es, this message translates to: + /// **'Plano'** + String get equalizerPresetFlat; + + /// No description provided for @equalizerPresetRock. + /// + /// In es, this message translates to: + /// **'Rock'** + String get equalizerPresetRock; + + /// No description provided for @equalizerPresetPop. + /// + /// In es, this message translates to: + /// **'Pop'** + String get equalizerPresetPop; + + /// No description provided for @equalizerPresetBassBoost. + /// + /// In es, this message translates to: + /// **'Refuerzo de graves'** + String get equalizerPresetBassBoost; + + /// No description provided for @equalizerPresetJazz. + /// + /// In es, this message translates to: + /// **'Jazz'** + String get equalizerPresetJazz; + + /// No description provided for @equalizerPresetVoice. + /// + /// In es, this message translates to: + /// **'Voz'** + String get equalizerPresetVoice; + + /// No description provided for @equalizerPresetCustom. + /// + /// In es, this message translates to: + /// **'Personalizado'** + String get equalizerPresetCustom; + + /// No description provided for @onboardingTitle. + /// + /// In es, this message translates to: + /// **'Bienvenido a PluriWave'** + String get onboardingTitle; + + /// No description provided for @onboardingNewsTitle. + /// + /// In es, this message translates to: + /// **'Novedades'** + String get onboardingNewsTitle; + + /// No description provided for @onboardingStartAction. + /// + /// In es, this message translates to: + /// **'Empezar'** + String get onboardingStartAction; + + /// No description provided for @onboardingCloseTooltip. + /// + /// In es, this message translates to: + /// **'Cerrar'** + String get onboardingCloseTooltip; + + /// No description provided for @radioRecordingError. + /// + /// In es, this message translates to: + /// **'Error al grabar la radio: {error}'** + String radioRecordingError(Object error); + + /// No description provided for @radioApiConnectionError. + /// + /// In es, this message translates to: + /// **'Sin conexión a la API de radio'** + String get radioApiConnectionError; + + /// No description provided for @radioSearchError. + /// + /// In es, this message translates to: + /// **'Error en la búsqueda. Comprueba tu conexión.'** + String get radioSearchError; + + /// No description provided for @radioLoadMoreStationsError. + /// + /// In es, this message translates to: + /// **'No se pudieron cargar más emisoras.'** + String get radioLoadMoreStationsError; + + /// No description provided for @radioNearbyStationsError. + /// + /// In es, this message translates to: + /// **'No pudimos detectar emisoras cercanas. Usa filtros por país.'** + String get radioNearbyStationsError; + + /// No description provided for @radioCannotPlayStation. + /// + /// In es, this message translates to: + /// **'No se puede reproducir \"{stationName}\"'** + String radioCannotPlayStation(Object stationName); + + /// No description provided for @recordingSelectStationFirst. + /// + /// In es, this message translates to: + /// **'Primero selecciona una emisora para grabar.'** + String get recordingSelectStationFirst; + + /// No description provided for @recordingStartError. + /// + /// In es, this message translates to: + /// **'No se pudo iniciar la grabación: {error}'** + String recordingStartError(Object error); + + /// No description provided for @unsupportedConfigVersion. + /// + /// In es, this message translates to: + /// **'Versión de configuración no compatible'** + String get unsupportedConfigVersion; + + /// No description provided for @audioErrorGeneric. + /// + /// In es, this message translates to: + /// **'Error de reproducción'** + String get audioErrorGeneric; + + /// No description provided for @audioErrorNoInternet. + /// + /// In es, this message translates to: + /// **'Sin conexión a internet'** + String get audioErrorNoInternet; + + /// No description provided for @audioErrorInvalidUrl. + /// + /// In es, this message translates to: + /// **'La URL de la radio no es válida'** + String get audioErrorInvalidUrl; + + /// No description provided for @audioErrorNotFound. + /// + /// In es, this message translates to: + /// **'La radio no está disponible (error 404)'** + String get audioErrorNotFound; + + /// No description provided for @audioErrorTimeout. + /// + /// In es, this message translates to: + /// **'Tiempo de espera agotado al conectar'** + String get audioErrorTimeout; + + /// No description provided for @audioErrorCannotConnect. + /// + /// In es, this message translates to: + /// **'No se puede conectar a la radio'** + String get audioErrorCannotConnect; + + /// No description provided for @audioErrorUnsupportedFormat. + /// + /// In es, this message translates to: + /// **'Formato de stream no compatible'** + String get audioErrorUnsupportedFormat; + + /// No description provided for @audioErrorDecode. + /// + /// In es, this message translates to: + /// **'Error al decodificar el stream de audio'** + String get audioErrorDecode; + + /// No description provided for @audioErrorCleartext. + /// + /// In es, this message translates to: + /// **'Esta radio usa HTTP sin cifrar, y no está permitido'** + String get audioErrorCleartext; + + /// No description provided for @audioErrorSsl. + /// + /// In es, this message translates to: + /// **'Certificado SSL inválido en la radio'** + String get audioErrorSsl; + + /// No description provided for @audioErrorCannotPlay. + /// + /// In es, this message translates to: + /// **'No se puede reproducir esta radio'** + String get audioErrorCannotPlay; + + /// No description provided for @audioErrorUnexpectedPlayback. + /// + /// In es, this message translates to: + /// **'Error inesperado al reproducir'** + String get audioErrorUnexpectedPlayback; + + /// No description provided for @androidExactAlarmScheduleError. + /// + /// In es, this message translates to: + /// **'Android no pudo programar una alarma exacta. Revisa el permiso de alarmas exactas.'** + String get androidExactAlarmScheduleError; + + /// No description provided for @recordingPathEmptyError. + /// + /// In es, this message translates to: + /// **'La ruta de grabación no puede estar vacía'** + String get recordingPathEmptyError; + + /// No description provided for @recordingMaxSizeInvalidError. + /// + /// In es, this message translates to: + /// **'El tamaño máximo debe ser mayor que cero'** + String get recordingMaxSizeInvalidError; + + /// No description provided for @recordingAlreadyActiveError. + /// + /// In es, this message translates to: + /// **'Ya hay una grabación en curso'** + String get recordingAlreadyActiveError; + + /// No description provided for @alarmRingingFallbackActive. + /// + /// In es, this message translates to: + /// **'Sonando con audio seguro interno.'** + String get alarmRingingFallbackActive; + + /// No description provided for @alarmRingingPreparingFallback. + /// + /// In es, this message translates to: + /// **'Preparando audio seguro interno.'** + String get alarmRingingPreparingFallback; + + /// No description provided for @alarmRingingTryingStation. + /// + /// In es, this message translates to: + /// **'Intentando reproducir tu emisora con máxima calidad disponible.'** + String get alarmRingingTryingStation; + + /// No description provided for @alarmScheduleOnce. + /// + /// In es, this message translates to: + /// **'Una vez · {date}'** + String alarmScheduleOnce(Object date); + + /// No description provided for @alarmScheduleWeekdays. + /// + /// In es, this message translates to: + /// **'Días: {days}'** + String alarmScheduleWeekdays(Object days); + + /// No description provided for @androidReliabilityTitle. + /// + /// In es, this message translates to: + /// **'Revisar fiabilidad Android'** + String get androidReliabilityTitle; + + /// No description provided for @closeAction. + /// + /// In es, this message translates to: + /// **'Cerrar'** + String get closeAction; + + /// No description provided for @customOption. + /// + /// In es, this message translates to: + /// **'Personalizada'** + String get customOption; + + /// No description provided for @endLabel. + /// + /// In es, this message translates to: + /// **'Fin'** + String get endLabel; + + /// No description provided for @equalizerDisable. + /// + /// In es, this message translates to: + /// **'Desactivar ecualizador'** + String get equalizerDisable; + + /// No description provided for @helpTitle. + /// + /// In es, this message translates to: + /// **'Ayuda y tutorial'** + String get helpTitle; + + /// No description provided for @helpSubtitle. + /// + /// In es, this message translates to: + /// **'Repasá funciones, consejos y novedades de PluriWave.'** + String get helpSubtitle; + + /// No description provided for @indefiniteOption. + /// + /// In es, this message translates to: + /// **'Indefinida'** + String get indefiniteOption; + + /// No description provided for @invalidNumber. + /// + /// In es, this message translates to: + /// **'Número inválido'** + String get invalidNumber; + + /// No description provided for @nameLabel. + /// + /// In es, this message translates to: + /// **'Nombre'** + String get nameLabel; + + /// No description provided for @notPlaying. + /// + /// In es, this message translates to: + /// **'No está reproduciendo'** + String get notPlaying; + + /// No description provided for @oneTimeOption. + /// + /// In es, this message translates to: + /// **'Una vez'** + String get oneTimeOption; + + /// No description provided for @pausePlaybackTooltip. + /// + /// In es, this message translates to: + /// **'Pausar reproducción'** + String get pausePlaybackTooltip; + + /// No description provided for @qualityOriginal. + /// + /// In es, this message translates to: + /// **'Calidad original: {quality}'** + String qualityOriginal(Object quality); + + /// No description provided for @qualityUnknown. + /// + /// In es, this message translates to: + /// **'Calidad no informada'** + String get qualityUnknown; + + /// No description provided for @recordAction. + /// + /// In es, this message translates to: + /// **'Grabar'** + String get recordAction; + + /// No description provided for @recordDurationTitle. + /// + /// In es, this message translates to: + /// **'Duración de grabación'** + String get recordDurationTitle; + + /// No description provided for @recordRadioSubtitle. + /// + /// In es, this message translates to: + /// **'Elegí cuánto tiempo querés grabar.'** + String get recordRadioSubtitle; + + /// No description provided for @recordRadioTitle. + /// + /// In es, this message translates to: + /// **'Grabar radio'** + String get recordRadioTitle; + + /// No description provided for @recordingActiveTitle. + /// + /// In es, this message translates to: + /// **'Grabando radio'** + String get recordingActiveTitle; + + /// No description provided for @recordingDirectTitle. + /// + /// In es, this message translates to: + /// **'Grabación directa'** + String get recordingDirectTitle; + + /// No description provided for @recordingsOpenFolderPlainError. + /// + /// In es, this message translates to: + /// **'No se pudo abrir la carpeta de grabaciones'** + String get recordingsOpenFolderPlainError; + + /// No description provided for @recordingsOpenLatest. + /// + /// In es, this message translates to: + /// **'Abrir última grabación'** + String get recordingsOpenLatest; + + /// No description provided for @recordingsOpenLatestError. + /// + /// In es, this message translates to: + /// **'No se pudo abrir la última grabación'** + String get recordingsOpenLatestError; + + /// No description provided for @startLabel. + /// + /// In es, this message translates to: + /// **'Inicio'** + String get startLabel; + + /// No description provided for @startPlaybackTooltip. + /// + /// In es, this message translates to: + /// **'Iniciar reproducción'** + String get startPlaybackTooltip; + + /// No description provided for @stopAction. + /// + /// In es, this message translates to: + /// **'Parar'** + String get stopAction; + + /// No description provided for @stopPlaybackTooltip. + /// + /// In es, this message translates to: + /// **'Detener reproducción'** + String get stopPlaybackTooltip; + + /// No description provided for @weekdayShortMonday. + /// + /// In es, this message translates to: + /// **'Lun'** + String get weekdayShortMonday; + + /// No description provided for @weekdayShortTuesday. + /// + /// In es, this message translates to: + /// **'Mar'** + String get weekdayShortTuesday; + + /// No description provided for @weekdayShortWednesday. + /// + /// In es, this message translates to: + /// **'Mié'** + String get weekdayShortWednesday; + + /// No description provided for @weekdayShortThursday. + /// + /// In es, this message translates to: + /// **'Jue'** + String get weekdayShortThursday; + + /// No description provided for @weekdayShortFriday. + /// + /// In es, this message translates to: + /// **'Vie'** + String get weekdayShortFriday; + + /// No description provided for @weekdayShortSaturday. + /// + /// In es, this message translates to: + /// **'Sáb'** + String get weekdayShortSaturday; + + /// No description provided for @weekdayShortSunday. + /// + /// In es, this message translates to: + /// **'Dom'** + String get weekdayShortSunday; } class _AppLocalizationsDelegate diff --git a/lib/l10n/gen/app_localizations_ar.dart b/lib/l10n/gen/app_localizations_ar.dart index 405a863..4b8b70c 100644 --- a/lib/l10n/gen/app_localizations_ar.dart +++ b/lib/l10n/gen/app_localizations_ar.dart @@ -12,440 +12,1175 @@ class AppLocalizationsAr extends AppLocalizations { String get appTitle => 'PluriWave'; @override - String get navHome => 'Home'; + String get navHome => 'الرئيسية'; @override - String get navSearch => 'Search'; + String get navSearch => 'بحث'; @override - String get navFavorites => 'Favorites'; + String get navFavorites => 'المفضلة'; @override - String get navAlarms => 'Alarms'; + String get navAlarms => 'المنبهات'; @override - String get navSettings => 'Settings'; + String get navSettings => 'الإعدادات'; @override - String get actionOk => 'OK'; + String get actionOk => 'حسنًا'; @override - String get sleepTimer => 'Sleep timer'; + String get sleepTimer => 'مؤقّت النوم'; @override String get sleepTimerDescription => - 'Smooth radio shutdown with an exact countdown.'; + 'إيقاف الراديو بسلاسة مع عدّ تنازلي دقيق.'; @override - String get cancelTimer => 'Cancel timer'; + String get cancelTimer => 'إلغاء المؤقّت'; @override - String get optionOther => 'Other'; + String get optionOther => 'أخرى'; @override - String get customDurationTitle => 'Custom duration'; + String get customDurationTitle => 'مدة مخصّصة'; @override - String get durationGreaterThanZero => 'Choose a duration greater than zero.'; + String get durationGreaterThanZero => 'اختر مدة أكبر من الصفر.'; @override - String get hoursLabel => 'Hours'; + String get hoursLabel => 'ساعات'; @override - String get minutesLabel => 'Minutes'; + String get minutesLabel => 'دقائق'; @override - String get secondsLabel => 'Seconds'; + String get secondsLabel => 'ثوانٍ'; @override - String get saveQuickAccess => 'Save as quick access'; + String durationHoursMinutesSeconds( + Object hours, + Object minutes, + Object seconds, + ) { + return '$hours ? $minutes ? $seconds ?'; + } @override - String get startTimer => 'Start timer'; + String durationMinutesSeconds(Object minutes, Object seconds) { + return '$minutes ? $seconds ?'; + } + + @override + String durationMinutesOnly(Object minutes) { + return '$minutes ?'; + } + + @override + String durationSecondsOnly(Object seconds) { + return '$seconds ?'; + } + + @override + String get saveQuickAccess => 'حفظ كاختصار سريع'; + + @override + String get startTimer => 'بدء المؤقّت'; @override String skipCurrentAlarmExecution(Object alarmName) { - return 'Skipped this execution of $alarmName.'; + return 'تم تخطي هذا التشغيل من $alarmName.'; } @override - String get settingsTitle => 'Settings'; + String get settingsTitle => 'الإعدادات'; @override String get settingsSubtitle => - 'Fine-grained sound control, backups, and custom stations.'; + 'تحكم دقيق في الصوت والنسخ الاحتياطية والمحطات المخصصة.'; @override - String get languageSectionTitle => 'Language'; + String get languageSectionTitle => 'اللغة'; @override - String get languageSectionDescription => - 'Choose how the app language is displayed.'; + String get languageSectionDescription => 'اختر كيفية عرض لغة التطبيق.'; @override - String get languageSystemDefault => 'System'; + String get languageSystemDefault => 'النظام'; @override - String get languageSpanish => 'Spanish'; + String get languageSpanish => 'الإسبانية'; @override - String get languageEnglish => 'English'; + String get languageEnglish => 'الإنجليزية'; @override String languageUpdated(Object languageName) { - return 'Language updated: $languageName'; + return 'تم تحديث اللغة: $languageName'; } @override - String get languageUpdatedSystem => 'Language updated: System'; + String get languageUpdatedSystem => 'تم تحديث اللغة: النظام'; @override - String get timerSectionTitle => 'Sleep timer'; + String get timerSectionTitle => 'مؤقّت النوم'; @override - String get timerSectionAdd => 'Add'; + String get timerSectionAdd => 'إضافة'; @override String get timerSectionDescription => - 'Customize the quick presets shown when automatically stopping the radio.'; + 'خصّص الاختصارات السريعة التي تظهر عند إيقاف الراديو تلقائيًا.'; @override - String get timerSectionRestoreRecommended => 'Restore recommended times'; + String get timerSectionRestoreRecommended => 'استعادة الأوقات الموصى بها'; @override - String get newQuickAccessTitle => 'New quick access'; + String get newQuickAccessTitle => 'اختصار سريع جديد'; @override - String get saveQuickAccessButton => 'Save quick access'; + String get saveQuickAccessButton => 'حفظ الاختصار السريع'; @override - String get settingsSafeStatus => 'Safe'; + String get settingsSafeStatus => 'آمن'; @override - String get recordingsSectionTitle => 'Recordings'; + String get recordingsSectionTitle => 'التسجيلات'; @override - String get recordingsFolderDialogTitle => 'Select recordings folder'; + String get recordingsFolderDialogTitle => 'اختر مجلد التسجيلات'; @override - String get recordingsPathUpdated => 'Recording path updated'; + String get recordingsPathUpdated => 'تم تحديث مسار التسجيل'; @override String recordingsPathSaveError(Object error) { - return 'Could not save the path: $error'; + return 'تعذّر حفظ المسار: $error'; } @override String get recordingsDefaultFolderRestored => - 'The internal default folder will be used'; + 'سيتم استخدام المجلد الداخلي الافتراضي'; @override - String get recordingsFolderTitle => 'Recordings folder'; + String get recordingsFolderTitle => 'مجلد التسجيل'; @override - String get recordingsPathCalculating => 'Calculating path...'; + String get recordingsPathCalculating => 'جارٍ حساب المسار...'; @override - String get recordingsChangePath => 'Change path'; + String get recordingsChangePath => 'تغيير المسار'; @override - String get recordingsUseDefaultPath => 'Use default path'; + String get recordingsUseDefaultPath => 'استخدام المسار الافتراضي'; @override String get recordingsOriginalStreamHint => - 'The radio is saved from the original stream, without recompressing.'; + 'يتم حفظ الراديو من البث الأصلي، دون إعادة ضغط.'; @override - String get equalizerActive => 'Active'; + String get equalizerActive => 'نشط'; @override - String get equalizerDisabled => 'Disabled'; + String get equalizerDisabled => 'معطّل'; @override - String get equalizerEnable => 'Enable equalizer'; + String get equalizerEnable => 'تفعيل المعادل'; @override String get equalizerRealtimeSubtitle => - 'Changes are applied in real time to the current station.'; + 'تُطبّق التغييرات فورًا على المحطة الحالية.'; @override String get equalizerPendingSubtitle => - 'Changes are saved and will apply when Android enables the effect.'; + 'تُحفظ التغييرات وستُطبّق عندما يفعّل Android التأثير.'; @override - String get equalizerPerStationTitle => 'Use custom EQ for this favorite'; + String get equalizerPerStationTitle => 'استخدام معادل خاص لهذه المفضلة'; @override String equalizerPerStationActive(Object stationName) { - return 'Active for $stationName'; + return 'نشط لـ $stationName'; } @override String equalizerPerStationMain(Object stationName) { - return 'Using main EQ for $stationName'; + return 'استخدام المعادل الرئيسي لـ $stationName'; } @override - String get preferredStationTitle => 'Preferred station'; + String get preferredStationTitle => 'المحطة المفضلة'; @override String get preferredStationDescription => - 'Preselected for new alarms and available for quick playback.'; + 'يتم اختيارها مسبقًا عند إنشاء المنبهات ويمكن تشغيلها سريعًا.'; @override - String get preferredStationNoStationsTitle => 'No stations available yet'; + String get preferredStationNoStationsTitle => 'لا توجد محطات متاحة بعد'; @override String get preferredStationNoStationsSubtitle => - 'Save favorites or load stations to choose a preferred one.'; + 'احفظ المفضلات أو حمّل محطات لاختيار محطة مفضلة.'; @override - String get preferredStationAutomaticFallback => 'Automatic fallback'; + String get preferredStationAutomaticFallback => 'بديل تلقائي'; @override - String get preferredStationDefaultFavorite => 'Default favorite'; + String get preferredStationDefaultFavorite => 'المفضلة الافتراضية'; @override String preferredStationCurrent(Object stationName) { - return 'Current preferred: $stationName'; + return 'المفضلة الحالية: $stationName'; } @override String preferredStationAutoUsing(Object stationName) { - return 'No favorites: automatically using $stationName'; + return 'لا توجد مفضلات: يتم استخدام $stationName تلقائيًا'; } @override - String get preferredStationPlay => 'Play preferred'; + String get preferredStationPlay => 'تشغيل المفضلة'; @override - String get customStationsTitle => 'Custom stations'; + String get customStationsTitle => 'محطات مخصصة'; @override - String get customStationsAdd => 'Add'; + String get customStationsAdd => 'إضافة'; @override - String get customStationsEmpty => 'No custom stations.'; + String get customStationsEmpty => 'لا توجد محطات مخصصة.'; @override - String get playAction => 'Play'; + String get playAction => 'تشغيل'; @override - String get deleteAction => 'Delete'; + String get deleteAction => 'حذف'; @override - String get addStationTitle => 'Add station'; + String get addStationTitle => 'إضافة محطة'; @override - String get stationNameLabel => 'Name *'; + String get stationNameLabel => 'الاسم *'; @override - String get requiredField => 'Required field'; + String get unnamedStation => 'محطة بدون اسم'; @override - String get streamUrlLabel => 'Stream URL *'; + String get requiredField => 'حقل مطلوب'; @override - String get invalidUrl => 'Invalid URL'; + String get streamUrlLabel => 'رابط البث *'; @override - String get countryOptionalLabel => 'Country (optional)'; + String get invalidUrl => 'رابط غير صالح'; @override - String get saveStation => 'Save station'; + String get countryOptionalLabel => 'البلد (اختياري)'; @override - String get backupSectionTitle => 'Backup'; + String get saveStation => 'حفظ المحطة'; @override - String get backupExportTitle => 'Export configuration'; + String get backupSectionTitle => 'النسخ الاحتياطي'; + + @override + String get backupExportTitle => 'تصدير الإعدادات'; @override String get backupExportSubtitle => - 'Favorites, custom stations, and EQ presets'; + 'المفضلات والمحطات المخصصة وإعدادات المعادل المسبقة'; @override - String get backupImportTitle => 'Import configuration'; + String get backupImportTitle => 'استيراد الإعدادات'; @override - String get backupImportSubtitle => 'Restore from a backup file'; + String get backupImportSubtitle => 'استعادة من ملف نسخة احتياطية'; @override - String get backupShareSubject => 'PluriWave — backup'; + String get backupShareSubject => 'PluriWave — نسخة احتياطية'; @override String backupShareText(Object date) { - return 'PluriWave configuration exported on $date'; + return 'إعدادات PluriWave المصدّرة في $date'; } @override String backupExportError(Object error) { - return 'Export error: $error'; + return 'خطأ أثناء التصدير: $error'; } @override String get backupImportConfirmMessage => - 'This will add favorites, stations, and presets from the file. Continue?'; + 'سيضيف هذا المفضلات والمحطات وإعدادات المعادل من الملف. هل تريد المتابعة؟'; @override - String get backupImportSuccess => 'Configuration imported successfully'; + String get backupImportSuccess => 'تم استيراد الإعدادات بنجاح'; @override String backupImportError(Object error) { - return 'Import error: $error'; + return 'خطأ أثناء الاستيراد: $error'; } @override - String get appVersionLoading => 'Loading version...'; + String get appVersionLoading => 'جارٍ تحميل الإصدار...'; @override String appVersionSubtitle(Object version) { - return '$version - World radio'; + return '$version - راديو عالمي'; } @override - String get savedFavoritesTitle => 'Saved favorites'; + String get savedFavoritesTitle => 'المفضلات المحفوظة'; @override - String get stationFilterTitle => 'Station filter'; + String get stationFilterTitle => 'فلتر المحطات'; @override - String get stationFilterSubtitle => 'Only stations verified as active'; + String get stationFilterSubtitle => 'المحطات المؤكدة كنشطة فقط'; @override - String get backgroundAudioTitle => 'Background audio'; + String get backgroundAudioTitle => 'الصوت في الخلفية'; @override - String get backgroundAudioSubtitle => 'Continues when the screen turns off'; + String get backgroundAudioSubtitle => 'يستمر عند إطفاء الشاشة'; @override String get dash => '—'; @override - String get cancelAction => 'Cancel'; + String get cancelAction => 'إلغاء'; @override - String get equalizerTitle => 'Equalizer'; + String get equalizerTitle => 'المعادل'; @override - String get recordingsOpenFolder => 'Open folder'; + String get recordingsOpenFolder => 'فتح المجلد'; @override String recordingsOpenFolderError(Object error) { - return 'Could not open the folder: $error'; + return 'تعذّر فتح المجلد: $error'; } @override - String get recordingsMaxSizeTitle => 'Maximum recording size'; + String get recordingsMaxSizeTitle => 'الحد الأقصى لحجم التسجيل'; @override String recordingsMaxSizeSubtitle(int size) { - return 'Current limit: $size MB'; + return 'الحد الحالي: $size ميغابايت'; } @override - String get recordingsMaxSizeDialogTitle => 'Maximum size per recording'; + String get recordingsMaxSizeDialogTitle => 'الحد الأقصى للحجم لكل تسجيل'; @override - String get recordingsMaxSizeMbLabel => 'Maximum megabytes'; + String get recordingsMaxSizeMbLabel => 'الحد الأقصى بالميغابايت'; @override String recordingsMaxSizeSaved(int size) { - return 'Recording limit updated to $size MB'; + return 'تم تحديث حد التسجيل إلى $size ميغابايت'; } @override - String get stationOrderTitle => 'Station order'; + String get stationOrderTitle => 'ترتيب المحطات'; @override - String get stationOrderByName => 'By name'; + String get stationOrderByName => 'حسب الاسم'; @override - String get stationOrderByQuality => 'By quality'; + String get stationOrderByQuality => 'حسب الجودة'; @override String get stationOrderScopeDescription => - 'Applies to favorites, searches, nearby stations and quick lists.'; + 'ينطبق على المفضلات وعمليات البحث والمحطات القريبة والقوائم السريعة.'; @override - String get favoriteGroupsTitle => 'Favorite lists'; + String get favoriteGroupsTitle => 'قوائم المفضلة'; @override String get favoriteGroupsDescription => - 'Create short lists to organize your saved stations.'; + 'أنشئ قوائم قصيرة لتنظيم محطاتك المحفوظة.'; @override - String get favoriteGroupsAdd => 'Add list'; + String get favoriteGroupsAdd => 'إضافة قائمة'; @override - String get favoriteGroupsEdit => 'Edit list'; + String get favoriteGroupsEdit => 'تعديل القائمة'; @override - String get favoriteGroupsDelete => 'Delete list'; + String get favoriteGroupsDelete => 'حذف القائمة'; @override - String get favoriteGroupsNameLabel => 'List name'; + String get favoriteGroupsNameLabel => 'اسم القائمة'; @override - String get favoriteGroupsNameTooLong => 'Maximum 28 characters.'; + String get favoriteGroupsNameTooLong => 'الحد الأقصى 28 حرفًا.'; @override - String get favoriteGroupsUnassigned => 'Unassigned'; + String get favoriteGroupsUnassigned => 'غير معيّنة'; @override String get favoriteGroupsProtectedHint => - 'Default list: it cannot be edited or deleted.'; + 'القائمة الافتراضية: لا يمكن تعديلها أو حذفها.'; @override - String get favoriteGroupsCreated => 'List created'; + String get favoriteGroupsCreated => 'تم إنشاء القائمة'; @override - String get favoriteGroupsUpdated => 'List updated'; + String get favoriteGroupsUpdated => 'تم تحديث القائمة'; @override String get favoriteGroupsDeleted => - 'List deleted; its stations return to Unassigned.'; + 'تم حذف القائمة؛ عادت محطاتها إلى غير معيّنة.'; @override - String get favoriteGroupsAssign => 'Move to list'; + String get favoriteGroupsAssign => 'نقل إلى قائمة'; @override String favoriteGroupsAssignSubtitle(Object groupName) { - return 'Current list: $groupName'; + return 'القائمة الحالية: $groupName'; } @override String favoriteGroupsAssigned(Object stationName, Object groupName) { - return '$stationName moved to $groupName'; + return 'تم نقل $stationName إلى $groupName'; } @override - String get favoritesTitle => 'Favorites'; + String get favoritesTitle => 'المفضلة'; @override - String get favoritesEmptyTitle => 'No favorites yet'; + String get favoritesEmptyTitle => 'لا توجد مفضلات بعد'; @override String get favoritesEmptySubtitle => - 'Tap the heart on any station to save it to your collection.'; + 'اضغط على القلب في أي محطة لحفظها في مجموعتك.'; @override String get favoritesHeaderSubtitle => - 'Organize your collection by lists and keep important radios close.'; + 'نظّم مجموعتك في قوائم وأبقِ المحطات المهمة قريبة.'; @override - String get favoritesCollection => 'Collection'; + String get favoritesCollection => 'المجموعة'; @override String favoritesSavedCount(int count) { - return '$count saved'; + return '$count محفوظة'; } @override - String get favoritesRemoveTooltip => 'Remove from favorites'; + String get favoritesRemoveTooltip => 'إزالة من المفضلة'; @override String favoritesRemovedMessage(Object stationName) { - return '$stationName removed from favorites'; + return 'تمت إزالة $stationName من المفضلة'; } + + @override + String get alarmPostponedCurrentExecution => 'تم تأجيل المنبه لهذا التشغيل.'; + + @override + String get searchScreenTitle => 'البحث عن إشارة'; + + @override + String get searchScreenSubtitle => + 'اعثر على إذاعات حسب الاسم أو البلد أو اللغة باستخدام فلاتر سريعة وتباين عالٍ.'; + + @override + String get searchFiltersLabel => 'الفلاتر'; + + @override + String get searchHint => 'راديو هورايزن، جاز، أخبار...'; + + @override + String get searchCountryFilterLabel => 'البلد'; + + @override + String get searchLanguageFilterLabel => 'اللغة'; + + @override + String get searchMinQualityFilterLabel => 'الحد الأدنى للجودة'; + + @override + String get searchEmptyTitle => 'ابحث عن محطة'; + + @override + String get searchNoResultsTitle => 'لا توجد نتائج'; + + @override + String get searchEmptySubtitle => + 'استخدم الشريط العلوي أو الشرائح لاكتشاف إشارات من كل العالم.'; + + @override + String get searchNoResultsSubtitle => + 'جرّب إزالة الفلاتر أو كتابة اسم آخر للعثور على إشارة نشطة.'; + + @override + String get countrySpain => 'إسبانيا'; + + @override + String get countryUsa => 'الولايات المتحدة'; + + @override + String get countryMexico => 'المكسيك'; + + @override + String get countryArgentina => 'الأرجنتين'; + + @override + String get countryUk => 'المملكة المتحدة'; + + @override + String get countryFrance => 'فرنسا'; + + @override + String get countryGermany => 'ألمانيا'; + + @override + String get countryItaly => 'إيطاليا'; + + @override + String get countryBrazil => 'البرازيل'; + + @override + String get countryJapan => 'اليابان'; + + @override + String get languageNameSpanish => 'الإسبانية'; + + @override + String get languageNameEnglish => 'الإنجليزية'; + + @override + String get languageNameFrench => 'الفرنسية'; + + @override + String get languageNameGerman => 'الألمانية'; + + @override + String get languageNamePortuguese => 'البرتغالية'; + + @override + String get languageNameItalian => 'الإيطالية'; + + @override + String get languageNameJapanese => 'اليابانية'; + + @override + String get languageNameArabic => 'العربية'; + + @override + String get languageNameRussian => 'الروسية'; + + @override + String get homeScreenSubtitle => + 'راديو عالمي مباشر بإشارات نقية ومفضلات ذكية وتجربة بصرية بأسلوب المسابقات.'; + + @override + String get exploreStations => 'استكشاف المحطات'; + + @override + String stationsCount(int count) { + return '$count محطة راديو'; + } + + @override + String get qualityHd => 'جودة HD'; + + @override + String get nearYou => 'بالقرب منك'; + + @override + String nearYouInCountry(Object country) { + return 'بالقرب منك · $country'; + } + + @override + String get detectAction => 'اكتشاف'; + + @override + String get liveRadar => 'رادار مباشر'; + + @override + String get genresTitle => 'الأنواع'; + + @override + String get retryAction => 'إعادة المحاولة'; + + @override + String get noStationsAvailable => 'لا توجد محطات متاحة'; + + @override + String get noStationsAvailableSubtitle => + 'جرّب التحديث أو اختيار نوع آخر لالتقاط الإشارة من جديد.'; + + @override + String get genrePop => 'بوب'; + + @override + String get genreRock => 'روك'; + + @override + String get genreJazz => 'جاز'; + + @override + String get genreClassical => 'كلاسيكي'; + + @override + String get genreElectronic => 'إلكترونية'; + + @override + String get genreNews => 'أخبار'; + + @override + String get genreTalk => 'حوارات'; + + @override + String get genreHipHop => 'هيب هوب'; + + @override + String get genreCountry => 'كانتري'; + + @override + String get genreMetal => 'ميتال'; + + @override + String get genreReggae => 'ريغي'; + + @override + String get genreLatin => 'لاتينية'; + + @override + String get alarmScreenTitle => 'الاستيقاظ الموسيقي'; + + @override + String get alarmScreenSubtitle => + 'منبهات بالراديو وصوت آمن وإجازات ذكية والتنفيذ التالي ظاهر دائمًا.'; + + @override + String get createAlarmAction => 'إنشاء منبه'; + + @override + String alarmsCount(int count) { + return '$count منبهات'; + } + + @override + String get activeAlarmsWithoutNextTitle => 'منبهات نشطة بلا تشغيل قادم'; + + @override + String get noActiveAlarms => 'لا توجد منبهات نشطة'; + + @override + String get nextAlarmTitle => 'المنبه التالي'; + + @override + String activeAlarmsWithoutNextSubtitle(int count) { + return 'توجد $count منبهات نشطة، لكنها لا تملك حاليًا تاريخًا مستقبليًا صالحًا. راجع التاريخ والأيام والإجازات.'; + } + + @override + String get createAlarmHint => + 'أنشئ منبهًا وسيحسب PluriWave التشغيل التالي تلقائيًا.'; + + @override + String get alarmVacationPlay => 'يرن في الإجازات'; + + @override + String get alarmVacationPause => 'يتوقف في الإجازات'; + + @override + String alarmFadeInLabel(int seconds) { + return 'تدرّج الصوت $secondsث'; + } + + @override + String alarmNextExecution(Object date) { + return 'التشغيل التالي: $date'; + } + + @override + String get alarmNoNextExecution => 'لا يوجد تشغيل نشط قادم.'; + + @override + String alarmSkippedExecution(Object date) { + return 'تم تخطي تشغيل: $date.'; + } + + @override + String get editAction => 'تعديل'; + + @override + String get skipNextAction => 'تخطي التالي'; + + @override + String get deleteTooltip => 'حذف'; + + @override + String get alarmSkippedNoNextSnackbar => + 'تم تخطي المنبه. لا يوجد تشغيل قادم.'; + + @override + String alarmSkippedReturnsSnackbar(Object date) { + return 'تم تخطي المنبه. سيعود في $date.'; + } + + @override + String alarmVacationPausedNoNext(Object vacationName) { + return 'متوقف بسبب الإجازة ($vacationName) ولا يوجد تشغيل قادم.'; + } + + @override + String alarmVacationPausedReturns(Object vacationName, Object date) { + return 'متوقف بسبب الإجازة ($vacationName) وسيعود في $date.'; + } + + @override + String alarmVacationReturns(Object date) { + return 'مع تفعيل الإجازات، سيعود للرنين في $date.'; + } + + @override + String get defaultAlarmName => 'منبه موسيقي'; + + @override + String get newAlarmTitle => 'منبه جديد'; + + @override + String get editAlarmTitle => 'تعديل المنبه'; + + @override + String get nameField => 'الاسم'; + + @override + String get timeField => 'الوقت'; + + @override + String get dateField => 'التاريخ'; + + @override + String get onceOption => 'مرة واحدة'; + + @override + String get dailyOption => 'يومي'; + + @override + String get weekdaysOption => 'أيام'; + + @override + String get soundAndVolumeSection => 'الصوت ومستوى الصوت'; + + @override + String get alarmFadeInTitle => 'تدرّج صوت المنبه'; + + @override + String get alarmFadeInOff => '0 ث (بدون انتقال)'; + + @override + String alarmFadeInSummary(int seconds) { + return '$seconds ث (من 5% إلى مستوى الصوت المختار)'; + } + + @override + String get internalSafeSoundLabel => 'صوت داخلي آمن'; + + @override + String get soundWarmSunrise => 'شروق دافئ'; + + @override + String get soundSoftBell => 'جرس ناعم'; + + @override + String get soundDigitalPulse => 'نبضة رقمية'; + + @override + String get favoriteStationLabel => 'المحطة المفضلة'; + + @override + String get noStationUseInternalSound => 'بدون محطة: استخدام الصوت الداخلي'; + + @override + String get saveFavoritesAlarmHint => + 'احفظ محطات في المفضلة لاستخدامها كمنبه موسيقي.'; + + @override + String get useCurrentStationAction => 'استخدام المحطة الحالية'; + + @override + String get playDuringVacations => 'الرنين أثناء الإجازات'; + + @override + String get playDuringVacationsHint => + 'إذا أوقفت ذلك، سيتخطى التشغيل التالي إلى أول يوم صالح.'; + + @override + String get saveAlarmAction => 'حفظ المنبه'; + + @override + String get chooseOneWeekdayError => 'اختر يومًا واحدًا على الأقل من الأسبوع.'; + + @override + String get androidReliabilityReview => 'مراجعة موثوقية Android'; + + @override + String get statusOk => 'حسنًا'; + + @override + String get statusPending => 'معلّق'; + + @override + String androidReliabilityStatus( + Object exact, + Object notifications, + Object screen, + ) { + return 'الموثوقية: الدقيقة $exact · الإشعارات $notifications · الشاشة $screen'; + } + + @override + String get vacationRangesTitle => 'نطاقات الإجازات'; + + @override + String get addAction => 'إضافة'; + + @override + String get vacationRangesHint => + 'إذا كان المنبه لديه \"توقف في الإجازات\"، فسيتم تخطي هذه النطاقات تلقائيًا.'; + + @override + String get noVacationRangesLoaded => 'لا توجد نطاقات محمّلة.'; + + @override + String get deleteRangeTooltip => 'حذف النطاق'; + + @override + String get vacationsDefaultName => 'إجازات'; + + @override + String get newVacationRangeTitle => 'نطاق إجازة جديد'; + + @override + String get startField => 'البداية'; + + @override + String get endField => 'النهاية'; + + @override + String get saveRangeAction => 'حفظ النطاق'; + + @override + String get noAlarmsYetTitle => 'لا توجد منبهات بعد.'; + + @override + String get noAlarmsYetSubtitle => 'أنشئ واحدًا لتصميم استيقاظك الموسيقي.'; + + @override + String get ringingInternalAudioActive => 'يرن باستخدام الصوت الداخلي الآمن.'; + + @override + String get ringingPreparingInternalAudio => 'جارٍ تجهيز الصوت الداخلي الآمن.'; + + @override + String get stopAlarmAction => 'إيقاف المنبه'; + + @override + String get pauseAction => 'إيقاف مؤقت'; + + @override + String miniPlayerOpenLabel(Object stationName) { + return 'فتح المشغل لـ $stationName'; + } + + @override + String get playerIconLabel => 'المشغل'; + + @override + String get playbackStatusConnecting => 'جارٍ الاتصال...'; + + @override + String get playbackStatusLive => 'مباشر'; + + @override + String get playbackStatusPaused => 'متوقف مؤقتًا'; + + @override + String get playbackStatusConnectionError => 'خطأ في الاتصال'; + + @override + String get playbackStatusStopped => 'متوقف'; + + @override + String stationSemanticLabel(Object stationName) { + return 'محطة $stationName'; + } + + @override + String get favoritesAddTooltip => 'إضافة إلى المفضلة'; + + @override + String favoritesAddedMessage(Object stationName) { + return 'تمت إضافة $stationName إلى المفضلة'; + } + + @override + String get stationIconLabel => 'أيقونة المحطة'; + + @override + String get liveNow => 'مباشر الآن'; + + @override + String equalizerBandLabel(Object band) { + return 'النطاق $band'; + } + + @override + String equalizerBandValue(Object value) { + return '$value ديسيبل'; + } + + @override + String get equalizerPresetFlat => 'مسطح'; + + @override + String get equalizerPresetRock => 'روك'; + + @override + String get equalizerPresetPop => 'بوب'; + + @override + String get equalizerPresetBassBoost => 'تعزيز الجهير'; + + @override + String get equalizerPresetJazz => 'جاز'; + + @override + String get equalizerPresetVoice => 'صوت'; + + @override + String get equalizerPresetCustom => 'مخصص'; + + @override + String get onboardingTitle => 'مرحبًا بك في PluriWave'; + + @override + String get onboardingNewsTitle => 'المستجدات'; + + @override + String get onboardingStartAction => 'ابدأ'; + + @override + String get onboardingCloseTooltip => 'إغلاق'; + + @override + String radioRecordingError(Object error) { + return 'خطأ أثناء تسجيل الراديو: $error'; + } + + @override + String get radioApiConnectionError => + 'لا يوجد اتصال بواجهة برمجة تطبيقات الراديو'; + + @override + String get radioSearchError => 'خطأ في البحث. تحقق من اتصالك.'; + + @override + String get radioLoadMoreStationsError => 'تعذر تحميل المزيد من المحطات.'; + + @override + String get radioNearbyStationsError => + 'تعذر علينا اكتشاف محطات قريبة. استخدم عوامل التصفية حسب البلد.'; + + @override + String radioCannotPlayStation(Object stationName) { + return 'لا يمكن تشغيل \"$stationName\"'; + } + + @override + String get recordingSelectStationFirst => 'اختر محطة أولًا للتسجيل.'; + + @override + String recordingStartError(Object error) { + return 'تعذر بدء التسجيل: $error'; + } + + @override + String get unsupportedConfigVersion => 'إصدار الإعدادات غير مدعوم'; + + @override + String get audioErrorGeneric => 'خطأ في التشغيل'; + + @override + String get audioErrorNoInternet => 'لا يوجد اتصال بالإنترنت'; + + @override + String get audioErrorInvalidUrl => 'عنوان الراديو غير صالح'; + + @override + String get audioErrorNotFound => 'الراديو غير متاح (خطأ 404)'; + + @override + String get audioErrorTimeout => 'انتهت مهلة الاتصال'; + + @override + String get audioErrorCannotConnect => 'لا يمكن الاتصال بالراديو'; + + @override + String get audioErrorUnsupportedFormat => 'تنسيق البث غير مدعوم'; + + @override + String get audioErrorDecode => 'خطأ أثناء فك ترميز بث الصوت'; + + @override + String get audioErrorCleartext => + 'تستخدم هذه المحطة HTTP غير مشفّر، وهذا غير مسموح'; + + @override + String get audioErrorSsl => 'شهادة SSL غير صالحة في الراديو'; + + @override + String get audioErrorCannotPlay => 'لا يمكن تشغيل هذه المحطة'; + + @override + String get audioErrorUnexpectedPlayback => 'خطأ غير متوقع أثناء التشغيل'; + + @override + String get androidExactAlarmScheduleError => + 'تعذر على Android جدولة منبه دقيق. تحقق من إذن المنبهات الدقيقة.'; + + @override + String get recordingPathEmptyError => 'لا يمكن أن يكون مسار التسجيل فارغًا'; + + @override + String get recordingMaxSizeInvalidError => + 'يجب أن يكون الحجم الأقصى أكبر من الصفر'; + + @override + String get recordingAlreadyActiveError => 'يوجد تسجيل قيد التنفيذ بالفعل'; + + @override + String get alarmRingingFallbackActive => + 'يعمل الآن باستخدام الصوت الداخلي الآمن.'; + + @override + String get alarmRingingPreparingFallback => 'جارٍ تجهيز الصوت الداخلي الآمن.'; + + @override + String get alarmRingingTryingStation => + 'جارٍ محاولة تشغيل محطتك بأعلى جودة متاحة.'; + + @override + String alarmScheduleOnce(Object date) { + return 'مرة واحدة · $date'; + } + + @override + String alarmScheduleWeekdays(Object days) { + return 'الأيام: $days'; + } + + @override + String get androidReliabilityTitle => 'مراجعة موثوقية Android'; + + @override + String get closeAction => 'إغلاق'; + + @override + String get customOption => 'مخصص'; + + @override + String get endLabel => 'النهاية'; + + @override + String get equalizerDisable => 'تعطيل المعادل'; + + @override + String get helpTitle => 'المساعدة والشرح'; + + @override + String get helpSubtitle => 'راجع ميزات PluriWave والنصائح والمستجدات.'; + + @override + String get indefiniteOption => 'غير محدد'; + + @override + String get invalidNumber => 'رقم غير صالح'; + + @override + String get nameLabel => 'الاسم'; + + @override + String get notPlaying => 'لا يتم التشغيل'; + + @override + String get oneTimeOption => 'مرة واحدة'; + + @override + String get pausePlaybackTooltip => 'إيقاف مؤقت'; + + @override + String qualityOriginal(Object quality) { + return 'الجودة الأصلية: $quality'; + } + + @override + String get qualityUnknown => 'الجودة غير مذكورة'; + + @override + String get recordAction => 'تسجيل'; + + @override + String get recordDurationTitle => 'مدة التسجيل'; + + @override + String get recordRadioSubtitle => 'اختر مدة التسجيل.'; + + @override + String get recordRadioTitle => 'تسجيل الراديو'; + + @override + String get recordingActiveTitle => 'جارٍ تسجيل الراديو'; + + @override + String get recordingDirectTitle => 'تسجيل مباشر'; + + @override + String get recordingsOpenFolderPlainError => 'تعذر فتح مجلد التسجيلات'; + + @override + String get recordingsOpenLatest => 'فتح آخر تسجيل'; + + @override + String get recordingsOpenLatestError => 'تعذر فتح آخر تسجيل'; + + @override + String get startLabel => 'البداية'; + + @override + String get startPlaybackTooltip => 'بدء التشغيل'; + + @override + String get stopAction => 'إيقاف'; + + @override + String get stopPlaybackTooltip => 'إيقاف التشغيل'; + + @override + String get weekdayShortMonday => 'الإثنين'; + + @override + String get weekdayShortTuesday => 'الثلاثاء'; + + @override + String get weekdayShortWednesday => 'الأربعاء'; + + @override + String get weekdayShortThursday => 'الخميس'; + + @override + String get weekdayShortFriday => 'الجمعة'; + + @override + String get weekdayShortSaturday => 'السبت'; + + @override + String get weekdayShortSunday => 'الأحد'; } diff --git a/lib/l10n/gen/app_localizations_bn.dart b/lib/l10n/gen/app_localizations_bn.dart index 551dbd5..8218821 100644 --- a/lib/l10n/gen/app_localizations_bn.dart +++ b/lib/l10n/gen/app_localizations_bn.dart @@ -12,440 +12,1184 @@ class AppLocalizationsBn extends AppLocalizations { String get appTitle => 'PluriWave'; @override - String get navHome => 'Home'; + String get navHome => 'হোম'; @override - String get navSearch => 'Search'; + String get navSearch => 'অনুসন্ধান'; @override - String get navFavorites => 'Favorites'; + String get navFavorites => 'প্রিয়'; @override - String get navAlarms => 'Alarms'; + String get navAlarms => 'অ্যালার্ম'; @override - String get navSettings => 'Settings'; + String get navSettings => 'সেটিংস'; @override - String get actionOk => 'OK'; + String get actionOk => 'ঠিক আছে'; @override - String get sleepTimer => 'Sleep timer'; + String get sleepTimer => 'ঘুমের টাইমার'; @override String get sleepTimerDescription => - 'Smooth radio shutdown with an exact countdown.'; + 'নির্ভুল কাউন্টডাউন দিয়ে রেডিও মসৃণভাবে বন্ধ করা।'; @override - String get cancelTimer => 'Cancel timer'; + String get cancelTimer => 'টাইমার বাতিল করুন'; @override - String get optionOther => 'Other'; + String get optionOther => 'অন্যান্য'; @override - String get customDurationTitle => 'Custom duration'; + String get customDurationTitle => 'নিজস্ব সময়কাল'; @override - String get durationGreaterThanZero => 'Choose a duration greater than zero.'; + String get durationGreaterThanZero => + 'শূন্যের চেয়ে বেশি একটি সময়কাল বেছে নিন।'; @override - String get hoursLabel => 'Hours'; + String get hoursLabel => 'ঘণ্টা'; @override - String get minutesLabel => 'Minutes'; + String get minutesLabel => 'মিনিট'; @override - String get secondsLabel => 'Seconds'; + String get secondsLabel => 'সেকেন্ড'; @override - String get saveQuickAccess => 'Save as quick access'; + String durationHoursMinutesSeconds( + Object hours, + Object minutes, + Object seconds, + ) { + return '$hours ? $minutes ?? $seconds ??'; + } @override - String get startTimer => 'Start timer'; + String durationMinutesSeconds(Object minutes, Object seconds) { + return '$minutes ?? $seconds ??'; + } + + @override + String durationMinutesOnly(Object minutes) { + return '$minutes ??'; + } + + @override + String durationSecondsOnly(Object seconds) { + return '$seconds ??'; + } + + @override + String get saveQuickAccess => 'দ্রুত অ্যাক্সেস হিসেবে সংরক্ষণ করুন'; + + @override + String get startTimer => 'টাইমার শুরু করুন'; @override String skipCurrentAlarmExecution(Object alarmName) { - return 'Skipped this execution of $alarmName.'; + return '$alarmName-এর এই চালনা এড়িয়ে দেওয়া হয়েছে।'; } @override - String get settingsTitle => 'Settings'; + String get settingsTitle => 'সেটিংস'; @override String get settingsSubtitle => - 'Fine-grained sound control, backups, and custom stations.'; + 'শব্দ, ব্যাকআপ এবং নিজস্ব স্টেশনের সূক্ষ্ম নিয়ন্ত্রণ।'; @override - String get languageSectionTitle => 'Language'; + String get languageSectionTitle => 'ভাষা'; @override String get languageSectionDescription => - 'Choose how the app language is displayed.'; + 'অ্যাপের ভাষা কীভাবে দেখাবে তা বেছে নিন।'; @override - String get languageSystemDefault => 'System'; + String get languageSystemDefault => 'সিস্টেম'; @override - String get languageSpanish => 'Spanish'; + String get languageSpanish => 'স্প্যানিশ'; @override - String get languageEnglish => 'English'; + String get languageEnglish => 'ইংরেজি'; @override String languageUpdated(Object languageName) { - return 'Language updated: $languageName'; + return 'ভাষা আপডেট হয়েছে: $languageName'; } @override - String get languageUpdatedSystem => 'Language updated: System'; + String get languageUpdatedSystem => 'ভাষা আপডেট হয়েছে: সিস্টেম'; @override - String get timerSectionTitle => 'Sleep timer'; + String get timerSectionTitle => 'ঘুমের টাইমার'; @override - String get timerSectionAdd => 'Add'; + String get timerSectionAdd => 'যোগ করুন'; @override String get timerSectionDescription => - 'Customize the quick presets shown when automatically stopping the radio.'; + 'রেডিও স্বয়ংক্রিয়ভাবে বন্ধ করার সময় দেখা যায় এমন দ্রুত প্রিসেটগুলো সাজান।'; @override - String get timerSectionRestoreRecommended => 'Restore recommended times'; + String get timerSectionRestoreRecommended => 'প্রস্তাবিত সময় ফিরিয়ে আনুন'; @override - String get newQuickAccessTitle => 'New quick access'; + String get newQuickAccessTitle => 'নতুন দ্রুত অ্যাক্সেস'; @override - String get saveQuickAccessButton => 'Save quick access'; + String get saveQuickAccessButton => 'দ্রুত অ্যাক্সেস সংরক্ষণ করুন'; @override - String get settingsSafeStatus => 'Safe'; + String get settingsSafeStatus => 'নিরাপদ'; @override - String get recordingsSectionTitle => 'Recordings'; + String get recordingsSectionTitle => 'রেকর্ডিং'; @override - String get recordingsFolderDialogTitle => 'Select recordings folder'; + String get recordingsFolderDialogTitle => 'রেকর্ডিং ফোল্ডার নির্বাচন করুন'; @override - String get recordingsPathUpdated => 'Recording path updated'; + String get recordingsPathUpdated => 'রেকর্ডিং পথ আপডেট হয়েছে'; @override String recordingsPathSaveError(Object error) { - return 'Could not save the path: $error'; + return 'পথ সংরক্ষণ করা যায়নি: $error'; } @override String get recordingsDefaultFolderRestored => - 'The internal default folder will be used'; + 'ডিফল্ট অভ্যন্তরীণ ফোল্ডার ব্যবহার করা হবে'; @override - String get recordingsFolderTitle => 'Recordings folder'; + String get recordingsFolderTitle => 'রেকর্ডিং ফোল্ডার'; @override - String get recordingsPathCalculating => 'Calculating path...'; + String get recordingsPathCalculating => 'পথ গণনা করা হচ্ছে...'; @override - String get recordingsChangePath => 'Change path'; + String get recordingsChangePath => 'পথ পরিবর্তন করুন'; @override - String get recordingsUseDefaultPath => 'Use default path'; + String get recordingsUseDefaultPath => 'ডিফল্ট পথ ব্যবহার করুন'; @override String get recordingsOriginalStreamHint => - 'The radio is saved from the original stream, without recompressing.'; + 'রেডিওটি মূল স্ট্রিম থেকে সংরক্ষিত হয়, পুনরায় কমপ্রেস করা হয় না।'; @override - String get equalizerActive => 'Active'; + String get equalizerActive => 'সক্রিয়'; @override - String get equalizerDisabled => 'Disabled'; + String get equalizerDisabled => 'নিষ্ক্রিয়'; @override - String get equalizerEnable => 'Enable equalizer'; + String get equalizerEnable => 'ইকুয়ালাইজার চালু করুন'; @override String get equalizerRealtimeSubtitle => - 'Changes are applied in real time to the current station.'; + 'পরিবর্তনগুলো বর্তমান স্টেশনে তাৎক্ষণিকভাবে প্রয়োগ হয়।'; @override String get equalizerPendingSubtitle => - 'Changes are saved and will apply when Android enables the effect.'; + 'পরিবর্তনগুলো সংরক্ষিত থাকবে এবং Android প্রভাব চালু করলে প্রয়োগ হবে।'; @override - String get equalizerPerStationTitle => 'Use custom EQ for this favorite'; + String get equalizerPerStationTitle => + 'এই প্রিয়টির জন্য নিজস্ব ইকুয়ালাইজার ব্যবহার করুন'; @override String equalizerPerStationActive(Object stationName) { - return 'Active for $stationName'; + return '$stationName-এর জন্য সক্রিয়'; } @override String equalizerPerStationMain(Object stationName) { - return 'Using main EQ for $stationName'; + return '$stationName-এর জন্য মূল ইকুয়ালাইজার ব্যবহার করা হচ্ছে'; } @override - String get preferredStationTitle => 'Preferred station'; + String get preferredStationTitle => 'পছন্দের স্টেশন'; @override String get preferredStationDescription => - 'Preselected for new alarms and available for quick playback.'; + 'নতুন অ্যালার্মে আগে থেকে বেছে নেওয়া হয় এবং দ্রুত চালানো যায়।'; @override - String get preferredStationNoStationsTitle => 'No stations available yet'; + String get preferredStationNoStationsTitle => 'এখনও কোনো স্টেশন উপলব্ধ নেই'; @override String get preferredStationNoStationsSubtitle => - 'Save favorites or load stations to choose a preferred one.'; + 'পছন্দের স্টেশন বেছে নিতে প্রিয় সংরক্ষণ করুন বা স্টেশন লোড করুন।'; @override - String get preferredStationAutomaticFallback => 'Automatic fallback'; + String get preferredStationAutomaticFallback => 'স্বয়ংক্রিয় বিকল্প'; @override - String get preferredStationDefaultFavorite => 'Default favorite'; + String get preferredStationDefaultFavorite => 'ডিফল্ট প্রিয়'; @override String preferredStationCurrent(Object stationName) { - return 'Current preferred: $stationName'; + return 'বর্তমান পছন্দের: $stationName'; } @override String preferredStationAutoUsing(Object stationName) { - return 'No favorites: automatically using $stationName'; + return 'কোনো প্রিয় নেই: স্বয়ংক্রিয়ভাবে $stationName ব্যবহার করা হচ্ছে'; } @override - String get preferredStationPlay => 'Play preferred'; + String get preferredStationPlay => 'পছন্দেরটি চালান'; @override - String get customStationsTitle => 'Custom stations'; + String get customStationsTitle => 'নিজস্ব স্টেশন'; @override - String get customStationsAdd => 'Add'; + String get customStationsAdd => 'যোগ করুন'; @override - String get customStationsEmpty => 'No custom stations.'; + String get customStationsEmpty => 'কোনো নিজস্ব স্টেশন নেই।'; @override - String get playAction => 'Play'; + String get playAction => 'চালান'; @override - String get deleteAction => 'Delete'; + String get deleteAction => 'মুছুন'; @override - String get addStationTitle => 'Add station'; + String get addStationTitle => 'স্টেশন যোগ করুন'; @override - String get stationNameLabel => 'Name *'; + String get stationNameLabel => 'নাম *'; @override - String get requiredField => 'Required field'; + String get unnamedStation => 'নামহীন স্টেশন'; @override - String get streamUrlLabel => 'Stream URL *'; + String get requiredField => 'আবশ্যক ক্ষেত্র'; @override - String get invalidUrl => 'Invalid URL'; + String get streamUrlLabel => 'স্ট্রিম URL *'; @override - String get countryOptionalLabel => 'Country (optional)'; + String get invalidUrl => 'অবৈধ URL'; @override - String get saveStation => 'Save station'; + String get countryOptionalLabel => 'দেশ (ঐচ্ছিক)'; @override - String get backupSectionTitle => 'Backup'; + String get saveStation => 'স্টেশন সংরক্ষণ করুন'; @override - String get backupExportTitle => 'Export configuration'; + String get backupSectionTitle => 'ব্যাকআপ'; + + @override + String get backupExportTitle => 'সেটিংস রপ্তানি করুন'; @override String get backupExportSubtitle => - 'Favorites, custom stations, and EQ presets'; + 'প্রিয়, নিজস্ব স্টেশন এবং ইকুয়ালাইজার প্রিসেট'; @override - String get backupImportTitle => 'Import configuration'; + String get backupImportTitle => 'সেটিংস আমদানি করুন'; @override - String get backupImportSubtitle => 'Restore from a backup file'; + String get backupImportSubtitle => 'ব্যাকআপ ফাইল থেকে পুনরুদ্ধার করুন'; @override - String get backupShareSubject => 'PluriWave — backup'; + String get backupShareSubject => 'PluriWave — ব্যাকআপ'; @override String backupShareText(Object date) { - return 'PluriWave configuration exported on $date'; + return '$date তারিখে রপ্তানি করা PluriWave সেটিংস'; } @override String backupExportError(Object error) { - return 'Export error: $error'; + return 'রপ্তানির সময় ত্রুটি: $error'; } @override String get backupImportConfirmMessage => - 'This will add favorites, stations, and presets from the file. Continue?'; + 'এটি ফাইলের প্রিয়, স্টেশন এবং প্রিসেট যোগ করবে। চালিয়ে যাবেন?'; @override - String get backupImportSuccess => 'Configuration imported successfully'; + String get backupImportSuccess => 'সেটিংস সফলভাবে আমদানি হয়েছে'; @override String backupImportError(Object error) { - return 'Import error: $error'; + return 'আমদানির সময় ত্রুটি: $error'; } @override - String get appVersionLoading => 'Loading version...'; + String get appVersionLoading => 'সংস্করণ লোড হচ্ছে...'; @override String appVersionSubtitle(Object version) { - return '$version - World radio'; + return '$version - বিশ্ব রেডিও'; } @override - String get savedFavoritesTitle => 'Saved favorites'; + String get savedFavoritesTitle => 'সংরক্ষিত প্রিয়'; @override - String get stationFilterTitle => 'Station filter'; + String get stationFilterTitle => 'স্টেশন ফিল্টার'; @override - String get stationFilterSubtitle => 'Only stations verified as active'; + String get stationFilterSubtitle => 'শুধু সক্রিয় হিসেবে যাচাই করা স্টেশন'; @override - String get backgroundAudioTitle => 'Background audio'; + String get backgroundAudioTitle => 'পটভূমির অডিও'; @override - String get backgroundAudioSubtitle => 'Continues when the screen turns off'; + String get backgroundAudioSubtitle => 'স্ক্রিন বন্ধ করলেও চলতে থাকে'; @override String get dash => '—'; @override - String get cancelAction => 'Cancel'; + String get cancelAction => 'বাতিল করুন'; @override - String get equalizerTitle => 'Equalizer'; + String get equalizerTitle => 'ইকুয়ালাইজার'; @override - String get recordingsOpenFolder => 'Open folder'; + String get recordingsOpenFolder => 'ফোল্ডার খুলুন'; @override String recordingsOpenFolderError(Object error) { - return 'Could not open the folder: $error'; + return 'ফোল্ডার খোলা যায়নি: $error'; } @override - String get recordingsMaxSizeTitle => 'Maximum recording size'; + String get recordingsMaxSizeTitle => 'রেকর্ডিংয়ের সর্বোচ্চ আকার'; @override String recordingsMaxSizeSubtitle(int size) { - return 'Current limit: $size MB'; + return 'বর্তমান সীমা: $size MB'; } @override - String get recordingsMaxSizeDialogTitle => 'Maximum size per recording'; + String get recordingsMaxSizeDialogTitle => 'প্রতি রেকর্ডিংয়ের সর্বোচ্চ আকার'; @override - String get recordingsMaxSizeMbLabel => 'Maximum megabytes'; + String get recordingsMaxSizeMbLabel => 'সর্বোচ্চ মেগাবাইট'; @override String recordingsMaxSizeSaved(int size) { - return 'Recording limit updated to $size MB'; + return 'রেকর্ডিং সীমা $size MB-এ আপডেট হয়েছে'; } @override - String get stationOrderTitle => 'Station order'; + String get stationOrderTitle => 'স্টেশনের ক্রম'; @override - String get stationOrderByName => 'By name'; + String get stationOrderByName => 'নাম অনুযায়ী'; @override - String get stationOrderByQuality => 'By quality'; + String get stationOrderByQuality => 'গুণমান অনুযায়ী'; @override String get stationOrderScopeDescription => - 'Applies to favorites, searches, nearby stations and quick lists.'; + 'প্রিয়, অনুসন্ধান, কাছাকাছি স্টেশন এবং দ্রুত তালিকায় প্রযোজ্য।'; @override - String get favoriteGroupsTitle => 'Favorite lists'; + String get favoriteGroupsTitle => 'প্রিয় তালিকা'; @override String get favoriteGroupsDescription => - 'Create short lists to organize your saved stations.'; + 'সংরক্ষিত স্টেশন সাজাতে ছোট তালিকা তৈরি করুন।'; @override - String get favoriteGroupsAdd => 'Add list'; + String get favoriteGroupsAdd => 'তালিকা যোগ করুন'; @override - String get favoriteGroupsEdit => 'Edit list'; + String get favoriteGroupsEdit => 'তালিকা সম্পাদনা করুন'; @override - String get favoriteGroupsDelete => 'Delete list'; + String get favoriteGroupsDelete => 'তালিকা মুছুন'; @override - String get favoriteGroupsNameLabel => 'List name'; + String get favoriteGroupsNameLabel => 'তালিকার নাম'; @override - String get favoriteGroupsNameTooLong => 'Maximum 28 characters.'; + String get favoriteGroupsNameTooLong => 'সর্বোচ্চ ২৮ অক্ষর।'; @override - String get favoriteGroupsUnassigned => 'Unassigned'; + String get favoriteGroupsUnassigned => 'বরাদ্দ নয়'; @override String get favoriteGroupsProtectedHint => - 'Default list: it cannot be edited or deleted.'; + 'ডিফল্ট তালিকা: সম্পাদনা বা মুছে ফেলা যায় না।'; @override - String get favoriteGroupsCreated => 'List created'; + String get favoriteGroupsCreated => 'তালিকা তৈরি হয়েছে'; @override - String get favoriteGroupsUpdated => 'List updated'; + String get favoriteGroupsUpdated => 'তালিকা আপডেট হয়েছে'; @override String get favoriteGroupsDeleted => - 'List deleted; its stations return to Unassigned.'; + 'তালিকা মুছে ফেলা হয়েছে; এর স্টেশনগুলো বরাদ্দ নয়-এ ফিরে গেছে।'; @override - String get favoriteGroupsAssign => 'Move to list'; + String get favoriteGroupsAssign => 'তালিকায় সরান'; @override String favoriteGroupsAssignSubtitle(Object groupName) { - return 'Current list: $groupName'; + return 'বর্তমান তালিকা: $groupName'; } @override String favoriteGroupsAssigned(Object stationName, Object groupName) { - return '$stationName moved to $groupName'; + return '$stationName $groupName-এ সরানো হয়েছে'; } @override - String get favoritesTitle => 'Favorites'; + String get favoritesTitle => 'প্রিয়'; @override - String get favoritesEmptyTitle => 'No favorites yet'; + String get favoritesEmptyTitle => 'এখনও কোনো প্রিয় নেই'; @override String get favoritesEmptySubtitle => - 'Tap the heart on any station to save it to your collection.'; + 'যেকোনো স্টেশনে হৃদয় আইকনে ট্যাপ করে সেটি আপনার সংগ্রহে সংরক্ষণ করুন।'; @override String get favoritesHeaderSubtitle => - 'Organize your collection by lists and keep important radios close.'; + 'আপনার সংগ্রহ তালিকা দিয়ে সাজান এবং গুরুত্বপূর্ণ রেডিওগুলো কাছে রাখুন।'; @override - String get favoritesCollection => 'Collection'; + String get favoritesCollection => 'সংগ্রহ'; @override String favoritesSavedCount(int count) { - return '$count saved'; + return '$count সংরক্ষিত'; } @override - String get favoritesRemoveTooltip => 'Remove from favorites'; + String get favoritesRemoveTooltip => 'প্রিয় থেকে সরান'; @override String favoritesRemovedMessage(Object stationName) { - return '$stationName removed from favorites'; + return '$stationName প্রিয় থেকে সরানো হয়েছে'; } + + @override + String get alarmPostponedCurrentExecution => + 'এই চালনার জন্য অ্যালার্ম পিছিয়ে দেওয়া হয়েছে।'; + + @override + String get searchScreenTitle => 'সিগন্যাল খুঁজুন'; + + @override + String get searchScreenSubtitle => + 'নাম, দেশ বা ভাষা দিয়ে দ্রুত ফিল্টার ও উচ্চ কনট্রাস্টে রেডিও খুঁজুন।'; + + @override + String get searchFiltersLabel => 'ফিল্টার'; + + @override + String get searchHint => 'রেডিও হোরাইজন, জ্যাজ, সংবাদ...'; + + @override + String get searchCountryFilterLabel => 'দেশ'; + + @override + String get searchLanguageFilterLabel => 'ভাষা'; + + @override + String get searchMinQualityFilterLabel => 'ন্যূনতম গুণমান'; + + @override + String get searchEmptyTitle => 'একটি স্টেশন খুঁজুন'; + + @override + String get searchNoResultsTitle => 'কোনো ফলাফল নেই'; + + @override + String get searchEmptySubtitle => + 'উপরের বার বা চিপ ব্যবহার করে সারা বিশ্বের সিগন্যাল আবিষ্কার করুন।'; + + @override + String get searchNoResultsSubtitle => + 'সক্রিয় সিগন্যাল পেতে ফিল্টার সরিয়ে বা অন্য নাম লিখে দেখুন।'; + + @override + String get countrySpain => 'স্পেন'; + + @override + String get countryUsa => 'যুক্তরাষ্ট্র'; + + @override + String get countryMexico => 'মেক্সিকো'; + + @override + String get countryArgentina => 'আর্জেন্টিনা'; + + @override + String get countryUk => 'যুক্তরাজ্য'; + + @override + String get countryFrance => 'ফ্রান্স'; + + @override + String get countryGermany => 'জার্মানি'; + + @override + String get countryItaly => 'ইতালি'; + + @override + String get countryBrazil => 'ব্রাজিল'; + + @override + String get countryJapan => 'জাপান'; + + @override + String get languageNameSpanish => 'স্প্যানিশ'; + + @override + String get languageNameEnglish => 'ইংরেজি'; + + @override + String get languageNameFrench => 'ফরাসি'; + + @override + String get languageNameGerman => 'জার্মান'; + + @override + String get languageNamePortuguese => 'পর্তুগিজ'; + + @override + String get languageNameItalian => 'ইতালীয়'; + + @override + String get languageNameJapanese => 'জাপানি'; + + @override + String get languageNameArabic => 'আরবি'; + + @override + String get languageNameRussian => 'রুশ'; + + @override + String get homeScreenSubtitle => + 'পরিষ্কার সিগন্যাল, বুদ্ধিমান প্রিয় এবং গেম শো-ধাঁচের ভিজ্যুয়াল অভিজ্ঞতাসহ লাইভ বিশ্ব রেডিও।'; + + @override + String get exploreStations => 'স্টেশন দেখুন'; + + @override + String stationsCount(int count) { + return '$count রেডিও'; + } + + @override + String get qualityHd => 'HD গুণমান'; + + @override + String get nearYou => 'আপনার কাছাকাছি'; + + @override + String nearYouInCountry(Object country) { + return 'আপনার কাছাকাছি · $country'; + } + + @override + String get detectAction => 'সনাক্ত করুন'; + + @override + String get liveRadar => 'লাইভ রাডার'; + + @override + String get genresTitle => 'ধরন'; + + @override + String get retryAction => 'আবার চেষ্টা করুন'; + + @override + String get noStationsAvailable => 'কোনো স্টেশন উপলব্ধ নেই'; + + @override + String get noStationsAvailableSubtitle => + 'সিগন্যাল আবার ধরতে রিফ্রেশ করুন বা অন্য ধরন বেছে নিন।'; + + @override + String get genrePop => 'পপ'; + + @override + String get genreRock => 'রক'; + + @override + String get genreJazz => 'জ্যাজ'; + + @override + String get genreClassical => 'ক্লাসিক্যাল'; + + @override + String get genreElectronic => 'ইলেকট্রনিক'; + + @override + String get genreNews => 'সংবাদ'; + + @override + String get genreTalk => 'আলাপ'; + + @override + String get genreHipHop => 'হিপ-হপ'; + + @override + String get genreCountry => 'কান্ট্রি'; + + @override + String get genreMetal => 'মেটাল'; + + @override + String get genreReggae => 'রেগে'; + + @override + String get genreLatin => 'লাতিন'; + + @override + String get alarmScreenTitle => 'সুরেলা জাগরণ'; + + @override + String get alarmScreenSubtitle => + 'রেডিও অ্যালার্ম, নিরাপদ শব্দ, স্মার্ট ছুটি এবং পরবর্তী চালনা সবসময় দৃশ্যমান।'; + + @override + String get createAlarmAction => 'অ্যালার্ম তৈরি করুন'; + + @override + String alarmsCount(int count) { + return '$count অ্যালার্ম'; + } + + @override + String get activeAlarmsWithoutNextTitle => + 'পরবর্তী চালনা ছাড়া সক্রিয় অ্যালার্ম'; + + @override + String get noActiveAlarms => 'কোনো সক্রিয় অ্যালার্ম নেই'; + + @override + String get nextAlarmTitle => 'পরবর্তী অ্যালার্ম'; + + @override + String activeAlarmsWithoutNextSubtitle(int count) { + return '$countটি সক্রিয় অ্যালার্ম আছে, কিন্তু এখন তাদের কোনো বৈধ ভবিষ্যৎ তারিখ নেই। তারিখ, দিন এবং ছুটি দেখুন।'; + } + + @override + String get createAlarmHint => + 'একটি অ্যালার্ম তৈরি করুন, PluriWave স্বয়ংক্রিয়ভাবে পরবর্তী চালনা হিসাব করবে।'; + + @override + String get alarmVacationPlay => 'ছুটিতে বাজে'; + + @override + String get alarmVacationPause => 'ছুটিতে বিরতি'; + + @override + String alarmFadeInLabel(int seconds) { + return 'ফেড-ইন $secondsসে'; + } + + @override + String alarmNextExecution(Object date) { + return 'পরবর্তী চালনা: $date'; + } + + @override + String get alarmNoNextExecution => 'কোনো সক্রিয় পরবর্তী চালনা নেই।'; + + @override + String alarmSkippedExecution(Object date) { + return 'একটি চালনা এড়িয়ে দেওয়া হয়েছে: $date।'; + } + + @override + String get editAction => 'সম্পাদনা'; + + @override + String get skipNextAction => 'পরবর্তীটি এড়িয়ে যান'; + + @override + String get deleteTooltip => 'মুছুন'; + + @override + String get alarmSkippedNoNextSnackbar => + 'অ্যালার্ম এড়ানো হয়েছে। আর কোনো পরবর্তী চালনা নেই।'; + + @override + String alarmSkippedReturnsSnackbar(Object date) { + return 'অ্যালার্ম এড়ানো হয়েছে। $date-এ আবার ফিরবে।'; + } + + @override + String alarmVacationPausedNoNext(Object vacationName) { + return 'ছুটির কারণে ($vacationName) বিরত আছে এবং কোনো পরবর্তী চালনা নেই।'; + } + + @override + String alarmVacationPausedReturns(Object vacationName, Object date) { + return 'ছুটির কারণে ($vacationName) বিরত আছে এবং $date-এ ফিরবে।'; + } + + @override + String alarmVacationReturns(Object date) { + return 'ছুটি চালু থাকলে, $date-এ আবার বাজবে।'; + } + + @override + String get defaultAlarmName => 'সুরেলা অ্যালার্ম'; + + @override + String get newAlarmTitle => 'নতুন অ্যালার্ম'; + + @override + String get editAlarmTitle => 'অ্যালার্ম সম্পাদনা'; + + @override + String get nameField => 'নাম'; + + @override + String get timeField => 'সময়'; + + @override + String get dateField => 'তারিখ'; + + @override + String get onceOption => 'একবার'; + + @override + String get dailyOption => 'দৈনিক'; + + @override + String get weekdaysOption => 'দিন'; + + @override + String get soundAndVolumeSection => 'শব্দ ও ভলিউম'; + + @override + String get alarmFadeInTitle => 'অ্যালার্ম ফেড-ইন'; + + @override + String get alarmFadeInOff => '০ সে (কোনো পরিবর্তন নয়)'; + + @override + String alarmFadeInSummary(int seconds) { + return '$seconds সে (৫% থেকে নির্বাচিত ভলিউমে)'; + } + + @override + String get internalSafeSoundLabel => 'নিরাপদ অভ্যন্তরীণ শব্দ'; + + @override + String get soundWarmSunrise => 'উষ্ণ সূর্যোদয়'; + + @override + String get soundSoftBell => 'নরম ঘণ্টা'; + + @override + String get soundDigitalPulse => 'ডিজিটাল পালস'; + + @override + String get favoriteStationLabel => 'প্রিয় স্টেশন'; + + @override + String get noStationUseInternalSound => + 'স্টেশন নেই: অভ্যন্তরীণ শব্দ ব্যবহার করুন'; + + @override + String get saveFavoritesAlarmHint => + 'সুরেলা অ্যালার্ম হিসেবে ব্যবহার করতে প্রিয়তে স্টেশন সংরক্ষণ করুন।'; + + @override + String get useCurrentStationAction => 'বর্তমান স্টেশন ব্যবহার করুন'; + + @override + String get playDuringVacations => 'ছুটিতে বাজান'; + + @override + String get playDuringVacationsHint => + 'এটি বন্ধ করলে পরবর্তী চালনা প্রথম বৈধ দিনে চলে যাবে।'; + + @override + String get saveAlarmAction => 'অ্যালার্ম সংরক্ষণ করুন'; + + @override + String get chooseOneWeekdayError => 'সপ্তাহের অন্তত একটি দিন বেছে নিন।'; + + @override + String get androidReliabilityReview => + 'Android নির্ভরযোগ্যতা পর্যালোচনা করুন'; + + @override + String get statusOk => 'ঠিক আছে'; + + @override + String get statusPending => 'অপেক্ষমাণ'; + + @override + String androidReliabilityStatus( + Object exact, + Object notifications, + Object screen, + ) { + return 'নির্ভরযোগ্যতা: নির্দিষ্ট $exact · বিজ্ঞপ্তি $notifications · স্ক্রিন $screen'; + } + + @override + String get vacationRangesTitle => 'ছুটির পরিসর'; + + @override + String get addAction => 'যোগ করুন'; + + @override + String get vacationRangesHint => + 'কোনো অ্যালার্মে \"ছুটিতে বিরতি\" থাকলে এই পরিসরগুলো স্বয়ংক্রিয়ভাবে এড়িয়ে যাবে।'; + + @override + String get noVacationRangesLoaded => 'কোনো পরিসর লোড হয়নি।'; + + @override + String get deleteRangeTooltip => 'পরিসর মুছুন'; + + @override + String get vacationsDefaultName => 'ছুটি'; + + @override + String get newVacationRangeTitle => 'নতুন ছুটির পরিসর'; + + @override + String get startField => 'শুরু'; + + @override + String get endField => 'শেষ'; + + @override + String get saveRangeAction => 'পরিসর সংরক্ষণ করুন'; + + @override + String get noAlarmsYetTitle => 'এখনও কোনো অ্যালার্ম নেই।'; + + @override + String get noAlarmsYetSubtitle => 'আপনার সুরেলা জাগরণ সাজাতে একটি তৈরি করুন।'; + + @override + String get ringingInternalAudioActive => + 'নিরাপদ অভ্যন্তরীণ শব্দ দিয়ে বাজছে।'; + + @override + String get ringingPreparingInternalAudio => + 'নিরাপদ অভ্যন্তরীণ শব্দ প্রস্তুত হচ্ছে।'; + + @override + String get stopAlarmAction => 'অ্যালার্ম বন্ধ করুন'; + + @override + String get pauseAction => 'বিরতি দিন'; + + @override + String miniPlayerOpenLabel(Object stationName) { + return '$stationName-এর প্লেয়ার খুলুন'; + } + + @override + String get playerIconLabel => 'প্লেয়ার'; + + @override + String get playbackStatusConnecting => 'সংযুক্ত হচ্ছে...'; + + @override + String get playbackStatusLive => 'লাইভ'; + + @override + String get playbackStatusPaused => 'বিরতিতে'; + + @override + String get playbackStatusConnectionError => 'সংযোগে ত্রুটি'; + + @override + String get playbackStatusStopped => 'বন্ধ'; + + @override + String stationSemanticLabel(Object stationName) { + return 'স্টেশন $stationName'; + } + + @override + String get favoritesAddTooltip => 'পছন্দের তালিকায় যোগ করুন'; + + @override + String favoritesAddedMessage(Object stationName) { + return '$stationName পছন্দের তালিকায় যোগ করা হয়েছে'; + } + + @override + String get stationIconLabel => 'স্টেশনের প্রতীক'; + + @override + String get liveNow => 'এখন লাইভ'; + + @override + String equalizerBandLabel(Object band) { + return 'ব্যান্ড $band'; + } + + @override + String equalizerBandValue(Object value) { + return '$value ডেসিবেল'; + } + + @override + String get equalizerPresetFlat => 'সমতল'; + + @override + String get equalizerPresetRock => 'রক'; + + @override + String get equalizerPresetPop => 'পপ'; + + @override + String get equalizerPresetBassBoost => 'বেস বাড়ানো'; + + @override + String get equalizerPresetJazz => 'জ্যাজ'; + + @override + String get equalizerPresetVoice => 'কণ্ঠ'; + + @override + String get equalizerPresetCustom => 'নিজস্ব'; + + @override + String get onboardingTitle => 'PluriWave-এ স্বাগতম'; + + @override + String get onboardingNewsTitle => 'নতুন কী আছে'; + + @override + String get onboardingStartAction => 'শুরু করুন'; + + @override + String get onboardingCloseTooltip => 'বন্ধ করুন'; + + @override + String radioRecordingError(Object error) { + return 'রেডিও রেকর্ড করতে ত্রুটি: $error'; + } + + @override + String get radioApiConnectionError => 'রেডিও এপিআই-এর সঙ্গে কোনো সংযোগ নেই'; + + @override + String get radioSearchError => 'অনুসন্ধানে ত্রুটি। আপনার সংযোগ পরীক্ষা করুন।'; + + @override + String get radioLoadMoreStationsError => 'আরও স্টেশন আনা যায়নি।'; + + @override + String get radioNearbyStationsError => + 'কাছাকাছি স্টেশন শনাক্ত করা যায়নি। দেশ অনুযায়ী ফিল্টার ব্যবহার করুন।'; + + @override + String radioCannotPlayStation(Object stationName) { + return '\"$stationName\" চালানো যাচ্ছে না'; + } + + @override + String get recordingSelectStationFirst => + 'রেকর্ড করার আগে একটি স্টেশন নির্বাচন করুন।'; + + @override + String recordingStartError(Object error) { + return 'রেকর্ডিং শুরু করা যায়নি: $error'; + } + + @override + String get unsupportedConfigVersion => 'কনফিগারেশন সংস্করণ সমর্থিত নয়'; + + @override + String get audioErrorGeneric => 'চালানোর সময় ত্রুটি'; + + @override + String get audioErrorNoInternet => 'ইন্টারনেট সংযোগ নেই'; + + @override + String get audioErrorInvalidUrl => 'রেডিওর ঠিকানা বৈধ নয়'; + + @override + String get audioErrorNotFound => 'রেডিওটি উপলব্ধ নয় (404 ত্রুটি)'; + + @override + String get audioErrorTimeout => 'সংযোগের সময়সীমা শেষ হয়েছে'; + + @override + String get audioErrorCannotConnect => 'রেডিওর সঙ্গে সংযোগ করা যাচ্ছে না'; + + @override + String get audioErrorUnsupportedFormat => 'স্ট্রিম ফরম্যাট সমর্থিত নয়'; + + @override + String get audioErrorDecode => 'অডিও স্ট্রিম ডিকোড করতে ত্রুটি'; + + @override + String get audioErrorCleartext => + 'এই রেডিও এনক্রিপশন ছাড়া HTTP ব্যবহার করে, যা অনুমোদিত নয়'; + + @override + String get audioErrorSsl => 'রেডিওর SSL সার্টিফিকেট অবৈধ'; + + @override + String get audioErrorCannotPlay => 'এই রেডিও চালানো যাচ্ছে না'; + + @override + String get audioErrorUnexpectedPlayback => 'চালানোর সময় অপ্রত্যাশিত ত্রুটি'; + + @override + String get androidExactAlarmScheduleError => + 'অ্যান্ড্রয়েড সুনির্দিষ্ট অ্যালার্ম নির্ধারণ করতে পারেনি। সুনির্দিষ্ট অ্যালার্মের অনুমতি পরীক্ষা করুন।'; + + @override + String get recordingPathEmptyError => 'রেকর্ডিংয়ের পথ খালি থাকতে পারে না'; + + @override + String get recordingMaxSizeInvalidError => + 'সর্বোচ্চ আকার শূন্যের বেশি হতে হবে'; + + @override + String get recordingAlreadyActiveError => 'ইতিমধ্যেই একটি রেকর্ডিং চলছে'; + + @override + String get alarmRingingFallbackActive => 'অভ্যন্তরীণ নিরাপদ অডিও দিয়ে চলছে।'; + + @override + String get alarmRingingPreparingFallback => + 'অভ্যন্তরীণ নিরাপদ অডিও প্রস্তুত করা হচ্ছে।'; + + @override + String get alarmRingingTryingStation => + 'আপনার স্টেশন সর্বোচ্চ উপলভ্য মানে চালানোর চেষ্টা করা হচ্ছে।'; + + @override + String alarmScheduleOnce(Object date) { + return 'একবার · $date'; + } + + @override + String alarmScheduleWeekdays(Object days) { + return 'দিন: $days'; + } + + @override + String get androidReliabilityTitle => 'Android নির্ভরযোগ্যতা দেখুন'; + + @override + String get closeAction => 'বন্ধ করুন'; + + @override + String get customOption => 'কাস্টম'; + + @override + String get endLabel => 'শেষ'; + + @override + String get equalizerDisable => 'ইকুয়ালাইজার বন্ধ করুন'; + + @override + String get helpTitle => 'সহায়তা ও টিউটোরিয়াল'; + + @override + String get helpSubtitle => 'PluriWave-এর ফিচার, টিপস ও নতুন বিষয়গুলো দেখুন।'; + + @override + String get indefiniteOption => 'অনির্দিষ্ট'; + + @override + String get invalidNumber => 'অবৈধ সংখ্যা'; + + @override + String get nameLabel => 'নাম'; + + @override + String get notPlaying => 'চলছে না'; + + @override + String get oneTimeOption => 'একবার'; + + @override + String get pausePlaybackTooltip => 'প্লেব্যাক বিরতি'; + + @override + String qualityOriginal(Object quality) { + return 'মূল মান: $quality'; + } + + @override + String get qualityUnknown => 'মান জানানো নেই'; + + @override + String get recordAction => 'রেকর্ড করুন'; + + @override + String get recordDurationTitle => 'রেকর্ডিং সময়কাল'; + + @override + String get recordRadioSubtitle => 'কতক্ষণ রেকর্ড করতে চান বেছে নিন।'; + + @override + String get recordRadioTitle => 'রেডিও রেকর্ড করুন'; + + @override + String get recordingActiveTitle => 'রেডিও রেকর্ড হচ্ছে'; + + @override + String get recordingDirectTitle => 'সরাসরি রেকর্ডিং'; + + @override + String get recordingsOpenFolderPlainError => 'রেকর্ডিং ফোল্ডার খোলা যায়নি'; + + @override + String get recordingsOpenLatest => 'সর্বশেষ রেকর্ডিং খুলুন'; + + @override + String get recordingsOpenLatestError => 'সর্বশেষ রেকর্ডিং খোলা যায়নি'; + + @override + String get startLabel => 'শুরু'; + + @override + String get startPlaybackTooltip => 'প্লেব্যাক শুরু করুন'; + + @override + String get stopAction => 'থামান'; + + @override + String get stopPlaybackTooltip => 'প্লেব্যাক থামান'; + + @override + String get weekdayShortMonday => 'সোম'; + + @override + String get weekdayShortTuesday => 'মঙ্গল'; + + @override + String get weekdayShortWednesday => 'বুধ'; + + @override + String get weekdayShortThursday => 'বৃহস্পতি'; + + @override + String get weekdayShortFriday => 'শুক্র'; + + @override + String get weekdayShortSaturday => 'শনি'; + + @override + String get weekdayShortSunday => 'রবি'; } diff --git a/lib/l10n/gen/app_localizations_de.dart b/lib/l10n/gen/app_localizations_de.dart index 0245ada..5e1d328 100644 --- a/lib/l10n/gen/app_localizations_de.dart +++ b/lib/l10n/gen/app_localizations_de.dart @@ -34,38 +34,62 @@ class AppLocalizationsDe extends AppLocalizations { @override String get sleepTimerDescription => - 'Smooth radio shutdown with an exact countdown.'; + 'Sanftes Ausschalten des Radios mit genauem Countdown.'; @override - String get cancelTimer => 'Cancel timer'; + String get cancelTimer => 'Timer abbrechen'; @override - String get optionOther => 'Other'; + String get optionOther => 'Andere'; @override - String get customDurationTitle => 'Custom duration'; + String get customDurationTitle => 'Benutzerdefinierte Dauer'; @override - String get durationGreaterThanZero => 'Choose a duration greater than zero.'; + String get durationGreaterThanZero => 'Wähle eine Dauer größer als null.'; @override - String get hoursLabel => 'Hours'; + String get hoursLabel => 'Stunden'; @override - String get minutesLabel => 'Minutes'; + String get minutesLabel => 'Minuten'; @override - String get secondsLabel => 'Seconds'; + String get secondsLabel => 'Sekunden'; @override - String get saveQuickAccess => 'Save as quick access'; + String durationHoursMinutesSeconds( + Object hours, + Object minutes, + Object seconds, + ) { + return '$hours Std $minutes Min $seconds Sek'; + } @override - String get startTimer => 'Start timer'; + String durationMinutesSeconds(Object minutes, Object seconds) { + return '$minutes Min $seconds Sek'; + } + + @override + String durationMinutesOnly(Object minutes) { + return '$minutes Min'; + } + + @override + String durationSecondsOnly(Object seconds) { + return '$seconds Sek'; + } + + @override + String get saveQuickAccess => 'Als Schnellzugriff speichern'; + + @override + String get startTimer => 'Timer starten'; @override String skipCurrentAlarmExecution(Object alarmName) { - return 'Skipped this execution of $alarmName.'; + return 'Diese Ausführung von $alarmName wurde ausgelassen.'; } @override @@ -73,14 +97,14 @@ class AppLocalizationsDe extends AppLocalizations { @override String get settingsSubtitle => - 'Fine-grained sound control, backups, and custom stations.'; + 'Feinabstimmung von Klang, Backups und benutzerdefinierten Sendern.'; @override String get languageSectionTitle => 'Sprache'; @override String get languageSectionDescription => - 'Choose how the app language is displayed.'; + 'Wähle, wie die Sprache der App angezeigt wird.'; @override String get languageSystemDefault => 'System'; @@ -100,223 +124,231 @@ class AppLocalizationsDe extends AppLocalizations { String get languageUpdatedSystem => 'Sprache aktualisiert: System'; @override - String get timerSectionTitle => 'Sleep timer'; + String get timerSectionTitle => 'Sleep-Timer'; @override - String get timerSectionAdd => 'Add'; + String get timerSectionAdd => 'Hinzufügen'; @override String get timerSectionDescription => - 'Customize the quick presets shown when automatically stopping the radio.'; + 'Passe die Schnellzugriffe an, die beim automatischen Ausschalten des Radios angezeigt werden.'; @override - String get timerSectionRestoreRecommended => 'Restore recommended times'; + String get timerSectionRestoreRecommended => + 'Empfohlene Zeiten wiederherstellen'; @override - String get newQuickAccessTitle => 'New quick access'; + String get newQuickAccessTitle => 'Neuer Schnellzugriff'; @override - String get saveQuickAccessButton => 'Save quick access'; + String get saveQuickAccessButton => 'Schnellzugriff speichern'; @override - String get settingsSafeStatus => 'Safe'; + String get settingsSafeStatus => 'Sicher'; @override - String get recordingsSectionTitle => 'Recordings'; + String get recordingsSectionTitle => 'Aufnahmen'; @override - String get recordingsFolderDialogTitle => 'Select recordings folder'; + String get recordingsFolderDialogTitle => 'Aufnahmeordner auswählen'; @override - String get recordingsPathUpdated => 'Recording path updated'; + String get recordingsPathUpdated => 'Aufnahmepfad aktualisiert'; @override String recordingsPathSaveError(Object error) { - return 'Could not save the path: $error'; + return 'Pfad konnte nicht gespeichert werden: $error'; } @override String get recordingsDefaultFolderRestored => - 'The internal default folder will be used'; + 'Der interne Standardordner wird verwendet'; @override - String get recordingsFolderTitle => 'Recordings folder'; + String get recordingsFolderTitle => 'Aufnahmeordner'; @override - String get recordingsPathCalculating => 'Calculating path...'; + String get recordingsPathCalculating => 'Pfad wird berechnet...'; @override - String get recordingsChangePath => 'Change path'; + String get recordingsChangePath => 'Pfad ändern'; @override - String get recordingsUseDefaultPath => 'Use default path'; + String get recordingsUseDefaultPath => 'Standardpfad verwenden'; @override String get recordingsOriginalStreamHint => - 'The radio is saved from the original stream, without recompressing.'; + 'Das Radio wird aus dem Originalstream gespeichert, ohne erneute Komprimierung.'; @override - String get equalizerActive => 'Active'; + String get equalizerActive => 'Aktiv'; @override - String get equalizerDisabled => 'Disabled'; + String get equalizerDisabled => 'Deaktiviert'; @override - String get equalizerEnable => 'Enable equalizer'; + String get equalizerEnable => 'Equalizer aktivieren'; @override String get equalizerRealtimeSubtitle => - 'Changes are applied in real time to the current station.'; + 'Änderungen werden in Echtzeit auf den aktuellen Sender angewendet.'; @override String get equalizerPendingSubtitle => - 'Changes are saved and will apply when Android enables the effect.'; + 'Änderungen werden gespeichert und angewendet, sobald Android den Effekt aktiviert.'; @override - String get equalizerPerStationTitle => 'Use custom EQ for this favorite'; + String get equalizerPerStationTitle => + 'Eigenen EQ für diesen Favoriten verwenden'; @override String equalizerPerStationActive(Object stationName) { - return 'Active for $stationName'; + return 'Aktiv für $stationName'; } @override String equalizerPerStationMain(Object stationName) { - return 'Using main EQ for $stationName'; + return 'Haupt-EQ für $stationName wird verwendet'; } @override - String get preferredStationTitle => 'Preferred station'; + String get preferredStationTitle => 'Bevorzugter Sender'; @override String get preferredStationDescription => - 'Preselected for new alarms and available for quick playback.'; + 'Wird beim Erstellen von Alarmen vorausgewählt und kann als Schnellwiedergabe gestartet werden.'; @override - String get preferredStationNoStationsTitle => 'No stations available yet'; + String get preferredStationNoStationsTitle => 'Noch keine Sender verfügbar'; @override String get preferredStationNoStationsSubtitle => - 'Save favorites or load stations to choose a preferred one.'; + 'Speichere Favoriten oder lade Sender, um einen bevorzugten auszuwählen.'; @override - String get preferredStationAutomaticFallback => 'Automatic fallback'; + String get preferredStationAutomaticFallback => 'Automatischer Fallback'; @override - String get preferredStationDefaultFavorite => 'Default favorite'; + String get preferredStationDefaultFavorite => 'Standardfavorit'; @override String preferredStationCurrent(Object stationName) { - return 'Current preferred: $stationName'; + return 'Aktuell bevorzugt: $stationName'; } @override String preferredStationAutoUsing(Object stationName) { - return 'No favorites: automatically using $stationName'; + return 'Keine Favoriten: $stationName wird automatisch verwendet'; } @override - String get preferredStationPlay => 'Play preferred'; + String get preferredStationPlay => 'Bevorzugten Sender abspielen'; @override - String get customStationsTitle => 'Custom stations'; + String get customStationsTitle => 'Benutzerdefinierte Sender'; @override - String get customStationsAdd => 'Add'; + String get customStationsAdd => 'Hinzufügen'; @override - String get customStationsEmpty => 'No custom stations.'; + String get customStationsEmpty => 'Keine benutzerdefinierten Sender.'; @override - String get playAction => 'Play'; + String get playAction => 'Wiedergeben'; @override - String get deleteAction => 'Delete'; + String get deleteAction => 'Löschen'; @override - String get addStationTitle => 'Add station'; + String get addStationTitle => 'Sender hinzufügen'; @override String get stationNameLabel => 'Name *'; @override - String get requiredField => 'Required field'; + String get unnamedStation => 'Unbenannter Sender'; @override - String get streamUrlLabel => 'Stream URL *'; + String get requiredField => 'Pflichtfeld'; @override - String get invalidUrl => 'Invalid URL'; + String get streamUrlLabel => 'Stream-URL *'; @override - String get countryOptionalLabel => 'Country (optional)'; + String get invalidUrl => 'Ungültige URL'; @override - String get saveStation => 'Save station'; + String get countryOptionalLabel => 'Land (optional)'; @override - String get backupSectionTitle => 'Backup'; + String get saveStation => 'Sender speichern'; @override - String get backupExportTitle => 'Export configuration'; + String get backupSectionTitle => 'Sicherung'; + + @override + String get backupExportTitle => 'Konfiguration exportieren'; @override String get backupExportSubtitle => - 'Favorites, custom stations, and EQ presets'; + 'Favoriten, benutzerdefinierte Sender und EQ-Presets'; @override - String get backupImportTitle => 'Import configuration'; + String get backupImportTitle => 'Konfiguration importieren'; @override - String get backupImportSubtitle => 'Restore from a backup file'; + String get backupImportSubtitle => + 'Aus einer Sicherungsdatei wiederherstellen'; @override - String get backupShareSubject => 'PluriWave — backup'; + String get backupShareSubject => 'PluriWave — Sicherung'; @override String backupShareText(Object date) { - return 'PluriWave configuration exported on $date'; + return 'PluriWave-Konfiguration exportiert am $date'; } @override String backupExportError(Object error) { - return 'Export error: $error'; + return 'Fehler beim Exportieren: $error'; } @override String get backupImportConfirmMessage => - 'This will add favorites, stations, and presets from the file. Continue?'; + 'Dadurch werden Favoriten, Sender und Presets aus der Datei hinzugefügt. Fortfahren?'; @override - String get backupImportSuccess => 'Configuration imported successfully'; + String get backupImportSuccess => 'Konfiguration erfolgreich importiert'; @override String backupImportError(Object error) { - return 'Import error: $error'; + return 'Fehler beim Importieren: $error'; } @override - String get appVersionLoading => 'Loading version...'; + String get appVersionLoading => 'Version wird geladen...'; @override String appVersionSubtitle(Object version) { - return '$version - World radio'; + return '$version - Weltradio'; } @override - String get savedFavoritesTitle => 'Saved favorites'; + String get savedFavoritesTitle => 'Gespeicherte Favoriten'; @override - String get stationFilterTitle => 'Station filter'; + String get stationFilterTitle => 'Senderfilter'; @override - String get stationFilterSubtitle => 'Only stations verified as active'; + String get stationFilterSubtitle => + 'Nur Sender, die als aktiv überprüft wurden'; @override - String get backgroundAudioTitle => 'Background audio'; + String get backgroundAudioTitle => 'Audio im Hintergrund'; @override - String get backgroundAudioSubtitle => 'Continues when the screen turns off'; + String get backgroundAudioSubtitle => + 'Läuft weiter, wenn der Bildschirm ausgeschaltet wird'; @override String get dash => '—'; @@ -328,124 +360,846 @@ class AppLocalizationsDe extends AppLocalizations { String get equalizerTitle => 'Equalizer'; @override - String get recordingsOpenFolder => 'Open folder'; + String get recordingsOpenFolder => 'Ordner öffnen'; @override String recordingsOpenFolderError(Object error) { - return 'Could not open the folder: $error'; + return 'Ordner konnte nicht geöffnet werden: $error'; } @override - String get recordingsMaxSizeTitle => 'Maximum recording size'; + String get recordingsMaxSizeTitle => 'Maximale Aufnahmegröße'; @override String recordingsMaxSizeSubtitle(int size) { - return 'Current limit: $size MB'; + return 'Aktuelles Limit: $size MB'; } @override - String get recordingsMaxSizeDialogTitle => 'Maximum size per recording'; + String get recordingsMaxSizeDialogTitle => 'Maximale Größe pro Aufnahme'; @override - String get recordingsMaxSizeMbLabel => 'Maximum megabytes'; + String get recordingsMaxSizeMbLabel => 'Maximale Megabytes'; @override String recordingsMaxSizeSaved(int size) { - return 'Recording limit updated to $size MB'; + return 'Aufnahmelimit auf $size MB aktualisiert'; } @override - String get stationOrderTitle => 'Station order'; + String get stationOrderTitle => 'Senderreihenfolge'; @override - String get stationOrderByName => 'By name'; + String get stationOrderByName => 'Nach Name'; @override - String get stationOrderByQuality => 'By quality'; + String get stationOrderByQuality => 'Nach Qualität'; @override String get stationOrderScopeDescription => - 'Applies to favorites, searches, nearby stations and quick lists.'; + 'Gilt für Favoriten, Suchen, nahegelegene Sender und Schnelllisten.'; @override - String get favoriteGroupsTitle => 'Favorite lists'; + String get favoriteGroupsTitle => 'Favoritenlisten'; @override String get favoriteGroupsDescription => - 'Create short lists to organize your saved stations.'; + 'Erstelle kurze Listen, um deine gespeicherten Sender zu organisieren.'; @override - String get favoriteGroupsAdd => 'Add list'; + String get favoriteGroupsAdd => 'Liste hinzufügen'; @override - String get favoriteGroupsEdit => 'Edit list'; + String get favoriteGroupsEdit => 'Liste bearbeiten'; @override - String get favoriteGroupsDelete => 'Delete list'; + String get favoriteGroupsDelete => 'Liste löschen'; @override - String get favoriteGroupsNameLabel => 'List name'; + String get favoriteGroupsNameLabel => 'Listenname'; @override - String get favoriteGroupsNameTooLong => 'Maximum 28 characters.'; + String get favoriteGroupsNameTooLong => 'Maximal 28 Zeichen.'; @override - String get favoriteGroupsUnassigned => 'Unassigned'; + String get favoriteGroupsUnassigned => 'Nicht zugewiesen'; @override String get favoriteGroupsProtectedHint => - 'Default list: it cannot be edited or deleted.'; + 'Standardliste: kann nicht bearbeitet oder gelöscht werden.'; @override - String get favoriteGroupsCreated => 'List created'; + String get favoriteGroupsCreated => 'Liste erstellt'; @override - String get favoriteGroupsUpdated => 'List updated'; + String get favoriteGroupsUpdated => 'Liste aktualisiert'; @override String get favoriteGroupsDeleted => - 'List deleted; its stations return to Unassigned.'; + 'Liste gelöscht; ihre Sender kehren zu Nicht zugewiesen zurück.'; @override - String get favoriteGroupsAssign => 'Move to list'; + String get favoriteGroupsAssign => 'In Liste verschieben'; @override String favoriteGroupsAssignSubtitle(Object groupName) { - return 'Current list: $groupName'; + return 'Aktuelle Liste: $groupName'; } @override String favoriteGroupsAssigned(Object stationName, Object groupName) { - return '$stationName moved to $groupName'; + return '$stationName nach $groupName verschoben'; } @override - String get favoritesTitle => 'Favorites'; + String get favoritesTitle => 'Favoriten'; @override - String get favoritesEmptyTitle => 'No favorites yet'; + String get favoritesEmptyTitle => 'Noch keine Favoriten'; @override String get favoritesEmptySubtitle => - 'Tap the heart on any station to save it to your collection.'; + 'Tippe bei einem Sender auf das Herz, um ihn in deiner Sammlung zu speichern.'; @override String get favoritesHeaderSubtitle => - 'Organize your collection by lists and keep important radios close.'; + 'Organisiere deine Sammlung in Listen und halte wichtige Radios griffbereit.'; @override - String get favoritesCollection => 'Collection'; + String get favoritesCollection => 'Sammlung'; @override String favoritesSavedCount(int count) { - return '$count saved'; + return '$count gespeichert'; } @override - String get favoritesRemoveTooltip => 'Remove from favorites'; + String get favoritesRemoveTooltip => 'Aus Favoriten entfernen'; @override String favoritesRemovedMessage(Object stationName) { - return '$stationName removed from favorites'; + return '$stationName aus Favoriten entfernt'; } + + @override + String get alarmPostponedCurrentExecution => + 'Alarm für diese Ausführung verschoben.'; + + @override + String get searchScreenTitle => 'Signal suchen'; + + @override + String get searchScreenSubtitle => + 'Finde Sender nach Name, Land oder Sprache mit schnellen Filtern und hohem Kontrast.'; + + @override + String get searchFiltersLabel => 'Filter'; + + @override + String get searchHint => 'Radio Horizont, Jazz, Nachrichten...'; + + @override + String get searchCountryFilterLabel => 'Land'; + + @override + String get searchLanguageFilterLabel => 'Sprache'; + + @override + String get searchMinQualityFilterLabel => 'Mindestqualität'; + + @override + String get searchEmptyTitle => 'Suche nach einem Sender'; + + @override + String get searchNoResultsTitle => 'Keine Ergebnisse'; + + @override + String get searchEmptySubtitle => + 'Nutze die obere Leiste oder die Chips, um Sender aus aller Welt zu entdecken.'; + + @override + String get searchNoResultsSubtitle => + 'Versuche, Filter zu entfernen oder einen anderen Namen einzugeben, um einen aktiven Sender zu finden.'; + + @override + String get countrySpain => 'Spanien'; + + @override + String get countryUsa => 'USA'; + + @override + String get countryMexico => 'Mexiko'; + + @override + String get countryArgentina => 'Argentinien'; + + @override + String get countryUk => 'Vereinigtes Königreich'; + + @override + String get countryFrance => 'Frankreich'; + + @override + String get countryGermany => 'Deutschland'; + + @override + String get countryItaly => 'Italien'; + + @override + String get countryBrazil => 'Brasilien'; + + @override + String get countryJapan => 'Japan'; + + @override + String get languageNameSpanish => 'Spanisch'; + + @override + String get languageNameEnglish => 'Englisch'; + + @override + String get languageNameFrench => 'Französisch'; + + @override + String get languageNameGerman => 'Deutsch'; + + @override + String get languageNamePortuguese => 'Portugiesisch'; + + @override + String get languageNameItalian => 'Italienisch'; + + @override + String get languageNameJapanese => 'Japanisch'; + + @override + String get languageNameArabic => 'Arabisch'; + + @override + String get languageNameRussian => 'Russisch'; + + @override + String get homeScreenSubtitle => + 'Live-Weltradio mit klaren Signalen, intelligenten Favoriten und einer visuellen Game-Show-Erfahrung.'; + + @override + String get exploreStations => 'Sender erkunden'; + + @override + String stationsCount(int count) { + return '$count Radios'; + } + + @override + String get qualityHd => 'HD-Qualität'; + + @override + String get nearYou => 'In deiner Nähe'; + + @override + String nearYouInCountry(Object country) { + return 'In deiner Nähe · $country'; + } + + @override + String get detectAction => 'Erkennen'; + + @override + String get liveRadar => 'Live-Radar'; + + @override + String get genresTitle => 'Genres'; + + @override + String get retryAction => 'Erneut versuchen'; + + @override + String get noStationsAvailable => 'Keine Sender verfügbar'; + + @override + String get noStationsAvailableSubtitle => + 'Versuche zu aktualisieren oder ein anderes Genre auszuwählen, um wieder ein Signal zu empfangen.'; + + @override + String get genrePop => 'Pop'; + + @override + String get genreRock => 'Rock'; + + @override + String get genreJazz => 'Jazz'; + + @override + String get genreClassical => 'Klassik'; + + @override + String get genreElectronic => 'Elektronisch'; + + @override + String get genreNews => 'Nachrichten'; + + @override + String get genreTalk => 'Talk'; + + @override + String get genreHipHop => 'Hip-hop'; + + @override + String get genreCountry => 'Country'; + + @override + String get genreMetal => 'Metal'; + + @override + String get genreReggae => 'Reggae'; + + @override + String get genreLatin => 'Latin'; + + @override + String get alarmScreenTitle => 'Musikalisch aufwachen'; + + @override + String get alarmScreenSubtitle => + 'Alarme mit Radio, sicherem Ton, intelligenten Ferien und stets sichtbarer nächster Ausführung.'; + + @override + String get createAlarmAction => 'Alarm erstellen'; + + @override + String alarmsCount(int count) { + return '$count Alarme'; + } + + @override + String get activeAlarmsWithoutNextTitle => + 'Aktive Alarme ohne nächste Ausführung'; + + @override + String get noActiveAlarms => 'Keine aktiven Alarme'; + + @override + String get nextAlarmTitle => 'Nächster Alarm'; + + @override + String activeAlarmsWithoutNextSubtitle(int count) { + return 'Es gibt $count aktive(n) Alarm(e), aber derzeit kein gültiges zukünftiges Datum. Prüfe Datum, Wochentage und Ferien.'; + } + + @override + String get createAlarmHint => + 'Erstelle einen Alarm und PluriWave berechnet automatisch die nächste Ausführung.'; + + @override + String get alarmVacationPlay => 'Läutet in den Ferien'; + + @override + String get alarmVacationPause => 'In den Ferien pausiert'; + + @override + String alarmFadeInLabel(int seconds) { + return 'Fade-in ${seconds}s'; + } + + @override + String alarmNextExecution(Object date) { + return 'Nächste Ausführung: $date'; + } + + @override + String get alarmNoNextExecution => 'Keine aktive nächste Ausführung.'; + + @override + String alarmSkippedExecution(Object date) { + return 'Eine Ausführung wurde ausgelassen: $date.'; + } + + @override + String get editAction => 'Bearbeiten'; + + @override + String get skipNextAction => 'Nächste auslassen'; + + @override + String get deleteTooltip => 'Löschen'; + + @override + String get alarmSkippedNoNextSnackbar => + 'Alarm ausgelassen. Es bleibt keine nächste Ausführung.'; + + @override + String alarmSkippedReturnsSnackbar(Object date) { + return 'Alarm ausgelassen. Er kehrt am $date zurück.'; + } + + @override + String alarmVacationPausedNoNext(Object vacationName) { + return 'Wegen Ferien ($vacationName) pausiert und ohne nächste Ausführung.'; + } + + @override + String alarmVacationPausedReturns(Object vacationName, Object date) { + return 'Wegen Ferien ($vacationName) pausiert und kehrt am $date zurück.'; + } + + @override + String alarmVacationReturns(Object date) { + return 'Mit aktiven Ferien läutet er wieder am $date.'; + } + + @override + String get defaultAlarmName => 'Musikalischer Wecker'; + + @override + String get newAlarmTitle => 'Neuer Alarm'; + + @override + String get editAlarmTitle => 'Alarm bearbeiten'; + + @override + String get nameField => 'Name'; + + @override + String get timeField => 'Uhrzeit'; + + @override + String get dateField => 'Datum'; + + @override + String get onceOption => 'Einmal'; + + @override + String get dailyOption => 'Täglich'; + + @override + String get weekdaysOption => 'Tage'; + + @override + String get soundAndVolumeSection => 'Klang und Lautstärke'; + + @override + String get alarmFadeInTitle => 'Alarm-Fade-in'; + + @override + String get alarmFadeInOff => '0 s (ohne Übergang)'; + + @override + String alarmFadeInSummary(int seconds) { + return '$seconds s (von 5 % bis zur gewählten Lautstärke)'; + } + + @override + String get internalSafeSoundLabel => 'Interner Sicherheitston'; + + @override + String get soundWarmSunrise => 'Warmer Sonnenaufgang'; + + @override + String get soundSoftBell => 'Sanfte Glocke'; + + @override + String get soundDigitalPulse => 'Digitaler Puls'; + + @override + String get favoriteStationLabel => 'Lieblingssender'; + + @override + String get noStationUseInternalSound => 'Kein Sender: internen Ton verwenden'; + + @override + String get saveFavoritesAlarmHint => + 'Speichere Sender in Favoriten, um sie als musikalischen Alarm zu verwenden.'; + + @override + String get useCurrentStationAction => 'Aktuellen Sender verwenden'; + + @override + String get playDuringVacations => 'Während der Ferien läuten'; + + @override + String get playDuringVacationsHint => + 'Wenn du das ausschaltest, springt die nächste Ausführung zum ersten gültigen Tag.'; + + @override + String get saveAlarmAction => 'Alarm speichern'; + + @override + String get chooseOneWeekdayError => 'Wähle mindestens einen Wochentag.'; + + @override + String get androidReliabilityReview => 'Android-Zuverlässigkeit prüfen'; + + @override + String get statusOk => 'OK'; + + @override + String get statusPending => 'ausstehend'; + + @override + String androidReliabilityStatus( + Object exact, + Object notifications, + Object screen, + ) { + return 'Zuverlässigkeit: exakt $exact · Benachrichtigungen $notifications · Bildschirm $screen'; + } + + @override + String get vacationRangesTitle => 'Ferienzeiträume'; + + @override + String get addAction => 'Hinzufügen'; + + @override + String get vacationRangesHint => + 'Wenn ein Alarm „In den Ferien pausiert“ hat, werden diese Zeiträume automatisch übersprungen.'; + + @override + String get noVacationRangesLoaded => 'Keine Zeiträume geladen.'; + + @override + String get deleteRangeTooltip => 'Zeitraum löschen'; + + @override + String get vacationsDefaultName => 'Ferien'; + + @override + String get newVacationRangeTitle => 'Neuer Ferienzeitraum'; + + @override + String get startField => 'Beginn'; + + @override + String get endField => 'Ende'; + + @override + String get saveRangeAction => 'Zeitraum speichern'; + + @override + String get noAlarmsYetTitle => 'Noch keine Alarme.'; + + @override + String get noAlarmsYetSubtitle => + 'Erstelle einen, um dein musikalisches Aufwachen zu gestalten.'; + + @override + String get ringingInternalAudioActive => + 'Wiedergabe mit internem Sicherheitston.'; + + @override + String get ringingPreparingInternalAudio => + 'Interner Sicherheitston wird vorbereitet.'; + + @override + String get stopAlarmAction => 'Alarm stoppen'; + + @override + String get pauseAction => 'Pausieren'; + + @override + String miniPlayerOpenLabel(Object stationName) { + return 'Wiedergabe für $stationName öffnen'; + } + + @override + String get playerIconLabel => 'Wiedergabe'; + + @override + String get playbackStatusConnecting => 'Verbindung wird hergestellt...'; + + @override + String get playbackStatusLive => 'Live'; + + @override + String get playbackStatusPaused => 'Pausiert'; + + @override + String get playbackStatusConnectionError => 'Verbindungsfehler'; + + @override + String get playbackStatusStopped => 'Gestoppt'; + + @override + String stationSemanticLabel(Object stationName) { + return 'Sender $stationName'; + } + + @override + String get favoritesAddTooltip => 'Zu Favoriten hinzufügen'; + + @override + String favoritesAddedMessage(Object stationName) { + return '$stationName zu Favoriten hinzugefügt'; + } + + @override + String get stationIconLabel => 'Sendersymbol'; + + @override + String get liveNow => 'Live'; + + @override + String equalizerBandLabel(Object band) { + return 'Band $band'; + } + + @override + String equalizerBandValue(Object value) { + return '$value Dezibel'; + } + + @override + String get equalizerPresetFlat => 'Linear'; + + @override + String get equalizerPresetRock => 'Rock'; + + @override + String get equalizerPresetPop => 'Pop'; + + @override + String get equalizerPresetBassBoost => 'Bassverstärkung'; + + @override + String get equalizerPresetJazz => 'Jazz'; + + @override + String get equalizerPresetVoice => 'Stimme'; + + @override + String get equalizerPresetCustom => 'Benutzerdefiniert'; + + @override + String get onboardingTitle => 'Willkommen bei PluriWave'; + + @override + String get onboardingNewsTitle => 'Neuigkeiten'; + + @override + String get onboardingStartAction => 'Loslegen'; + + @override + String get onboardingCloseTooltip => 'Schließen'; + + @override + String radioRecordingError(Object error) { + return 'Fehler beim Aufnehmen des Radios: $error'; + } + + @override + String get radioApiConnectionError => 'Keine Verbindung zur Radio-API'; + + @override + String get radioSearchError => 'Suchfehler. Überprüfe deine Verbindung.'; + + @override + String get radioLoadMoreStationsError => + 'Weitere Sender konnten nicht geladen werden.'; + + @override + String get radioNearbyStationsError => + 'Nahegelegene Sender konnten nicht erkannt werden. Nutze Filter nach Land.'; + + @override + String radioCannotPlayStation(Object stationName) { + return '\"$stationName\" kann nicht wiedergegeben werden'; + } + + @override + String get recordingSelectStationFirst => + 'Wähle zuerst einen Sender zum Aufnehmen aus.'; + + @override + String recordingStartError(Object error) { + return 'Aufnahme konnte nicht gestartet werden: $error'; + } + + @override + String get unsupportedConfigVersion => + 'Nicht unterstützte Konfigurationsversion'; + + @override + String get audioErrorGeneric => 'Wiedergabefehler'; + + @override + String get audioErrorNoInternet => 'Keine Internetverbindung'; + + @override + String get audioErrorInvalidUrl => 'Die Radio-URL ist ungültig'; + + @override + String get audioErrorNotFound => 'Das Radio ist nicht verfügbar (Fehler 404)'; + + @override + String get audioErrorTimeout => 'Zeitüberschreitung beim Verbinden'; + + @override + String get audioErrorCannotConnect => + 'Es kann keine Verbindung zum Radio hergestellt werden'; + + @override + String get audioErrorUnsupportedFormat => 'Nicht unterstütztes Stream-Format'; + + @override + String get audioErrorDecode => 'Fehler beim Decodieren des Audiostreams'; + + @override + String get audioErrorCleartext => + 'Dieses Radio verwendet unverschlüsseltes HTTP, was nicht erlaubt ist'; + + @override + String get audioErrorSsl => 'Ungültiges SSL-Zertifikat für das Radio'; + + @override + String get audioErrorCannotPlay => + 'Dieses Radio kann nicht wiedergegeben werden'; + + @override + String get audioErrorUnexpectedPlayback => 'Unerwarteter Wiedergabefehler'; + + @override + String get androidExactAlarmScheduleError => + 'Android konnte keinen exakten Alarm planen. Prüfe die Berechtigung für exakte Alarme.'; + + @override + String get recordingPathEmptyError => 'Der Aufnahmepfad darf nicht leer sein'; + + @override + String get recordingMaxSizeInvalidError => + 'Die maximale Größe muss größer als null sein'; + + @override + String get recordingAlreadyActiveError => 'Es läuft bereits eine Aufnahme'; + + @override + String get alarmRingingFallbackActive => + 'Wiedergabe mit internem Sicherheitsaudio.'; + + @override + String get alarmRingingPreparingFallback => + 'Internes Sicherheitsaudio wird vorbereitet.'; + + @override + String get alarmRingingTryingStation => + 'Dein Sender wird mit der bestmöglichen verfügbaren Qualität gestartet.'; + + @override + String alarmScheduleOnce(Object date) { + return 'Einmal · $date'; + } + + @override + String alarmScheduleWeekdays(Object days) { + return 'Tage: $days'; + } + + @override + String get androidReliabilityTitle => 'Android-Zuverlässigkeit prüfen'; + + @override + String get closeAction => 'Schließen'; + + @override + String get customOption => 'Benutzerdefiniert'; + + @override + String get endLabel => 'Ende'; + + @override + String get equalizerDisable => 'Equalizer deaktivieren'; + + @override + String get helpTitle => 'Hilfe und Tutorial'; + + @override + String get helpSubtitle => + 'Funktionen, Tipps und Neuigkeiten von PluriWave ansehen.'; + + @override + String get indefiniteOption => 'Unbegrenzt'; + + @override + String get invalidNumber => 'Ungültige Zahl'; + + @override + String get nameLabel => 'Name'; + + @override + String get notPlaying => 'Wird nicht wiedergegeben'; + + @override + String get oneTimeOption => 'Einmal'; + + @override + String get pausePlaybackTooltip => 'Wiedergabe pausieren'; + + @override + String qualityOriginal(Object quality) { + return 'Originalqualität: $quality'; + } + + @override + String get qualityUnknown => 'Qualität nicht angegeben'; + + @override + String get recordAction => 'Aufnehmen'; + + @override + String get recordDurationTitle => 'Aufnahmedauer'; + + @override + String get recordRadioSubtitle => 'Wähle, wie lange aufgenommen werden soll.'; + + @override + String get recordRadioTitle => 'Radio aufnehmen'; + + @override + String get recordingActiveTitle => 'Radio wird aufgenommen'; + + @override + String get recordingDirectTitle => 'Direktaufnahme'; + + @override + String get recordingsOpenFolderPlainError => + 'Aufnahmeordner konnte nicht geöffnet werden'; + + @override + String get recordingsOpenLatest => 'Letzte Aufnahme öffnen'; + + @override + String get recordingsOpenLatestError => + 'Letzte Aufnahme konnte nicht geöffnet werden'; + + @override + String get startLabel => 'Beginn'; + + @override + String get startPlaybackTooltip => 'Wiedergabe starten'; + + @override + String get stopAction => 'Stoppen'; + + @override + String get stopPlaybackTooltip => 'Wiedergabe stoppen'; + + @override + String get weekdayShortMonday => 'Mo'; + + @override + String get weekdayShortTuesday => 'Di'; + + @override + String get weekdayShortWednesday => 'Mi'; + + @override + String get weekdayShortThursday => 'Do'; + + @override + String get weekdayShortFriday => 'Fr'; + + @override + String get weekdayShortSaturday => 'Sa'; + + @override + String get weekdayShortSunday => 'So'; } diff --git a/lib/l10n/gen/app_localizations_en.dart b/lib/l10n/gen/app_localizations_en.dart index 7d4efe6..275180b 100644 --- a/lib/l10n/gen/app_localizations_en.dart +++ b/lib/l10n/gen/app_localizations_en.dart @@ -57,6 +57,30 @@ class AppLocalizationsEn extends AppLocalizations { @override String get secondsLabel => 'Seconds'; + @override + String durationHoursMinutesSeconds( + Object hours, + Object minutes, + Object seconds, + ) { + return '$hours h $minutes min $seconds s'; + } + + @override + String durationMinutesSeconds(Object minutes, Object seconds) { + return '$minutes min $seconds s'; + } + + @override + String durationMinutesOnly(Object minutes) { + return '$minutes min'; + } + + @override + String durationSecondsOnly(Object seconds) { + return '$seconds s'; + } + @override String get saveQuickAccess => 'Save as quick access'; @@ -239,6 +263,9 @@ class AppLocalizationsEn extends AppLocalizations { @override String get stationNameLabel => 'Name *'; + @override + String get unnamedStation => 'Unnamed station'; + @override String get requiredField => 'Required field'; @@ -448,4 +475,717 @@ class AppLocalizationsEn extends AppLocalizations { String favoritesRemovedMessage(Object stationName) { return '$stationName removed from favorites'; } + + @override + String get alarmPostponedCurrentExecution => + 'Alarm postponed for this occurrence.'; + + @override + String get searchScreenTitle => 'Search signal'; + + @override + String get searchScreenSubtitle => + 'Find stations by name, country, or language with fast filters and high contrast.'; + + @override + String get searchFiltersLabel => 'Filters'; + + @override + String get searchHint => 'Radio Horizon, jazz, news...'; + + @override + String get searchCountryFilterLabel => 'Country'; + + @override + String get searchLanguageFilterLabel => 'Language'; + + @override + String get searchMinQualityFilterLabel => 'Minimum quality'; + + @override + String get searchEmptyTitle => 'Search for a station'; + + @override + String get searchNoResultsTitle => 'No results'; + + @override + String get searchEmptySubtitle => + 'Use the top bar or chips to discover stations from around the world.'; + + @override + String get searchNoResultsSubtitle => + 'Try removing filters or typing another name to find an active station.'; + + @override + String get countrySpain => 'Spain'; + + @override + String get countryUsa => 'USA'; + + @override + String get countryMexico => 'Mexico'; + + @override + String get countryArgentina => 'Argentina'; + + @override + String get countryUk => 'UK'; + + @override + String get countryFrance => 'France'; + + @override + String get countryGermany => 'Germany'; + + @override + String get countryItaly => 'Italy'; + + @override + String get countryBrazil => 'Brazil'; + + @override + String get countryJapan => 'Japan'; + + @override + String get languageNameSpanish => 'Spanish'; + + @override + String get languageNameEnglish => 'English'; + + @override + String get languageNameFrench => 'French'; + + @override + String get languageNameGerman => 'German'; + + @override + String get languageNamePortuguese => 'Portuguese'; + + @override + String get languageNameItalian => 'Italian'; + + @override + String get languageNameJapanese => 'Japanese'; + + @override + String get languageNameArabic => 'Arabic'; + + @override + String get languageNameRussian => 'Russian'; + + @override + String get homeScreenSubtitle => + 'Live global radio with clean signals, smart favorites, and a show-style visual experience.'; + + @override + String get exploreStations => 'Explore stations'; + + @override + String stationsCount(int count) { + return '$count stations'; + } + + @override + String get qualityHd => 'HD quality'; + + @override + String get nearYou => 'Near you'; + + @override + String nearYouInCountry(Object country) { + return 'Near you · $country'; + } + + @override + String get detectAction => 'Detect'; + + @override + String get liveRadar => 'Live radar'; + + @override + String get genresTitle => 'Genres'; + + @override + String get retryAction => 'Retry'; + + @override + String get noStationsAvailable => 'No stations available'; + + @override + String get noStationsAvailableSubtitle => + 'Try refreshing or choosing another genre to capture a signal again.'; + + @override + String get genrePop => 'Pop'; + + @override + String get genreRock => 'Rock'; + + @override + String get genreJazz => 'Jazz'; + + @override + String get genreClassical => 'Classical'; + + @override + String get genreElectronic => 'Electronic'; + + @override + String get genreNews => 'News'; + + @override + String get genreTalk => 'Talk'; + + @override + String get genreHipHop => 'Hip-hop'; + + @override + String get genreCountry => 'Country'; + + @override + String get genreMetal => 'Metal'; + + @override + String get genreReggae => 'Reggae'; + + @override + String get genreLatin => 'Latin'; + + @override + String get alarmScreenTitle => 'Music wake-up'; + + @override + String get alarmScreenSubtitle => + 'Alarms with radio, safe fallback sound, smart vacations, and the next occurrence always visible.'; + + @override + String get createAlarmAction => 'Create alarm'; + + @override + String alarmsCount(int count) { + return '$count alarms'; + } + + @override + String get activeAlarmsWithoutNextTitle => + 'Active alarms without a next occurrence'; + + @override + String get noActiveAlarms => 'No active alarms'; + + @override + String get nextAlarmTitle => 'Next alarm'; + + @override + String activeAlarmsWithoutNextSubtitle(int count) { + return 'There are $count active alarm(s), but they do not currently have a valid future date. Check date, weekdays, and vacations.'; + } + + @override + String get createAlarmHint => + 'Create an alarm and PluriWave will calculate the next occurrence automatically.'; + + @override + String get alarmVacationPlay => 'Plays during vacations'; + + @override + String get alarmVacationPause => 'Paused during vacations'; + + @override + String alarmFadeInLabel(int seconds) { + return 'Fade-in ${seconds}s'; + } + + @override + String alarmNextExecution(Object date) { + return 'Next occurrence: $date'; + } + + @override + String get alarmNoNextExecution => 'It has no active next occurrence.'; + + @override + String alarmSkippedExecution(Object date) { + return 'One occurrence was skipped: $date.'; + } + + @override + String get editAction => 'Edit'; + + @override + String get skipNextAction => 'Skip next'; + + @override + String get deleteTooltip => 'Delete'; + + @override + String get alarmSkippedNoNextSnackbar => + 'Alarm skipped. There is no next occurrence left.'; + + @override + String alarmSkippedReturnsSnackbar(Object date) { + return 'Alarm skipped. It will return on $date.'; + } + + @override + String alarmVacationPausedNoNext(Object vacationName) { + return 'It is paused for vacations ($vacationName) and has no next occurrence.'; + } + + @override + String alarmVacationPausedReturns(Object vacationName, Object date) { + return 'It is paused for vacations ($vacationName) and returns on $date.'; + } + + @override + String alarmVacationReturns(Object date) { + return 'With vacations enabled, it will ring again on $date.'; + } + + @override + String get defaultAlarmName => 'Music alarm'; + + @override + String get newAlarmTitle => 'New alarm'; + + @override + String get editAlarmTitle => 'Edit alarm'; + + @override + String get nameField => 'Name'; + + @override + String get timeField => 'Time'; + + @override + String get dateField => 'Date'; + + @override + String get onceOption => 'Once'; + + @override + String get dailyOption => 'Daily'; + + @override + String get weekdaysOption => 'Weekdays'; + + @override + String get soundAndVolumeSection => 'Sound and volume'; + + @override + String get alarmFadeInTitle => 'Alarm fade-in'; + + @override + String get alarmFadeInOff => '0 s (no transition)'; + + @override + String alarmFadeInSummary(int seconds) { + return '$seconds s (from 5% to the selected volume)'; + } + + @override + String get internalSafeSoundLabel => 'Internal safe sound'; + + @override + String get soundWarmSunrise => 'Warm sunrise'; + + @override + String get soundSoftBell => 'Soft bell'; + + @override + String get soundDigitalPulse => 'Digital pulse'; + + @override + String get favoriteStationLabel => 'Favorite station'; + + @override + String get noStationUseInternalSound => 'No station: use internal sound'; + + @override + String get saveFavoritesAlarmHint => + 'Save stations in Favorites to use them as a music alarm.'; + + @override + String get useCurrentStationAction => 'Use current station'; + + @override + String get playDuringVacations => 'Play during vacations'; + + @override + String get playDuringVacationsHint => + 'If you turn this off, the next occurrence will jump to the first valid day.'; + + @override + String get saveAlarmAction => 'Save alarm'; + + @override + String get chooseOneWeekdayError => 'Choose at least one weekday.'; + + @override + String get androidReliabilityReview => 'Review Android reliability'; + + @override + String get statusOk => 'OK'; + + @override + String get statusPending => 'pending'; + + @override + String androidReliabilityStatus( + Object exact, + Object notifications, + Object screen, + ) { + return 'Reliability: exact $exact · notifications $notifications · screen $screen'; + } + + @override + String get vacationRangesTitle => 'Vacation ranges'; + + @override + String get addAction => 'Add'; + + @override + String get vacationRangesHint => + 'If an alarm is set to \"Paused during vacations\", it automatically skips these ranges.'; + + @override + String get noVacationRangesLoaded => 'No ranges loaded.'; + + @override + String get deleteRangeTooltip => 'Delete range'; + + @override + String get vacationsDefaultName => 'Vacation'; + + @override + String get newVacationRangeTitle => 'New vacation range'; + + @override + String get startField => 'Start'; + + @override + String get endField => 'End'; + + @override + String get saveRangeAction => 'Save range'; + + @override + String get noAlarmsYetTitle => 'There are no alarms yet.'; + + @override + String get noAlarmsYetSubtitle => + 'Create one to design your musical wake-up.'; + + @override + String get ringingInternalAudioActive => 'Playing with internal safe audio.'; + + @override + String get ringingPreparingInternalAudio => 'Preparing internal safe audio.'; + + @override + String get stopAlarmAction => 'Stop alarm'; + + @override + String get pauseAction => 'Pause'; + + @override + String miniPlayerOpenLabel(Object stationName) { + return 'Open player for $stationName'; + } + + @override + String get playerIconLabel => 'Player'; + + @override + String get playbackStatusConnecting => 'Connecting...'; + + @override + String get playbackStatusLive => 'Live'; + + @override + String get playbackStatusPaused => 'Paused'; + + @override + String get playbackStatusConnectionError => 'Connection error'; + + @override + String get playbackStatusStopped => 'Stopped'; + + @override + String stationSemanticLabel(Object stationName) { + return 'Station $stationName'; + } + + @override + String get favoritesAddTooltip => 'Add to favorites'; + + @override + String favoritesAddedMessage(Object stationName) { + return '$stationName added to favorites'; + } + + @override + String get stationIconLabel => 'Station icon'; + + @override + String get liveNow => 'Live'; + + @override + String equalizerBandLabel(Object band) { + return '$band band'; + } + + @override + String equalizerBandValue(Object value) { + return '$value decibels'; + } + + @override + String get equalizerPresetFlat => 'Flat'; + + @override + String get equalizerPresetRock => 'Rock'; + + @override + String get equalizerPresetPop => 'Pop'; + + @override + String get equalizerPresetBassBoost => 'Bass Boost'; + + @override + String get equalizerPresetJazz => 'Jazz'; + + @override + String get equalizerPresetVoice => 'Voice'; + + @override + String get equalizerPresetCustom => 'Custom'; + + @override + String get onboardingTitle => 'Welcome to PluriWave'; + + @override + String get onboardingNewsTitle => 'What\'s new'; + + @override + String get onboardingStartAction => 'Start'; + + @override + String get onboardingCloseTooltip => 'Close'; + + @override + String radioRecordingError(Object error) { + return 'Error recording the radio: $error'; + } + + @override + String get radioApiConnectionError => 'No connection to the radio API'; + + @override + String get radioSearchError => 'Search error. Check your connection.'; + + @override + String get radioLoadMoreStationsError => 'Could not load more stations.'; + + @override + String get radioNearbyStationsError => + 'We could not detect nearby stations. Use country filters.'; + + @override + String radioCannotPlayStation(Object stationName) { + return 'Cannot play \"$stationName\"'; + } + + @override + String get recordingSelectStationFirst => + 'Select a station before recording.'; + + @override + String recordingStartError(Object error) { + return 'Could not start recording: $error'; + } + + @override + String get unsupportedConfigVersion => 'Unsupported configuration version'; + + @override + String get audioErrorGeneric => 'Playback error'; + + @override + String get audioErrorNoInternet => 'No internet connection'; + + @override + String get audioErrorInvalidUrl => 'The radio URL is not valid'; + + @override + String get audioErrorNotFound => 'The radio is not available (404 error)'; + + @override + String get audioErrorTimeout => 'Connection timed out'; + + @override + String get audioErrorCannotConnect => 'Cannot connect to the radio'; + + @override + String get audioErrorUnsupportedFormat => 'Unsupported stream format'; + + @override + String get audioErrorDecode => 'Error decoding the audio stream'; + + @override + String get audioErrorCleartext => + 'This radio uses unencrypted HTTP, which is not allowed'; + + @override + String get audioErrorSsl => 'Invalid SSL certificate on the radio'; + + @override + String get audioErrorCannotPlay => 'This radio cannot be played'; + + @override + String get audioErrorUnexpectedPlayback => 'Unexpected playback error'; + + @override + String get androidExactAlarmScheduleError => + 'Android could not schedule an exact alarm. Check the exact alarm permission.'; + + @override + String get recordingPathEmptyError => 'The recording path cannot be empty'; + + @override + String get recordingMaxSizeInvalidError => + 'The maximum size must be greater than zero'; + + @override + String get recordingAlreadyActiveError => + 'A recording is already in progress'; + + @override + String get alarmRingingFallbackActive => 'Playing with internal safe audio.'; + + @override + String get alarmRingingPreparingFallback => 'Preparing internal safe audio.'; + + @override + String get alarmRingingTryingStation => + 'Trying to play your station at the highest available quality.'; + + @override + String alarmScheduleOnce(Object date) { + return 'Once · $date'; + } + + @override + String alarmScheduleWeekdays(Object days) { + return 'Days: $days'; + } + + @override + String get androidReliabilityTitle => 'Review Android reliability'; + + @override + String get closeAction => 'Close'; + + @override + String get customOption => 'Custom'; + + @override + String get endLabel => 'End'; + + @override + String get equalizerDisable => 'Disable equalizer'; + + @override + String get helpTitle => 'Help and tutorial'; + + @override + String get helpSubtitle => 'Review PluriWave features, tips and what’s new.'; + + @override + String get indefiniteOption => 'Indefinite'; + + @override + String get invalidNumber => 'Invalid number'; + + @override + String get nameLabel => 'Name'; + + @override + String get notPlaying => 'Not playing'; + + @override + String get oneTimeOption => 'Once'; + + @override + String get pausePlaybackTooltip => 'Pause playback'; + + @override + String qualityOriginal(Object quality) { + return 'Original quality: $quality'; + } + + @override + String get qualityUnknown => 'Quality not reported'; + + @override + String get recordAction => 'Record'; + + @override + String get recordDurationTitle => 'Recording duration'; + + @override + String get recordRadioSubtitle => 'Choose how long you want to record.'; + + @override + String get recordRadioTitle => 'Record radio'; + + @override + String get recordingActiveTitle => 'Recording radio'; + + @override + String get recordingDirectTitle => 'Direct recording'; + + @override + String get recordingsOpenFolderPlainError => + 'Could not open the recordings folder'; + + @override + String get recordingsOpenLatest => 'Open latest recording'; + + @override + String get recordingsOpenLatestError => 'Could not open the latest recording'; + + @override + String get startLabel => 'Start'; + + @override + String get startPlaybackTooltip => 'Start playback'; + + @override + String get stopAction => 'Stop'; + + @override + String get stopPlaybackTooltip => 'Stop playback'; + + @override + String get weekdayShortMonday => 'Mon'; + + @override + String get weekdayShortTuesday => 'Tue'; + + @override + String get weekdayShortWednesday => 'Wed'; + + @override + String get weekdayShortThursday => 'Thu'; + + @override + String get weekdayShortFriday => 'Fri'; + + @override + String get weekdayShortSaturday => 'Sat'; + + @override + String get weekdayShortSunday => 'Sun'; } diff --git a/lib/l10n/gen/app_localizations_es.dart b/lib/l10n/gen/app_localizations_es.dart index 6b9c910..03f0c88 100644 --- a/lib/l10n/gen/app_localizations_es.dart +++ b/lib/l10n/gen/app_localizations_es.dart @@ -57,6 +57,30 @@ class AppLocalizationsEs extends AppLocalizations { @override String get secondsLabel => 'Segundos'; + @override + String durationHoursMinutesSeconds( + Object hours, + Object minutes, + Object seconds, + ) { + return '$hours h $minutes min $seconds s'; + } + + @override + String durationMinutesSeconds(Object minutes, Object seconds) { + return '$minutes min $seconds s'; + } + + @override + String durationMinutesOnly(Object minutes) { + return '$minutes min'; + } + + @override + String durationSecondsOnly(Object seconds) { + return '$seconds s'; + } + @override String get saveQuickAccess => 'Guardar como acceso rápido'; @@ -241,6 +265,9 @@ class AppLocalizationsEs extends AppLocalizations { @override String get stationNameLabel => 'Nombre *'; + @override + String get unnamedStation => 'Sin nombre'; + @override String get requiredField => 'Campo obligatorio'; @@ -451,4 +478,723 @@ class AppLocalizationsEs extends AppLocalizations { String favoritesRemovedMessage(Object stationName) { return '$stationName eliminada de favoritos'; } + + @override + String get alarmPostponedCurrentExecution => + 'Alarma pospuesta para esta ejecución.'; + + @override + String get searchScreenTitle => 'Buscar señal'; + + @override + String get searchScreenSubtitle => + 'Encontrá radios por nombre, país o idioma con filtros rápidos y alto contraste.'; + + @override + String get searchFiltersLabel => 'Filtros'; + + @override + String get searchHint => 'Radio Horizonte, jazz, noticias...'; + + @override + String get searchCountryFilterLabel => 'País'; + + @override + String get searchLanguageFilterLabel => 'Idioma'; + + @override + String get searchMinQualityFilterLabel => 'Calidad mínima'; + + @override + String get searchEmptyTitle => 'Buscá una emisora'; + + @override + String get searchNoResultsTitle => 'Sin resultados'; + + @override + String get searchEmptySubtitle => + 'Usá la barra superior o los chips para descubrir señales de todo el mundo.'; + + @override + String get searchNoResultsSubtitle => + 'Probá quitar filtros o escribir otro nombre para encontrar una señal activa.'; + + @override + String get countrySpain => 'España'; + + @override + String get countryUsa => 'EE. UU.'; + + @override + String get countryMexico => 'México'; + + @override + String get countryArgentina => 'Argentina'; + + @override + String get countryUk => 'Reino Unido'; + + @override + String get countryFrance => 'Francia'; + + @override + String get countryGermany => 'Alemania'; + + @override + String get countryItaly => 'Italia'; + + @override + String get countryBrazil => 'Brasil'; + + @override + String get countryJapan => 'Japón'; + + @override + String get languageNameSpanish => 'Español'; + + @override + String get languageNameEnglish => 'Inglés'; + + @override + String get languageNameFrench => 'Francés'; + + @override + String get languageNameGerman => 'Alemán'; + + @override + String get languageNamePortuguese => 'Portugués'; + + @override + String get languageNameItalian => 'Italiano'; + + @override + String get languageNameJapanese => 'Japonés'; + + @override + String get languageNameArabic => 'Árabe'; + + @override + String get languageNameRussian => 'Ruso'; + + @override + String get homeScreenSubtitle => + 'Radio global en vivo con señales limpias, favoritos inteligentes y una experiencia visual de concurso.'; + + @override + String get exploreStations => 'Explorar emisoras'; + + @override + String stationsCount(int count) { + return '$count radios'; + } + + @override + String get qualityHd => 'Calidad HD'; + + @override + String get nearYou => 'Cerca de vos'; + + @override + String nearYouInCountry(Object country) { + return 'Cerca de vos · $country'; + } + + @override + String get detectAction => 'Detectar'; + + @override + String get liveRadar => 'Radar en directo'; + + @override + String get genresTitle => 'Géneros'; + + @override + String get retryAction => 'Reintentar'; + + @override + String get noStationsAvailable => 'No hay emisoras disponibles'; + + @override + String get noStationsAvailableSubtitle => + 'Probá refrescar o elegir otro género para volver a capturar señal.'; + + @override + String get genrePop => 'Pop'; + + @override + String get genreRock => 'Rock'; + + @override + String get genreJazz => 'Jazz'; + + @override + String get genreClassical => 'Clásica'; + + @override + String get genreElectronic => 'Electrónica'; + + @override + String get genreNews => 'Noticias'; + + @override + String get genreTalk => 'Charlas'; + + @override + String get genreHipHop => 'Hip-hop'; + + @override + String get genreCountry => 'Country'; + + @override + String get genreMetal => 'Metal'; + + @override + String get genreReggae => 'Reggae'; + + @override + String get genreLatin => 'Latina'; + + @override + String get alarmScreenTitle => 'Despertar musical'; + + @override + String get alarmScreenSubtitle => + 'Alarmas con radio, sonido seguro, vacaciones inteligentes y próxima ejecución siempre visible.'; + + @override + String get createAlarmAction => 'Crear alarma'; + + @override + String alarmsCount(int count) { + return '$count alarmas'; + } + + @override + String get activeAlarmsWithoutNextTitle => + 'Alarmas activas sin próxima ejecución'; + + @override + String get noActiveAlarms => 'Sin alarmas activas'; + + @override + String get nextAlarmTitle => 'Próxima alarma'; + + @override + String activeAlarmsWithoutNextSubtitle(int count) { + return 'Hay $count alarma(s) activas, pero ahora mismo no tienen una fecha futura válida. Revisá fecha, días y vacaciones.'; + } + + @override + String get createAlarmHint => + 'Creá una alarma y PluriWave calculará la siguiente ejecución automáticamente.'; + + @override + String get alarmVacationPlay => 'Suena en vacaciones'; + + @override + String get alarmVacationPause => 'Pausa en vacaciones'; + + @override + String alarmFadeInLabel(int seconds) { + return 'Fade-in ${seconds}s'; + } + + @override + String alarmNextExecution(Object date) { + return 'Siguiente ejecución: $date'; + } + + @override + String get alarmNoNextExecution => 'No tiene próxima ejecución activa.'; + + @override + String alarmSkippedExecution(Object date) { + return 'Una ejecución fue omitida: $date.'; + } + + @override + String get editAction => 'Editar'; + + @override + String get skipNextAction => 'Omitir siguiente'; + + @override + String get deleteTooltip => 'Eliminar'; + + @override + String get alarmSkippedNoNextSnackbar => + 'Alarma omitida. No queda próxima ejecución.'; + + @override + String alarmSkippedReturnsSnackbar(Object date) { + return 'Alarma omitida. Volverá el $date.'; + } + + @override + String alarmVacationPausedNoNext(Object vacationName) { + return 'Está pausada por vacaciones ($vacationName) y sin próxima ejecución.'; + } + + @override + String alarmVacationPausedReturns(Object vacationName, Object date) { + return 'Está pausada por vacaciones ($vacationName) y vuelve el $date.'; + } + + @override + String alarmVacationReturns(Object date) { + return 'Con vacaciones activas, volverá a sonar el $date.'; + } + + @override + String get defaultAlarmName => 'Despertador musical'; + + @override + String get newAlarmTitle => 'Nueva alarma'; + + @override + String get editAlarmTitle => 'Editar alarma'; + + @override + String get nameField => 'Nombre'; + + @override + String get timeField => 'Hora'; + + @override + String get dateField => 'Fecha'; + + @override + String get onceOption => 'Una vez'; + + @override + String get dailyOption => 'Diaria'; + + @override + String get weekdaysOption => 'Días'; + + @override + String get soundAndVolumeSection => 'Sonido y volumen'; + + @override + String get alarmFadeInTitle => 'Fade-in de alarma'; + + @override + String get alarmFadeInOff => '0 s (sin transición)'; + + @override + String alarmFadeInSummary(int seconds) { + return '$seconds s (de 5% al volumen elegido)'; + } + + @override + String get internalSafeSoundLabel => 'Sonido seguro interno'; + + @override + String get soundWarmSunrise => 'Amanecer cálido'; + + @override + String get soundSoftBell => 'Campana suave'; + + @override + String get soundDigitalPulse => 'Pulso digital'; + + @override + String get favoriteStationLabel => 'Emisora favorita'; + + @override + String get noStationUseInternalSound => 'Sin emisora: usar sonido interno'; + + @override + String get saveFavoritesAlarmHint => + 'Guardá emisoras en Favoritos para usarlas como alarma musical.'; + + @override + String get useCurrentStationAction => 'Usar emisora actual'; + + @override + String get playDuringVacations => 'Sonar durante vacaciones'; + + @override + String get playDuringVacationsHint => + 'Si lo apagás, la próxima ejecución saltará al primer día válido.'; + + @override + String get saveAlarmAction => 'Guardar alarma'; + + @override + String get chooseOneWeekdayError => 'Elegí al menos un día de la semana.'; + + @override + String get androidReliabilityReview => 'Revisar fiabilidad Android'; + + @override + String get statusOk => 'OK'; + + @override + String get statusPending => 'pendiente'; + + @override + String androidReliabilityStatus( + Object exact, + Object notifications, + Object screen, + ) { + return 'Fiabilidad: exactas $exact · notificaciones $notifications · pantalla $screen'; + } + + @override + String get vacationRangesTitle => 'Rangos de vacaciones'; + + @override + String get addAction => 'Agregar'; + + @override + String get vacationRangesHint => + 'Si una alarma tiene \"Pausa en vacaciones\", se salta automáticamente estos rangos.'; + + @override + String get noVacationRangesLoaded => 'Sin rangos cargados.'; + + @override + String get deleteRangeTooltip => 'Eliminar rango'; + + @override + String get vacationsDefaultName => 'Vacaciones'; + + @override + String get newVacationRangeTitle => 'Nuevo rango de vacaciones'; + + @override + String get startField => 'Inicio'; + + @override + String get endField => 'Fin'; + + @override + String get saveRangeAction => 'Guardar rango'; + + @override + String get noAlarmsYetTitle => 'Todavía no hay alarmas.'; + + @override + String get noAlarmsYetSubtitle => + 'Creá una para diseñar tu despertar musical.'; + + @override + String get ringingInternalAudioActive => 'Sonando con audio seguro interno.'; + + @override + String get ringingPreparingInternalAudio => + 'Preparando audio seguro interno.'; + + @override + String get stopAlarmAction => 'Detener alarma'; + + @override + String get pauseAction => 'Pausar'; + + @override + String miniPlayerOpenLabel(Object stationName) { + return 'Abrir reproductor de $stationName'; + } + + @override + String get playerIconLabel => 'Reproductor'; + + @override + String get playbackStatusConnecting => 'Conectando...'; + + @override + String get playbackStatusLive => 'En directo'; + + @override + String get playbackStatusPaused => 'Pausado'; + + @override + String get playbackStatusConnectionError => 'Error de conexión'; + + @override + String get playbackStatusStopped => 'Detenido'; + + @override + String stationSemanticLabel(Object stationName) { + return 'Emisora $stationName'; + } + + @override + String get favoritesAddTooltip => 'Añadir a favoritos'; + + @override + String favoritesAddedMessage(Object stationName) { + return '$stationName añadida a favoritos'; + } + + @override + String get stationIconLabel => 'Icono de emisora'; + + @override + String get liveNow => 'En vivo'; + + @override + String equalizerBandLabel(Object band) { + return 'Banda $band'; + } + + @override + String equalizerBandValue(Object value) { + return '$value decibelios'; + } + + @override + String get equalizerPresetFlat => 'Plano'; + + @override + String get equalizerPresetRock => 'Rock'; + + @override + String get equalizerPresetPop => 'Pop'; + + @override + String get equalizerPresetBassBoost => 'Refuerzo de graves'; + + @override + String get equalizerPresetJazz => 'Jazz'; + + @override + String get equalizerPresetVoice => 'Voz'; + + @override + String get equalizerPresetCustom => 'Personalizado'; + + @override + String get onboardingTitle => 'Bienvenido a PluriWave'; + + @override + String get onboardingNewsTitle => 'Novedades'; + + @override + String get onboardingStartAction => 'Empezar'; + + @override + String get onboardingCloseTooltip => 'Cerrar'; + + @override + String radioRecordingError(Object error) { + return 'Error al grabar la radio: $error'; + } + + @override + String get radioApiConnectionError => 'Sin conexión a la API de radio'; + + @override + String get radioSearchError => 'Error en la búsqueda. Comprueba tu conexión.'; + + @override + String get radioLoadMoreStationsError => + 'No se pudieron cargar más emisoras.'; + + @override + String get radioNearbyStationsError => + 'No pudimos detectar emisoras cercanas. Usa filtros por país.'; + + @override + String radioCannotPlayStation(Object stationName) { + return 'No se puede reproducir \"$stationName\"'; + } + + @override + String get recordingSelectStationFirst => + 'Primero selecciona una emisora para grabar.'; + + @override + String recordingStartError(Object error) { + return 'No se pudo iniciar la grabación: $error'; + } + + @override + String get unsupportedConfigVersion => + 'Versión de configuración no compatible'; + + @override + String get audioErrorGeneric => 'Error de reproducción'; + + @override + String get audioErrorNoInternet => 'Sin conexión a internet'; + + @override + String get audioErrorInvalidUrl => 'La URL de la radio no es válida'; + + @override + String get audioErrorNotFound => 'La radio no está disponible (error 404)'; + + @override + String get audioErrorTimeout => 'Tiempo de espera agotado al conectar'; + + @override + String get audioErrorCannotConnect => 'No se puede conectar a la radio'; + + @override + String get audioErrorUnsupportedFormat => 'Formato de stream no compatible'; + + @override + String get audioErrorDecode => 'Error al decodificar el stream de audio'; + + @override + String get audioErrorCleartext => + 'Esta radio usa HTTP sin cifrar, y no está permitido'; + + @override + String get audioErrorSsl => 'Certificado SSL inválido en la radio'; + + @override + String get audioErrorCannotPlay => 'No se puede reproducir esta radio'; + + @override + String get audioErrorUnexpectedPlayback => 'Error inesperado al reproducir'; + + @override + String get androidExactAlarmScheduleError => + 'Android no pudo programar una alarma exacta. Revisa el permiso de alarmas exactas.'; + + @override + String get recordingPathEmptyError => + 'La ruta de grabación no puede estar vacía'; + + @override + String get recordingMaxSizeInvalidError => + 'El tamaño máximo debe ser mayor que cero'; + + @override + String get recordingAlreadyActiveError => 'Ya hay una grabación en curso'; + + @override + String get alarmRingingFallbackActive => 'Sonando con audio seguro interno.'; + + @override + String get alarmRingingPreparingFallback => + 'Preparando audio seguro interno.'; + + @override + String get alarmRingingTryingStation => + 'Intentando reproducir tu emisora con máxima calidad disponible.'; + + @override + String alarmScheduleOnce(Object date) { + return 'Una vez · $date'; + } + + @override + String alarmScheduleWeekdays(Object days) { + return 'Días: $days'; + } + + @override + String get androidReliabilityTitle => 'Revisar fiabilidad Android'; + + @override + String get closeAction => 'Cerrar'; + + @override + String get customOption => 'Personalizada'; + + @override + String get endLabel => 'Fin'; + + @override + String get equalizerDisable => 'Desactivar ecualizador'; + + @override + String get helpTitle => 'Ayuda y tutorial'; + + @override + String get helpSubtitle => + 'Repasá funciones, consejos y novedades de PluriWave.'; + + @override + String get indefiniteOption => 'Indefinida'; + + @override + String get invalidNumber => 'Número inválido'; + + @override + String get nameLabel => 'Nombre'; + + @override + String get notPlaying => 'No está reproduciendo'; + + @override + String get oneTimeOption => 'Una vez'; + + @override + String get pausePlaybackTooltip => 'Pausar reproducción'; + + @override + String qualityOriginal(Object quality) { + return 'Calidad original: $quality'; + } + + @override + String get qualityUnknown => 'Calidad no informada'; + + @override + String get recordAction => 'Grabar'; + + @override + String get recordDurationTitle => 'Duración de grabación'; + + @override + String get recordRadioSubtitle => 'Elegí cuánto tiempo querés grabar.'; + + @override + String get recordRadioTitle => 'Grabar radio'; + + @override + String get recordingActiveTitle => 'Grabando radio'; + + @override + String get recordingDirectTitle => 'Grabación directa'; + + @override + String get recordingsOpenFolderPlainError => + 'No se pudo abrir la carpeta de grabaciones'; + + @override + String get recordingsOpenLatest => 'Abrir última grabación'; + + @override + String get recordingsOpenLatestError => + 'No se pudo abrir la última grabación'; + + @override + String get startLabel => 'Inicio'; + + @override + String get startPlaybackTooltip => 'Iniciar reproducción'; + + @override + String get stopAction => 'Parar'; + + @override + String get stopPlaybackTooltip => 'Detener reproducción'; + + @override + String get weekdayShortMonday => 'Lun'; + + @override + String get weekdayShortTuesday => 'Mar'; + + @override + String get weekdayShortWednesday => 'Mié'; + + @override + String get weekdayShortThursday => 'Jue'; + + @override + String get weekdayShortFriday => 'Vie'; + + @override + String get weekdayShortSaturday => 'Sáb'; + + @override + String get weekdayShortSunday => 'Dom'; } diff --git a/lib/l10n/gen/app_localizations_fr.dart b/lib/l10n/gen/app_localizations_fr.dart index e0b341d..05f17b5 100644 --- a/lib/l10n/gen/app_localizations_fr.dart +++ b/lib/l10n/gen/app_localizations_fr.dart @@ -24,7 +24,7 @@ class AppLocalizationsFr extends AppLocalizations { String get navAlarms => 'Alarmes'; @override - String get navSettings => 'Settings'; + String get navSettings => 'Paramètres'; @override String get actionOk => 'OK'; @@ -34,56 +34,81 @@ class AppLocalizationsFr extends AppLocalizations { @override String get sleepTimerDescription => - 'Smooth radio shutdown with an exact countdown.'; + 'Arrêt progressif de la radio avec compte à rebours précis.'; @override - String get cancelTimer => 'Cancel timer'; + String get cancelTimer => 'Annuler le minuteur'; @override - String get optionOther => 'Other'; + String get optionOther => 'Autre'; @override - String get customDurationTitle => 'Custom duration'; + String get customDurationTitle => 'Durée personnalisée'; @override - String get durationGreaterThanZero => 'Choose a duration greater than zero.'; + String get durationGreaterThanZero => + 'Choisissez une durée supérieure à zéro.'; @override - String get hoursLabel => 'Hours'; + String get hoursLabel => 'Heures'; @override String get minutesLabel => 'Minutes'; @override - String get secondsLabel => 'Seconds'; + String get secondsLabel => 'Secondes'; @override - String get saveQuickAccess => 'Save as quick access'; - - @override - String get startTimer => 'Start timer'; - - @override - String skipCurrentAlarmExecution(Object alarmName) { - return 'Skipped this execution of $alarmName.'; + String durationHoursMinutesSeconds( + Object hours, + Object minutes, + Object seconds, + ) { + return '$hours h $minutes min $seconds s'; } @override - String get settingsTitle => 'Settings'; + String durationMinutesSeconds(Object minutes, Object seconds) { + return '$minutes min $seconds s'; + } + + @override + String durationMinutesOnly(Object minutes) { + return '$minutes min'; + } + + @override + String durationSecondsOnly(Object seconds) { + return '$seconds s'; + } + + @override + String get saveQuickAccess => 'Enregistrer comme raccourci'; + + @override + String get startTimer => 'Démarrer le minuteur'; + + @override + String skipCurrentAlarmExecution(Object alarmName) { + return 'Cette exécution de $alarmName a été ignorée.'; + } + + @override + String get settingsTitle => 'Paramètres'; @override String get settingsSubtitle => - 'Fine-grained sound control, backups, and custom stations.'; + 'Réglage précis du son, sauvegardes et stations personnalisées.'; @override String get languageSectionTitle => 'Langue'; @override String get languageSectionDescription => - 'Choose how the app language is displayed.'; + 'Choisissez le mode d’affichage de la langue de l’app.'; @override - String get languageSystemDefault => 'System'; + String get languageSystemDefault => 'Système'; @override String get languageSpanish => 'Espagnol'; @@ -93,230 +118,238 @@ class AppLocalizationsFr extends AppLocalizations { @override String languageUpdated(Object languageName) { - return 'Language updated: $languageName'; + return 'Langue mise à jour : $languageName'; } @override - String get languageUpdatedSystem => 'Language updated: System'; + String get languageUpdatedSystem => 'Langue mise à jour : Système'; @override - String get timerSectionTitle => 'Sleep timer'; + String get timerSectionTitle => 'Minuteur de sommeil'; @override - String get timerSectionAdd => 'Add'; + String get timerSectionAdd => 'Ajouter'; @override String get timerSectionDescription => - 'Customize the quick presets shown when automatically stopping the radio.'; + 'Personnalisez les raccourcis affichés lors de l’arrêt automatique de la radio.'; @override - String get timerSectionRestoreRecommended => 'Restore recommended times'; + String get timerSectionRestoreRecommended => + 'Restaurer les durées recommandées'; @override - String get newQuickAccessTitle => 'New quick access'; + String get newQuickAccessTitle => 'Nouveau raccourci'; @override - String get saveQuickAccessButton => 'Save quick access'; + String get saveQuickAccessButton => 'Enregistrer le raccourci'; @override - String get settingsSafeStatus => 'Safe'; + String get settingsSafeStatus => 'Sûr'; @override - String get recordingsSectionTitle => 'Recordings'; + String get recordingsSectionTitle => 'Enregistrements'; @override - String get recordingsFolderDialogTitle => 'Select recordings folder'; + String get recordingsFolderDialogTitle => + 'Sélectionnez le dossier d’enregistrement'; @override - String get recordingsPathUpdated => 'Recording path updated'; + String get recordingsPathUpdated => 'Chemin d’enregistrement mis à jour'; @override String recordingsPathSaveError(Object error) { - return 'Could not save the path: $error'; + return 'Impossible d’enregistrer le chemin : $error'; } @override String get recordingsDefaultFolderRestored => - 'The internal default folder will be used'; + 'Le dossier interne par défaut sera utilisé'; @override - String get recordingsFolderTitle => 'Recordings folder'; + String get recordingsFolderTitle => 'Dossier d’enregistrement'; @override - String get recordingsPathCalculating => 'Calculating path...'; + String get recordingsPathCalculating => 'Calcul du chemin...'; @override - String get recordingsChangePath => 'Change path'; + String get recordingsChangePath => 'Changer le chemin'; @override - String get recordingsUseDefaultPath => 'Use default path'; + String get recordingsUseDefaultPath => 'Utiliser le chemin par défaut'; @override String get recordingsOriginalStreamHint => - 'The radio is saved from the original stream, without recompressing.'; + 'La radio est enregistrée depuis le flux original, sans recompression.'; @override - String get equalizerActive => 'Active'; + String get equalizerActive => 'Actif'; @override - String get equalizerDisabled => 'Disabled'; + String get equalizerDisabled => 'Désactivé'; @override - String get equalizerEnable => 'Enable equalizer'; + String get equalizerEnable => 'Activer l’égaliseur'; @override String get equalizerRealtimeSubtitle => - 'Changes are applied in real time to the current station.'; + 'Les changements s’appliquent en temps réel à la station actuelle.'; @override String get equalizerPendingSubtitle => - 'Changes are saved and will apply when Android enables the effect.'; + 'Les changements sont enregistrés et s’appliqueront quand Android activera l’effet.'; @override - String get equalizerPerStationTitle => 'Use custom EQ for this favorite'; + String get equalizerPerStationTitle => 'Utiliser un EQ propre pour ce favori'; @override String equalizerPerStationActive(Object stationName) { - return 'Active for $stationName'; + return 'Actif pour $stationName'; } @override String equalizerPerStationMain(Object stationName) { - return 'Using main EQ for $stationName'; + return 'EQ principal utilisé pour $stationName'; } @override - String get preferredStationTitle => 'Preferred station'; + String get preferredStationTitle => 'Station préférée'; @override String get preferredStationDescription => - 'Preselected for new alarms and available for quick playback.'; + 'Présélectionnée lors de la création d’alarmes et disponible en lecture rapide.'; @override - String get preferredStationNoStationsTitle => 'No stations available yet'; + String get preferredStationNoStationsTitle => + 'Aucune station disponible pour le moment'; @override String get preferredStationNoStationsSubtitle => - 'Save favorites or load stations to choose a preferred one.'; + 'Enregistrez des favoris ou chargez des stations pour en choisir une préférée.'; @override - String get preferredStationAutomaticFallback => 'Automatic fallback'; + String get preferredStationAutomaticFallback => 'Repli automatique'; @override - String get preferredStationDefaultFavorite => 'Default favorite'; + String get preferredStationDefaultFavorite => 'Favori par défaut'; @override String preferredStationCurrent(Object stationName) { - return 'Current preferred: $stationName'; + return 'Préférée actuelle : $stationName'; } @override String preferredStationAutoUsing(Object stationName) { - return 'No favorites: automatically using $stationName'; + return 'Aucun favori : utilisation automatique de $stationName'; } @override - String get preferredStationPlay => 'Play preferred'; + String get preferredStationPlay => 'Lire la préférée'; @override - String get customStationsTitle => 'Custom stations'; + String get customStationsTitle => 'Stations personnalisées'; @override - String get customStationsAdd => 'Add'; + String get customStationsAdd => 'Ajouter'; @override - String get customStationsEmpty => 'No custom stations.'; + String get customStationsEmpty => 'Aucune station personnalisée.'; @override - String get playAction => 'Play'; + String get playAction => 'Lire'; @override - String get deleteAction => 'Delete'; + String get deleteAction => 'Supprimer'; @override - String get addStationTitle => 'Add station'; + String get addStationTitle => 'Ajouter une station'; @override - String get stationNameLabel => 'Name *'; + String get stationNameLabel => 'Nom *'; @override - String get requiredField => 'Required field'; + String get unnamedStation => 'Station sans nom'; @override - String get streamUrlLabel => 'Stream URL *'; + String get requiredField => 'Champ obligatoire'; @override - String get invalidUrl => 'Invalid URL'; + String get streamUrlLabel => 'URL du flux *'; @override - String get countryOptionalLabel => 'Country (optional)'; + String get invalidUrl => 'URL non valide'; @override - String get saveStation => 'Save station'; + String get countryOptionalLabel => 'Pays (facultatif)'; @override - String get backupSectionTitle => 'Backup'; + String get saveStation => 'Enregistrer la station'; @override - String get backupExportTitle => 'Export configuration'; + String get backupSectionTitle => 'Sauvegarde'; + + @override + String get backupExportTitle => 'Exporter la configuration'; @override String get backupExportSubtitle => - 'Favorites, custom stations, and EQ presets'; + 'Favoris, stations personnalisées et préréglages d’EQ'; @override - String get backupImportTitle => 'Import configuration'; + String get backupImportTitle => 'Importer la configuration'; @override - String get backupImportSubtitle => 'Restore from a backup file'; + String get backupImportSubtitle => + 'Restaurer depuis un fichier de sauvegarde'; @override - String get backupShareSubject => 'PluriWave — backup'; + String get backupShareSubject => 'PluriWave — sauvegarde'; @override String backupShareText(Object date) { - return 'PluriWave configuration exported on $date'; + return 'Configuration de PluriWave exportée le $date'; } @override String backupExportError(Object error) { - return 'Export error: $error'; + return 'Erreur d’exportation : $error'; } @override String get backupImportConfirmMessage => - 'This will add favorites, stations, and presets from the file. Continue?'; + 'Cela ajoutera les favoris, stations et préréglages du fichier. Continuer ?'; @override - String get backupImportSuccess => 'Configuration imported successfully'; + String get backupImportSuccess => 'Configuration importée avec succès'; @override String backupImportError(Object error) { - return 'Import error: $error'; + return 'Erreur d’importation : $error'; } @override - String get appVersionLoading => 'Loading version...'; + String get appVersionLoading => 'Chargement de la version...'; @override String appVersionSubtitle(Object version) { - return '$version - World radio'; + return '$version - Radio mondiale'; } @override - String get savedFavoritesTitle => 'Saved favorites'; + String get savedFavoritesTitle => 'Favoris enregistrés'; @override - String get stationFilterTitle => 'Station filter'; + String get stationFilterTitle => 'Filtre de stations'; @override - String get stationFilterSubtitle => 'Only stations verified as active'; + String get stationFilterSubtitle => + 'Seulement les stations vérifiées comme actives'; @override - String get backgroundAudioTitle => 'Background audio'; + String get backgroundAudioTitle => 'Audio en arrière-plan'; @override - String get backgroundAudioSubtitle => 'Continues when the screen turns off'; + String get backgroundAudioSubtitle => 'Continue lorsque l’écran s’éteint'; @override String get dash => '—'; @@ -325,127 +358,853 @@ class AppLocalizationsFr extends AppLocalizations { String get cancelAction => 'Annuler'; @override - String get equalizerTitle => 'Equalizer'; + String get equalizerTitle => 'Égaliseur'; @override - String get recordingsOpenFolder => 'Open folder'; + String get recordingsOpenFolder => 'Ouvrir le dossier'; @override String recordingsOpenFolderError(Object error) { - return 'Could not open the folder: $error'; + return 'Impossible d’ouvrir le dossier : $error'; } @override - String get recordingsMaxSizeTitle => 'Maximum recording size'; + String get recordingsMaxSizeTitle => 'Taille maximale d’enregistrement'; @override String recordingsMaxSizeSubtitle(int size) { - return 'Current limit: $size MB'; + return 'Limite actuelle : $size Mo'; } @override - String get recordingsMaxSizeDialogTitle => 'Maximum size per recording'; + String get recordingsMaxSizeDialogTitle => + 'Taille maximale par enregistrement'; @override - String get recordingsMaxSizeMbLabel => 'Maximum megabytes'; + String get recordingsMaxSizeMbLabel => 'Mégaoctets maximum'; @override String recordingsMaxSizeSaved(int size) { - return 'Recording limit updated to $size MB'; + return 'Limite d’enregistrement mise à jour à $size Mo'; } @override - String get stationOrderTitle => 'Station order'; + String get stationOrderTitle => 'Ordre des stations'; @override - String get stationOrderByName => 'By name'; + String get stationOrderByName => 'Par nom'; @override - String get stationOrderByQuality => 'By quality'; + String get stationOrderByQuality => 'Par qualité'; @override String get stationOrderScopeDescription => - 'Applies to favorites, searches, nearby stations and quick lists.'; + 'S’applique aux favoris, recherches, stations proches et listes rapides.'; @override - String get favoriteGroupsTitle => 'Favorite lists'; + String get favoriteGroupsTitle => 'Listes de favoris'; @override String get favoriteGroupsDescription => - 'Create short lists to organize your saved stations.'; + 'Créez de courtes listes pour organiser vos stations enregistrées.'; @override - String get favoriteGroupsAdd => 'Add list'; + String get favoriteGroupsAdd => 'Ajouter une liste'; @override - String get favoriteGroupsEdit => 'Edit list'; + String get favoriteGroupsEdit => 'Modifier la liste'; @override - String get favoriteGroupsDelete => 'Delete list'; + String get favoriteGroupsDelete => 'Supprimer la liste'; @override - String get favoriteGroupsNameLabel => 'List name'; + String get favoriteGroupsNameLabel => 'Nom de la liste'; @override - String get favoriteGroupsNameTooLong => 'Maximum 28 characters.'; + String get favoriteGroupsNameTooLong => 'Maximum 28 caractères.'; @override - String get favoriteGroupsUnassigned => 'Unassigned'; + String get favoriteGroupsUnassigned => 'Non assigné'; @override String get favoriteGroupsProtectedHint => - 'Default list: it cannot be edited or deleted.'; + 'Liste par défaut : elle ne peut être ni modifiée ni supprimée.'; @override - String get favoriteGroupsCreated => 'List created'; + String get favoriteGroupsCreated => 'Liste créée'; @override - String get favoriteGroupsUpdated => 'List updated'; + String get favoriteGroupsUpdated => 'Liste mise à jour'; @override String get favoriteGroupsDeleted => - 'List deleted; its stations return to Unassigned.'; + 'Liste supprimée ; ses stations retournent à Non assigné.'; @override - String get favoriteGroupsAssign => 'Move to list'; + String get favoriteGroupsAssign => 'Déplacer vers une liste'; @override String favoriteGroupsAssignSubtitle(Object groupName) { - return 'Current list: $groupName'; + return 'Liste actuelle : $groupName'; } @override String favoriteGroupsAssigned(Object stationName, Object groupName) { - return '$stationName moved to $groupName'; + return '$stationName déplacée vers $groupName'; } @override - String get favoritesTitle => 'Favorites'; + String get favoritesTitle => 'Favoris'; @override - String get favoritesEmptyTitle => 'No favorites yet'; + String get favoritesEmptyTitle => 'Aucun favori pour le moment'; @override String get favoritesEmptySubtitle => - 'Tap the heart on any station to save it to your collection.'; + 'Touchez le cœur sur n’importe quelle station pour l’enregistrer dans votre collection.'; @override String get favoritesHeaderSubtitle => - 'Organize your collection by lists and keep important radios close.'; + 'Organisez votre collection par listes et gardez les radios importantes à portée de main.'; @override String get favoritesCollection => 'Collection'; @override String favoritesSavedCount(int count) { - return '$count saved'; + return '$count enregistrés'; } @override - String get favoritesRemoveTooltip => 'Remove from favorites'; + String get favoritesRemoveTooltip => 'Retirer des favoris'; @override String favoritesRemovedMessage(Object stationName) { - return '$stationName removed from favorites'; + return '$stationName retirée des favoris'; } + + @override + String get alarmPostponedCurrentExecution => + 'Alarme reportée pour cette exécution.'; + + @override + String get searchScreenTitle => 'Rechercher un signal'; + + @override + String get searchScreenSubtitle => + 'Trouvez des stations par nom, pays ou langue grâce à des filtres rapides et à un contraste élevé.'; + + @override + String get searchFiltersLabel => 'Filtres'; + + @override + String get searchHint => 'Radio Horizon, jazz, infos...'; + + @override + String get searchCountryFilterLabel => 'Pays'; + + @override + String get searchLanguageFilterLabel => 'Langue'; + + @override + String get searchMinQualityFilterLabel => 'Qualité minimale'; + + @override + String get searchEmptyTitle => 'Recherchez une station'; + + @override + String get searchNoResultsTitle => 'Aucun résultat'; + + @override + String get searchEmptySubtitle => + 'Utilisez la barre du haut ou les pastilles pour découvrir des stations du monde entier.'; + + @override + String get searchNoResultsSubtitle => + 'Essayez de retirer des filtres ou de saisir un autre nom pour trouver une station active.'; + + @override + String get countrySpain => 'Espagne'; + + @override + String get countryUsa => 'États-Unis'; + + @override + String get countryMexico => 'Mexique'; + + @override + String get countryArgentina => 'Argentine'; + + @override + String get countryUk => 'Royaume-Uni'; + + @override + String get countryFrance => 'France'; + + @override + String get countryGermany => 'Allemagne'; + + @override + String get countryItaly => 'Italie'; + + @override + String get countryBrazil => 'Brésil'; + + @override + String get countryJapan => 'Japon'; + + @override + String get languageNameSpanish => 'espagnol'; + + @override + String get languageNameEnglish => 'anglais'; + + @override + String get languageNameFrench => 'français'; + + @override + String get languageNameGerman => 'allemand'; + + @override + String get languageNamePortuguese => 'portugais'; + + @override + String get languageNameItalian => 'italien'; + + @override + String get languageNameJapanese => 'japonais'; + + @override + String get languageNameArabic => 'arabe'; + + @override + String get languageNameRussian => 'russe'; + + @override + String get homeScreenSubtitle => + 'Radio mondiale en direct avec des signaux clairs, des favoris intelligents et une expérience visuelle de jeu télévisé.'; + + @override + String get exploreStations => 'Explorer les stations'; + + @override + String stationsCount(int count) { + return '$count radios'; + } + + @override + String get qualityHd => 'Qualité HD'; + + @override + String get nearYou => 'Près de vous'; + + @override + String nearYouInCountry(Object country) { + return 'Près de vous · $country'; + } + + @override + String get detectAction => 'Détecter'; + + @override + String get liveRadar => 'Radar en direct'; + + @override + String get genresTitle => 'Genres'; + + @override + String get retryAction => 'Réessayer'; + + @override + String get noStationsAvailable => 'Aucune station disponible'; + + @override + String get noStationsAvailableSubtitle => + 'Essayez d’actualiser ou de choisir un autre genre pour capter à nouveau un signal.'; + + @override + String get genrePop => 'Pop'; + + @override + String get genreRock => 'Rock'; + + @override + String get genreJazz => 'Jazz'; + + @override + String get genreClassical => 'Classique'; + + @override + String get genreElectronic => 'Électronique'; + + @override + String get genreNews => 'Infos'; + + @override + String get genreTalk => 'Débat'; + + @override + String get genreHipHop => 'Hip-hop'; + + @override + String get genreCountry => 'Country'; + + @override + String get genreMetal => 'Metal'; + + @override + String get genreReggae => 'Reggae'; + + @override + String get genreLatin => 'Latino'; + + @override + String get alarmScreenTitle => 'Réveil musical'; + + @override + String get alarmScreenSubtitle => + 'Alarmes avec radio, son sécurisé, vacances intelligentes et prochaine exécution toujours visible.'; + + @override + String get createAlarmAction => 'Créer une alarme'; + + @override + String alarmsCount(int count) { + return '$count alarmes'; + } + + @override + String get activeAlarmsWithoutNextTitle => + 'Alarmes actives sans prochaine exécution'; + + @override + String get noActiveAlarms => 'Aucune alarme active'; + + @override + String get nextAlarmTitle => 'Prochaine alarme'; + + @override + String activeAlarmsWithoutNextSubtitle(int count) { + return 'Il y a $count alarme(s) active(s), mais elles n’ont actuellement aucune date future valide. Vérifiez la date, les jours et les vacances.'; + } + + @override + String get createAlarmHint => + 'Créez une alarme et PluriWave calculera automatiquement la prochaine exécution.'; + + @override + String get alarmVacationPlay => 'Sonne pendant les vacances'; + + @override + String get alarmVacationPause => 'En pause pendant les vacances'; + + @override + String alarmFadeInLabel(int seconds) { + return 'Fondu d’entrée $seconds s'; + } + + @override + String alarmNextExecution(Object date) { + return 'Prochaine exécution : $date'; + } + + @override + String get alarmNoNextExecution => 'Aucune prochaine exécution active.'; + + @override + String alarmSkippedExecution(Object date) { + return 'Une exécution a été ignorée : $date.'; + } + + @override + String get editAction => 'Modifier'; + + @override + String get skipNextAction => 'Ignorer la suivante'; + + @override + String get deleteTooltip => 'Supprimer'; + + @override + String get alarmSkippedNoNextSnackbar => + 'Alarme ignorée. Il ne reste aucune prochaine exécution.'; + + @override + String alarmSkippedReturnsSnackbar(Object date) { + return 'Alarme ignorée. Elle reviendra le $date.'; + } + + @override + String alarmVacationPausedNoNext(Object vacationName) { + return 'En pause pour vacances ($vacationName) et sans prochaine exécution.'; + } + + @override + String alarmVacationPausedReturns(Object vacationName, Object date) { + return 'En pause pour vacances ($vacationName) et revient le $date.'; + } + + @override + String alarmVacationReturns(Object date) { + return 'Avec les vacances actives, elle sonnera à nouveau le $date.'; + } + + @override + String get defaultAlarmName => 'Réveil musical'; + + @override + String get newAlarmTitle => 'Nouvelle alarme'; + + @override + String get editAlarmTitle => 'Modifier l’alarme'; + + @override + String get nameField => 'Nom'; + + @override + String get timeField => 'Heure'; + + @override + String get dateField => 'Date'; + + @override + String get onceOption => 'Une fois'; + + @override + String get dailyOption => 'Quotidienne'; + + @override + String get weekdaysOption => 'Jours'; + + @override + String get soundAndVolumeSection => 'Son et volume'; + + @override + String get alarmFadeInTitle => 'Fondu d’entrée de l’alarme'; + + @override + String get alarmFadeInOff => '0 s (sans transition)'; + + @override + String alarmFadeInSummary(int seconds) { + return '$seconds s (de 5 % au volume choisi)'; + } + + @override + String get internalSafeSoundLabel => 'Son sécurisé interne'; + + @override + String get soundWarmSunrise => 'Lever de soleil chaleureux'; + + @override + String get soundSoftBell => 'Cloche douce'; + + @override + String get soundDigitalPulse => 'Impulsion numérique'; + + @override + String get favoriteStationLabel => 'Station favorite'; + + @override + String get noStationUseInternalSound => + 'Aucune station : utiliser le son interne'; + + @override + String get saveFavoritesAlarmHint => + 'Enregistrez des stations dans les Favoris pour les utiliser comme alarme musicale.'; + + @override + String get useCurrentStationAction => 'Utiliser la station actuelle'; + + @override + String get playDuringVacations => 'Sonner pendant les vacances'; + + @override + String get playDuringVacationsHint => + 'Si vous désactivez cette option, la prochaine exécution passera au premier jour valide.'; + + @override + String get saveAlarmAction => 'Enregistrer l’alarme'; + + @override + String get chooseOneWeekdayError => + 'Choisissez au moins un jour de la semaine.'; + + @override + String get androidReliabilityReview => 'Vérifier la fiabilité Android'; + + @override + String get statusOk => 'OK'; + + @override + String get statusPending => 'en attente'; + + @override + String androidReliabilityStatus( + Object exact, + Object notifications, + Object screen, + ) { + return 'Fiabilité : exactes $exact · notifications $notifications · écran $screen'; + } + + @override + String get vacationRangesTitle => 'Périodes de vacances'; + + @override + String get addAction => 'Ajouter'; + + @override + String get vacationRangesHint => + 'Si une alarme est en « pause pendant les vacances », ces périodes sont automatiquement ignorées.'; + + @override + String get noVacationRangesLoaded => 'Aucune période chargée.'; + + @override + String get deleteRangeTooltip => 'Supprimer la période'; + + @override + String get vacationsDefaultName => 'Vacances'; + + @override + String get newVacationRangeTitle => 'Nouvelle période de vacances'; + + @override + String get startField => 'Début'; + + @override + String get endField => 'Fin'; + + @override + String get saveRangeAction => 'Enregistrer la période'; + + @override + String get noAlarmsYetTitle => 'Il n’y a pas encore d’alarmes.'; + + @override + String get noAlarmsYetSubtitle => + 'Créez-en une pour concevoir votre réveil musical.'; + + @override + String get ringingInternalAudioActive => 'Son sécurisé interne en cours.'; + + @override + String get ringingPreparingInternalAudio => + 'Préparation du son sécurisé interne.'; + + @override + String get stopAlarmAction => 'Arrêter l’alarme'; + + @override + String get pauseAction => 'Pause'; + + @override + String miniPlayerOpenLabel(Object stationName) { + return 'Ouvrir le lecteur de $stationName'; + } + + @override + String get playerIconLabel => 'Lecteur'; + + @override + String get playbackStatusConnecting => 'Connexion...'; + + @override + String get playbackStatusLive => 'En direct'; + + @override + String get playbackStatusPaused => 'En pause'; + + @override + String get playbackStatusConnectionError => 'Erreur de connexion'; + + @override + String get playbackStatusStopped => 'Arrêté'; + + @override + String stationSemanticLabel(Object stationName) { + return 'Station $stationName'; + } + + @override + String get favoritesAddTooltip => 'Ajouter aux favoris'; + + @override + String favoritesAddedMessage(Object stationName) { + return '$stationName ajoutée aux favoris'; + } + + @override + String get stationIconLabel => 'Icône de station'; + + @override + String get liveNow => 'En direct'; + + @override + String equalizerBandLabel(Object band) { + return 'Bande $band'; + } + + @override + String equalizerBandValue(Object value) { + return '$value décibels'; + } + + @override + String get equalizerPresetFlat => 'Plat'; + + @override + String get equalizerPresetRock => 'Rock'; + + @override + String get equalizerPresetPop => 'Pop'; + + @override + String get equalizerPresetBassBoost => 'Renforcement des basses'; + + @override + String get equalizerPresetJazz => 'Jazz'; + + @override + String get equalizerPresetVoice => 'Voix'; + + @override + String get equalizerPresetCustom => 'Personnalisé'; + + @override + String get onboardingTitle => 'Bienvenue dans PluriWave'; + + @override + String get onboardingNewsTitle => 'Nouveautés'; + + @override + String get onboardingStartAction => 'Commencer'; + + @override + String get onboardingCloseTooltip => 'Fermer'; + + @override + String radioRecordingError(Object error) { + return 'Erreur lors de l\'enregistrement de la radio : $error'; + } + + @override + String get radioApiConnectionError => 'Aucune connexion à l\'API radio'; + + @override + String get radioSearchError => + 'Erreur de recherche. Vérifiez votre connexion.'; + + @override + String get radioLoadMoreStationsError => + 'Impossible de charger plus de stations.'; + + @override + String get radioNearbyStationsError => + 'Nous n\'avons pas pu détecter de stations proches. Utilisez les filtres par pays.'; + + @override + String radioCannotPlayStation(Object stationName) { + return 'Impossible de lire \"$stationName\"'; + } + + @override + String get recordingSelectStationFirst => + 'Sélectionnez d\'abord une station à enregistrer.'; + + @override + String recordingStartError(Object error) { + return 'Impossible de démarrer l\'enregistrement : $error'; + } + + @override + String get unsupportedConfigVersion => + 'Version de configuration non prise en charge'; + + @override + String get audioErrorGeneric => 'Erreur de lecture'; + + @override + String get audioErrorNoInternet => 'Aucune connexion Internet'; + + @override + String get audioErrorInvalidUrl => 'L\'URL de la radio n\'est pas valide'; + + @override + String get audioErrorNotFound => + 'La radio n\'est pas disponible (erreur 404)'; + + @override + String get audioErrorTimeout => 'Délai de connexion dépassé'; + + @override + String get audioErrorCannotConnect => 'Impossible de se connecter à la radio'; + + @override + String get audioErrorUnsupportedFormat => 'Format de flux non pris en charge'; + + @override + String get audioErrorDecode => 'Erreur lors du décodage du flux audio'; + + @override + String get audioErrorCleartext => + 'Cette radio utilise HTTP non chiffré, ce qui n\'est pas autorisé'; + + @override + String get audioErrorSsl => 'Certificat SSL invalide pour la radio'; + + @override + String get audioErrorCannotPlay => 'Impossible de lire cette radio'; + + @override + String get audioErrorUnexpectedPlayback => 'Erreur de lecture inattendue'; + + @override + String get androidExactAlarmScheduleError => + 'Android n\'a pas pu programmer une alarme exacte. Vérifiez l\'autorisation des alarmes exactes.'; + + @override + String get recordingPathEmptyError => + 'Le chemin d\'enregistrement ne peut pas être vide'; + + @override + String get recordingMaxSizeInvalidError => + 'La taille maximale doit être supérieure à zéro'; + + @override + String get recordingAlreadyActiveError => + 'Un enregistrement est déjà en cours'; + + @override + String get alarmRingingFallbackActive => + 'Lecture avec l’audio interne sécurisé.'; + + @override + String get alarmRingingPreparingFallback => + 'Préparation de l’audio interne sécurisé.'; + + @override + String get alarmRingingTryingStation => + 'Tentative de lecture de votre station avec la meilleure qualité disponible.'; + + @override + String alarmScheduleOnce(Object date) { + return 'Une fois · $date'; + } + + @override + String alarmScheduleWeekdays(Object days) { + return 'Jours : $days'; + } + + @override + String get androidReliabilityTitle => 'Vérifier la fiabilité Android'; + + @override + String get closeAction => 'Fermer'; + + @override + String get customOption => 'Personnalisée'; + + @override + String get endLabel => 'Fin'; + + @override + String get equalizerDisable => 'Désactiver l’égaliseur'; + + @override + String get helpTitle => 'Aide et tutoriel'; + + @override + String get helpSubtitle => + 'Revoyez les fonctions, conseils et nouveautés de PluriWave.'; + + @override + String get indefiniteOption => 'Indéfinie'; + + @override + String get invalidNumber => 'Nombre invalide'; + + @override + String get nameLabel => 'Nom'; + + @override + String get notPlaying => 'Lecture arrêtée'; + + @override + String get oneTimeOption => 'Une fois'; + + @override + String get pausePlaybackTooltip => 'Mettre en pause'; + + @override + String qualityOriginal(Object quality) { + return 'Qualité d’origine : $quality'; + } + + @override + String get qualityUnknown => 'Qualité non indiquée'; + + @override + String get recordAction => 'Enregistrer'; + + @override + String get recordDurationTitle => 'Durée d’enregistrement'; + + @override + String get recordRadioSubtitle => 'Choisissez la durée d’enregistrement.'; + + @override + String get recordRadioTitle => 'Enregistrer la radio'; + + @override + String get recordingActiveTitle => 'Enregistrement de la radio'; + + @override + String get recordingDirectTitle => 'Enregistrement direct'; + + @override + String get recordingsOpenFolderPlainError => + 'Impossible d’ouvrir le dossier des enregistrements'; + + @override + String get recordingsOpenLatest => 'Ouvrir le dernier enregistrement'; + + @override + String get recordingsOpenLatestError => + 'Impossible d’ouvrir le dernier enregistrement'; + + @override + String get startLabel => 'Début'; + + @override + String get startPlaybackTooltip => 'Démarrer la lecture'; + + @override + String get stopAction => 'Arrêter'; + + @override + String get stopPlaybackTooltip => 'Arrêter la lecture'; + + @override + String get weekdayShortMonday => 'Lun'; + + @override + String get weekdayShortTuesday => 'Mar'; + + @override + String get weekdayShortWednesday => 'Mer'; + + @override + String get weekdayShortThursday => 'Jeu'; + + @override + String get weekdayShortFriday => 'Ven'; + + @override + String get weekdayShortSaturday => 'Sam'; + + @override + String get weekdayShortSunday => 'Dim'; } diff --git a/lib/l10n/gen/app_localizations_hi.dart b/lib/l10n/gen/app_localizations_hi.dart index c6fb417..62efdea 100644 --- a/lib/l10n/gen/app_localizations_hi.dart +++ b/lib/l10n/gen/app_localizations_hi.dart @@ -12,440 +12,1183 @@ class AppLocalizationsHi extends AppLocalizations { String get appTitle => 'PluriWave'; @override - String get navHome => 'Home'; + String get navHome => 'मुखपृष्ठ'; @override - String get navSearch => 'Search'; + String get navSearch => 'खोज'; @override - String get navFavorites => 'Favorites'; + String get navFavorites => 'पसंदीदा'; @override - String get navAlarms => 'Alarms'; + String get navAlarms => 'अलार्म'; @override - String get navSettings => 'Settings'; + String get navSettings => 'सेटिंग्स'; @override - String get actionOk => 'OK'; + String get actionOk => 'ठीक है'; @override - String get sleepTimer => 'Sleep timer'; + String get sleepTimer => 'नींद टाइमर'; @override String get sleepTimerDescription => - 'Smooth radio shutdown with an exact countdown.'; + 'सटीक उलटी गिनती के साथ रेडियो को धीरे से बंद करना।'; @override - String get cancelTimer => 'Cancel timer'; + String get cancelTimer => 'टाइमर रद्द करें'; @override - String get optionOther => 'Other'; + String get optionOther => 'अन्य'; @override - String get customDurationTitle => 'Custom duration'; + String get customDurationTitle => 'मनचाही अवधि'; @override - String get durationGreaterThanZero => 'Choose a duration greater than zero.'; + String get durationGreaterThanZero => 'शून्य से अधिक अवधि चुनें।'; @override - String get hoursLabel => 'Hours'; + String get hoursLabel => 'घंटे'; @override - String get minutesLabel => 'Minutes'; + String get minutesLabel => 'मिनट'; @override - String get secondsLabel => 'Seconds'; + String get secondsLabel => 'सेकंड'; @override - String get saveQuickAccess => 'Save as quick access'; + String durationHoursMinutesSeconds( + Object hours, + Object minutes, + Object seconds, + ) { + return '$hours ?? $minutes ?? $seconds ??'; + } @override - String get startTimer => 'Start timer'; + String durationMinutesSeconds(Object minutes, Object seconds) { + return '$minutes ?? $seconds ??'; + } + + @override + String durationMinutesOnly(Object minutes) { + return '$minutes ??'; + } + + @override + String durationSecondsOnly(Object seconds) { + return '$seconds ??'; + } + + @override + String get saveQuickAccess => 'त्वरित पहुँच के रूप में सहेजें'; + + @override + String get startTimer => 'टाइमर शुरू करें'; @override String skipCurrentAlarmExecution(Object alarmName) { - return 'Skipped this execution of $alarmName.'; + return '$alarmName की यह चाल छोड़ दी गई।'; } @override - String get settingsTitle => 'Settings'; + String get settingsTitle => 'सेटिंग्स'; @override String get settingsSubtitle => - 'Fine-grained sound control, backups, and custom stations.'; + 'ध्वनि, बैकअप और मनचाहे स्टेशनों पर बारीक नियंत्रण।'; @override - String get languageSectionTitle => 'Language'; + String get languageSectionTitle => 'भाषा'; @override String get languageSectionDescription => - 'Choose how the app language is displayed.'; + 'ऐप की भाषा कैसे दिखाई जाए, यह चुनें।'; @override - String get languageSystemDefault => 'System'; + String get languageSystemDefault => 'सिस्टम'; @override - String get languageSpanish => 'Spanish'; + String get languageSpanish => 'स्पैनिश'; @override - String get languageEnglish => 'English'; + String get languageEnglish => 'अंग्रेज़ी'; @override String languageUpdated(Object languageName) { - return 'Language updated: $languageName'; + return 'भाषा अपडेट हुई: $languageName'; } @override - String get languageUpdatedSystem => 'Language updated: System'; + String get languageUpdatedSystem => 'भाषा अपडेट हुई: सिस्टम'; @override - String get timerSectionTitle => 'Sleep timer'; + String get timerSectionTitle => 'नींद टाइमर'; @override - String get timerSectionAdd => 'Add'; + String get timerSectionAdd => 'जोड़ें'; @override String get timerSectionDescription => - 'Customize the quick presets shown when automatically stopping the radio.'; + 'रेडियो को अपने-आप बंद करते समय दिखने वाले त्वरित प्रीसेट सजाएँ।'; @override - String get timerSectionRestoreRecommended => 'Restore recommended times'; + String get timerSectionRestoreRecommended => 'अनुशंसित समय वापस लाएँ'; @override - String get newQuickAccessTitle => 'New quick access'; + String get newQuickAccessTitle => 'नई त्वरित पहुँच'; @override - String get saveQuickAccessButton => 'Save quick access'; + String get saveQuickAccessButton => 'त्वरित पहुँच सहेजें'; @override - String get settingsSafeStatus => 'Safe'; + String get settingsSafeStatus => 'सुरक्षित'; @override - String get recordingsSectionTitle => 'Recordings'; + String get recordingsSectionTitle => 'रिकॉर्डिंग'; @override - String get recordingsFolderDialogTitle => 'Select recordings folder'; + String get recordingsFolderDialogTitle => 'रिकॉर्डिंग फ़ोल्डर चुनें'; @override - String get recordingsPathUpdated => 'Recording path updated'; + String get recordingsPathUpdated => 'रिकॉर्डिंग पथ अपडेट हुआ'; @override String recordingsPathSaveError(Object error) { - return 'Could not save the path: $error'; + return 'पथ सहेजा नहीं जा सका: $error'; } @override String get recordingsDefaultFolderRestored => - 'The internal default folder will be used'; + 'डिफ़ॉल्ट आंतरिक फ़ोल्डर इस्तेमाल होगा'; @override - String get recordingsFolderTitle => 'Recordings folder'; + String get recordingsFolderTitle => 'रिकॉर्डिंग फ़ोल्डर'; @override - String get recordingsPathCalculating => 'Calculating path...'; + String get recordingsPathCalculating => 'पथ की गणना हो रही है...'; @override - String get recordingsChangePath => 'Change path'; + String get recordingsChangePath => 'पथ बदलें'; @override - String get recordingsUseDefaultPath => 'Use default path'; + String get recordingsUseDefaultPath => 'डिफ़ॉल्ट पथ इस्तेमाल करें'; @override String get recordingsOriginalStreamHint => - 'The radio is saved from the original stream, without recompressing.'; + 'रेडियो मूल स्ट्रीम से सहेजा जाता है, बिना दोबारा संपीड़ित किए।'; @override - String get equalizerActive => 'Active'; + String get equalizerActive => 'सक्रिय'; @override - String get equalizerDisabled => 'Disabled'; + String get equalizerDisabled => 'निष्क्रिय'; @override - String get equalizerEnable => 'Enable equalizer'; + String get equalizerEnable => 'इक्वलाइज़र चालू करें'; @override String get equalizerRealtimeSubtitle => - 'Changes are applied in real time to the current station.'; + 'बदलाव वर्तमान स्टेशन पर तुरंत लागू होते हैं।'; @override String get equalizerPendingSubtitle => - 'Changes are saved and will apply when Android enables the effect.'; + 'बदलाव सहेजे जाते हैं और Android प्रभाव सक्षम होने पर लागू होंगे।'; @override - String get equalizerPerStationTitle => 'Use custom EQ for this favorite'; + String get equalizerPerStationTitle => + 'इस पसंदीदा के लिए अपना EQ इस्तेमाल करें'; @override String equalizerPerStationActive(Object stationName) { - return 'Active for $stationName'; + return '$stationName के लिए सक्रिय'; } @override String equalizerPerStationMain(Object stationName) { - return 'Using main EQ for $stationName'; + return '$stationName के लिए मुख्य EQ इस्तेमाल हो रहा है'; } @override - String get preferredStationTitle => 'Preferred station'; + String get preferredStationTitle => 'पसंदीदा स्टेशन'; @override String get preferredStationDescription => - 'Preselected for new alarms and available for quick playback.'; + 'नए अलार्म बनाते समय पहले से चुना जाता है और त्वरित प्लेबैक में चल सकता है।'; @override - String get preferredStationNoStationsTitle => 'No stations available yet'; + String get preferredStationNoStationsTitle => 'अभी कोई स्टेशन उपलब्ध नहीं है'; @override String get preferredStationNoStationsSubtitle => - 'Save favorites or load stations to choose a preferred one.'; + 'पसंदीदा स्टेशन चुनने के लिए पसंदीदा सहेजें या स्टेशन लोड करें।'; @override - String get preferredStationAutomaticFallback => 'Automatic fallback'; + String get preferredStationAutomaticFallback => 'स्वचालित विकल्प'; @override - String get preferredStationDefaultFavorite => 'Default favorite'; + String get preferredStationDefaultFavorite => 'डिफ़ॉल्ट पसंदीदा'; @override String preferredStationCurrent(Object stationName) { - return 'Current preferred: $stationName'; + return 'वर्तमान पसंदीदा: $stationName'; } @override String preferredStationAutoUsing(Object stationName) { - return 'No favorites: automatically using $stationName'; + return 'कोई पसंदीदा नहीं: अपने-आप $stationName इस्तेमाल हो रहा है'; } @override - String get preferredStationPlay => 'Play preferred'; + String get preferredStationPlay => 'पसंदीदा चलाएँ'; @override - String get customStationsTitle => 'Custom stations'; + String get customStationsTitle => 'मनचाहे स्टेशन'; @override - String get customStationsAdd => 'Add'; + String get customStationsAdd => 'जोड़ें'; @override - String get customStationsEmpty => 'No custom stations.'; + String get customStationsEmpty => 'कोई मनचाहा स्टेशन नहीं।'; @override - String get playAction => 'Play'; + String get playAction => 'चलाएँ'; @override - String get deleteAction => 'Delete'; + String get deleteAction => 'हटाएँ'; @override - String get addStationTitle => 'Add station'; + String get addStationTitle => 'स्टेशन जोड़ें'; @override - String get stationNameLabel => 'Name *'; + String get stationNameLabel => 'नाम *'; @override - String get requiredField => 'Required field'; + String get unnamedStation => 'बिना नाम का स्टेशन'; @override - String get streamUrlLabel => 'Stream URL *'; + String get requiredField => 'आवश्यक फ़ील्ड'; @override - String get invalidUrl => 'Invalid URL'; + String get streamUrlLabel => 'स्ट्रीम URL *'; @override - String get countryOptionalLabel => 'Country (optional)'; + String get invalidUrl => 'अमान्य URL'; @override - String get saveStation => 'Save station'; + String get countryOptionalLabel => 'देश (वैकल्पिक)'; @override - String get backupSectionTitle => 'Backup'; + String get saveStation => 'स्टेशन सहेजें'; @override - String get backupExportTitle => 'Export configuration'; + String get backupSectionTitle => 'बैकअप'; @override - String get backupExportSubtitle => - 'Favorites, custom stations, and EQ presets'; + String get backupExportTitle => 'सेटिंग्स निर्यात करें'; @override - String get backupImportTitle => 'Import configuration'; + String get backupExportSubtitle => 'पसंदीदा, मनचाहे स्टेशन और EQ प्रीसेट'; @override - String get backupImportSubtitle => 'Restore from a backup file'; + String get backupImportTitle => 'सेटिंग्स आयात करें'; @override - String get backupShareSubject => 'PluriWave — backup'; + String get backupImportSubtitle => 'बैकअप फ़ाइल से पुनर्स्थापित करें'; + + @override + String get backupShareSubject => 'PluriWave — बैकअप'; @override String backupShareText(Object date) { - return 'PluriWave configuration exported on $date'; + return '$date को निर्यात की गई PluriWave सेटिंग्स'; } @override String backupExportError(Object error) { - return 'Export error: $error'; + return 'निर्यात करते समय त्रुटि: $error'; } @override String get backupImportConfirmMessage => - 'This will add favorites, stations, and presets from the file. Continue?'; + 'यह फ़ाइल से पसंदीदा, स्टेशन और प्रीसेट जोड़ देगा। जारी रखें?'; @override - String get backupImportSuccess => 'Configuration imported successfully'; + String get backupImportSuccess => 'सेटिंग्स सफलतापूर्वक आयात हुईं'; @override String backupImportError(Object error) { - return 'Import error: $error'; + return 'आयात करते समय त्रुटि: $error'; } @override - String get appVersionLoading => 'Loading version...'; + String get appVersionLoading => 'संस्करण लोड हो रहा है...'; @override String appVersionSubtitle(Object version) { - return '$version - World radio'; + return '$version - विश्व रेडियो'; } @override - String get savedFavoritesTitle => 'Saved favorites'; + String get savedFavoritesTitle => 'सहेजे गए पसंदीदा'; @override - String get stationFilterTitle => 'Station filter'; + String get stationFilterTitle => 'स्टेशन फ़िल्टर'; @override - String get stationFilterSubtitle => 'Only stations verified as active'; + String get stationFilterSubtitle => 'केवल सक्रिय सत्यापित स्टेशन'; @override - String get backgroundAudioTitle => 'Background audio'; + String get backgroundAudioTitle => 'पृष्ठभूमि ऑडियो'; @override - String get backgroundAudioSubtitle => 'Continues when the screen turns off'; + String get backgroundAudioSubtitle => 'स्क्रीन बंद होने पर भी जारी रहता है'; @override String get dash => '—'; @override - String get cancelAction => 'Cancel'; + String get cancelAction => 'रद्द करें'; @override - String get equalizerTitle => 'Equalizer'; + String get equalizerTitle => 'इक्वलाइज़र'; @override - String get recordingsOpenFolder => 'Open folder'; + String get recordingsOpenFolder => 'फ़ोल्डर खोलें'; @override String recordingsOpenFolderError(Object error) { - return 'Could not open the folder: $error'; + return 'फ़ोल्डर नहीं खुल सका: $error'; } @override - String get recordingsMaxSizeTitle => 'Maximum recording size'; + String get recordingsMaxSizeTitle => 'रिकॉर्डिंग का अधिकतम आकार'; @override String recordingsMaxSizeSubtitle(int size) { - return 'Current limit: $size MB'; + return 'वर्तमान सीमा: $size MB'; } @override - String get recordingsMaxSizeDialogTitle => 'Maximum size per recording'; + String get recordingsMaxSizeDialogTitle => 'प्रति रिकॉर्डिंग अधिकतम आकार'; @override - String get recordingsMaxSizeMbLabel => 'Maximum megabytes'; + String get recordingsMaxSizeMbLabel => 'अधिकतम मेगाबाइट'; @override String recordingsMaxSizeSaved(int size) { - return 'Recording limit updated to $size MB'; + return 'रिकॉर्डिंग सीमा $size MB पर अपडेट हुई'; } @override - String get stationOrderTitle => 'Station order'; + String get stationOrderTitle => 'स्टेशन क्रम'; @override - String get stationOrderByName => 'By name'; + String get stationOrderByName => 'नाम से'; @override - String get stationOrderByQuality => 'By quality'; + String get stationOrderByQuality => 'गुणवत्ता से'; @override String get stationOrderScopeDescription => - 'Applies to favorites, searches, nearby stations and quick lists.'; + 'पसंदीदा, खोज, पास के स्टेशन और त्वरित सूचियों पर लागू होता है।'; @override - String get favoriteGroupsTitle => 'Favorite lists'; + String get favoriteGroupsTitle => 'पसंदीदा सूचियाँ'; @override String get favoriteGroupsDescription => - 'Create short lists to organize your saved stations.'; + 'सहेजे गए स्टेशनों को व्यवस्थित करने के लिए छोटी सूचियाँ बनाएँ।'; @override - String get favoriteGroupsAdd => 'Add list'; + String get favoriteGroupsAdd => 'सूची जोड़ें'; @override - String get favoriteGroupsEdit => 'Edit list'; + String get favoriteGroupsEdit => 'सूची संपादित करें'; @override - String get favoriteGroupsDelete => 'Delete list'; + String get favoriteGroupsDelete => 'सूची हटाएँ'; @override - String get favoriteGroupsNameLabel => 'List name'; + String get favoriteGroupsNameLabel => 'सूची का नाम'; @override - String get favoriteGroupsNameTooLong => 'Maximum 28 characters.'; + String get favoriteGroupsNameTooLong => 'अधिकतम 28 वर्ण।'; @override - String get favoriteGroupsUnassigned => 'Unassigned'; + String get favoriteGroupsUnassigned => 'अनिर्धारित'; @override String get favoriteGroupsProtectedHint => - 'Default list: it cannot be edited or deleted.'; + 'डिफ़ॉल्ट सूची: संपादित या हटाई नहीं जा सकती।'; @override - String get favoriteGroupsCreated => 'List created'; + String get favoriteGroupsCreated => 'सूची बनाई गई'; @override - String get favoriteGroupsUpdated => 'List updated'; + String get favoriteGroupsUpdated => 'सूची अपडेट हुई'; @override String get favoriteGroupsDeleted => - 'List deleted; its stations return to Unassigned.'; + 'सूची हटाई गई; उसके स्टेशन अनिर्धारित में लौट गए।'; @override - String get favoriteGroupsAssign => 'Move to list'; + String get favoriteGroupsAssign => 'सूची में ले जाएँ'; @override String favoriteGroupsAssignSubtitle(Object groupName) { - return 'Current list: $groupName'; + return 'वर्तमान सूची: $groupName'; } @override String favoriteGroupsAssigned(Object stationName, Object groupName) { - return '$stationName moved to $groupName'; + return '$stationName को $groupName में ले जाया गया'; } @override - String get favoritesTitle => 'Favorites'; + String get favoritesTitle => 'पसंदीदा'; @override - String get favoritesEmptyTitle => 'No favorites yet'; + String get favoritesEmptyTitle => 'अभी कोई पसंदीदा नहीं'; @override String get favoritesEmptySubtitle => - 'Tap the heart on any station to save it to your collection.'; + 'किसी भी स्टेशन पर दिल दबाकर उसे अपने संग्रह में सहेजें।'; @override String get favoritesHeaderSubtitle => - 'Organize your collection by lists and keep important radios close.'; + 'अपने संग्रह को सूचियों में सजाएँ और महत्वपूर्ण रेडियो पास रखें।'; @override - String get favoritesCollection => 'Collection'; + String get favoritesCollection => 'संग्रह'; @override String favoritesSavedCount(int count) { - return '$count saved'; + return '$count सहेजे गए'; } @override - String get favoritesRemoveTooltip => 'Remove from favorites'; + String get favoritesRemoveTooltip => 'पसंदीदा से हटाएँ'; @override String favoritesRemovedMessage(Object stationName) { - return '$stationName removed from favorites'; + return '$stationName पसंदीदा से हटाया गया'; } + + @override + String get alarmPostponedCurrentExecution => + 'इस चाल के लिए अलार्म स्थगित किया गया।'; + + @override + String get searchScreenTitle => 'सिग्नल खोजें'; + + @override + String get searchScreenSubtitle => + 'नाम, देश या भाषा से तेज़ फ़िल्टर और उच्च कंट्रास्ट के साथ रेडियो खोजें।'; + + @override + String get searchFiltersLabel => 'फ़िल्टर'; + + @override + String get searchHint => 'रेडियो होराइजन, जैज़, समाचार...'; + + @override + String get searchCountryFilterLabel => 'देश'; + + @override + String get searchLanguageFilterLabel => 'भाषा'; + + @override + String get searchMinQualityFilterLabel => 'न्यूनतम गुणवत्ता'; + + @override + String get searchEmptyTitle => 'एक स्टेशन खोजें'; + + @override + String get searchNoResultsTitle => 'कोई परिणाम नहीं'; + + @override + String get searchEmptySubtitle => + 'दुनिया भर के सिग्नल खोजने के लिए ऊपर की बार या चिप्स इस्तेमाल करें।'; + + @override + String get searchNoResultsSubtitle => + 'सक्रिय सिग्नल पाने के लिए फ़िल्टर हटाएँ या कोई दूसरा नाम लिखें।'; + + @override + String get countrySpain => 'स्पेन'; + + @override + String get countryUsa => 'अमेरिका'; + + @override + String get countryMexico => 'मेक्सिको'; + + @override + String get countryArgentina => 'अर्जेंटीना'; + + @override + String get countryUk => 'यूनाइटेड किंगडम'; + + @override + String get countryFrance => 'फ़्रांस'; + + @override + String get countryGermany => 'जर्मनी'; + + @override + String get countryItaly => 'इटली'; + + @override + String get countryBrazil => 'ब्राज़ील'; + + @override + String get countryJapan => 'जापान'; + + @override + String get languageNameSpanish => 'स्पैनिश'; + + @override + String get languageNameEnglish => 'अंग्रेज़ी'; + + @override + String get languageNameFrench => 'फ़्रेंच'; + + @override + String get languageNameGerman => 'जर्मन'; + + @override + String get languageNamePortuguese => 'पुर्तगाली'; + + @override + String get languageNameItalian => 'इतालवी'; + + @override + String get languageNameJapanese => 'जापानी'; + + @override + String get languageNameArabic => 'अरबी'; + + @override + String get languageNameRussian => 'रूसी'; + + @override + String get homeScreenSubtitle => + 'साफ़ सिग्नल, समझदार पसंदीदा और गेम शो जैसी दृश्य अनुभूति के साथ लाइव वैश्विक रेडियो।'; + + @override + String get exploreStations => 'स्टेशन देखें'; + + @override + String stationsCount(int count) { + return '$count रेडियो'; + } + + @override + String get qualityHd => 'HD गुणवत्ता'; + + @override + String get nearYou => 'आपके पास'; + + @override + String nearYouInCountry(Object country) { + return 'आपके पास · $country'; + } + + @override + String get detectAction => 'पहचानें'; + + @override + String get liveRadar => 'लाइव रडार'; + + @override + String get genresTitle => 'शैलियाँ'; + + @override + String get retryAction => 'फिर कोशिश करें'; + + @override + String get noStationsAvailable => 'कोई स्टेशन उपलब्ध नहीं'; + + @override + String get noStationsAvailableSubtitle => + 'सिग्नल फिर पकड़ने के लिए रीफ़्रेश करें या दूसरी शैली चुनें।'; + + @override + String get genrePop => 'पॉप'; + + @override + String get genreRock => 'रॉक'; + + @override + String get genreJazz => 'जैज़'; + + @override + String get genreClassical => 'शास्त्रीय'; + + @override + String get genreElectronic => 'इलेक्ट्रॉनिक'; + + @override + String get genreNews => 'समाचार'; + + @override + String get genreTalk => 'वार्ता'; + + @override + String get genreHipHop => 'हिप-हॉप'; + + @override + String get genreCountry => 'कंट्री'; + + @override + String get genreMetal => 'मेटल'; + + @override + String get genreReggae => 'रेगे'; + + @override + String get genreLatin => 'लैटिन'; + + @override + String get alarmScreenTitle => 'संगीतमय जागरण'; + + @override + String get alarmScreenSubtitle => + 'रेडियो अलार्म, सुरक्षित ध्वनि, स्मार्ट छुट्टियाँ और अगली चाल हमेशा दिखाई देती है।'; + + @override + String get createAlarmAction => 'अलार्म बनाएँ'; + + @override + String alarmsCount(int count) { + return '$count अलार्म'; + } + + @override + String get activeAlarmsWithoutNextTitle => 'अगली चाल के बिना सक्रिय अलार्म'; + + @override + String get noActiveAlarms => 'कोई सक्रिय अलार्म नहीं'; + + @override + String get nextAlarmTitle => 'अगला अलार्म'; + + @override + String activeAlarmsWithoutNextSubtitle(int count) { + return '$count सक्रिय अलार्म हैं, लेकिन अभी उनके पास कोई वैध भविष्य तारीख नहीं है। तारीख, दिन और छुट्टियाँ जाँचें।'; + } + + @override + String get createAlarmHint => + 'एक अलार्म बनाएँ और PluriWave अगली चाल अपने-आप गणना करेगा।'; + + @override + String get alarmVacationPlay => 'छुट्टियों में बजे'; + + @override + String get alarmVacationPause => 'छुट्टियों में विराम'; + + @override + String alarmFadeInLabel(int seconds) { + return 'फेड-इन $secondsसे'; + } + + @override + String alarmNextExecution(Object date) { + return 'अगली चाल: $date'; + } + + @override + String get alarmNoNextExecution => 'कोई सक्रिय अगली चाल नहीं है।'; + + @override + String alarmSkippedExecution(Object date) { + return 'एक चाल छोड़ी गई: $date।'; + } + + @override + String get editAction => 'संपादित करें'; + + @override + String get skipNextAction => 'अगला छोड़ें'; + + @override + String get deleteTooltip => 'हटाएँ'; + + @override + String get alarmSkippedNoNextSnackbar => + 'अलार्म छोड़ा गया। कोई अगली चाल बाकी नहीं।'; + + @override + String alarmSkippedReturnsSnackbar(Object date) { + return 'अलार्म छोड़ा गया। $date को वापस आएगा।'; + } + + @override + String alarmVacationPausedNoNext(Object vacationName) { + return 'छुट्टी ($vacationName) के कारण विराम में है और कोई अगली चाल नहीं है।'; + } + + @override + String alarmVacationPausedReturns(Object vacationName, Object date) { + return 'छुट्टी ($vacationName) के कारण विराम में है और $date को लौटेगा।'; + } + + @override + String alarmVacationReturns(Object date) { + return 'छुट्टियाँ सक्रिय होने पर, $date को फिर बजेगा।'; + } + + @override + String get defaultAlarmName => 'संगीतमय अलार्म'; + + @override + String get newAlarmTitle => 'नया अलार्म'; + + @override + String get editAlarmTitle => 'अलार्म संपादित करें'; + + @override + String get nameField => 'नाम'; + + @override + String get timeField => 'समय'; + + @override + String get dateField => 'तारीख'; + + @override + String get onceOption => 'एक बार'; + + @override + String get dailyOption => 'दैनिक'; + + @override + String get weekdaysOption => 'दिन'; + + @override + String get soundAndVolumeSection => 'ध्वनि और वॉल्यूम'; + + @override + String get alarmFadeInTitle => 'अलार्म फेड-इन'; + + @override + String get alarmFadeInOff => '0 से (बिना बदलाव)'; + + @override + String alarmFadeInSummary(int seconds) { + return '$seconds से (5% से चुने हुए वॉल्यूम तक)'; + } + + @override + String get internalSafeSoundLabel => 'सुरक्षित आंतरिक ध्वनि'; + + @override + String get soundWarmSunrise => 'गरम सूर्योदय'; + + @override + String get soundSoftBell => 'मुलायम घंटी'; + + @override + String get soundDigitalPulse => 'डिजिटल धड़कन'; + + @override + String get favoriteStationLabel => 'पसंदीदा स्टेशन'; + + @override + String get noStationUseInternalSound => + 'कोई स्टेशन नहीं: आंतरिक ध्वनि इस्तेमाल करें'; + + @override + String get saveFavoritesAlarmHint => + 'उन्हें संगीतमय अलार्म के रूप में इस्तेमाल करने के लिए स्टेशन पसंदीदा में सहेजें।'; + + @override + String get useCurrentStationAction => 'वर्तमान स्टेशन इस्तेमाल करें'; + + @override + String get playDuringVacations => 'छुट्टियों में बजाएँ'; + + @override + String get playDuringVacationsHint => + 'इसे बंद करने पर अगली चाल पहले वैध दिन पर चली जाएगी।'; + + @override + String get saveAlarmAction => 'अलार्म सहेजें'; + + @override + String get chooseOneWeekdayError => 'सप्ताह का कम से कम एक दिन चुनें।'; + + @override + String get androidReliabilityReview => 'Android विश्वसनीयता जाँचें'; + + @override + String get statusOk => 'ठीक है'; + + @override + String get statusPending => 'लंबित'; + + @override + String androidReliabilityStatus( + Object exact, + Object notifications, + Object screen, + ) { + return 'विश्वसनीयता: सटीक $exact · सूचनाएँ $notifications · स्क्रीन $screen'; + } + + @override + String get vacationRangesTitle => 'छुट्टी की अवधियाँ'; + + @override + String get addAction => 'जोड़ें'; + + @override + String get vacationRangesHint => + 'यदि किसी अलार्म में \"छुट्टियों में विराम\" है, तो ये अवधियाँ अपने-आप छोड़ी जाएँगी।'; + + @override + String get noVacationRangesLoaded => 'कोई अवधि लोड नहीं हुई।'; + + @override + String get deleteRangeTooltip => 'अवधि हटाएँ'; + + @override + String get vacationsDefaultName => 'छुट्टियाँ'; + + @override + String get newVacationRangeTitle => 'नई छुट्टी अवधि'; + + @override + String get startField => 'शुरुआत'; + + @override + String get endField => 'समाप्ति'; + + @override + String get saveRangeAction => 'अवधि सहेजें'; + + @override + String get noAlarmsYetTitle => 'अभी कोई अलार्म नहीं।'; + + @override + String get noAlarmsYetSubtitle => 'अपना संगीतमय जागरण बनाने के लिए एक बनाएँ।'; + + @override + String get ringingInternalAudioActive => + 'सुरक्षित आंतरिक ध्वनि के साथ बज रहा है।'; + + @override + String get ringingPreparingInternalAudio => + 'सुरक्षित आंतरिक ध्वनि तैयार हो रही है।'; + + @override + String get stopAlarmAction => 'अलार्म रोकें'; + + @override + String get pauseAction => 'विराम दें'; + + @override + String miniPlayerOpenLabel(Object stationName) { + return '$stationName का प्लेयर खोलें'; + } + + @override + String get playerIconLabel => 'प्लेयर'; + + @override + String get playbackStatusConnecting => 'कनेक्ट हो रहा है...'; + + @override + String get playbackStatusLive => 'लाइव'; + + @override + String get playbackStatusPaused => 'विराम पर'; + + @override + String get playbackStatusConnectionError => 'कनेक्शन त्रुटि'; + + @override + String get playbackStatusStopped => 'बंद'; + + @override + String stationSemanticLabel(Object stationName) { + return 'स्टेशन $stationName'; + } + + @override + String get favoritesAddTooltip => 'पसंदीदा में जोड़ें'; + + @override + String favoritesAddedMessage(Object stationName) { + return '$stationName को पसंदीदा में जोड़ा गया'; + } + + @override + String get stationIconLabel => 'स्टेशन आइकन'; + + @override + String get liveNow => 'अभी लाइव'; + + @override + String equalizerBandLabel(Object band) { + return 'बैंड $band'; + } + + @override + String equalizerBandValue(Object value) { + return '$value डेसिबल'; + } + + @override + String get equalizerPresetFlat => 'समतल'; + + @override + String get equalizerPresetRock => 'रॉक'; + + @override + String get equalizerPresetPop => 'पॉप'; + + @override + String get equalizerPresetBassBoost => 'बास बढ़ाएँ'; + + @override + String get equalizerPresetJazz => 'जैज़'; + + @override + String get equalizerPresetVoice => 'आवाज़'; + + @override + String get equalizerPresetCustom => 'कस्टम'; + + @override + String get onboardingTitle => 'PluriWave में आपका स्वागत है'; + + @override + String get onboardingNewsTitle => 'नया क्या है'; + + @override + String get onboardingStartAction => 'शुरू करें'; + + @override + String get onboardingCloseTooltip => 'बंद करें'; + + @override + String radioRecordingError(Object error) { + return 'रेडियो रिकॉर्ड करते समय त्रुटि: $error'; + } + + @override + String get radioApiConnectionError => 'रेडियो एपीआई से कनेक्शन नहीं है'; + + @override + String get radioSearchError => 'खोज त्रुटि। अपना कनेक्शन जाँचें।'; + + @override + String get radioLoadMoreStationsError => 'और स्टेशन लोड नहीं हो सके।'; + + @override + String get radioNearbyStationsError => + 'हम आस-पास के स्टेशन नहीं खोज सके। देश के फ़िल्टर इस्तेमाल करें।'; + + @override + String radioCannotPlayStation(Object stationName) { + return '\"$stationName\" नहीं चलाया जा सकता'; + } + + @override + String get recordingSelectStationFirst => + 'रिकॉर्ड करने से पहले कोई स्टेशन चुनें।'; + + @override + String recordingStartError(Object error) { + return 'रिकॉर्डिंग शुरू नहीं हो सकी: $error'; + } + + @override + String get unsupportedConfigVersion => 'कॉन्फ़िगरेशन संस्करण समर्थित नहीं है'; + + @override + String get audioErrorGeneric => 'चलाने में त्रुटि'; + + @override + String get audioErrorNoInternet => 'इंटरनेट कनेक्शन नहीं है'; + + @override + String get audioErrorInvalidUrl => 'रेडियो का पता मान्य नहीं है'; + + @override + String get audioErrorNotFound => 'रेडियो उपलब्ध नहीं है (404 त्रुटि)'; + + @override + String get audioErrorTimeout => 'कनेक्शन का समय समाप्त हो गया'; + + @override + String get audioErrorCannotConnect => 'रेडियो से कनेक्ट नहीं हो सकता'; + + @override + String get audioErrorUnsupportedFormat => 'स्ट्रीम स्वरूप समर्थित नहीं है'; + + @override + String get audioErrorDecode => 'ऑडियो स्ट्रीम डिकोड करने में त्रुटि'; + + @override + String get audioErrorCleartext => + 'यह रेडियो बिना एन्क्रिप्शन वाला HTTP इस्तेमाल करता है, जिसकी अनुमति नहीं है'; + + @override + String get audioErrorSsl => 'रेडियो पर SSL प्रमाणपत्र अमान्य है'; + + @override + String get audioErrorCannotPlay => 'यह रेडियो नहीं चलाया जा सकता'; + + @override + String get audioErrorUnexpectedPlayback => 'चलाते समय अनपेक्षित त्रुटि'; + + @override + String get androidExactAlarmScheduleError => + 'ऐंड्रॉयड सटीक अलार्म निर्धारित नहीं कर सका। सटीक अलार्म की अनुमति जाँचें।'; + + @override + String get recordingPathEmptyError => 'रिकॉर्डिंग पथ खाली नहीं हो सकता'; + + @override + String get recordingMaxSizeInvalidError => + 'अधिकतम आकार शून्य से बड़ा होना चाहिए'; + + @override + String get recordingAlreadyActiveError => 'एक रिकॉर्डिंग पहले से चल रही है'; + + @override + String get alarmRingingFallbackActive => + 'आंतरिक सुरक्षित ऑडियो के साथ चल रहा है।'; + + @override + String get alarmRingingPreparingFallback => + 'आंतरिक सुरक्षित ऑडियो तैयार किया जा रहा है।'; + + @override + String get alarmRingingTryingStation => + 'आपका स्टेशन उपलब्ध सर्वोच्च गुणवत्ता में चलाने की कोशिश की जा रही है।'; + + @override + String alarmScheduleOnce(Object date) { + return 'एक बार · $date'; + } + + @override + String alarmScheduleWeekdays(Object days) { + return 'दिन: $days'; + } + + @override + String get androidReliabilityTitle => 'Android विश्वसनीयता जाँचें'; + + @override + String get closeAction => 'बंद करें'; + + @override + String get customOption => 'कस्टम'; + + @override + String get endLabel => 'समाप्ति'; + + @override + String get equalizerDisable => 'इक्वलाइज़र बंद करें'; + + @override + String get helpTitle => 'मदद और ट्यूटोरियल'; + + @override + String get helpSubtitle => + 'PluriWave की सुविधाएँ, सुझाव और नया क्या है देखें।'; + + @override + String get indefiniteOption => 'अनिश्चित'; + + @override + String get invalidNumber => 'अमान्य संख्या'; + + @override + String get nameLabel => 'नाम'; + + @override + String get notPlaying => 'नहीं चल रहा'; + + @override + String get oneTimeOption => 'एक बार'; + + @override + String get pausePlaybackTooltip => 'प्लेबैक रोकें'; + + @override + String qualityOriginal(Object quality) { + return 'मूल गुणवत्ता: $quality'; + } + + @override + String get qualityUnknown => 'गुणवत्ता उपलब्ध नहीं'; + + @override + String get recordAction => 'रिकॉर्ड करें'; + + @override + String get recordDurationTitle => 'रिकॉर्डिंग अवधि'; + + @override + String get recordRadioSubtitle => 'रिकॉर्डिंग की अवधि चुनें।'; + + @override + String get recordRadioTitle => 'रेडियो रिकॉर्ड करें'; + + @override + String get recordingActiveTitle => 'रेडियो रिकॉर्ड हो रहा है'; + + @override + String get recordingDirectTitle => 'सीधी रिकॉर्डिंग'; + + @override + String get recordingsOpenFolderPlainError => + 'रिकॉर्डिंग फ़ोल्डर नहीं खुल सका'; + + @override + String get recordingsOpenLatest => 'नई रिकॉर्डिंग खोलें'; + + @override + String get recordingsOpenLatestError => 'नई रिकॉर्डिंग नहीं खुल सकी'; + + @override + String get startLabel => 'शुरुआत'; + + @override + String get startPlaybackTooltip => 'प्लेबैक शुरू करें'; + + @override + String get stopAction => 'रोकें'; + + @override + String get stopPlaybackTooltip => 'प्लेबैक रोकें'; + + @override + String get weekdayShortMonday => 'सोम'; + + @override + String get weekdayShortTuesday => 'मंगल'; + + @override + String get weekdayShortWednesday => 'बुध'; + + @override + String get weekdayShortThursday => 'गुरु'; + + @override + String get weekdayShortFriday => 'शुक्र'; + + @override + String get weekdayShortSaturday => 'शनि'; + + @override + String get weekdayShortSunday => 'रवि'; } diff --git a/lib/l10n/gen/app_localizations_id.dart b/lib/l10n/gen/app_localizations_id.dart index 920e3d5..f450991 100644 --- a/lib/l10n/gen/app_localizations_id.dart +++ b/lib/l10n/gen/app_localizations_id.dart @@ -27,45 +27,70 @@ class AppLocalizationsId extends AppLocalizations { String get navSettings => 'Pengaturan'; @override - String get actionOk => 'OK'; + String get actionOk => 'Oke'; @override String get sleepTimer => 'Timer tidur'; @override String get sleepTimerDescription => - 'Smooth radio shutdown with an exact countdown.'; + 'Mematikan radio secara lembut dengan hitung mundur yang tepat.'; @override - String get cancelTimer => 'Cancel timer'; + String get cancelTimer => 'Batalkan timer'; @override - String get optionOther => 'Other'; + String get optionOther => 'Lainnya'; @override - String get customDurationTitle => 'Custom duration'; + String get customDurationTitle => 'Durasi khusus'; @override - String get durationGreaterThanZero => 'Choose a duration greater than zero.'; + String get durationGreaterThanZero => + 'Pilih durasi yang lebih besar dari nol.'; @override - String get hoursLabel => 'Hours'; + String get hoursLabel => 'Jam'; @override - String get minutesLabel => 'Minutes'; + String get minutesLabel => 'Menit'; @override - String get secondsLabel => 'Seconds'; + String get secondsLabel => 'Detik'; @override - String get saveQuickAccess => 'Save as quick access'; + String durationHoursMinutesSeconds( + Object hours, + Object minutes, + Object seconds, + ) { + return '$hours jam $minutes mnt $seconds dtk'; + } @override - String get startTimer => 'Start timer'; + String durationMinutesSeconds(Object minutes, Object seconds) { + return '$minutes mnt $seconds dtk'; + } + + @override + String durationMinutesOnly(Object minutes) { + return '$minutes mnt'; + } + + @override + String durationSecondsOnly(Object seconds) { + return '$seconds dtk'; + } + + @override + String get saveQuickAccess => 'Simpan sebagai akses cepat'; + + @override + String get startTimer => 'Mulai timer'; @override String skipCurrentAlarmExecution(Object alarmName) { - return 'Skipped this execution of $alarmName.'; + return 'Eksekusi $alarmName kali ini dilewati.'; } @override @@ -73,13 +98,14 @@ class AppLocalizationsId extends AppLocalizations { @override String get settingsSubtitle => - 'Kontrol suara, cadangan, dan stasiun khusus secara detail.'; + 'Kontrol halus untuk suara, cadangan, dan stasiun khusus.'; @override String get languageSectionTitle => 'Bahasa'; @override - String get languageSectionDescription => 'Pilih bahasa tampilan aplikasi.'; + String get languageSectionDescription => + 'Pilih bagaimana bahasa aplikasi ditampilkan.'; @override String get languageSystemDefault => 'Sistem'; @@ -99,223 +125,226 @@ class AppLocalizationsId extends AppLocalizations { String get languageUpdatedSystem => 'Bahasa diperbarui: Sistem'; @override - String get timerSectionTitle => 'Sleep timer'; + String get timerSectionTitle => 'Timer tidur'; @override - String get timerSectionAdd => 'Add'; + String get timerSectionAdd => 'Tambah'; @override String get timerSectionDescription => - 'Customize the quick presets shown when automatically stopping the radio.'; + 'Sesuaikan pintasan cepat yang muncul saat radio dimatikan otomatis.'; @override - String get timerSectionRestoreRecommended => 'Restore recommended times'; + String get timerSectionRestoreRecommended => 'Pulihkan waktu yang disarankan'; @override - String get newQuickAccessTitle => 'New quick access'; + String get newQuickAccessTitle => 'Akses cepat baru'; @override - String get saveQuickAccessButton => 'Save quick access'; + String get saveQuickAccessButton => 'Simpan akses cepat'; @override - String get settingsSafeStatus => 'Safe'; + String get settingsSafeStatus => 'Aman'; @override - String get recordingsSectionTitle => 'Recordings'; + String get recordingsSectionTitle => 'Rekaman'; @override - String get recordingsFolderDialogTitle => 'Select recordings folder'; + String get recordingsFolderDialogTitle => 'Pilih folder rekaman'; @override - String get recordingsPathUpdated => 'Recording path updated'; + String get recordingsPathUpdated => 'Jalur rekaman diperbarui'; @override String recordingsPathSaveError(Object error) { - return 'Could not save the path: $error'; + return 'Tidak dapat menyimpan jalur: $error'; } @override String get recordingsDefaultFolderRestored => - 'The internal default folder will be used'; + 'Folder internal bawaan akan digunakan'; @override - String get recordingsFolderTitle => 'Recordings folder'; + String get recordingsFolderTitle => 'Folder rekaman'; @override - String get recordingsPathCalculating => 'Calculating path...'; + String get recordingsPathCalculating => 'Menghitung jalur...'; @override - String get recordingsChangePath => 'Change path'; + String get recordingsChangePath => 'Ubah jalur'; @override - String get recordingsUseDefaultPath => 'Use default path'; + String get recordingsUseDefaultPath => 'Gunakan jalur bawaan'; @override String get recordingsOriginalStreamHint => - 'The radio is saved from the original stream, without recompressing.'; + 'Radio disimpan dari stream asli, tanpa kompresi ulang.'; @override - String get equalizerActive => 'Active'; + String get equalizerActive => 'Aktif'; @override - String get equalizerDisabled => 'Disabled'; + String get equalizerDisabled => 'Nonaktif'; @override - String get equalizerEnable => 'Enable equalizer'; + String get equalizerEnable => 'Aktifkan equalizer'; @override String get equalizerRealtimeSubtitle => - 'Changes are applied in real time to the current station.'; + 'Perubahan diterapkan secara langsung ke stasiun saat ini.'; @override String get equalizerPendingSubtitle => - 'Changes are saved and will apply when Android enables the effect.'; + 'Perubahan disimpan dan akan diterapkan saat Android mengaktifkan efek.'; @override - String get equalizerPerStationTitle => 'Use custom EQ for this favorite'; + String get equalizerPerStationTitle => 'Gunakan EQ khusus untuk favorit ini'; @override String equalizerPerStationActive(Object stationName) { - return 'Active for $stationName'; + return 'Aktif untuk $stationName'; } @override String equalizerPerStationMain(Object stationName) { - return 'Using main EQ for $stationName'; + return 'Menggunakan EQ utama untuk $stationName'; } @override - String get preferredStationTitle => 'Preferred station'; + String get preferredStationTitle => 'Stasiun pilihan'; @override String get preferredStationDescription => - 'Preselected for new alarms and available for quick playback.'; + 'Dipilih lebih dulu saat membuat alarm dan dapat dimulai sebagai pemutaran cepat.'; @override - String get preferredStationNoStationsTitle => 'No stations available yet'; + String get preferredStationNoStationsTitle => + 'Belum ada stasiun yang tersedia'; @override String get preferredStationNoStationsSubtitle => - 'Save favorites or load stations to choose a preferred one.'; + 'Simpan favorit atau muat stasiun untuk memilih stasiun pilihan.'; @override - String get preferredStationAutomaticFallback => 'Automatic fallback'; + String get preferredStationAutomaticFallback => 'Cadangan otomatis'; @override - String get preferredStationDefaultFavorite => 'Default favorite'; + String get preferredStationDefaultFavorite => 'Favorit bawaan'; @override String preferredStationCurrent(Object stationName) { - return 'Current preferred: $stationName'; + return 'Pilihan saat ini: $stationName'; } @override String preferredStationAutoUsing(Object stationName) { - return 'No favorites: automatically using $stationName'; + return 'Tidak ada favorit: otomatis menggunakan $stationName'; } @override - String get preferredStationPlay => 'Play preferred'; + String get preferredStationPlay => 'Putar pilihan'; @override - String get customStationsTitle => 'Custom stations'; + String get customStationsTitle => 'Stasiun khusus'; @override - String get customStationsAdd => 'Add'; + String get customStationsAdd => 'Tambah'; @override - String get customStationsEmpty => 'No custom stations.'; + String get customStationsEmpty => 'Tidak ada stasiun khusus.'; @override - String get playAction => 'Play'; + String get playAction => 'Putar'; @override - String get deleteAction => 'Delete'; + String get deleteAction => 'Hapus'; @override - String get addStationTitle => 'Add station'; + String get addStationTitle => 'Tambah stasiun'; @override - String get stationNameLabel => 'Name *'; + String get stationNameLabel => 'Nama *'; @override - String get requiredField => 'Required field'; + String get unnamedStation => 'Stasiun tanpa nama'; @override - String get streamUrlLabel => 'Stream URL *'; + String get requiredField => 'Kolom wajib'; @override - String get invalidUrl => 'Invalid URL'; + String get streamUrlLabel => 'URL stream *'; @override - String get countryOptionalLabel => 'Country (optional)'; + String get invalidUrl => 'URL tidak valid'; @override - String get saveStation => 'Save station'; + String get countryOptionalLabel => 'Negara (opsional)'; @override - String get backupSectionTitle => 'Backup'; + String get saveStation => 'Simpan stasiun'; @override - String get backupExportTitle => 'Export configuration'; + String get backupSectionTitle => 'Cadangan'; @override - String get backupExportSubtitle => - 'Favorites, custom stations, and EQ presets'; + String get backupExportTitle => 'Ekspor pengaturan'; @override - String get backupImportTitle => 'Import configuration'; + String get backupExportSubtitle => 'Favorit, stasiun khusus, dan preset EQ'; @override - String get backupImportSubtitle => 'Restore from a backup file'; + String get backupImportTitle => 'Impor pengaturan'; @override - String get backupShareSubject => 'PluriWave — backup'; + String get backupImportSubtitle => 'Pulihkan dari berkas cadangan'; + + @override + String get backupShareSubject => 'PluriWave — cadangan'; @override String backupShareText(Object date) { - return 'PluriWave configuration exported on $date'; + return 'Pengaturan PluriWave diekspor pada $date'; } @override String backupExportError(Object error) { - return 'Export error: $error'; + return 'Kesalahan saat mengekspor: $error'; } @override String get backupImportConfirmMessage => - 'This will add favorites, stations, and presets from the file. Continue?'; + 'Ini akan menambahkan favorit, stasiun, dan preset dari berkas. Lanjutkan?'; @override - String get backupImportSuccess => 'Configuration imported successfully'; + String get backupImportSuccess => 'Pengaturan berhasil diimpor'; @override String backupImportError(Object error) { - return 'Import error: $error'; + return 'Kesalahan saat mengimpor: $error'; } @override - String get appVersionLoading => 'Loading version...'; + String get appVersionLoading => 'Memuat versi...'; @override String appVersionSubtitle(Object version) { - return '$version - World radio'; + return '$version - Radio dunia'; } @override - String get savedFavoritesTitle => 'Saved favorites'; + String get savedFavoritesTitle => 'Favorit tersimpan'; @override - String get stationFilterTitle => 'Station filter'; + String get stationFilterTitle => 'Filter stasiun'; @override - String get stationFilterSubtitle => 'Only stations verified as active'; + String get stationFilterSubtitle => 'Hanya stasiun yang terverifikasi aktif'; @override - String get backgroundAudioTitle => 'Background audio'; + String get backgroundAudioTitle => 'Audio latar belakang'; @override - String get backgroundAudioSubtitle => 'Continues when the screen turns off'; + String get backgroundAudioSubtitle => 'Tetap berjalan saat layar dimatikan'; @override String get dash => '—'; @@ -327,124 +356,845 @@ class AppLocalizationsId extends AppLocalizations { String get equalizerTitle => 'Equalizer'; @override - String get recordingsOpenFolder => 'Open folder'; + String get recordingsOpenFolder => 'Buka folder'; @override String recordingsOpenFolderError(Object error) { - return 'Could not open the folder: $error'; + return 'Tidak dapat membuka folder: $error'; } @override - String get recordingsMaxSizeTitle => 'Maximum recording size'; + String get recordingsMaxSizeTitle => 'Ukuran rekaman maksimum'; @override String recordingsMaxSizeSubtitle(int size) { - return 'Current limit: $size MB'; + return 'Batas saat ini: $size MB'; } @override - String get recordingsMaxSizeDialogTitle => 'Maximum size per recording'; + String get recordingsMaxSizeDialogTitle => 'Ukuran maksimum per rekaman'; @override - String get recordingsMaxSizeMbLabel => 'Maximum megabytes'; + String get recordingsMaxSizeMbLabel => 'Megabyte maksimum'; @override String recordingsMaxSizeSaved(int size) { - return 'Recording limit updated to $size MB'; + return 'Batas rekaman diperbarui menjadi $size MB'; } @override - String get stationOrderTitle => 'Station order'; + String get stationOrderTitle => 'Urutan stasiun'; @override - String get stationOrderByName => 'By name'; + String get stationOrderByName => 'Berdasarkan nama'; @override - String get stationOrderByQuality => 'By quality'; + String get stationOrderByQuality => 'Berdasarkan kualitas'; @override String get stationOrderScopeDescription => - 'Applies to favorites, searches, nearby stations and quick lists.'; + 'Berlaku untuk favorit, pencarian, stasiun terdekat, dan daftar cepat.'; @override - String get favoriteGroupsTitle => 'Favorite lists'; + String get favoriteGroupsTitle => 'Daftar favorit'; @override String get favoriteGroupsDescription => - 'Create short lists to organize your saved stations.'; + 'Buat daftar pendek untuk mengatur stasiun tersimpan.'; @override - String get favoriteGroupsAdd => 'Add list'; + String get favoriteGroupsAdd => 'Tambah daftar'; @override - String get favoriteGroupsEdit => 'Edit list'; + String get favoriteGroupsEdit => 'Edit daftar'; @override - String get favoriteGroupsDelete => 'Delete list'; + String get favoriteGroupsDelete => 'Hapus daftar'; @override - String get favoriteGroupsNameLabel => 'List name'; + String get favoriteGroupsNameLabel => 'Nama daftar'; @override - String get favoriteGroupsNameTooLong => 'Maximum 28 characters.'; + String get favoriteGroupsNameTooLong => 'Maksimum 28 karakter.'; @override - String get favoriteGroupsUnassigned => 'Unassigned'; + String get favoriteGroupsUnassigned => 'Belum ditetapkan'; @override String get favoriteGroupsProtectedHint => - 'Default list: it cannot be edited or deleted.'; + 'Daftar bawaan: tidak dapat diedit atau dihapus.'; @override - String get favoriteGroupsCreated => 'List created'; + String get favoriteGroupsCreated => 'Daftar dibuat'; @override - String get favoriteGroupsUpdated => 'List updated'; + String get favoriteGroupsUpdated => 'Daftar diperbarui'; @override String get favoriteGroupsDeleted => - 'List deleted; its stations return to Unassigned.'; + 'Daftar dihapus; stasiunnya kembali ke Belum ditetapkan.'; @override - String get favoriteGroupsAssign => 'Move to list'; + String get favoriteGroupsAssign => 'Pindahkan ke daftar'; @override String favoriteGroupsAssignSubtitle(Object groupName) { - return 'Current list: $groupName'; + return 'Daftar saat ini: $groupName'; } @override String favoriteGroupsAssigned(Object stationName, Object groupName) { - return '$stationName moved to $groupName'; + return '$stationName dipindahkan ke $groupName'; } @override - String get favoritesTitle => 'Favorites'; + String get favoritesTitle => 'Favorit'; @override - String get favoritesEmptyTitle => 'No favorites yet'; + String get favoritesEmptyTitle => 'Belum ada favorit'; @override String get favoritesEmptySubtitle => - 'Tap the heart on any station to save it to your collection.'; + 'Ketuk hati di stasiun mana pun untuk menyimpannya ke koleksi Anda.'; @override String get favoritesHeaderSubtitle => - 'Organize your collection by lists and keep important radios close.'; + 'Atur koleksi Anda dengan daftar dan dekatkan radio penting.'; @override - String get favoritesCollection => 'Collection'; + String get favoritesCollection => 'Koleksi'; @override String favoritesSavedCount(int count) { - return '$count saved'; + return '$count tersimpan'; } @override - String get favoritesRemoveTooltip => 'Remove from favorites'; + String get favoritesRemoveTooltip => 'Hapus dari favorit'; @override String favoritesRemovedMessage(Object stationName) { - return '$stationName removed from favorites'; + return '$stationName dihapus dari favorit'; } + + @override + String get alarmPostponedCurrentExecution => + 'Alarm ditunda untuk eksekusi ini.'; + + @override + String get searchScreenTitle => 'Cari sinyal'; + + @override + String get searchScreenSubtitle => + 'Temukan radio berdasarkan nama, negara, atau bahasa dengan filter cepat dan kontras tinggi.'; + + @override + String get searchFiltersLabel => 'Filter'; + + @override + String get searchHint => 'Radio Horizonte, jazz, berita...'; + + @override + String get searchCountryFilterLabel => 'Negara'; + + @override + String get searchLanguageFilterLabel => 'Bahasa'; + + @override + String get searchMinQualityFilterLabel => 'Kualitas minimum'; + + @override + String get searchEmptyTitle => 'Cari stasiun'; + + @override + String get searchNoResultsTitle => 'Tidak ada hasil'; + + @override + String get searchEmptySubtitle => + 'Gunakan bilah atas atau chip untuk menemukan sinyal dari seluruh dunia.'; + + @override + String get searchNoResultsSubtitle => + 'Coba hapus filter atau tulis nama lain untuk menemukan sinyal aktif.'; + + @override + String get countrySpain => 'Spanyol'; + + @override + String get countryUsa => 'Amerika Serikat'; + + @override + String get countryMexico => 'Meksiko'; + + @override + String get countryArgentina => 'Argentina'; + + @override + String get countryUk => 'Inggris Raya'; + + @override + String get countryFrance => 'Prancis'; + + @override + String get countryGermany => 'Jerman'; + + @override + String get countryItaly => 'Italia'; + + @override + String get countryBrazil => 'Brasil'; + + @override + String get countryJapan => 'Jepang'; + + @override + String get languageNameSpanish => 'Spanyol'; + + @override + String get languageNameEnglish => 'Inggris'; + + @override + String get languageNameFrench => 'Prancis'; + + @override + String get languageNameGerman => 'Jerman'; + + @override + String get languageNamePortuguese => 'Portugis'; + + @override + String get languageNameItalian => 'Italia'; + + @override + String get languageNameJapanese => 'Jepang'; + + @override + String get languageNameArabic => 'Arab'; + + @override + String get languageNameRussian => 'Rusia'; + + @override + String get homeScreenSubtitle => + 'Radio global langsung dengan sinyal bersih, favorit cerdas, dan pengalaman visual bergaya kuis.'; + + @override + String get exploreStations => 'Jelajahi stasiun'; + + @override + String stationsCount(int count) { + return '$count radio'; + } + + @override + String get qualityHd => 'Kualitas HD'; + + @override + String get nearYou => 'Di dekat Anda'; + + @override + String nearYouInCountry(Object country) { + return 'Di dekat Anda · $country'; + } + + @override + String get detectAction => 'Deteksi'; + + @override + String get liveRadar => 'Radar langsung'; + + @override + String get genresTitle => 'Genre'; + + @override + String get retryAction => 'Coba lagi'; + + @override + String get noStationsAvailable => 'Tidak ada stasiun tersedia'; + + @override + String get noStationsAvailableSubtitle => + 'Coba segarkan atau pilih genre lain untuk menangkap sinyal kembali.'; + + @override + String get genrePop => 'Pop'; + + @override + String get genreRock => 'Rock'; + + @override + String get genreJazz => 'Jazz'; + + @override + String get genreClassical => 'Klasik'; + + @override + String get genreElectronic => 'Elektronik'; + + @override + String get genreNews => 'Berita'; + + @override + String get genreTalk => 'Obrolan'; + + @override + String get genreHipHop => 'Hip-hop'; + + @override + String get genreCountry => 'Country'; + + @override + String get genreMetal => 'Metal'; + + @override + String get genreReggae => 'Reggae'; + + @override + String get genreLatin => 'Latin'; + + @override + String get alarmScreenTitle => 'Bangun dengan musik'; + + @override + String get alarmScreenSubtitle => + 'Alarm dengan radio, suara aman, liburan cerdas, dan eksekusi berikutnya selalu terlihat.'; + + @override + String get createAlarmAction => 'Buat alarm'; + + @override + String alarmsCount(int count) { + return '$count alarm'; + } + + @override + String get activeAlarmsWithoutNextTitle => + 'Alarm aktif tanpa eksekusi berikutnya'; + + @override + String get noActiveAlarms => 'Tidak ada alarm aktif'; + + @override + String get nextAlarmTitle => 'Alarm berikutnya'; + + @override + String activeAlarmsWithoutNextSubtitle(int count) { + return 'Ada $count alarm aktif, tetapi saat ini tidak memiliki tanggal valid di masa depan. Periksa tanggal, hari, dan liburan.'; + } + + @override + String get createAlarmHint => + 'Buat alarm dan PluriWave akan menghitung eksekusi berikutnya secara otomatis.'; + + @override + String get alarmVacationPlay => 'Berbunyi saat liburan'; + + @override + String get alarmVacationPause => 'Jeda saat liburan'; + + @override + String alarmFadeInLabel(int seconds) { + return 'Fade-in ${seconds}d'; + } + + @override + String alarmNextExecution(Object date) { + return 'Eksekusi berikutnya: $date'; + } + + @override + String get alarmNoNextExecution => + 'Tidak memiliki eksekusi aktif berikutnya.'; + + @override + String alarmSkippedExecution(Object date) { + return 'Satu eksekusi dilewati: $date.'; + } + + @override + String get editAction => 'Edit'; + + @override + String get skipNextAction => 'Lewati berikutnya'; + + @override + String get deleteTooltip => 'Hapus'; + + @override + String get alarmSkippedNoNextSnackbar => + 'Alarm dilewati. Tidak ada eksekusi berikutnya.'; + + @override + String alarmSkippedReturnsSnackbar(Object date) { + return 'Alarm dilewati. Akan kembali pada $date.'; + } + + @override + String alarmVacationPausedNoNext(Object vacationName) { + return 'Dijeda karena liburan ($vacationName) dan tanpa eksekusi berikutnya.'; + } + + @override + String alarmVacationPausedReturns(Object vacationName, Object date) { + return 'Dijeda karena liburan ($vacationName) dan akan kembali pada $date.'; + } + + @override + String alarmVacationReturns(Object date) { + return 'Dengan liburan aktif, akan berbunyi lagi pada $date.'; + } + + @override + String get defaultAlarmName => 'Alarm musik'; + + @override + String get newAlarmTitle => 'Alarm baru'; + + @override + String get editAlarmTitle => 'Edit alarm'; + + @override + String get nameField => 'Nama'; + + @override + String get timeField => 'Waktu'; + + @override + String get dateField => 'Tanggal'; + + @override + String get onceOption => 'Sekali'; + + @override + String get dailyOption => 'Harian'; + + @override + String get weekdaysOption => 'Hari'; + + @override + String get soundAndVolumeSection => 'Suara dan volume'; + + @override + String get alarmFadeInTitle => 'Fade-in alarm'; + + @override + String get alarmFadeInOff => '0 d (tanpa transisi)'; + + @override + String alarmFadeInSummary(int seconds) { + return '$seconds d (dari 5% ke volume terpilih)'; + } + + @override + String get internalSafeSoundLabel => 'Suara internal aman'; + + @override + String get soundWarmSunrise => 'Matahari terbit hangat'; + + @override + String get soundSoftBell => 'Lonceng lembut'; + + @override + String get soundDigitalPulse => 'Denyut digital'; + + @override + String get favoriteStationLabel => 'Stasiun favorit'; + + @override + String get noStationUseInternalSound => + 'Tanpa stasiun: gunakan suara internal'; + + @override + String get saveFavoritesAlarmHint => + 'Simpan stasiun ke Favorit untuk digunakan sebagai alarm musik.'; + + @override + String get useCurrentStationAction => 'Gunakan stasiun saat ini'; + + @override + String get playDuringVacations => 'Bunyi saat liburan'; + + @override + String get playDuringVacationsHint => + 'Jika dimatikan, eksekusi berikutnya akan melompat ke hari valid pertama.'; + + @override + String get saveAlarmAction => 'Simpan alarm'; + + @override + String get chooseOneWeekdayError => + 'Pilih setidaknya satu hari dalam seminggu.'; + + @override + String get androidReliabilityReview => 'Tinjau keandalan Android'; + + @override + String get statusOk => 'Oke'; + + @override + String get statusPending => 'tertunda'; + + @override + String androidReliabilityStatus( + Object exact, + Object notifications, + Object screen, + ) { + return 'Keandalan: tepat $exact · notifikasi $notifications · layar $screen'; + } + + @override + String get vacationRangesTitle => 'Rentang liburan'; + + @override + String get addAction => 'Tambah'; + + @override + String get vacationRangesHint => + 'Jika sebuah alarm memiliki \"Jeda saat liburan\", rentang ini dilewati otomatis.'; + + @override + String get noVacationRangesLoaded => 'Tidak ada rentang dimuat.'; + + @override + String get deleteRangeTooltip => 'Hapus rentang'; + + @override + String get vacationsDefaultName => 'Liburan'; + + @override + String get newVacationRangeTitle => 'Rentang liburan baru'; + + @override + String get startField => 'Mulai'; + + @override + String get endField => 'Akhir'; + + @override + String get saveRangeAction => 'Simpan rentang'; + + @override + String get noAlarmsYetTitle => 'Belum ada alarm.'; + + @override + String get noAlarmsYetSubtitle => + 'Buat satu untuk merancang bangun tidur musikal Anda.'; + + @override + String get ringingInternalAudioActive => + 'Berbunyi dengan audio internal aman.'; + + @override + String get ringingPreparingInternalAudio => 'Menyiapkan audio internal aman.'; + + @override + String get stopAlarmAction => 'Hentikan alarm'; + + @override + String get pauseAction => 'Jeda'; + + @override + String miniPlayerOpenLabel(Object stationName) { + return 'Buka pemutar untuk $stationName'; + } + + @override + String get playerIconLabel => 'Pemutar'; + + @override + String get playbackStatusConnecting => 'Menghubungkan...'; + + @override + String get playbackStatusLive => 'Siaran langsung'; + + @override + String get playbackStatusPaused => 'Dijeda'; + + @override + String get playbackStatusConnectionError => 'Kesalahan koneksi'; + + @override + String get playbackStatusStopped => 'Dihentikan'; + + @override + String stationSemanticLabel(Object stationName) { + return 'Stasiun $stationName'; + } + + @override + String get favoritesAddTooltip => 'Tambahkan ke favorit'; + + @override + String favoritesAddedMessage(Object stationName) { + return '$stationName ditambahkan ke favorit'; + } + + @override + String get stationIconLabel => 'Ikon stasiun'; + + @override + String get liveNow => 'Sedang siaran langsung'; + + @override + String equalizerBandLabel(Object band) { + return 'Pita $band'; + } + + @override + String equalizerBandValue(Object value) { + return '$value desibel'; + } + + @override + String get equalizerPresetFlat => 'Datar'; + + @override + String get equalizerPresetRock => 'Rock'; + + @override + String get equalizerPresetPop => 'Pop'; + + @override + String get equalizerPresetBassBoost => 'Penguat bass'; + + @override + String get equalizerPresetJazz => 'Jazz'; + + @override + String get equalizerPresetVoice => 'Suara'; + + @override + String get equalizerPresetCustom => 'Kustom'; + + @override + String get onboardingTitle => 'Selamat datang di PluriWave'; + + @override + String get onboardingNewsTitle => 'Yang baru'; + + @override + String get onboardingStartAction => 'Mulai'; + + @override + String get onboardingCloseTooltip => 'Tutup'; + + @override + String radioRecordingError(Object error) { + return 'Kesalahan saat merekam radio: $error'; + } + + @override + String get radioApiConnectionError => + 'Tidak ada koneksi ke antarmuka pemrograman aplikasi radio'; + + @override + String get radioSearchError => 'Kesalahan pencarian. Periksa koneksi Anda.'; + + @override + String get radioLoadMoreStationsError => + 'Tidak dapat memuat lebih banyak stasiun.'; + + @override + String get radioNearbyStationsError => + 'Kami tidak dapat mendeteksi stasiun terdekat. Gunakan filter berdasarkan negara.'; + + @override + String radioCannotPlayStation(Object stationName) { + return 'Tidak dapat memutar \"$stationName\"'; + } + + @override + String get recordingSelectStationFirst => 'Pilih stasiun sebelum merekam.'; + + @override + String recordingStartError(Object error) { + return 'Tidak dapat memulai rekaman: $error'; + } + + @override + String get unsupportedConfigVersion => 'Versi konfigurasi tidak didukung'; + + @override + String get audioErrorGeneric => 'Kesalahan pemutaran'; + + @override + String get audioErrorNoInternet => 'Tidak ada koneksi internet'; + + @override + String get audioErrorInvalidUrl => 'Alamat radio tidak valid'; + + @override + String get audioErrorNotFound => 'Radio tidak tersedia (kesalahan 404)'; + + @override + String get audioErrorTimeout => 'Waktu koneksi habis'; + + @override + String get audioErrorCannotConnect => 'Tidak dapat terhubung ke radio'; + + @override + String get audioErrorUnsupportedFormat => 'Format aliran tidak didukung'; + + @override + String get audioErrorDecode => 'Kesalahan saat mendekode aliran audio'; + + @override + String get audioErrorCleartext => + 'Radio ini menggunakan HTTP tanpa enkripsi, dan itu tidak diizinkan'; + + @override + String get audioErrorSsl => 'Sertifikat SSL radio tidak valid'; + + @override + String get audioErrorCannotPlay => 'Radio ini tidak dapat diputar'; + + @override + String get audioErrorUnexpectedPlayback => + 'Kesalahan tak terduga saat memutar'; + + @override + String get androidExactAlarmScheduleError => + 'Android tidak dapat menjadwalkan alarm tepat. Periksa izin alarm tepat.'; + + @override + String get recordingPathEmptyError => 'Jalur rekaman tidak boleh kosong'; + + @override + String get recordingMaxSizeInvalidError => + 'Ukuran maksimum harus lebih besar dari nol'; + + @override + String get recordingAlreadyActiveError => + 'Sudah ada rekaman yang sedang berlangsung'; + + @override + String get alarmRingingFallbackActive => + 'Memutar dengan audio internal yang aman.'; + + @override + String get alarmRingingPreparingFallback => + 'Menyiapkan audio internal yang aman.'; + + @override + String get alarmRingingTryingStation => + 'Mencoba memutar stasiun Anda dengan kualitas tertinggi yang tersedia.'; + + @override + String alarmScheduleOnce(Object date) { + return 'Sekali · $date'; + } + + @override + String alarmScheduleWeekdays(Object days) { + return 'Hari: $days'; + } + + @override + String get androidReliabilityTitle => 'Tinjau keandalan Android'; + + @override + String get closeAction => 'Tutup'; + + @override + String get customOption => 'Kustom'; + + @override + String get endLabel => 'Selesai'; + + @override + String get equalizerDisable => 'Nonaktifkan equalizer'; + + @override + String get helpTitle => 'Bantuan dan tutorial'; + + @override + String get helpSubtitle => 'Tinjau fitur, tips, dan hal baru di PluriWave.'; + + @override + String get indefiniteOption => 'Tidak terbatas'; + + @override + String get invalidNumber => 'Nomor tidak valid'; + + @override + String get nameLabel => 'Nama'; + + @override + String get notPlaying => 'Tidak memutar'; + + @override + String get oneTimeOption => 'Sekali'; + + @override + String get pausePlaybackTooltip => 'Jeda pemutaran'; + + @override + String qualityOriginal(Object quality) { + return 'Kualitas asli: $quality'; + } + + @override + String get qualityUnknown => 'Kualitas tidak dilaporkan'; + + @override + String get recordAction => 'Rekam'; + + @override + String get recordDurationTitle => 'Durasi rekaman'; + + @override + String get recordRadioSubtitle => 'Pilih berapa lama ingin merekam.'; + + @override + String get recordRadioTitle => 'Rekam radio'; + + @override + String get recordingActiveTitle => 'Merekam radio'; + + @override + String get recordingDirectTitle => 'Perekaman langsung'; + + @override + String get recordingsOpenFolderPlainError => + 'Tidak dapat membuka folder rekaman'; + + @override + String get recordingsOpenLatest => 'Buka rekaman terbaru'; + + @override + String get recordingsOpenLatestError => 'Tidak dapat membuka rekaman terbaru'; + + @override + String get startLabel => 'Mulai'; + + @override + String get startPlaybackTooltip => 'Mulai pemutaran'; + + @override + String get stopAction => 'Stop'; + + @override + String get stopPlaybackTooltip => 'Hentikan pemutaran'; + + @override + String get weekdayShortMonday => 'Sen'; + + @override + String get weekdayShortTuesday => 'Sel'; + + @override + String get weekdayShortWednesday => 'Rab'; + + @override + String get weekdayShortThursday => 'Kam'; + + @override + String get weekdayShortFriday => 'Jum'; + + @override + String get weekdayShortSaturday => 'Sab'; + + @override + String get weekdayShortSunday => 'Min'; } diff --git a/lib/l10n/gen/app_localizations_it.dart b/lib/l10n/gen/app_localizations_it.dart index 20e64b1..7aafd4d 100644 --- a/lib/l10n/gen/app_localizations_it.dart +++ b/lib/l10n/gen/app_localizations_it.dart @@ -12,7 +12,7 @@ class AppLocalizationsIt extends AppLocalizations { String get appTitle => 'PluriWave'; @override - String get navHome => 'Home'; + String get navHome => 'Inizio'; @override String get navSearch => 'Cerca'; @@ -34,38 +34,62 @@ class AppLocalizationsIt extends AppLocalizations { @override String get sleepTimerDescription => - 'Smooth radio shutdown with an exact countdown.'; + 'Spegnimento graduale della radio con conto alla rovescia preciso.'; @override - String get cancelTimer => 'Cancel timer'; + String get cancelTimer => 'Annulla timer'; @override - String get optionOther => 'Other'; + String get optionOther => 'Altro'; @override - String get customDurationTitle => 'Custom duration'; + String get customDurationTitle => 'Durata personalizzata'; @override - String get durationGreaterThanZero => 'Choose a duration greater than zero.'; + String get durationGreaterThanZero => 'Scegli una durata maggiore di zero.'; @override - String get hoursLabel => 'Hours'; + String get hoursLabel => 'Ore'; @override - String get minutesLabel => 'Minutes'; + String get minutesLabel => 'Minuti'; @override - String get secondsLabel => 'Seconds'; + String get secondsLabel => 'Secondi'; @override - String get saveQuickAccess => 'Save as quick access'; + String durationHoursMinutesSeconds( + Object hours, + Object minutes, + Object seconds, + ) { + return '$hours h $minutes min $seconds s'; + } @override - String get startTimer => 'Start timer'; + String durationMinutesSeconds(Object minutes, Object seconds) { + return '$minutes min $seconds s'; + } + + @override + String durationMinutesOnly(Object minutes) { + return '$minutes min'; + } + + @override + String durationSecondsOnly(Object seconds) { + return '$seconds s'; + } + + @override + String get saveQuickAccess => 'Salva come accesso rapido'; + + @override + String get startTimer => 'Avvia timer'; @override String skipCurrentAlarmExecution(Object alarmName) { - return 'Skipped this execution of $alarmName.'; + return 'Questa esecuzione di $alarmName è stata saltata.'; } @override @@ -80,7 +104,7 @@ class AppLocalizationsIt extends AppLocalizations { @override String get languageSectionDescription => - 'Choose how the app language is displayed.'; + 'Scegli come visualizzare la lingua dell\'app.'; @override String get languageSystemDefault => 'Sistema'; @@ -100,223 +124,228 @@ class AppLocalizationsIt extends AppLocalizations { String get languageUpdatedSystem => 'Lingua aggiornata: Sistema'; @override - String get timerSectionTitle => 'Sleep timer'; + String get timerSectionTitle => 'Timer sonno'; @override - String get timerSectionAdd => 'Add'; + String get timerSectionAdd => 'Aggiungi'; @override String get timerSectionDescription => - 'Customize the quick presets shown when automatically stopping the radio.'; + 'Personalizza gli accessi rapidi mostrati quando la radio si spegne automaticamente.'; @override - String get timerSectionRestoreRecommended => 'Restore recommended times'; + String get timerSectionRestoreRecommended => 'Ripristina tempi consigliati'; @override - String get newQuickAccessTitle => 'New quick access'; + String get newQuickAccessTitle => 'Nuovo accesso rapido'; @override - String get saveQuickAccessButton => 'Save quick access'; + String get saveQuickAccessButton => 'Salva accesso rapido'; @override - String get settingsSafeStatus => 'Safe'; + String get settingsSafeStatus => 'Sicuro'; @override - String get recordingsSectionTitle => 'Recordings'; + String get recordingsSectionTitle => 'Registrazioni'; @override - String get recordingsFolderDialogTitle => 'Select recordings folder'; + String get recordingsFolderDialogTitle => + 'Seleziona la cartella delle registrazioni'; @override - String get recordingsPathUpdated => 'Recording path updated'; + String get recordingsPathUpdated => 'Percorso di registrazione aggiornato'; @override String recordingsPathSaveError(Object error) { - return 'Could not save the path: $error'; + return 'Impossibile salvare il percorso: $error'; } @override String get recordingsDefaultFolderRestored => - 'The internal default folder will be used'; + 'Verrà usata la cartella interna predefinita'; @override - String get recordingsFolderTitle => 'Recordings folder'; + String get recordingsFolderTitle => 'Cartella di registrazione'; @override - String get recordingsPathCalculating => 'Calculating path...'; + String get recordingsPathCalculating => 'Calcolo percorso...'; @override - String get recordingsChangePath => 'Change path'; + String get recordingsChangePath => 'Cambia percorso'; @override - String get recordingsUseDefaultPath => 'Use default path'; + String get recordingsUseDefaultPath => 'Usa percorso predefinito'; @override String get recordingsOriginalStreamHint => - 'The radio is saved from the original stream, without recompressing.'; + 'La radio viene salvata dallo stream originale, senza ricompressione.'; @override - String get equalizerActive => 'Active'; + String get equalizerActive => 'Attivo'; @override - String get equalizerDisabled => 'Disabled'; + String get equalizerDisabled => 'Disattivato'; @override - String get equalizerEnable => 'Enable equalizer'; + String get equalizerEnable => 'Attiva equalizzatore'; @override String get equalizerRealtimeSubtitle => - 'Changes are applied in real time to the current station.'; + 'Le modifiche vengono applicate in tempo reale all\'emittente attuale.'; @override String get equalizerPendingSubtitle => - 'Changes are saved and will apply when Android enables the effect.'; + 'Le modifiche vengono salvate e saranno applicate quando Android abiliterà l\'effetto.'; @override - String get equalizerPerStationTitle => 'Use custom EQ for this favorite'; + String get equalizerPerStationTitle => 'Usa EQ proprio per questo preferito'; @override String equalizerPerStationActive(Object stationName) { - return 'Active for $stationName'; + return 'Attivo per $stationName'; } @override String equalizerPerStationMain(Object stationName) { - return 'Using main EQ for $stationName'; + return 'EQ principale in uso per $stationName'; } @override - String get preferredStationTitle => 'Preferred station'; + String get preferredStationTitle => 'Emittente preferita'; @override String get preferredStationDescription => - 'Preselected for new alarms and available for quick playback.'; + 'Preselezionata quando crei sveglie e disponibile per la riproduzione rapida.'; @override - String get preferredStationNoStationsTitle => 'No stations available yet'; + String get preferredStationNoStationsTitle => + 'Non ci sono ancora emittenti disponibili'; @override String get preferredStationNoStationsSubtitle => - 'Save favorites or load stations to choose a preferred one.'; + 'Salva preferiti o carica emittenti per sceglierne una preferita.'; @override - String get preferredStationAutomaticFallback => 'Automatic fallback'; + String get preferredStationAutomaticFallback => 'Fallback automatico'; @override - String get preferredStationDefaultFavorite => 'Default favorite'; + String get preferredStationDefaultFavorite => 'Preferita predefinita'; @override String preferredStationCurrent(Object stationName) { - return 'Current preferred: $stationName'; + return 'Preferita attuale: $stationName'; } @override String preferredStationAutoUsing(Object stationName) { - return 'No favorites: automatically using $stationName'; + return 'Nessun preferito: uso automatico di $stationName'; } @override - String get preferredStationPlay => 'Play preferred'; + String get preferredStationPlay => 'Riproduci preferita'; @override - String get customStationsTitle => 'Custom stations'; + String get customStationsTitle => 'Emittenti personalizzate'; @override - String get customStationsAdd => 'Add'; + String get customStationsAdd => 'Aggiungi'; @override - String get customStationsEmpty => 'No custom stations.'; + String get customStationsEmpty => 'Nessuna emittente personalizzata.'; @override - String get playAction => 'Play'; + String get playAction => 'Riproduci'; @override - String get deleteAction => 'Delete'; + String get deleteAction => 'Elimina'; @override - String get addStationTitle => 'Add station'; + String get addStationTitle => 'Aggiungi emittente'; @override - String get stationNameLabel => 'Name *'; + String get stationNameLabel => 'Nome *'; @override - String get requiredField => 'Required field'; + String get unnamedStation => 'Stazione senza nome'; @override - String get streamUrlLabel => 'Stream URL *'; + String get requiredField => 'Campo obbligatorio'; @override - String get invalidUrl => 'Invalid URL'; + String get streamUrlLabel => 'URL dello stream *'; @override - String get countryOptionalLabel => 'Country (optional)'; + String get invalidUrl => 'URL non valido'; @override - String get saveStation => 'Save station'; + String get countryOptionalLabel => 'Paese (opzionale)'; + + @override + String get saveStation => 'Salva emittente'; @override String get backupSectionTitle => 'Backup'; @override - String get backupExportTitle => 'Export configuration'; + String get backupExportTitle => 'Esporta configurazione'; @override String get backupExportSubtitle => - 'Favorites, custom stations, and EQ presets'; + 'Preferiti, emittenti personalizzate e preset EQ'; @override - String get backupImportTitle => 'Import configuration'; + String get backupImportTitle => 'Importa configurazione'; @override - String get backupImportSubtitle => 'Restore from a backup file'; + String get backupImportSubtitle => 'Ripristina da un file di backup'; @override String get backupShareSubject => 'PluriWave — backup'; @override String backupShareText(Object date) { - return 'PluriWave configuration exported on $date'; + return 'Configurazione di PluriWave esportata il $date'; } @override String backupExportError(Object error) { - return 'Export error: $error'; + return 'Errore durante l\'esportazione: $error'; } @override String get backupImportConfirmMessage => - 'This will add favorites, stations, and presets from the file. Continue?'; + 'Questo aggiungerà preferiti, emittenti e preset dal file. Continuare?'; @override - String get backupImportSuccess => 'Configuration imported successfully'; + String get backupImportSuccess => 'Configurazione importata correttamente'; @override String backupImportError(Object error) { - return 'Import error: $error'; + return 'Errore durante l\'importazione: $error'; } @override - String get appVersionLoading => 'Loading version...'; + String get appVersionLoading => 'Caricamento versione...'; @override String appVersionSubtitle(Object version) { - return '$version - World radio'; + return '$version - Radio mondiale'; } @override - String get savedFavoritesTitle => 'Saved favorites'; + String get savedFavoritesTitle => 'Preferiti salvati'; @override - String get stationFilterTitle => 'Station filter'; + String get stationFilterTitle => 'Filtro emittenti'; @override - String get stationFilterSubtitle => 'Only stations verified as active'; + String get stationFilterSubtitle => 'Solo emittenti verificate come attive'; @override - String get backgroundAudioTitle => 'Background audio'; + String get backgroundAudioTitle => 'Audio in background'; @override - String get backgroundAudioSubtitle => 'Continues when the screen turns off'; + String get backgroundAudioSubtitle => 'Continua quando lo schermo si spegne'; @override String get dash => '—'; @@ -325,127 +354,852 @@ class AppLocalizationsIt extends AppLocalizations { String get cancelAction => 'Annulla'; @override - String get equalizerTitle => 'Equalizer'; + String get equalizerTitle => 'Equalizzatore'; @override - String get recordingsOpenFolder => 'Open folder'; + String get recordingsOpenFolder => 'Apri cartella'; @override String recordingsOpenFolderError(Object error) { - return 'Could not open the folder: $error'; + return 'Impossibile aprire la cartella: $error'; } @override - String get recordingsMaxSizeTitle => 'Maximum recording size'; + String get recordingsMaxSizeTitle => 'Dimensione massima registrazione'; @override String recordingsMaxSizeSubtitle(int size) { - return 'Current limit: $size MB'; + return 'Limite attuale: $size MB'; } @override - String get recordingsMaxSizeDialogTitle => 'Maximum size per recording'; + String get recordingsMaxSizeDialogTitle => + 'Dimensione massima per registrazione'; @override - String get recordingsMaxSizeMbLabel => 'Maximum megabytes'; + String get recordingsMaxSizeMbLabel => 'Megabyte massimi'; @override String recordingsMaxSizeSaved(int size) { - return 'Recording limit updated to $size MB'; + return 'Limite di registrazione aggiornato a $size MB'; } @override - String get stationOrderTitle => 'Station order'; + String get stationOrderTitle => 'Ordine emittenti'; @override - String get stationOrderByName => 'By name'; + String get stationOrderByName => 'Per nome'; @override - String get stationOrderByQuality => 'By quality'; + String get stationOrderByQuality => 'Per qualità'; @override String get stationOrderScopeDescription => - 'Applies to favorites, searches, nearby stations and quick lists.'; + 'Si applica a preferiti, ricerche, emittenti vicine ed elenchi rapidi.'; @override - String get favoriteGroupsTitle => 'Favorite lists'; + String get favoriteGroupsTitle => 'Liste preferiti'; @override String get favoriteGroupsDescription => - 'Create short lists to organize your saved stations.'; + 'Crea liste brevi per organizzare le emittenti salvate.'; @override - String get favoriteGroupsAdd => 'Add list'; + String get favoriteGroupsAdd => 'Aggiungi lista'; @override - String get favoriteGroupsEdit => 'Edit list'; + String get favoriteGroupsEdit => 'Modifica lista'; @override - String get favoriteGroupsDelete => 'Delete list'; + String get favoriteGroupsDelete => 'Elimina lista'; @override - String get favoriteGroupsNameLabel => 'List name'; + String get favoriteGroupsNameLabel => 'Nome della lista'; @override - String get favoriteGroupsNameTooLong => 'Maximum 28 characters.'; + String get favoriteGroupsNameTooLong => 'Massimo 28 caratteri.'; @override - String get favoriteGroupsUnassigned => 'Unassigned'; + String get favoriteGroupsUnassigned => 'Non assegnate'; @override String get favoriteGroupsProtectedHint => - 'Default list: it cannot be edited or deleted.'; + 'Lista predefinita: non può essere modificata né eliminata.'; @override - String get favoriteGroupsCreated => 'List created'; + String get favoriteGroupsCreated => 'Lista creata'; @override - String get favoriteGroupsUpdated => 'List updated'; + String get favoriteGroupsUpdated => 'Lista aggiornata'; @override String get favoriteGroupsDeleted => - 'List deleted; its stations return to Unassigned.'; + 'Lista eliminata; le sue emittenti tornano a Non assegnate.'; @override - String get favoriteGroupsAssign => 'Move to list'; + String get favoriteGroupsAssign => 'Sposta in lista'; @override String favoriteGroupsAssignSubtitle(Object groupName) { - return 'Current list: $groupName'; + return 'Lista attuale: $groupName'; } @override String favoriteGroupsAssigned(Object stationName, Object groupName) { - return '$stationName moved to $groupName'; + return '$stationName spostata in $groupName'; } @override - String get favoritesTitle => 'Favorites'; + String get favoritesTitle => 'Preferiti'; @override - String get favoritesEmptyTitle => 'No favorites yet'; + String get favoritesEmptyTitle => 'Ancora nessun preferito'; @override String get favoritesEmptySubtitle => - 'Tap the heart on any station to save it to your collection.'; + 'Tocca il cuore su qualsiasi emittente per salvarla nella tua raccolta.'; @override String get favoritesHeaderSubtitle => - 'Organize your collection by lists and keep important radios close.'; + 'Organizza la raccolta in liste e tieni vicine le radio importanti.'; @override - String get favoritesCollection => 'Collection'; + String get favoritesCollection => 'Raccolta'; @override String favoritesSavedCount(int count) { - return '$count saved'; + return '$count salvate'; } @override - String get favoritesRemoveTooltip => 'Remove from favorites'; + String get favoritesRemoveTooltip => 'Rimuovi dai preferiti'; @override String favoritesRemovedMessage(Object stationName) { - return '$stationName removed from favorites'; + return '$stationName rimossa dai preferiti'; } + + @override + String get alarmPostponedCurrentExecution => + 'Sveglia posticipata per questa esecuzione.'; + + @override + String get searchScreenTitle => 'Cerca segnale'; + + @override + String get searchScreenSubtitle => + 'Trova emittenti per nome, Paese o lingua con filtri rapidi e contrasto elevato.'; + + @override + String get searchFiltersLabel => 'Filtri'; + + @override + String get searchHint => 'Radio Orizzonte, jazz, notizie...'; + + @override + String get searchCountryFilterLabel => 'Paese'; + + @override + String get searchLanguageFilterLabel => 'Lingua'; + + @override + String get searchMinQualityFilterLabel => 'Qualità minima'; + + @override + String get searchEmptyTitle => 'Cerca un\'emittente'; + + @override + String get searchNoResultsTitle => 'Nessun risultato'; + + @override + String get searchEmptySubtitle => + 'Usa la barra in alto o i chip per scoprire emittenti da tutto il mondo.'; + + @override + String get searchNoResultsSubtitle => + 'Prova a rimuovere i filtri o a digitare un altro nome per trovare un\'emittente attiva.'; + + @override + String get countrySpain => 'Spagna'; + + @override + String get countryUsa => 'USA'; + + @override + String get countryMexico => 'Messico'; + + @override + String get countryArgentina => 'Argentina'; + + @override + String get countryUk => 'Regno Unito'; + + @override + String get countryFrance => 'Francia'; + + @override + String get countryGermany => 'Germania'; + + @override + String get countryItaly => 'Italia'; + + @override + String get countryBrazil => 'Brasile'; + + @override + String get countryJapan => 'Giappone'; + + @override + String get languageNameSpanish => 'spagnolo'; + + @override + String get languageNameEnglish => 'inglese'; + + @override + String get languageNameFrench => 'francese'; + + @override + String get languageNameGerman => 'tedesco'; + + @override + String get languageNamePortuguese => 'portoghese'; + + @override + String get languageNameItalian => 'italiano'; + + @override + String get languageNameJapanese => 'giapponese'; + + @override + String get languageNameArabic => 'arabo'; + + @override + String get languageNameRussian => 'russo'; + + @override + String get homeScreenSubtitle => + 'Radio globale in diretta con segnali puliti, preferiti intelligenti e un\'esperienza visiva da quiz show.'; + + @override + String get exploreStations => 'Esplora emittenti'; + + @override + String stationsCount(int count) { + return '$count radio'; + } + + @override + String get qualityHd => 'Qualità HD'; + + @override + String get nearYou => 'Vicino a te'; + + @override + String nearYouInCountry(Object country) { + return 'Vicino a te · $country'; + } + + @override + String get detectAction => 'Rileva'; + + @override + String get liveRadar => 'Radar live'; + + @override + String get genresTitle => 'Generi'; + + @override + String get retryAction => 'Riprova'; + + @override + String get noStationsAvailable => 'Nessuna emittente disponibile'; + + @override + String get noStationsAvailableSubtitle => + 'Prova ad aggiornare o a scegliere un altro genere per captare di nuovo un segnale.'; + + @override + String get genrePop => 'Pop'; + + @override + String get genreRock => 'Rock'; + + @override + String get genreJazz => 'Jazz'; + + @override + String get genreClassical => 'Classica'; + + @override + String get genreElectronic => 'Elettronica'; + + @override + String get genreNews => 'Notizie'; + + @override + String get genreTalk => 'Talk'; + + @override + String get genreHipHop => 'Hip-hop'; + + @override + String get genreCountry => 'Country'; + + @override + String get genreMetal => 'Metal'; + + @override + String get genreReggae => 'Reggae'; + + @override + String get genreLatin => 'Latina'; + + @override + String get alarmScreenTitle => 'Risveglio musicale'; + + @override + String get alarmScreenSubtitle => + 'Sveglie con radio, suono sicuro, vacanze intelligenti e prossima esecuzione sempre visibile.'; + + @override + String get createAlarmAction => 'Crea sveglia'; + + @override + String alarmsCount(int count) { + return '$count sveglie'; + } + + @override + String get activeAlarmsWithoutNextTitle => + 'Sveglie attive senza prossima esecuzione'; + + @override + String get noActiveAlarms => 'Nessuna sveglia attiva'; + + @override + String get nextAlarmTitle => 'Prossima sveglia'; + + @override + String activeAlarmsWithoutNextSubtitle(int count) { + return 'Ci sono $count sveglia/e attive, ma al momento non hanno una data futura valida. Controlla data, giorni e vacanze.'; + } + + @override + String get createAlarmHint => + 'Crea una sveglia e PluriWave calcolerà automaticamente la prossima esecuzione.'; + + @override + String get alarmVacationPlay => 'Suona durante le vacanze'; + + @override + String get alarmVacationPause => 'Pausa durante le vacanze'; + + @override + String alarmFadeInLabel(int seconds) { + return 'Fade-in ${seconds}s'; + } + + @override + String alarmNextExecution(Object date) { + return 'Prossima esecuzione: $date'; + } + + @override + String get alarmNoNextExecution => 'Non ha una prossima esecuzione attiva.'; + + @override + String alarmSkippedExecution(Object date) { + return 'Un\'esecuzione è stata saltata: $date.'; + } + + @override + String get editAction => 'Modifica'; + + @override + String get skipNextAction => 'Salta prossima'; + + @override + String get deleteTooltip => 'Elimina'; + + @override + String get alarmSkippedNoNextSnackbar => + 'Sveglia saltata. Non resta alcuna prossima esecuzione.'; + + @override + String alarmSkippedReturnsSnackbar(Object date) { + return 'Sveglia saltata. Tornerà il $date.'; + } + + @override + String alarmVacationPausedNoNext(Object vacationName) { + return 'In pausa per vacanze ($vacationName) e senza prossima esecuzione.'; + } + + @override + String alarmVacationPausedReturns(Object vacationName, Object date) { + return 'In pausa per vacanze ($vacationName) e torna il $date.'; + } + + @override + String alarmVacationReturns(Object date) { + return 'Con le vacanze attive, suonerà di nuovo il $date.'; + } + + @override + String get defaultAlarmName => 'Sveglia musicale'; + + @override + String get newAlarmTitle => 'Nuova sveglia'; + + @override + String get editAlarmTitle => 'Modifica sveglia'; + + @override + String get nameField => 'Nome'; + + @override + String get timeField => 'Ora'; + + @override + String get dateField => 'Data'; + + @override + String get onceOption => 'Una volta'; + + @override + String get dailyOption => 'Giornaliera'; + + @override + String get weekdaysOption => 'Giorni'; + + @override + String get soundAndVolumeSection => 'Suono e volume'; + + @override + String get alarmFadeInTitle => 'Fade-in sveglia'; + + @override + String get alarmFadeInOff => '0 s (senza transizione)'; + + @override + String alarmFadeInSummary(int seconds) { + return '$seconds s (dal 5% al volume scelto)'; + } + + @override + String get internalSafeSoundLabel => 'Suono sicuro interno'; + + @override + String get soundWarmSunrise => 'Alba calda'; + + @override + String get soundSoftBell => 'Campana dolce'; + + @override + String get soundDigitalPulse => 'Impulso digitale'; + + @override + String get favoriteStationLabel => 'Emittente preferita'; + + @override + String get noStationUseInternalSound => + 'Nessuna emittente: usa suono interno'; + + @override + String get saveFavoritesAlarmHint => + 'Salva emittenti nei Preferiti per usarle come sveglia musicale.'; + + @override + String get useCurrentStationAction => 'Usa emittente attuale'; + + @override + String get playDuringVacations => 'Suona durante le vacanze'; + + @override + String get playDuringVacationsHint => + 'Se lo disattivi, la prossima esecuzione passerà al primo giorno valido.'; + + @override + String get saveAlarmAction => 'Salva sveglia'; + + @override + String get chooseOneWeekdayError => + 'Scegli almeno un giorno della settimana.'; + + @override + String get androidReliabilityReview => 'Controlla affidabilità Android'; + + @override + String get statusOk => 'OK'; + + @override + String get statusPending => 'in sospeso'; + + @override + String androidReliabilityStatus( + Object exact, + Object notifications, + Object screen, + ) { + return 'Affidabilità: esatte $exact · notifiche $notifications · schermo $screen'; + } + + @override + String get vacationRangesTitle => 'Periodi di vacanza'; + + @override + String get addAction => 'Aggiungi'; + + @override + String get vacationRangesHint => + 'Se una sveglia ha \"Pausa durante le vacanze\", questi periodi vengono saltati automaticamente.'; + + @override + String get noVacationRangesLoaded => 'Nessun periodo caricato.'; + + @override + String get deleteRangeTooltip => 'Elimina periodo'; + + @override + String get vacationsDefaultName => 'Vacanze'; + + @override + String get newVacationRangeTitle => 'Nuovo periodo di vacanza'; + + @override + String get startField => 'Inizio'; + + @override + String get endField => 'Fine'; + + @override + String get saveRangeAction => 'Salva periodo'; + + @override + String get noAlarmsYetTitle => 'Non ci sono ancora sveglie.'; + + @override + String get noAlarmsYetSubtitle => + 'Creane una per progettare il tuo risveglio musicale.'; + + @override + String get ringingInternalAudioActive => + 'Suono sicuro interno in riproduzione.'; + + @override + String get ringingPreparingInternalAudio => + 'Preparazione del suono sicuro interno.'; + + @override + String get stopAlarmAction => 'Ferma sveglia'; + + @override + String get pauseAction => 'Pausa'; + + @override + String miniPlayerOpenLabel(Object stationName) { + return 'Apri il lettore per $stationName'; + } + + @override + String get playerIconLabel => 'Lettore'; + + @override + String get playbackStatusConnecting => 'Connessione...'; + + @override + String get playbackStatusLive => 'In diretta'; + + @override + String get playbackStatusPaused => 'In pausa'; + + @override + String get playbackStatusConnectionError => 'Errore di connessione'; + + @override + String get playbackStatusStopped => 'Interrotto'; + + @override + String stationSemanticLabel(Object stationName) { + return 'Stazione $stationName'; + } + + @override + String get favoritesAddTooltip => 'Aggiungi ai preferiti'; + + @override + String favoritesAddedMessage(Object stationName) { + return '$stationName aggiunta ai preferiti'; + } + + @override + String get stationIconLabel => 'Icona della stazione'; + + @override + String get liveNow => 'In diretta'; + + @override + String equalizerBandLabel(Object band) { + return 'Banda $band'; + } + + @override + String equalizerBandValue(Object value) { + return '$value decibel'; + } + + @override + String get equalizerPresetFlat => 'Piatto'; + + @override + String get equalizerPresetRock => 'Rock'; + + @override + String get equalizerPresetPop => 'Pop'; + + @override + String get equalizerPresetBassBoost => 'Potenziamento bassi'; + + @override + String get equalizerPresetJazz => 'Jazz'; + + @override + String get equalizerPresetVoice => 'Voce'; + + @override + String get equalizerPresetCustom => 'Personalizzato'; + + @override + String get onboardingTitle => 'Benvenuto in PluriWave'; + + @override + String get onboardingNewsTitle => 'Novità'; + + @override + String get onboardingStartAction => 'Inizia'; + + @override + String get onboardingCloseTooltip => 'Chiudi'; + + @override + String radioRecordingError(Object error) { + return 'Errore durante la registrazione della radio: $error'; + } + + @override + String get radioApiConnectionError => 'Nessuna connessione all\'API radio'; + + @override + String get radioSearchError => 'Errore di ricerca. Controlla la connessione.'; + + @override + String get radioLoadMoreStationsError => + 'Impossibile caricare altre stazioni.'; + + @override + String get radioNearbyStationsError => + 'Non abbiamo potuto rilevare stazioni vicine. Usa i filtri per paese.'; + + @override + String radioCannotPlayStation(Object stationName) { + return 'Impossibile riprodurre \"$stationName\"'; + } + + @override + String get recordingSelectStationFirst => + 'Seleziona prima una stazione da registrare.'; + + @override + String recordingStartError(Object error) { + return 'Impossibile avviare la registrazione: $error'; + } + + @override + String get unsupportedConfigVersion => + 'Versione di configurazione non supportata'; + + @override + String get audioErrorGeneric => 'Errore di riproduzione'; + + @override + String get audioErrorNoInternet => 'Nessuna connessione a Internet'; + + @override + String get audioErrorInvalidUrl => 'L\'URL della radio non è valido'; + + @override + String get audioErrorNotFound => 'La radio non è disponibile (errore 404)'; + + @override + String get audioErrorTimeout => 'Tempo di connessione scaduto'; + + @override + String get audioErrorCannotConnect => 'Impossibile connettersi alla radio'; + + @override + String get audioErrorUnsupportedFormat => 'Formato stream non supportato'; + + @override + String get audioErrorDecode => + 'Errore durante la decodifica dello stream audio'; + + @override + String get audioErrorCleartext => + 'Questa radio usa HTTP non cifrato, non consentito'; + + @override + String get audioErrorSsl => 'Certificato SSL non valido per la radio'; + + @override + String get audioErrorCannotPlay => 'Questa radio non può essere riprodotta'; + + @override + String get audioErrorUnexpectedPlayback => + 'Errore di riproduzione imprevisto'; + + @override + String get androidExactAlarmScheduleError => + 'Android non ha potuto programmare una sveglia esatta. Controlla l\'autorizzazione per le sveglie esatte.'; + + @override + String get recordingPathEmptyError => + 'Il percorso di registrazione non può essere vuoto'; + + @override + String get recordingMaxSizeInvalidError => + 'La dimensione massima deve essere maggiore di zero'; + + @override + String get recordingAlreadyActiveError => 'È già in corso una registrazione'; + + @override + String get alarmRingingFallbackActive => + 'Riproduzione con audio interno sicuro.'; + + @override + String get alarmRingingPreparingFallback => + 'Preparazione dell’audio interno sicuro.'; + + @override + String get alarmRingingTryingStation => + 'Tentativo di riprodurre la tua stazione con la massima qualità disponibile.'; + + @override + String alarmScheduleOnce(Object date) { + return 'Una volta · $date'; + } + + @override + String alarmScheduleWeekdays(Object days) { + return 'Giorni: $days'; + } + + @override + String get androidReliabilityTitle => 'Controlla affidabilità Android'; + + @override + String get closeAction => 'Chiudi'; + + @override + String get customOption => 'Personalizzata'; + + @override + String get endLabel => 'Fine'; + + @override + String get equalizerDisable => 'Disattiva equalizzatore'; + + @override + String get helpTitle => 'Aiuto e tutorial'; + + @override + String get helpSubtitle => 'Rivedi funzioni, consigli e novità di PluriWave.'; + + @override + String get indefiniteOption => 'Indefinita'; + + @override + String get invalidNumber => 'Numero non valido'; + + @override + String get nameLabel => 'Nome'; + + @override + String get notPlaying => 'Non in riproduzione'; + + @override + String get oneTimeOption => 'Una volta'; + + @override + String get pausePlaybackTooltip => 'Pausa riproduzione'; + + @override + String qualityOriginal(Object quality) { + return 'Qualità originale: $quality'; + } + + @override + String get qualityUnknown => 'Qualità non indicata'; + + @override + String get recordAction => 'Registra'; + + @override + String get recordDurationTitle => 'Durata registrazione'; + + @override + String get recordRadioSubtitle => 'Scegli per quanto tempo registrare.'; + + @override + String get recordRadioTitle => 'Registra radio'; + + @override + String get recordingActiveTitle => 'Registrazione radio'; + + @override + String get recordingDirectTitle => 'Registrazione diretta'; + + @override + String get recordingsOpenFolderPlainError => + 'Impossibile aprire la cartella delle registrazioni'; + + @override + String get recordingsOpenLatest => 'Apri ultima registrazione'; + + @override + String get recordingsOpenLatestError => + 'Impossibile aprire l’ultima registrazione'; + + @override + String get startLabel => 'Inizio'; + + @override + String get startPlaybackTooltip => 'Avvia riproduzione'; + + @override + String get stopAction => 'Ferma'; + + @override + String get stopPlaybackTooltip => 'Ferma riproduzione'; + + @override + String get weekdayShortMonday => 'Lun'; + + @override + String get weekdayShortTuesday => 'Mar'; + + @override + String get weekdayShortWednesday => 'Mer'; + + @override + String get weekdayShortThursday => 'Gio'; + + @override + String get weekdayShortFriday => 'Ven'; + + @override + String get weekdayShortSaturday => 'Sab'; + + @override + String get weekdayShortSunday => 'Dom'; } diff --git a/lib/l10n/gen/app_localizations_ja.dart b/lib/l10n/gen/app_localizations_ja.dart index 6b14f55..487ea62 100644 --- a/lib/l10n/gen/app_localizations_ja.dart +++ b/lib/l10n/gen/app_localizations_ja.dart @@ -12,440 +12,1145 @@ class AppLocalizationsJa extends AppLocalizations { String get appTitle => 'PluriWave'; @override - String get navHome => 'Home'; + String get navHome => 'ホーム'; @override - String get navSearch => 'Search'; + String get navSearch => '検索'; @override - String get navFavorites => 'Favorites'; + String get navFavorites => 'お気に入り'; @override - String get navAlarms => 'Alarms'; + String get navAlarms => 'アラーム'; @override - String get navSettings => 'Settings'; + String get navSettings => '設定'; @override - String get actionOk => 'OK'; + String get actionOk => '了解'; @override - String get sleepTimer => 'Sleep timer'; + String get sleepTimer => 'スリープタイマー'; @override - String get sleepTimerDescription => - 'Smooth radio shutdown with an exact countdown.'; + String get sleepTimerDescription => '正確なカウントダウンでラジオをなめらかに停止します。'; @override - String get cancelTimer => 'Cancel timer'; + String get cancelTimer => 'タイマーをキャンセル'; @override - String get optionOther => 'Other'; + String get optionOther => 'その他'; @override - String get customDurationTitle => 'Custom duration'; + String get customDurationTitle => 'カスタム時間'; @override - String get durationGreaterThanZero => 'Choose a duration greater than zero.'; + String get durationGreaterThanZero => '0 より大きい時間を選択してください。'; @override - String get hoursLabel => 'Hours'; + String get hoursLabel => '時間'; @override - String get minutesLabel => 'Minutes'; + String get minutesLabel => '分'; @override - String get secondsLabel => 'Seconds'; + String get secondsLabel => '秒'; @override - String get saveQuickAccess => 'Save as quick access'; + String durationHoursMinutesSeconds( + Object hours, + Object minutes, + Object seconds, + ) { + return '$hours?? $minutes? $seconds?'; + } @override - String get startTimer => 'Start timer'; + String durationMinutesSeconds(Object minutes, Object seconds) { + return '$minutes? $seconds?'; + } + + @override + String durationMinutesOnly(Object minutes) { + return '$minutes?'; + } + + @override + String durationSecondsOnly(Object seconds) { + return '$seconds?'; + } + + @override + String get saveQuickAccess => 'クイックアクセスとして保存'; + + @override + String get startTimer => 'タイマーを開始'; @override String skipCurrentAlarmExecution(Object alarmName) { - return 'Skipped this execution of $alarmName.'; + return '$alarmName の今回の実行をスキップしました。'; } @override - String get settingsTitle => 'Settings'; + String get settingsTitle => '設定'; @override - String get settingsSubtitle => - 'Fine-grained sound control, backups, and custom stations.'; + String get settingsSubtitle => '音質、バックアップ、カスタム局を細かく管理します。'; @override - String get languageSectionTitle => 'Language'; + String get languageSectionTitle => '言語'; @override - String get languageSectionDescription => - 'Choose how the app language is displayed.'; + String get languageSectionDescription => 'アプリの言語表示を選択します。'; @override - String get languageSystemDefault => 'System'; + String get languageSystemDefault => 'システム'; @override - String get languageSpanish => 'Spanish'; + String get languageSpanish => 'スペイン語'; @override - String get languageEnglish => 'English'; + String get languageEnglish => '英語'; @override String languageUpdated(Object languageName) { - return 'Language updated: $languageName'; + return '言語を更新しました: $languageName'; } @override - String get languageUpdatedSystem => 'Language updated: System'; + String get languageUpdatedSystem => '言語を更新しました: システム'; @override - String get timerSectionTitle => 'Sleep timer'; + String get timerSectionTitle => 'スリープタイマー'; @override - String get timerSectionAdd => 'Add'; + String get timerSectionAdd => '追加'; @override String get timerSectionDescription => - 'Customize the quick presets shown when automatically stopping the radio.'; + 'ラジオを自動停止するときに表示されるクイックプリセットをカスタマイズします。'; @override - String get timerSectionRestoreRecommended => 'Restore recommended times'; + String get timerSectionRestoreRecommended => 'おすすめ時間を復元'; @override - String get newQuickAccessTitle => 'New quick access'; + String get newQuickAccessTitle => '新しいクイックアクセス'; @override - String get saveQuickAccessButton => 'Save quick access'; + String get saveQuickAccessButton => 'クイックアクセスを保存'; @override - String get settingsSafeStatus => 'Safe'; + String get settingsSafeStatus => '安全'; @override - String get recordingsSectionTitle => 'Recordings'; + String get recordingsSectionTitle => '録音'; @override - String get recordingsFolderDialogTitle => 'Select recordings folder'; + String get recordingsFolderDialogTitle => '録音フォルダーを選択'; @override - String get recordingsPathUpdated => 'Recording path updated'; + String get recordingsPathUpdated => '録音パスを更新しました'; @override String recordingsPathSaveError(Object error) { - return 'Could not save the path: $error'; + return 'パスを保存できませんでした: $error'; } @override - String get recordingsDefaultFolderRestored => - 'The internal default folder will be used'; + String get recordingsDefaultFolderRestored => '内部の既定フォルダーを使用します'; @override - String get recordingsFolderTitle => 'Recordings folder'; + String get recordingsFolderTitle => '録音フォルダー'; @override - String get recordingsPathCalculating => 'Calculating path...'; + String get recordingsPathCalculating => 'パスを計算中...'; @override - String get recordingsChangePath => 'Change path'; + String get recordingsChangePath => 'パスを変更'; @override - String get recordingsUseDefaultPath => 'Use default path'; + String get recordingsUseDefaultPath => '既定のパスを使用'; @override - String get recordingsOriginalStreamHint => - 'The radio is saved from the original stream, without recompressing.'; + String get recordingsOriginalStreamHint => 'ラジオは元のストリームから、再圧縮せずに保存されます。'; @override - String get equalizerActive => 'Active'; + String get equalizerActive => '有効'; @override - String get equalizerDisabled => 'Disabled'; + String get equalizerDisabled => '無効'; @override - String get equalizerEnable => 'Enable equalizer'; + String get equalizerEnable => 'イコライザーを有効化'; @override - String get equalizerRealtimeSubtitle => - 'Changes are applied in real time to the current station.'; + String get equalizerRealtimeSubtitle => '変更は現在の局にリアルタイムで適用されます。'; @override - String get equalizerPendingSubtitle => - 'Changes are saved and will apply when Android enables the effect.'; + String get equalizerPendingSubtitle => '変更は保存され、Android が効果を有効化したときに適用されます。'; @override - String get equalizerPerStationTitle => 'Use custom EQ for this favorite'; + String get equalizerPerStationTitle => 'このお気に入りに専用EQを使用'; @override String equalizerPerStationActive(Object stationName) { - return 'Active for $stationName'; + return '$stationName で有効'; } @override String equalizerPerStationMain(Object stationName) { - return 'Using main EQ for $stationName'; + return '$stationName でメインEQを使用中'; } @override - String get preferredStationTitle => 'Preferred station'; + String get preferredStationTitle => '優先局'; @override - String get preferredStationDescription => - 'Preselected for new alarms and available for quick playback.'; + String get preferredStationDescription => 'アラーム作成時に事前選択され、クイック再生でも開始できます。'; @override - String get preferredStationNoStationsTitle => 'No stations available yet'; + String get preferredStationNoStationsTitle => 'まだ利用できる局がありません'; @override String get preferredStationNoStationsSubtitle => - 'Save favorites or load stations to choose a preferred one.'; + '優先局を選ぶには、お気に入りを保存するか局を読み込んでください。'; @override - String get preferredStationAutomaticFallback => 'Automatic fallback'; + String get preferredStationAutomaticFallback => '自動フォールバック'; @override - String get preferredStationDefaultFavorite => 'Default favorite'; + String get preferredStationDefaultFavorite => '既定のお気に入り'; @override String preferredStationCurrent(Object stationName) { - return 'Current preferred: $stationName'; + return '現在の優先局: $stationName'; } @override String preferredStationAutoUsing(Object stationName) { - return 'No favorites: automatically using $stationName'; + return 'お気に入りなし: $stationName を自動使用中'; } @override - String get preferredStationPlay => 'Play preferred'; + String get preferredStationPlay => '優先局を再生'; @override - String get customStationsTitle => 'Custom stations'; + String get customStationsTitle => 'カスタム局'; @override - String get customStationsAdd => 'Add'; + String get customStationsAdd => '追加'; @override - String get customStationsEmpty => 'No custom stations.'; + String get customStationsEmpty => 'カスタム局はありません。'; @override - String get playAction => 'Play'; + String get playAction => '再生'; @override - String get deleteAction => 'Delete'; + String get deleteAction => '削除'; @override - String get addStationTitle => 'Add station'; + String get addStationTitle => '局を追加'; @override - String get stationNameLabel => 'Name *'; + String get stationNameLabel => '名前 *'; @override - String get requiredField => 'Required field'; + String get unnamedStation => '無名の放送局'; @override - String get streamUrlLabel => 'Stream URL *'; + String get requiredField => '必須項目'; @override - String get invalidUrl => 'Invalid URL'; + String get streamUrlLabel => 'ストリームURL *'; @override - String get countryOptionalLabel => 'Country (optional)'; + String get invalidUrl => '無効なURL'; @override - String get saveStation => 'Save station'; + String get countryOptionalLabel => '国(任意)'; @override - String get backupSectionTitle => 'Backup'; + String get saveStation => '局を保存'; @override - String get backupExportTitle => 'Export configuration'; + String get backupSectionTitle => 'バックアップ'; @override - String get backupExportSubtitle => - 'Favorites, custom stations, and EQ presets'; + String get backupExportTitle => '設定をエクスポート'; @override - String get backupImportTitle => 'Import configuration'; + String get backupExportSubtitle => 'お気に入り、カスタム局、EQプリセット'; @override - String get backupImportSubtitle => 'Restore from a backup file'; + String get backupImportTitle => '設定をインポート'; @override - String get backupShareSubject => 'PluriWave — backup'; + String get backupImportSubtitle => 'バックアップファイルから復元'; + + @override + String get backupShareSubject => 'PluriWave — バックアップ'; @override String backupShareText(Object date) { - return 'PluriWave configuration exported on $date'; + return '$date にエクスポートされた PluriWave 設定'; } @override String backupExportError(Object error) { - return 'Export error: $error'; + return 'エクスポート中にエラー: $error'; } @override - String get backupImportConfirmMessage => - 'This will add favorites, stations, and presets from the file. Continue?'; + String get backupImportConfirmMessage => 'ファイル内のお気に入り、局、プリセットを追加します。続行しますか?'; @override - String get backupImportSuccess => 'Configuration imported successfully'; + String get backupImportSuccess => '設定を正常にインポートしました'; @override String backupImportError(Object error) { - return 'Import error: $error'; + return 'インポート中にエラー: $error'; } @override - String get appVersionLoading => 'Loading version...'; + String get appVersionLoading => 'バージョンを読み込み中...'; @override String appVersionSubtitle(Object version) { - return '$version - World radio'; + return '$version - 世界のラジオ'; } @override - String get savedFavoritesTitle => 'Saved favorites'; + String get savedFavoritesTitle => '保存済みのお気に入り'; @override - String get stationFilterTitle => 'Station filter'; + String get stationFilterTitle => '局フィルター'; @override - String get stationFilterSubtitle => 'Only stations verified as active'; + String get stationFilterSubtitle => '有効確認済みの局のみ'; @override - String get backgroundAudioTitle => 'Background audio'; + String get backgroundAudioTitle => 'バックグラウンド音声'; @override - String get backgroundAudioSubtitle => 'Continues when the screen turns off'; + String get backgroundAudioSubtitle => '画面を消しても継続します'; @override String get dash => '—'; @override - String get cancelAction => 'Cancel'; + String get cancelAction => 'キャンセル'; @override - String get equalizerTitle => 'Equalizer'; + String get equalizerTitle => 'イコライザー'; @override - String get recordingsOpenFolder => 'Open folder'; + String get recordingsOpenFolder => 'フォルダーを開く'; @override String recordingsOpenFolderError(Object error) { - return 'Could not open the folder: $error'; + return 'フォルダーを開けませんでした: $error'; } @override - String get recordingsMaxSizeTitle => 'Maximum recording size'; + String get recordingsMaxSizeTitle => '録音の最大サイズ'; @override String recordingsMaxSizeSubtitle(int size) { - return 'Current limit: $size MB'; + return '現在の上限: $size MB'; } @override - String get recordingsMaxSizeDialogTitle => 'Maximum size per recording'; + String get recordingsMaxSizeDialogTitle => '録音ごとの最大サイズ'; @override - String get recordingsMaxSizeMbLabel => 'Maximum megabytes'; + String get recordingsMaxSizeMbLabel => '最大メガバイト'; @override String recordingsMaxSizeSaved(int size) { - return 'Recording limit updated to $size MB'; + return '録音上限を $size MB に更新しました'; } @override - String get stationOrderTitle => 'Station order'; + String get stationOrderTitle => '局の並び順'; @override - String get stationOrderByName => 'By name'; + String get stationOrderByName => '名前順'; @override - String get stationOrderByQuality => 'By quality'; + String get stationOrderByQuality => '品質順'; @override - String get stationOrderScopeDescription => - 'Applies to favorites, searches, nearby stations and quick lists.'; + String get stationOrderScopeDescription => 'お気に入り、検索、近くの局、クイック一覧に適用されます。'; @override - String get favoriteGroupsTitle => 'Favorite lists'; + String get favoriteGroupsTitle => 'お気に入りリスト'; @override - String get favoriteGroupsDescription => - 'Create short lists to organize your saved stations.'; + String get favoriteGroupsDescription => '保存した局を整理する短いリストを作成します。'; @override - String get favoriteGroupsAdd => 'Add list'; + String get favoriteGroupsAdd => 'リストを追加'; @override - String get favoriteGroupsEdit => 'Edit list'; + String get favoriteGroupsEdit => 'リストを編集'; @override - String get favoriteGroupsDelete => 'Delete list'; + String get favoriteGroupsDelete => 'リストを削除'; @override - String get favoriteGroupsNameLabel => 'List name'; + String get favoriteGroupsNameLabel => 'リスト名'; @override - String get favoriteGroupsNameTooLong => 'Maximum 28 characters.'; + String get favoriteGroupsNameTooLong => '最大28文字です。'; @override - String get favoriteGroupsUnassigned => 'Unassigned'; + String get favoriteGroupsUnassigned => '未割り当て'; @override - String get favoriteGroupsProtectedHint => - 'Default list: it cannot be edited or deleted.'; + String get favoriteGroupsProtectedHint => '既定のリスト: 編集または削除できません。'; @override - String get favoriteGroupsCreated => 'List created'; + String get favoriteGroupsCreated => 'リストを作成しました'; @override - String get favoriteGroupsUpdated => 'List updated'; + String get favoriteGroupsUpdated => 'リストを更新しました'; @override - String get favoriteGroupsDeleted => - 'List deleted; its stations return to Unassigned.'; + String get favoriteGroupsDeleted => 'リストを削除しました。局は未割り当てに戻りました。'; @override - String get favoriteGroupsAssign => 'Move to list'; + String get favoriteGroupsAssign => 'リストへ移動'; @override String favoriteGroupsAssignSubtitle(Object groupName) { - return 'Current list: $groupName'; + return '現在のリスト: $groupName'; } @override String favoriteGroupsAssigned(Object stationName, Object groupName) { - return '$stationName moved to $groupName'; + return '$stationName を $groupName に移動しました'; } @override - String get favoritesTitle => 'Favorites'; + String get favoritesTitle => 'お気に入り'; @override - String get favoritesEmptyTitle => 'No favorites yet'; + String get favoritesEmptyTitle => 'まだお気に入りはありません'; @override - String get favoritesEmptySubtitle => - 'Tap the heart on any station to save it to your collection.'; + String get favoritesEmptySubtitle => '任意の局でハートをタップしてコレクションに保存します。'; @override - String get favoritesHeaderSubtitle => - 'Organize your collection by lists and keep important radios close.'; + String get favoritesHeaderSubtitle => 'コレクションをリストで整理し、大事なラジオを近くに置きましょう。'; @override - String get favoritesCollection => 'Collection'; + String get favoritesCollection => 'コレクション'; @override String favoritesSavedCount(int count) { - return '$count saved'; + return '$count 件保存済み'; } @override - String get favoritesRemoveTooltip => 'Remove from favorites'; + String get favoritesRemoveTooltip => 'お気に入りから削除'; @override String favoritesRemovedMessage(Object stationName) { - return '$stationName removed from favorites'; + return '$stationName をお気に入りから削除しました'; } + + @override + String get alarmPostponedCurrentExecution => 'この実行のアラームを延期しました。'; + + @override + String get searchScreenTitle => '電波を探す'; + + @override + String get searchScreenSubtitle => '名前、国、言語で、すばやいフィルターと高コントラスト表示からラジオを見つけます。'; + + @override + String get searchFiltersLabel => 'フィルター'; + + @override + String get searchHint => 'ラジオ・オリゾンテ、ジャズ、ニュース...'; + + @override + String get searchCountryFilterLabel => '国'; + + @override + String get searchLanguageFilterLabel => '言語'; + + @override + String get searchMinQualityFilterLabel => '最低品質'; + + @override + String get searchEmptyTitle => '局を検索'; + + @override + String get searchNoResultsTitle => '結果がありません'; + + @override + String get searchEmptySubtitle => '上部バーやチップを使って、世界中の電波を見つけましょう。'; + + @override + String get searchNoResultsSubtitle => '有効な電波を見つけるには、フィルターを外すか別の名前を入力してください。'; + + @override + String get countrySpain => 'スペイン'; + + @override + String get countryUsa => '米国'; + + @override + String get countryMexico => 'メキシコ'; + + @override + String get countryArgentina => 'アルゼンチン'; + + @override + String get countryUk => '英国'; + + @override + String get countryFrance => 'フランス'; + + @override + String get countryGermany => 'ドイツ'; + + @override + String get countryItaly => 'イタリア'; + + @override + String get countryBrazil => 'ブラジル'; + + @override + String get countryJapan => '日本'; + + @override + String get languageNameSpanish => 'スペイン語'; + + @override + String get languageNameEnglish => '英語'; + + @override + String get languageNameFrench => 'フランス語'; + + @override + String get languageNameGerman => 'ドイツ語'; + + @override + String get languageNamePortuguese => 'ポルトガル語'; + + @override + String get languageNameItalian => 'イタリア語'; + + @override + String get languageNameJapanese => '日本語'; + + @override + String get languageNameArabic => 'アラビア語'; + + @override + String get languageNameRussian => 'ロシア語'; + + @override + String get homeScreenSubtitle => + 'クリアな電波、スマートなお気に入り、クイズ番組風のビジュアル体験を備えたライブ世界ラジオ。'; + + @override + String get exploreStations => '局を探す'; + + @override + String stationsCount(int count) { + return '$count 局'; + } + + @override + String get qualityHd => 'HD品質'; + + @override + String get nearYou => '近く'; + + @override + String nearYouInCountry(Object country) { + return '近く · $country'; + } + + @override + String get detectAction => '検出'; + + @override + String get liveRadar => 'ライブレーダー'; + + @override + String get genresTitle => 'ジャンル'; + + @override + String get retryAction => '再試行'; + + @override + String get noStationsAvailable => '利用できる局がありません'; + + @override + String get noStationsAvailableSubtitle => + '再読み込みするか別のジャンルを選んで、もう一度電波をつかまえてください。'; + + @override + String get genrePop => 'ポップ'; + + @override + String get genreRock => 'ロック'; + + @override + String get genreJazz => 'ジャズ'; + + @override + String get genreClassical => 'クラシック'; + + @override + String get genreElectronic => '電子音楽'; + + @override + String get genreNews => 'ニュース'; + + @override + String get genreTalk => 'トーク'; + + @override + String get genreHipHop => 'ヒップホップ'; + + @override + String get genreCountry => 'カントリー'; + + @override + String get genreMetal => 'メタル'; + + @override + String get genreReggae => 'レゲエ'; + + @override + String get genreLatin => 'ラテン'; + + @override + String get alarmScreenTitle => '音楽で目覚める'; + + @override + String get alarmScreenSubtitle => 'ラジオアラーム、安全な音、スマート休暇、次回実行を常に表示します。'; + + @override + String get createAlarmAction => 'アラームを作成'; + + @override + String alarmsCount(int count) { + return '$count 件のアラーム'; + } + + @override + String get activeAlarmsWithoutNextTitle => '次回実行がない有効なアラーム'; + + @override + String get noActiveAlarms => '有効なアラームはありません'; + + @override + String get nextAlarmTitle => '次のアラーム'; + + @override + String activeAlarmsWithoutNextSubtitle(int count) { + return '$count 件の有効なアラームがありますが、現在は有効な未来の日付がありません。日付、曜日、休暇を確認してください。'; + } + + @override + String get createAlarmHint => 'アラームを作成すると、PluriWave が次回実行を自動計算します。'; + + @override + String get alarmVacationPlay => '休暇中も鳴らす'; + + @override + String get alarmVacationPause => '休暇中は一時停止'; + + @override + String alarmFadeInLabel(int seconds) { + return 'フェードイン $seconds秒'; + } + + @override + String alarmNextExecution(Object date) { + return '次回実行: $date'; + } + + @override + String get alarmNoNextExecution => '有効な次回実行はありません。'; + + @override + String alarmSkippedExecution(Object date) { + return '1 回の実行をスキップしました: $date。'; + } + + @override + String get editAction => '編集'; + + @override + String get skipNextAction => '次回をスキップ'; + + @override + String get deleteTooltip => '削除'; + + @override + String get alarmSkippedNoNextSnackbar => 'アラームをスキップしました。次回実行は残っていません。'; + + @override + String alarmSkippedReturnsSnackbar(Object date) { + return 'アラームをスキップしました。$date に戻ります。'; + } + + @override + String alarmVacationPausedNoNext(Object vacationName) { + return '休暇($vacationName)で一時停止中、次回実行はありません。'; + } + + @override + String alarmVacationPausedReturns(Object vacationName, Object date) { + return '休暇($vacationName)で一時停止中、$date に戻ります。'; + } + + @override + String alarmVacationReturns(Object date) { + return '休暇が有効なため、$date に再び鳴ります。'; + } + + @override + String get defaultAlarmName => '音楽アラーム'; + + @override + String get newAlarmTitle => '新しいアラーム'; + + @override + String get editAlarmTitle => 'アラームを編集'; + + @override + String get nameField => '名前'; + + @override + String get timeField => '時刻'; + + @override + String get dateField => '日付'; + + @override + String get onceOption => '1回'; + + @override + String get dailyOption => '毎日'; + + @override + String get weekdaysOption => '曜日'; + + @override + String get soundAndVolumeSection => '音と音量'; + + @override + String get alarmFadeInTitle => 'アラームのフェードイン'; + + @override + String get alarmFadeInOff => '0 秒(切り替えなし)'; + + @override + String alarmFadeInSummary(int seconds) { + return '$seconds 秒(5% から選択音量まで)'; + } + + @override + String get internalSafeSoundLabel => '安全な内部音'; + + @override + String get soundWarmSunrise => '暖かな日の出'; + + @override + String get soundSoftBell => 'やさしいベル'; + + @override + String get soundDigitalPulse => 'デジタルパルス'; + + @override + String get favoriteStationLabel => 'お気に入り局'; + + @override + String get noStationUseInternalSound => '局なし: 内部音を使用'; + + @override + String get saveFavoritesAlarmHint => '音楽アラームとして使うには、局をお気に入りに保存してください。'; + + @override + String get useCurrentStationAction => '現在の局を使用'; + + @override + String get playDuringVacations => '休暇中も鳴らす'; + + @override + String get playDuringVacationsHint => 'オフにすると、次回実行は最初の有効日にスキップされます。'; + + @override + String get saveAlarmAction => 'アラームを保存'; + + @override + String get chooseOneWeekdayError => '少なくとも曜日を1つ選択してください。'; + + @override + String get androidReliabilityReview => 'Android の信頼性を確認'; + + @override + String get statusOk => '良好'; + + @override + String get statusPending => '保留中'; + + @override + String androidReliabilityStatus( + Object exact, + Object notifications, + Object screen, + ) { + return '信頼性: 正確 $exact · 通知 $notifications · 画面 $screen'; + } + + @override + String get vacationRangesTitle => '休暇期間'; + + @override + String get addAction => '追加'; + + @override + String get vacationRangesHint => 'アラームが「休暇中は一時停止」の場合、これらの期間は自動的にスキップされます。'; + + @override + String get noVacationRangesLoaded => '読み込まれた期間はありません。'; + + @override + String get deleteRangeTooltip => '期間を削除'; + + @override + String get vacationsDefaultName => '休暇'; + + @override + String get newVacationRangeTitle => '新しい休暇期間'; + + @override + String get startField => '開始'; + + @override + String get endField => '終了'; + + @override + String get saveRangeAction => '期間を保存'; + + @override + String get noAlarmsYetTitle => 'まだアラームはありません。'; + + @override + String get noAlarmsYetSubtitle => '音楽で目覚める体験を作るために、アラームを作成しましょう。'; + + @override + String get ringingInternalAudioActive => '安全な内部音で鳴っています。'; + + @override + String get ringingPreparingInternalAudio => '安全な内部音を準備中です。'; + + @override + String get stopAlarmAction => 'アラームを停止'; + + @override + String get pauseAction => '一時停止'; + + @override + String miniPlayerOpenLabel(Object stationName) { + return '$stationNameのプレーヤーを開く'; + } + + @override + String get playerIconLabel => 'プレーヤー'; + + @override + String get playbackStatusConnecting => '接続中...'; + + @override + String get playbackStatusLive => 'ライブ'; + + @override + String get playbackStatusPaused => '一時停止中'; + + @override + String get playbackStatusConnectionError => '接続エラー'; + + @override + String get playbackStatusStopped => '停止中'; + + @override + String stationSemanticLabel(Object stationName) { + return 'ラジオ局 $stationName'; + } + + @override + String get favoritesAddTooltip => 'お気に入りに追加'; + + @override + String favoritesAddedMessage(Object stationName) { + return '$stationNameをお気に入りに追加しました'; + } + + @override + String get stationIconLabel => 'ラジオ局アイコン'; + + @override + String get liveNow => 'ライブ'; + + @override + String equalizerBandLabel(Object band) { + return '$bandバンド'; + } + + @override + String equalizerBandValue(Object value) { + return '$value デシベル'; + } + + @override + String get equalizerPresetFlat => 'フラット'; + + @override + String get equalizerPresetRock => 'ロック'; + + @override + String get equalizerPresetPop => 'ポップ'; + + @override + String get equalizerPresetBassBoost => '低音ブースト'; + + @override + String get equalizerPresetJazz => 'ジャズ'; + + @override + String get equalizerPresetVoice => '音声'; + + @override + String get equalizerPresetCustom => 'カスタム'; + + @override + String get onboardingTitle => 'PluriWaveへようこそ'; + + @override + String get onboardingNewsTitle => '新機能'; + + @override + String get onboardingStartAction => '始める'; + + @override + String get onboardingCloseTooltip => '閉じる'; + + @override + String radioRecordingError(Object error) { + return 'ラジオの録音エラー: $error'; + } + + @override + String get radioApiConnectionError => 'ラジオAPIに接続できません'; + + @override + String get radioSearchError => '検索エラーです。接続を確認してください。'; + + @override + String get radioLoadMoreStationsError => 'これ以上ラジオ局を読み込めませんでした。'; + + @override + String get radioNearbyStationsError => '近くのラジオ局を検出できませんでした。国フィルターを使用してください。'; + + @override + String radioCannotPlayStation(Object stationName) { + return '\"$stationName\"を再生できません'; + } + + @override + String get recordingSelectStationFirst => '録音するにはまずラジオ局を選択してください。'; + + @override + String recordingStartError(Object error) { + return '録音を開始できませんでした: $error'; + } + + @override + String get unsupportedConfigVersion => 'サポートされていない設定バージョンです'; + + @override + String get audioErrorGeneric => '再生エラー'; + + @override + String get audioErrorNoInternet => 'インターネット接続がありません'; + + @override + String get audioErrorInvalidUrl => 'ラジオのURLが無効です'; + + @override + String get audioErrorNotFound => 'ラジオは利用できません(404エラー)'; + + @override + String get audioErrorTimeout => '接続がタイムアウトしました'; + + @override + String get audioErrorCannotConnect => 'ラジオに接続できません'; + + @override + String get audioErrorUnsupportedFormat => 'サポートされていないストリーム形式です'; + + @override + String get audioErrorDecode => '音声ストリームのデコード中にエラーが発生しました'; + + @override + String get audioErrorCleartext => 'このラジオは暗号化されていないHTTPを使用しているため、許可されていません'; + + @override + String get audioErrorSsl => 'ラジオのSSL証明書が無効です'; + + @override + String get audioErrorCannotPlay => 'このラジオは再生できません'; + + @override + String get audioErrorUnexpectedPlayback => '再生中に予期しないエラーが発生しました'; + + @override + String get androidExactAlarmScheduleError => + 'Androidで正確なアラームをスケジュールできませんでした。正確なアラームの権限を確認してください。'; + + @override + String get recordingPathEmptyError => '録音パスを空にすることはできません'; + + @override + String get recordingMaxSizeInvalidError => '最大サイズは0より大きくする必要があります'; + + @override + String get recordingAlreadyActiveError => 'すでに録音が進行中です'; + + @override + String get alarmRingingFallbackActive => '内部の安全な音声で再生しています。'; + + @override + String get alarmRingingPreparingFallback => '内部の安全な音声を準備しています。'; + + @override + String get alarmRingingTryingStation => '利用可能な最高音質で放送局の再生を試みています。'; + + @override + String alarmScheduleOnce(Object date) { + return '1回 · $date'; + } + + @override + String alarmScheduleWeekdays(Object days) { + return '曜日: $days'; + } + + @override + String get androidReliabilityTitle => 'Androidの信頼性を確認'; + + @override + String get closeAction => '閉じる'; + + @override + String get customOption => 'カスタム'; + + @override + String get endLabel => '終了'; + + @override + String get equalizerDisable => 'イコライザーを無効化'; + + @override + String get helpTitle => 'ヘルプとチュートリアル'; + + @override + String get helpSubtitle => 'PluriWaveの機能、ヒント、新着情報を確認できます。'; + + @override + String get indefiniteOption => '無期限'; + + @override + String get invalidNumber => '無効な数値'; + + @override + String get nameLabel => '名前'; + + @override + String get notPlaying => '再生していません'; + + @override + String get oneTimeOption => '1回'; + + @override + String get pausePlaybackTooltip => '再生を一時停止'; + + @override + String qualityOriginal(Object quality) { + return '元の音質: $quality'; + } + + @override + String get qualityUnknown => '音質情報なし'; + + @override + String get recordAction => '録音'; + + @override + String get recordDurationTitle => '録音時間'; + + @override + String get recordRadioSubtitle => '録音する時間を選んでください。'; + + @override + String get recordRadioTitle => 'ラジオを録音'; + + @override + String get recordingActiveTitle => 'ラジオを録音中'; + + @override + String get recordingDirectTitle => 'ダイレクト録音'; + + @override + String get recordingsOpenFolderPlainError => '録音フォルダーを開けませんでした'; + + @override + String get recordingsOpenLatest => '最新の録音を開く'; + + @override + String get recordingsOpenLatestError => '最新の録音を開けませんでした'; + + @override + String get startLabel => '開始'; + + @override + String get startPlaybackTooltip => '再生を開始'; + + @override + String get stopAction => '停止'; + + @override + String get stopPlaybackTooltip => '再生を停止'; + + @override + String get weekdayShortMonday => '月'; + + @override + String get weekdayShortTuesday => '火'; + + @override + String get weekdayShortWednesday => '水'; + + @override + String get weekdayShortThursday => '木'; + + @override + String get weekdayShortFriday => '金'; + + @override + String get weekdayShortSaturday => '土'; + + @override + String get weekdayShortSunday => '日'; } diff --git a/lib/l10n/gen/app_localizations_pt.dart b/lib/l10n/gen/app_localizations_pt.dart index f75303e..a202362 100644 --- a/lib/l10n/gen/app_localizations_pt.dart +++ b/lib/l10n/gen/app_localizations_pt.dart @@ -12,7 +12,7 @@ class AppLocalizationsPt extends AppLocalizations { String get appTitle => 'PluriWave'; @override - String get navHome => 'Home'; + String get navHome => 'Início'; @override String get navSearch => 'Buscar'; @@ -24,7 +24,7 @@ class AppLocalizationsPt extends AppLocalizations { String get navAlarms => 'Alarmes'; @override - String get navSettings => 'Settings'; + String get navSettings => 'Configurações'; @override String get actionOk => 'OK'; @@ -34,53 +34,77 @@ class AppLocalizationsPt extends AppLocalizations { @override String get sleepTimerDescription => - 'Smooth radio shutdown with an exact countdown.'; + 'Desligamento suave da rádio com contagem regressiva exata.'; @override - String get cancelTimer => 'Cancel timer'; + String get cancelTimer => 'Cancelar timer'; @override - String get optionOther => 'Other'; + String get optionOther => 'Outro'; @override - String get customDurationTitle => 'Custom duration'; + String get customDurationTitle => 'Duração personalizada'; @override - String get durationGreaterThanZero => 'Choose a duration greater than zero.'; + String get durationGreaterThanZero => 'Escolha uma duração maior que zero.'; @override - String get hoursLabel => 'Hours'; + String get hoursLabel => 'Horas'; @override - String get minutesLabel => 'Minutes'; + String get minutesLabel => 'Minutos'; @override - String get secondsLabel => 'Seconds'; + String get secondsLabel => 'Segundos'; @override - String get saveQuickAccess => 'Save as quick access'; - - @override - String get startTimer => 'Start timer'; - - @override - String skipCurrentAlarmExecution(Object alarmName) { - return 'Skipped this execution of $alarmName.'; + String durationHoursMinutesSeconds( + Object hours, + Object minutes, + Object seconds, + ) { + return '$hours h $minutes min $seconds s'; } @override - String get settingsTitle => 'Settings'; + String durationMinutesSeconds(Object minutes, Object seconds) { + return '$minutes min $seconds s'; + } + + @override + String durationMinutesOnly(Object minutes) { + return '$minutes min'; + } + + @override + String durationSecondsOnly(Object seconds) { + return '$seconds s'; + } + + @override + String get saveQuickAccess => 'Salvar como acesso rápido'; + + @override + String get startTimer => 'Iniciar timer'; + + @override + String skipCurrentAlarmExecution(Object alarmName) { + return 'Esta execução de $alarmName foi ignorada.'; + } + + @override + String get settingsTitle => 'Configurações'; @override String get settingsSubtitle => - 'Fine-grained sound control, backups, and custom stations.'; + 'Controle fino de som, backups e estações personalizadas.'; @override String get languageSectionTitle => 'Idioma'; @override String get languageSectionDescription => - 'Choose how the app language is displayed.'; + 'Escolha como o idioma do app é exibido.'; @override String get languageSystemDefault => 'Sistema'; @@ -89,7 +113,7 @@ class AppLocalizationsPt extends AppLocalizations { String get languageSpanish => 'Espanhol'; @override - String get languageEnglish => 'English'; + String get languageEnglish => 'Inglês'; @override String languageUpdated(Object languageName) { @@ -100,223 +124,228 @@ class AppLocalizationsPt extends AppLocalizations { String get languageUpdatedSystem => 'Idioma atualizado: Sistema'; @override - String get timerSectionTitle => 'Sleep timer'; + String get timerSectionTitle => 'Timer de sono'; @override - String get timerSectionAdd => 'Add'; + String get timerSectionAdd => 'Adicionar'; @override String get timerSectionDescription => - 'Customize the quick presets shown when automatically stopping the radio.'; + 'Personalize os acessos rápidos exibidos ao desligar a rádio automaticamente.'; @override - String get timerSectionRestoreRecommended => 'Restore recommended times'; + String get timerSectionRestoreRecommended => 'Restaurar tempos recomendados'; @override - String get newQuickAccessTitle => 'New quick access'; + String get newQuickAccessTitle => 'Novo acesso rápido'; @override - String get saveQuickAccessButton => 'Save quick access'; + String get saveQuickAccessButton => 'Salvar acesso rápido'; @override - String get settingsSafeStatus => 'Safe'; + String get settingsSafeStatus => 'Seguro'; @override - String get recordingsSectionTitle => 'Recordings'; + String get recordingsSectionTitle => 'Gravações'; @override - String get recordingsFolderDialogTitle => 'Select recordings folder'; + String get recordingsFolderDialogTitle => 'Selecione a pasta de gravações'; @override - String get recordingsPathUpdated => 'Recording path updated'; + String get recordingsPathUpdated => 'Caminho de gravação atualizado'; @override String recordingsPathSaveError(Object error) { - return 'Could not save the path: $error'; + return 'Não foi possível salvar o caminho: $error'; } @override String get recordingsDefaultFolderRestored => - 'The internal default folder will be used'; + 'A pasta interna padrão será usada'; @override - String get recordingsFolderTitle => 'Recordings folder'; + String get recordingsFolderTitle => 'Pasta de gravação'; @override - String get recordingsPathCalculating => 'Calculating path...'; + String get recordingsPathCalculating => 'Calculando caminho...'; @override - String get recordingsChangePath => 'Change path'; + String get recordingsChangePath => 'Alterar caminho'; @override - String get recordingsUseDefaultPath => 'Use default path'; + String get recordingsUseDefaultPath => 'Usar caminho padrão'; @override String get recordingsOriginalStreamHint => - 'The radio is saved from the original stream, without recompressing.'; + 'A rádio é salva a partir do stream original, sem recompressão.'; @override - String get equalizerActive => 'Active'; + String get equalizerActive => 'Ativo'; @override - String get equalizerDisabled => 'Disabled'; + String get equalizerDisabled => 'Desativado'; @override - String get equalizerEnable => 'Enable equalizer'; + String get equalizerEnable => 'Ativar equalizador'; @override String get equalizerRealtimeSubtitle => - 'Changes are applied in real time to the current station.'; + 'As alterações são aplicadas em tempo real à estação atual.'; @override String get equalizerPendingSubtitle => - 'Changes are saved and will apply when Android enables the effect.'; + 'As alterações são salvas e serão aplicadas quando o Android habilitar o efeito.'; @override - String get equalizerPerStationTitle => 'Use custom EQ for this favorite'; + String get equalizerPerStationTitle => 'Usar EQ próprio para este favorito'; @override String equalizerPerStationActive(Object stationName) { - return 'Active for $stationName'; + return 'Ativo para $stationName'; } @override String equalizerPerStationMain(Object stationName) { - return 'Using main EQ for $stationName'; + return 'Usando o EQ principal para $stationName'; } @override - String get preferredStationTitle => 'Preferred station'; + String get preferredStationTitle => 'Estação preferida'; @override String get preferredStationDescription => - 'Preselected for new alarms and available for quick playback.'; + 'Pré-selecionada ao criar alarmes e disponível para reprodução rápida.'; @override - String get preferredStationNoStationsTitle => 'No stations available yet'; + String get preferredStationNoStationsTitle => + 'Ainda não há estações disponíveis'; @override String get preferredStationNoStationsSubtitle => - 'Save favorites or load stations to choose a preferred one.'; + 'Salve favoritas ou carregue estações para escolher uma preferida.'; @override - String get preferredStationAutomaticFallback => 'Automatic fallback'; + String get preferredStationAutomaticFallback => 'Fallback automático'; @override - String get preferredStationDefaultFavorite => 'Default favorite'; + String get preferredStationDefaultFavorite => 'Favorita padrão'; @override String preferredStationCurrent(Object stationName) { - return 'Current preferred: $stationName'; + return 'Preferida atual: $stationName'; } @override String preferredStationAutoUsing(Object stationName) { - return 'No favorites: automatically using $stationName'; + return 'Sem favoritas: usando automaticamente $stationName'; } @override - String get preferredStationPlay => 'Play preferred'; + String get preferredStationPlay => 'Reproduzir preferida'; @override - String get customStationsTitle => 'Custom stations'; + String get customStationsTitle => 'Estações personalizadas'; @override - String get customStationsAdd => 'Add'; + String get customStationsAdd => 'Adicionar'; @override - String get customStationsEmpty => 'No custom stations.'; + String get customStationsEmpty => 'Não há estações personalizadas.'; @override - String get playAction => 'Play'; + String get playAction => 'Reproduzir'; @override - String get deleteAction => 'Delete'; + String get deleteAction => 'Excluir'; @override - String get addStationTitle => 'Add station'; + String get addStationTitle => 'Adicionar estação'; @override - String get stationNameLabel => 'Name *'; + String get stationNameLabel => 'Nome *'; @override - String get requiredField => 'Required field'; + String get unnamedStation => 'Estação sem nome'; @override - String get streamUrlLabel => 'Stream URL *'; + String get requiredField => 'Campo obrigatório'; @override - String get invalidUrl => 'Invalid URL'; + String get streamUrlLabel => 'URL do stream *'; @override - String get countryOptionalLabel => 'Country (optional)'; + String get invalidUrl => 'URL inválida'; @override - String get saveStation => 'Save station'; + String get countryOptionalLabel => 'País (opcional)'; + + @override + String get saveStation => 'Salvar estação'; @override String get backupSectionTitle => 'Backup'; @override - String get backupExportTitle => 'Export configuration'; + String get backupExportTitle => 'Exportar configuração'; @override String get backupExportSubtitle => - 'Favorites, custom stations, and EQ presets'; + 'Favoritos, estações personalizadas e presets de EQ'; @override - String get backupImportTitle => 'Import configuration'; + String get backupImportTitle => 'Importar configuração'; @override - String get backupImportSubtitle => 'Restore from a backup file'; + String get backupImportSubtitle => + 'Restaurar a partir de um arquivo de backup'; @override String get backupShareSubject => 'PluriWave — backup'; @override String backupShareText(Object date) { - return 'PluriWave configuration exported on $date'; + return 'Configuração do PluriWave exportada em $date'; } @override String backupExportError(Object error) { - return 'Export error: $error'; + return 'Erro ao exportar: $error'; } @override String get backupImportConfirmMessage => - 'This will add favorites, stations, and presets from the file. Continue?'; + 'Isso adicionará favoritos, estações e presets do arquivo. Continuar?'; @override - String get backupImportSuccess => 'Configuration imported successfully'; + String get backupImportSuccess => 'Configuração importada com sucesso'; @override String backupImportError(Object error) { - return 'Import error: $error'; + return 'Erro ao importar: $error'; } @override - String get appVersionLoading => 'Loading version...'; + String get appVersionLoading => 'Carregando versão...'; @override String appVersionSubtitle(Object version) { - return '$version - World radio'; + return '$version - Rádio mundial'; } @override - String get savedFavoritesTitle => 'Saved favorites'; + String get savedFavoritesTitle => 'Favoritos salvos'; @override - String get stationFilterTitle => 'Station filter'; + String get stationFilterTitle => 'Filtro de estações'; @override - String get stationFilterSubtitle => 'Only stations verified as active'; + String get stationFilterSubtitle => 'Apenas estações verificadas como ativas'; @override - String get backgroundAudioTitle => 'Background audio'; + String get backgroundAudioTitle => 'Áudio em segundo plano'; @override - String get backgroundAudioSubtitle => 'Continues when the screen turns off'; + String get backgroundAudioSubtitle => 'Continua ao desligar a tela'; @override String get dash => '—'; @@ -325,127 +354,844 @@ class AppLocalizationsPt extends AppLocalizations { String get cancelAction => 'Cancelar'; @override - String get equalizerTitle => 'Equalizer'; + String get equalizerTitle => 'Equalizador'; @override - String get recordingsOpenFolder => 'Open folder'; + String get recordingsOpenFolder => 'Abrir pasta'; @override String recordingsOpenFolderError(Object error) { - return 'Could not open the folder: $error'; + return 'Não foi possível abrir a pasta: $error'; } @override - String get recordingsMaxSizeTitle => 'Maximum recording size'; + String get recordingsMaxSizeTitle => 'Tamanho máximo da gravação'; @override String recordingsMaxSizeSubtitle(int size) { - return 'Current limit: $size MB'; + return 'Limite atual: $size MB'; } @override - String get recordingsMaxSizeDialogTitle => 'Maximum size per recording'; + String get recordingsMaxSizeDialogTitle => 'Tamanho máximo por gravação'; @override - String get recordingsMaxSizeMbLabel => 'Maximum megabytes'; + String get recordingsMaxSizeMbLabel => 'Megabytes máximos'; @override String recordingsMaxSizeSaved(int size) { - return 'Recording limit updated to $size MB'; + return 'Limite de gravação atualizado para $size MB'; } @override - String get stationOrderTitle => 'Station order'; + String get stationOrderTitle => 'Ordem das estações'; @override - String get stationOrderByName => 'By name'; + String get stationOrderByName => 'Por nome'; @override - String get stationOrderByQuality => 'By quality'; + String get stationOrderByQuality => 'Por qualidade'; @override String get stationOrderScopeDescription => - 'Applies to favorites, searches, nearby stations and quick lists.'; + 'Aplica-se a favoritos, buscas, estações próximas e listas rápidas.'; @override - String get favoriteGroupsTitle => 'Favorite lists'; + String get favoriteGroupsTitle => 'Listas de favoritos'; @override String get favoriteGroupsDescription => - 'Create short lists to organize your saved stations.'; + 'Crie listas curtas para organizar suas estações salvas.'; @override - String get favoriteGroupsAdd => 'Add list'; + String get favoriteGroupsAdd => 'Adicionar lista'; @override - String get favoriteGroupsEdit => 'Edit list'; + String get favoriteGroupsEdit => 'Editar lista'; @override - String get favoriteGroupsDelete => 'Delete list'; + String get favoriteGroupsDelete => 'Excluir lista'; @override - String get favoriteGroupsNameLabel => 'List name'; + String get favoriteGroupsNameLabel => 'Nome da lista'; @override - String get favoriteGroupsNameTooLong => 'Maximum 28 characters.'; + String get favoriteGroupsNameTooLong => 'Máximo de 28 caracteres.'; @override - String get favoriteGroupsUnassigned => 'Unassigned'; + String get favoriteGroupsUnassigned => 'Sem atribuição'; @override String get favoriteGroupsProtectedHint => - 'Default list: it cannot be edited or deleted.'; + 'Lista padrão: não pode ser editada nem excluída.'; @override - String get favoriteGroupsCreated => 'List created'; + String get favoriteGroupsCreated => 'Lista criada'; @override - String get favoriteGroupsUpdated => 'List updated'; + String get favoriteGroupsUpdated => 'Lista atualizada'; @override String get favoriteGroupsDeleted => - 'List deleted; its stations return to Unassigned.'; + 'Lista excluída; suas estações voltam para Sem atribuição.'; @override - String get favoriteGroupsAssign => 'Move to list'; + String get favoriteGroupsAssign => 'Mover para lista'; @override String favoriteGroupsAssignSubtitle(Object groupName) { - return 'Current list: $groupName'; + return 'Lista atual: $groupName'; } @override String favoriteGroupsAssigned(Object stationName, Object groupName) { - return '$stationName moved to $groupName'; + return '$stationName movida para $groupName'; } @override - String get favoritesTitle => 'Favorites'; + String get favoritesTitle => 'Favoritos'; @override - String get favoritesEmptyTitle => 'No favorites yet'; + String get favoritesEmptyTitle => 'Ainda sem favoritos'; @override String get favoritesEmptySubtitle => - 'Tap the heart on any station to save it to your collection.'; + 'Toque no coração em qualquer estação para salvá-la na sua coleção.'; @override String get favoritesHeaderSubtitle => - 'Organize your collection by lists and keep important radios close.'; + 'Organize sua coleção por listas e mantenha as rádios importantes por perto.'; @override - String get favoritesCollection => 'Collection'; + String get favoritesCollection => 'Coleção'; @override String favoritesSavedCount(int count) { - return '$count saved'; + return '$count salvas'; } @override - String get favoritesRemoveTooltip => 'Remove from favorites'; + String get favoritesRemoveTooltip => 'Remover dos favoritos'; @override String favoritesRemovedMessage(Object stationName) { - return '$stationName removed from favorites'; + return '$stationName removida dos favoritos'; } + + @override + String get alarmPostponedCurrentExecution => + 'Alarme adiado para esta execução.'; + + @override + String get searchScreenTitle => 'Buscar sinal'; + + @override + String get searchScreenSubtitle => + 'Encontre estações por nome, país ou idioma com filtros rápidos e contraste elevado.'; + + @override + String get searchFiltersLabel => 'Filtros'; + + @override + String get searchHint => 'Rádio Horizonte, jazz, notícias...'; + + @override + String get searchCountryFilterLabel => 'País'; + + @override + String get searchLanguageFilterLabel => 'Idioma'; + + @override + String get searchMinQualityFilterLabel => 'Qualidade mínima'; + + @override + String get searchEmptyTitle => 'Busque uma estação'; + + @override + String get searchNoResultsTitle => 'Sem resultados'; + + @override + String get searchEmptySubtitle => + 'Use a barra superior ou os chips para descobrir estações do mundo todo.'; + + @override + String get searchNoResultsSubtitle => + 'Tente remover filtros ou digitar outro nome para encontrar uma estação ativa.'; + + @override + String get countrySpain => 'Espanha'; + + @override + String get countryUsa => 'EUA'; + + @override + String get countryMexico => 'México'; + + @override + String get countryArgentina => 'Argentina'; + + @override + String get countryUk => 'Reino Unido'; + + @override + String get countryFrance => 'França'; + + @override + String get countryGermany => 'Alemanha'; + + @override + String get countryItaly => 'Itália'; + + @override + String get countryBrazil => 'Brasil'; + + @override + String get countryJapan => 'Japão'; + + @override + String get languageNameSpanish => 'espanhol'; + + @override + String get languageNameEnglish => 'inglês'; + + @override + String get languageNameFrench => 'francês'; + + @override + String get languageNameGerman => 'alemão'; + + @override + String get languageNamePortuguese => 'português'; + + @override + String get languageNameItalian => 'italiano'; + + @override + String get languageNameJapanese => 'japonês'; + + @override + String get languageNameArabic => 'árabe'; + + @override + String get languageNameRussian => 'russo'; + + @override + String get homeScreenSubtitle => + 'Rádio global ao vivo com sinais limpos, favoritos inteligentes e uma experiência visual de game show.'; + + @override + String get exploreStations => 'Explorar estações'; + + @override + String stationsCount(int count) { + return '$count rádios'; + } + + @override + String get qualityHd => 'Qualidade HD'; + + @override + String get nearYou => 'Perto de você'; + + @override + String nearYouInCountry(Object country) { + return 'Perto de você · $country'; + } + + @override + String get detectAction => 'Detectar'; + + @override + String get liveRadar => 'Radar ao vivo'; + + @override + String get genresTitle => 'Gêneros'; + + @override + String get retryAction => 'Tentar novamente'; + + @override + String get noStationsAvailable => 'Não há estações disponíveis'; + + @override + String get noStationsAvailableSubtitle => + 'Tente atualizar ou escolher outro gênero para captar sinal novamente.'; + + @override + String get genrePop => 'Pop'; + + @override + String get genreRock => 'Rock'; + + @override + String get genreJazz => 'Jazz'; + + @override + String get genreClassical => 'Clássica'; + + @override + String get genreElectronic => 'Eletrônica'; + + @override + String get genreNews => 'Notícias'; + + @override + String get genreTalk => 'Conversa'; + + @override + String get genreHipHop => 'Hip-hop'; + + @override + String get genreCountry => 'Country'; + + @override + String get genreMetal => 'Metal'; + + @override + String get genreReggae => 'Reggae'; + + @override + String get genreLatin => 'Latina'; + + @override + String get alarmScreenTitle => 'Despertar musical'; + + @override + String get alarmScreenSubtitle => + 'Alarmes com rádio, som seguro, férias inteligentes e próxima execução sempre visível.'; + + @override + String get createAlarmAction => 'Criar alarme'; + + @override + String alarmsCount(int count) { + return '$count alarmes'; + } + + @override + String get activeAlarmsWithoutNextTitle => + 'Alarmes ativos sem próxima execução'; + + @override + String get noActiveAlarms => 'Sem alarmes ativos'; + + @override + String get nextAlarmTitle => 'Próximo alarme'; + + @override + String activeAlarmsWithoutNextSubtitle(int count) { + return 'Há $count alarme(s) ativos, mas no momento não têm uma data futura válida. Verifique data, dias e férias.'; + } + + @override + String get createAlarmHint => + 'Crie um alarme e o PluriWave calculará automaticamente a próxima execução.'; + + @override + String get alarmVacationPlay => 'Toca durante as férias'; + + @override + String get alarmVacationPause => 'Pausa nas férias'; + + @override + String alarmFadeInLabel(int seconds) { + return 'Fade-in ${seconds}s'; + } + + @override + String alarmNextExecution(Object date) { + return 'Próxima execução: $date'; + } + + @override + String get alarmNoNextExecution => 'Não há próxima execução ativa.'; + + @override + String alarmSkippedExecution(Object date) { + return 'Uma execução foi ignorada: $date.'; + } + + @override + String get editAction => 'Editar'; + + @override + String get skipNextAction => 'Ignorar próxima'; + + @override + String get deleteTooltip => 'Excluir'; + + @override + String get alarmSkippedNoNextSnackbar => + 'Alarme ignorado. Não resta próxima execução.'; + + @override + String alarmSkippedReturnsSnackbar(Object date) { + return 'Alarme ignorado. Voltará em $date.'; + } + + @override + String alarmVacationPausedNoNext(Object vacationName) { + return 'Está pausado por férias ($vacationName) e sem próxima execução.'; + } + + @override + String alarmVacationPausedReturns(Object vacationName, Object date) { + return 'Está pausado por férias ($vacationName) e volta em $date.'; + } + + @override + String alarmVacationReturns(Object date) { + return 'Com férias ativas, tocará novamente em $date.'; + } + + @override + String get defaultAlarmName => 'Despertador musical'; + + @override + String get newAlarmTitle => 'Novo alarme'; + + @override + String get editAlarmTitle => 'Editar alarme'; + + @override + String get nameField => 'Nome'; + + @override + String get timeField => 'Hora'; + + @override + String get dateField => 'Data'; + + @override + String get onceOption => 'Uma vez'; + + @override + String get dailyOption => 'Diária'; + + @override + String get weekdaysOption => 'Dias'; + + @override + String get soundAndVolumeSection => 'Som e volume'; + + @override + String get alarmFadeInTitle => 'Fade-in do alarme'; + + @override + String get alarmFadeInOff => '0 s (sem transição)'; + + @override + String alarmFadeInSummary(int seconds) { + return '$seconds s (de 5% ao volume escolhido)'; + } + + @override + String get internalSafeSoundLabel => 'Som seguro interno'; + + @override + String get soundWarmSunrise => 'Amanhecer acolhedor'; + + @override + String get soundSoftBell => 'Sino suave'; + + @override + String get soundDigitalPulse => 'Pulso digital'; + + @override + String get favoriteStationLabel => 'Estação favorita'; + + @override + String get noStationUseInternalSound => 'Sem estação: usar som interno'; + + @override + String get saveFavoritesAlarmHint => + 'Salve estações nos Favoritos para usá-las como alarme musical.'; + + @override + String get useCurrentStationAction => 'Usar estação atual'; + + @override + String get playDuringVacations => 'Tocar durante as férias'; + + @override + String get playDuringVacationsHint => + 'Se você desativar, a próxima execução saltará para o primeiro dia válido.'; + + @override + String get saveAlarmAction => 'Salvar alarme'; + + @override + String get chooseOneWeekdayError => 'Escolha pelo menos um dia da semana.'; + + @override + String get androidReliabilityReview => 'Revisar confiabilidade Android'; + + @override + String get statusOk => 'OK'; + + @override + String get statusPending => 'pendente'; + + @override + String androidReliabilityStatus( + Object exact, + Object notifications, + Object screen, + ) { + return 'Confiabilidade: exatos $exact · notificações $notifications · tela $screen'; + } + + @override + String get vacationRangesTitle => 'Períodos de férias'; + + @override + String get addAction => 'Adicionar'; + + @override + String get vacationRangesHint => + 'Se um alarme tiver \"Pausa nas férias\", estes períodos serão ignorados automaticamente.'; + + @override + String get noVacationRangesLoaded => 'Nenhum período carregado.'; + + @override + String get deleteRangeTooltip => 'Excluir período'; + + @override + String get vacationsDefaultName => 'Férias'; + + @override + String get newVacationRangeTitle => 'Novo período de férias'; + + @override + String get startField => 'Início'; + + @override + String get endField => 'Fim'; + + @override + String get saveRangeAction => 'Salvar período'; + + @override + String get noAlarmsYetTitle => 'Ainda não há alarmes.'; + + @override + String get noAlarmsYetSubtitle => + 'Crie um para configurar seu despertar musical.'; + + @override + String get ringingInternalAudioActive => 'Tocando com som seguro interno.'; + + @override + String get ringingPreparingInternalAudio => 'Preparando som seguro interno.'; + + @override + String get stopAlarmAction => 'Parar alarme'; + + @override + String get pauseAction => 'Pausar'; + + @override + String miniPlayerOpenLabel(Object stationName) { + return 'Abrir reprodutor de $stationName'; + } + + @override + String get playerIconLabel => 'Reprodutor'; + + @override + String get playbackStatusConnecting => 'Conectando...'; + + @override + String get playbackStatusLive => 'Ao vivo'; + + @override + String get playbackStatusPaused => 'Pausado'; + + @override + String get playbackStatusConnectionError => 'Erro de conexão'; + + @override + String get playbackStatusStopped => 'Parado'; + + @override + String stationSemanticLabel(Object stationName) { + return 'Estação $stationName'; + } + + @override + String get favoritesAddTooltip => 'Adicionar aos favoritos'; + + @override + String favoritesAddedMessage(Object stationName) { + return '$stationName adicionada aos favoritos'; + } + + @override + String get stationIconLabel => 'Ícone da estação'; + + @override + String get liveNow => 'Ao vivo'; + + @override + String equalizerBandLabel(Object band) { + return 'Banda $band'; + } + + @override + String equalizerBandValue(Object value) { + return '$value decibéis'; + } + + @override + String get equalizerPresetFlat => 'Plano'; + + @override + String get equalizerPresetRock => 'Rock'; + + @override + String get equalizerPresetPop => 'Pop'; + + @override + String get equalizerPresetBassBoost => 'Reforço de graves'; + + @override + String get equalizerPresetJazz => 'Jazz'; + + @override + String get equalizerPresetVoice => 'Voz'; + + @override + String get equalizerPresetCustom => 'Personalizado'; + + @override + String get onboardingTitle => 'Bem-vindo ao PluriWave'; + + @override + String get onboardingNewsTitle => 'Novidades'; + + @override + String get onboardingStartAction => 'Começar'; + + @override + String get onboardingCloseTooltip => 'Fechar'; + + @override + String radioRecordingError(Object error) { + return 'Erro ao gravar a rádio: $error'; + } + + @override + String get radioApiConnectionError => 'Sem conexão com a API de rádio'; + + @override + String get radioSearchError => 'Erro na busca. Verifique sua conexão.'; + + @override + String get radioLoadMoreStationsError => + 'Não foi possível carregar mais estações.'; + + @override + String get radioNearbyStationsError => + 'Não foi possível detectar estações próximas. Use filtros por país.'; + + @override + String radioCannotPlayStation(Object stationName) { + return 'Não é possível reproduzir \"$stationName\"'; + } + + @override + String get recordingSelectStationFirst => + 'Primeiro selecione uma estação para gravar.'; + + @override + String recordingStartError(Object error) { + return 'Não foi possível iniciar a gravação: $error'; + } + + @override + String get unsupportedConfigVersion => + 'Versão de configuração não compatível'; + + @override + String get audioErrorGeneric => 'Erro de reprodução'; + + @override + String get audioErrorNoInternet => 'Sem conexão com a internet'; + + @override + String get audioErrorInvalidUrl => 'A URL da rádio não é válida'; + + @override + String get audioErrorNotFound => 'A rádio não está disponível (erro 404)'; + + @override + String get audioErrorTimeout => 'Tempo esgotado ao conectar'; + + @override + String get audioErrorCannotConnect => 'Não é possível conectar à rádio'; + + @override + String get audioErrorUnsupportedFormat => 'Formato de stream não compatível'; + + @override + String get audioErrorDecode => 'Erro ao decodificar o stream de áudio'; + + @override + String get audioErrorCleartext => + 'Esta rádio usa HTTP sem criptografia, o que não é permitido'; + + @override + String get audioErrorSsl => 'Certificado SSL inválido na rádio'; + + @override + String get audioErrorCannotPlay => 'Não é possível reproduzir esta rádio'; + + @override + String get audioErrorUnexpectedPlayback => 'Erro inesperado ao reproduzir'; + + @override + String get androidExactAlarmScheduleError => + 'O Android não conseguiu agendar um alarme exato. Verifique a permissão de alarmes exatos.'; + + @override + String get recordingPathEmptyError => + 'O caminho de gravação não pode estar vazio'; + + @override + String get recordingMaxSizeInvalidError => + 'O tamanho máximo deve ser maior que zero'; + + @override + String get recordingAlreadyActiveError => 'Já há uma gravação em andamento'; + + @override + String get alarmRingingFallbackActive => 'Tocando com áudio interno seguro.'; + + @override + String get alarmRingingPreparingFallback => + 'Preparando áudio interno seguro.'; + + @override + String get alarmRingingTryingStation => + 'Tentando reproduzir sua estação com a maior qualidade disponível.'; + + @override + String alarmScheduleOnce(Object date) { + return 'Uma vez · $date'; + } + + @override + String alarmScheduleWeekdays(Object days) { + return 'Dias: $days'; + } + + @override + String get androidReliabilityTitle => 'Revisar confiabilidade Android'; + + @override + String get closeAction => 'Fechar'; + + @override + String get customOption => 'Personalizada'; + + @override + String get endLabel => 'Fim'; + + @override + String get equalizerDisable => 'Desativar equalizador'; + + @override + String get helpTitle => 'Ajuda e tutorial'; + + @override + String get helpSubtitle => 'Revê funções, dicas e novidades do PluriWave.'; + + @override + String get indefiniteOption => 'Indefinida'; + + @override + String get invalidNumber => 'Número inválido'; + + @override + String get nameLabel => 'Nome'; + + @override + String get notPlaying => 'Não está reproduzindo'; + + @override + String get oneTimeOption => 'Uma vez'; + + @override + String get pausePlaybackTooltip => 'Pausar reprodução'; + + @override + String qualityOriginal(Object quality) { + return 'Qualidade original: $quality'; + } + + @override + String get qualityUnknown => 'Qualidade não informada'; + + @override + String get recordAction => 'Gravar'; + + @override + String get recordDurationTitle => 'Duração da gravação'; + + @override + String get recordRadioSubtitle => 'Escolha por quanto tempo deseja gravar.'; + + @override + String get recordRadioTitle => 'Gravar rádio'; + + @override + String get recordingActiveTitle => 'Gravando rádio'; + + @override + String get recordingDirectTitle => 'Gravação direta'; + + @override + String get recordingsOpenFolderPlainError => + 'Não foi possível abrir a pasta de gravações'; + + @override + String get recordingsOpenLatest => 'Abrir última gravação'; + + @override + String get recordingsOpenLatestError => + 'Não foi possível abrir a última gravação'; + + @override + String get startLabel => 'Início'; + + @override + String get startPlaybackTooltip => 'Iniciar reprodução'; + + @override + String get stopAction => 'Parar'; + + @override + String get stopPlaybackTooltip => 'Parar reprodução'; + + @override + String get weekdayShortMonday => 'Seg'; + + @override + String get weekdayShortTuesday => 'Ter'; + + @override + String get weekdayShortWednesday => 'Qua'; + + @override + String get weekdayShortThursday => 'Qui'; + + @override + String get weekdayShortFriday => 'Sex'; + + @override + String get weekdayShortSaturday => 'Sáb'; + + @override + String get weekdayShortSunday => 'Dom'; } diff --git a/lib/l10n/gen/app_localizations_ru.dart b/lib/l10n/gen/app_localizations_ru.dart index cc1ba1d..cdb309d 100644 --- a/lib/l10n/gen/app_localizations_ru.dart +++ b/lib/l10n/gen/app_localizations_ru.dart @@ -12,440 +12,1189 @@ class AppLocalizationsRu extends AppLocalizations { String get appTitle => 'PluriWave'; @override - String get navHome => 'Home'; + String get navHome => 'Главная'; @override - String get navSearch => 'Search'; + String get navSearch => 'Поиск'; @override - String get navFavorites => 'Favorites'; + String get navFavorites => 'Избранное'; @override - String get navAlarms => 'Alarms'; + String get navAlarms => 'Будильники'; @override - String get navSettings => 'Settings'; + String get navSettings => 'Настройки'; @override - String get actionOk => 'OK'; + String get actionOk => 'ОК'; @override - String get sleepTimer => 'Sleep timer'; + String get sleepTimer => 'Таймер сна'; @override String get sleepTimerDescription => - 'Smooth radio shutdown with an exact countdown.'; + 'Плавное выключение радио с точным обратным отсчётом.'; @override - String get cancelTimer => 'Cancel timer'; + String get cancelTimer => 'Отменить таймер'; @override - String get optionOther => 'Other'; + String get optionOther => 'Другое'; @override - String get customDurationTitle => 'Custom duration'; + String get customDurationTitle => 'Своя длительность'; @override - String get durationGreaterThanZero => 'Choose a duration greater than zero.'; + String get durationGreaterThanZero => 'Выберите длительность больше нуля.'; @override - String get hoursLabel => 'Hours'; + String get hoursLabel => 'Часы'; @override - String get minutesLabel => 'Minutes'; + String get minutesLabel => 'Минуты'; @override - String get secondsLabel => 'Seconds'; + String get secondsLabel => 'Секунды'; @override - String get saveQuickAccess => 'Save as quick access'; + String durationHoursMinutesSeconds( + Object hours, + Object minutes, + Object seconds, + ) { + return '$hours ? $minutes ??? $seconds ?'; + } @override - String get startTimer => 'Start timer'; + String durationMinutesSeconds(Object minutes, Object seconds) { + return '$minutes ??? $seconds ?'; + } + + @override + String durationMinutesOnly(Object minutes) { + return '$minutes ???'; + } + + @override + String durationSecondsOnly(Object seconds) { + return '$seconds ?'; + } + + @override + String get saveQuickAccess => 'Сохранить как быстрый доступ'; + + @override + String get startTimer => 'Запустить таймер'; @override String skipCurrentAlarmExecution(Object alarmName) { - return 'Skipped this execution of $alarmName.'; + return 'Этот запуск $alarmName пропущен.'; } @override - String get settingsTitle => 'Settings'; + String get settingsTitle => 'Настройки'; @override String get settingsSubtitle => - 'Fine-grained sound control, backups, and custom stations.'; + 'Точная настройка звука, резервных копий и пользовательских станций.'; @override - String get languageSectionTitle => 'Language'; + String get languageSectionTitle => 'Язык'; @override String get languageSectionDescription => - 'Choose how the app language is displayed.'; + 'Выберите, как отображается язык приложения.'; @override - String get languageSystemDefault => 'System'; + String get languageSystemDefault => 'Система'; @override - String get languageSpanish => 'Spanish'; + String get languageSpanish => 'Испанский'; @override - String get languageEnglish => 'English'; + String get languageEnglish => 'Английский'; @override String languageUpdated(Object languageName) { - return 'Language updated: $languageName'; + return 'Язык обновлён: $languageName'; } @override - String get languageUpdatedSystem => 'Language updated: System'; + String get languageUpdatedSystem => 'Язык обновлён: система'; @override - String get timerSectionTitle => 'Sleep timer'; + String get timerSectionTitle => 'Таймер сна'; @override - String get timerSectionAdd => 'Add'; + String get timerSectionAdd => 'Добавить'; @override String get timerSectionDescription => - 'Customize the quick presets shown when automatically stopping the radio.'; + 'Настройте быстрые пресеты, которые появляются при автоматическом выключении радио.'; @override - String get timerSectionRestoreRecommended => 'Restore recommended times'; + String get timerSectionRestoreRecommended => + 'Восстановить рекомендуемое время'; @override - String get newQuickAccessTitle => 'New quick access'; + String get newQuickAccessTitle => 'Новый быстрый доступ'; @override - String get saveQuickAccessButton => 'Save quick access'; + String get saveQuickAccessButton => 'Сохранить быстрый доступ'; @override - String get settingsSafeStatus => 'Safe'; + String get settingsSafeStatus => 'Безопасно'; @override - String get recordingsSectionTitle => 'Recordings'; + String get recordingsSectionTitle => 'Записи'; @override - String get recordingsFolderDialogTitle => 'Select recordings folder'; + String get recordingsFolderDialogTitle => 'Выберите папку для записей'; @override - String get recordingsPathUpdated => 'Recording path updated'; + String get recordingsPathUpdated => 'Путь записи обновлён'; @override String recordingsPathSaveError(Object error) { - return 'Could not save the path: $error'; + return 'Не удалось сохранить путь: $error'; } @override String get recordingsDefaultFolderRestored => - 'The internal default folder will be used'; + 'Будет использована внутренняя папка по умолчанию'; @override - String get recordingsFolderTitle => 'Recordings folder'; + String get recordingsFolderTitle => 'Папка записей'; @override - String get recordingsPathCalculating => 'Calculating path...'; + String get recordingsPathCalculating => 'Вычисление пути...'; @override - String get recordingsChangePath => 'Change path'; + String get recordingsChangePath => 'Изменить путь'; @override - String get recordingsUseDefaultPath => 'Use default path'; + String get recordingsUseDefaultPath => 'Использовать путь по умолчанию'; @override String get recordingsOriginalStreamHint => - 'The radio is saved from the original stream, without recompressing.'; + 'Радио сохраняется из исходного потока без повторного сжатия.'; @override - String get equalizerActive => 'Active'; + String get equalizerActive => 'Активно'; @override - String get equalizerDisabled => 'Disabled'; + String get equalizerDisabled => 'Отключено'; @override - String get equalizerEnable => 'Enable equalizer'; + String get equalizerEnable => 'Включить эквалайзер'; @override String get equalizerRealtimeSubtitle => - 'Changes are applied in real time to the current station.'; + 'Изменения применяются к текущей станции в реальном времени.'; @override String get equalizerPendingSubtitle => - 'Changes are saved and will apply when Android enables the effect.'; + 'Изменения сохраняются и применятся, когда Android включит эффект.'; @override - String get equalizerPerStationTitle => 'Use custom EQ for this favorite'; + String get equalizerPerStationTitle => + 'Использовать свой EQ для этого избранного'; @override String equalizerPerStationActive(Object stationName) { - return 'Active for $stationName'; + return 'Активно для $stationName'; } @override String equalizerPerStationMain(Object stationName) { - return 'Using main EQ for $stationName'; + return 'Используется основной EQ для $stationName'; } @override - String get preferredStationTitle => 'Preferred station'; + String get preferredStationTitle => 'Предпочитаемая станция'; @override String get preferredStationDescription => - 'Preselected for new alarms and available for quick playback.'; + 'Предварительно выбирается при создании будильников и доступна для быстрого воспроизведения.'; @override - String get preferredStationNoStationsTitle => 'No stations available yet'; + String get preferredStationNoStationsTitle => 'Пока нет доступных станций'; @override String get preferredStationNoStationsSubtitle => - 'Save favorites or load stations to choose a preferred one.'; + 'Сохраните избранные или загрузите станции, чтобы выбрать предпочитаемую.'; @override - String get preferredStationAutomaticFallback => 'Automatic fallback'; + String get preferredStationAutomaticFallback => 'Автоматический резерв'; @override - String get preferredStationDefaultFavorite => 'Default favorite'; + String get preferredStationDefaultFavorite => 'Избранное по умолчанию'; @override String preferredStationCurrent(Object stationName) { - return 'Current preferred: $stationName'; + return 'Текущая предпочитаемая: $stationName'; } @override String preferredStationAutoUsing(Object stationName) { - return 'No favorites: automatically using $stationName'; + return 'Нет избранных: автоматически используется $stationName'; } @override - String get preferredStationPlay => 'Play preferred'; + String get preferredStationPlay => 'Воспроизвести предпочитаемую'; @override - String get customStationsTitle => 'Custom stations'; + String get customStationsTitle => 'Пользовательские станции'; @override - String get customStationsAdd => 'Add'; + String get customStationsAdd => 'Добавить'; @override - String get customStationsEmpty => 'No custom stations.'; + String get customStationsEmpty => 'Пользовательских станций нет.'; @override - String get playAction => 'Play'; + String get playAction => 'Воспроизвести'; @override - String get deleteAction => 'Delete'; + String get deleteAction => 'Удалить'; @override - String get addStationTitle => 'Add station'; + String get addStationTitle => 'Добавить станцию'; @override - String get stationNameLabel => 'Name *'; + String get stationNameLabel => 'Название *'; @override - String get requiredField => 'Required field'; + String get unnamedStation => 'Станция без названия'; @override - String get streamUrlLabel => 'Stream URL *'; + String get requiredField => 'Обязательное поле'; @override - String get invalidUrl => 'Invalid URL'; + String get streamUrlLabel => 'URL потока *'; @override - String get countryOptionalLabel => 'Country (optional)'; + String get invalidUrl => 'Недопустимый URL'; @override - String get saveStation => 'Save station'; + String get countryOptionalLabel => 'Страна (необязательно)'; @override - String get backupSectionTitle => 'Backup'; + String get saveStation => 'Сохранить станцию'; @override - String get backupExportTitle => 'Export configuration'; + String get backupSectionTitle => 'Резервная копия'; + + @override + String get backupExportTitle => 'Экспортировать настройки'; @override String get backupExportSubtitle => - 'Favorites, custom stations, and EQ presets'; + 'Избранное, пользовательские станции и пресеты EQ'; @override - String get backupImportTitle => 'Import configuration'; + String get backupImportTitle => 'Импортировать настройки'; @override - String get backupImportSubtitle => 'Restore from a backup file'; + String get backupImportSubtitle => 'Восстановить из файла резервной копии'; @override - String get backupShareSubject => 'PluriWave — backup'; + String get backupShareSubject => 'PluriWave — резервная копия'; @override String backupShareText(Object date) { - return 'PluriWave configuration exported on $date'; + return 'Настройки PluriWave, экспортированные $date'; } @override String backupExportError(Object error) { - return 'Export error: $error'; + return 'Ошибка при экспорте: $error'; } @override String get backupImportConfirmMessage => - 'This will add favorites, stations, and presets from the file. Continue?'; + 'Это добавит избранное, станции и пресеты из файла. Продолжить?'; @override - String get backupImportSuccess => 'Configuration imported successfully'; + String get backupImportSuccess => 'Настройки успешно импортированы'; @override String backupImportError(Object error) { - return 'Import error: $error'; + return 'Ошибка при импорте: $error'; } @override - String get appVersionLoading => 'Loading version...'; + String get appVersionLoading => 'Загрузка версии...'; @override String appVersionSubtitle(Object version) { - return '$version - World radio'; + return '$version — мировое радио'; } @override - String get savedFavoritesTitle => 'Saved favorites'; + String get savedFavoritesTitle => 'Сохранённое избранное'; @override - String get stationFilterTitle => 'Station filter'; + String get stationFilterTitle => 'Фильтр станций'; @override - String get stationFilterSubtitle => 'Only stations verified as active'; + String get stationFilterSubtitle => + 'Только станции, подтверждённые как активные'; @override - String get backgroundAudioTitle => 'Background audio'; + String get backgroundAudioTitle => 'Фоновое аудио'; @override - String get backgroundAudioSubtitle => 'Continues when the screen turns off'; + String get backgroundAudioSubtitle => 'Продолжается при выключенном экране'; @override String get dash => '—'; @override - String get cancelAction => 'Cancel'; + String get cancelAction => 'Отмена'; @override - String get equalizerTitle => 'Equalizer'; + String get equalizerTitle => 'Эквалайзер'; @override - String get recordingsOpenFolder => 'Open folder'; + String get recordingsOpenFolder => 'Открыть папку'; @override String recordingsOpenFolderError(Object error) { - return 'Could not open the folder: $error'; + return 'Не удалось открыть папку: $error'; } @override - String get recordingsMaxSizeTitle => 'Maximum recording size'; + String get recordingsMaxSizeTitle => 'Максимальный размер записи'; @override String recordingsMaxSizeSubtitle(int size) { - return 'Current limit: $size MB'; + return 'Текущий лимит: $size МБ'; } @override - String get recordingsMaxSizeDialogTitle => 'Maximum size per recording'; + String get recordingsMaxSizeDialogTitle => 'Максимальный размер одной записи'; @override - String get recordingsMaxSizeMbLabel => 'Maximum megabytes'; + String get recordingsMaxSizeMbLabel => 'Максимум мегабайт'; @override String recordingsMaxSizeSaved(int size) { - return 'Recording limit updated to $size MB'; + return 'Лимит записи обновлён до $size МБ'; } @override - String get stationOrderTitle => 'Station order'; + String get stationOrderTitle => 'Порядок станций'; @override - String get stationOrderByName => 'By name'; + String get stationOrderByName => 'По названию'; @override - String get stationOrderByQuality => 'By quality'; + String get stationOrderByQuality => 'По качеству'; @override String get stationOrderScopeDescription => - 'Applies to favorites, searches, nearby stations and quick lists.'; + 'Применяется к избранному, поиску, ближайшим станциям и быстрым спискам.'; @override - String get favoriteGroupsTitle => 'Favorite lists'; + String get favoriteGroupsTitle => 'Списки избранного'; @override String get favoriteGroupsDescription => - 'Create short lists to organize your saved stations.'; + 'Создавайте короткие списки, чтобы упорядочить сохранённые станции.'; @override - String get favoriteGroupsAdd => 'Add list'; + String get favoriteGroupsAdd => 'Добавить список'; @override - String get favoriteGroupsEdit => 'Edit list'; + String get favoriteGroupsEdit => 'Изменить список'; @override - String get favoriteGroupsDelete => 'Delete list'; + String get favoriteGroupsDelete => 'Удалить список'; @override - String get favoriteGroupsNameLabel => 'List name'; + String get favoriteGroupsNameLabel => 'Название списка'; @override - String get favoriteGroupsNameTooLong => 'Maximum 28 characters.'; + String get favoriteGroupsNameTooLong => 'Максимум 28 символов.'; @override - String get favoriteGroupsUnassigned => 'Unassigned'; + String get favoriteGroupsUnassigned => 'Без списка'; @override String get favoriteGroupsProtectedHint => - 'Default list: it cannot be edited or deleted.'; + 'Список по умолчанию: нельзя изменить или удалить.'; @override - String get favoriteGroupsCreated => 'List created'; + String get favoriteGroupsCreated => 'Список создан'; @override - String get favoriteGroupsUpdated => 'List updated'; + String get favoriteGroupsUpdated => 'Список обновлён'; @override String get favoriteGroupsDeleted => - 'List deleted; its stations return to Unassigned.'; + 'Список удалён; его станции вернулись в «Без списка».'; @override - String get favoriteGroupsAssign => 'Move to list'; + String get favoriteGroupsAssign => 'Переместить в список'; @override String favoriteGroupsAssignSubtitle(Object groupName) { - return 'Current list: $groupName'; + return 'Текущий список: $groupName'; } @override String favoriteGroupsAssigned(Object stationName, Object groupName) { - return '$stationName moved to $groupName'; + return '$stationName перемещена в $groupName'; } @override - String get favoritesTitle => 'Favorites'; + String get favoritesTitle => 'Избранное'; @override - String get favoritesEmptyTitle => 'No favorites yet'; + String get favoritesEmptyTitle => 'Избранного пока нет'; @override String get favoritesEmptySubtitle => - 'Tap the heart on any station to save it to your collection.'; + 'Нажмите на сердце у любой станции, чтобы сохранить её в коллекцию.'; @override String get favoritesHeaderSubtitle => - 'Organize your collection by lists and keep important radios close.'; + 'Организуйте коллекцию по спискам и держите важные радио под рукой.'; @override - String get favoritesCollection => 'Collection'; + String get favoritesCollection => 'Коллекция'; @override String favoritesSavedCount(int count) { - return '$count saved'; + return '$count сохранено'; } @override - String get favoritesRemoveTooltip => 'Remove from favorites'; + String get favoritesRemoveTooltip => 'Удалить из избранного'; @override String favoritesRemovedMessage(Object stationName) { - return '$stationName removed from favorites'; + return '$stationName удалена из избранного'; } + + @override + String get alarmPostponedCurrentExecution => + 'Будильник отложен для этого запуска.'; + + @override + String get searchScreenTitle => 'Поиск сигнала'; + + @override + String get searchScreenSubtitle => + 'Находите радио по названию, стране или языку с быстрыми фильтрами и высокой контрастностью.'; + + @override + String get searchFiltersLabel => 'Фильтры'; + + @override + String get searchHint => 'Радио Горизонт, джаз, новости...'; + + @override + String get searchCountryFilterLabel => 'Страна'; + + @override + String get searchLanguageFilterLabel => 'Язык'; + + @override + String get searchMinQualityFilterLabel => 'Минимальное качество'; + + @override + String get searchEmptyTitle => 'Найдите станцию'; + + @override + String get searchNoResultsTitle => 'Нет результатов'; + + @override + String get searchEmptySubtitle => + 'Используйте верхнюю строку или чипы, чтобы находить сигналы со всего мира.'; + + @override + String get searchNoResultsSubtitle => + 'Попробуйте убрать фильтры или ввести другое название, чтобы найти активный сигнал.'; + + @override + String get countrySpain => 'Испания'; + + @override + String get countryUsa => 'США'; + + @override + String get countryMexico => 'Мексика'; + + @override + String get countryArgentina => 'Аргентина'; + + @override + String get countryUk => 'Великобритания'; + + @override + String get countryFrance => 'Франция'; + + @override + String get countryGermany => 'Германия'; + + @override + String get countryItaly => 'Италия'; + + @override + String get countryBrazil => 'Бразилия'; + + @override + String get countryJapan => 'Япония'; + + @override + String get languageNameSpanish => 'испанский'; + + @override + String get languageNameEnglish => 'английский'; + + @override + String get languageNameFrench => 'французский'; + + @override + String get languageNameGerman => 'немецкий'; + + @override + String get languageNamePortuguese => 'португальский'; + + @override + String get languageNameItalian => 'итальянский'; + + @override + String get languageNameJapanese => 'японский'; + + @override + String get languageNameArabic => 'арабский'; + + @override + String get languageNameRussian => 'русский'; + + @override + String get homeScreenSubtitle => + 'Глобальное радио в прямом эфире с чистыми сигналами, умным избранным и визуальным стилем телевикторины.'; + + @override + String get exploreStations => 'Изучить станции'; + + @override + String stationsCount(int count) { + return '$count радиостанций'; + } + + @override + String get qualityHd => 'HD-качество'; + + @override + String get nearYou => 'Рядом с вами'; + + @override + String nearYouInCountry(Object country) { + return 'Рядом с вами · $country'; + } + + @override + String get detectAction => 'Определить'; + + @override + String get liveRadar => 'Радар в эфире'; + + @override + String get genresTitle => 'Жанры'; + + @override + String get retryAction => 'Повторить'; + + @override + String get noStationsAvailable => 'Нет доступных станций'; + + @override + String get noStationsAvailableSubtitle => + 'Попробуйте обновить или выбрать другой жанр, чтобы снова поймать сигнал.'; + + @override + String get genrePop => 'Поп'; + + @override + String get genreRock => 'Рок'; + + @override + String get genreJazz => 'Джаз'; + + @override + String get genreClassical => 'Классика'; + + @override + String get genreElectronic => 'Электронная'; + + @override + String get genreNews => 'Новости'; + + @override + String get genreTalk => 'Разговорные'; + + @override + String get genreHipHop => 'Хип-хоп'; + + @override + String get genreCountry => 'Кантри'; + + @override + String get genreMetal => 'Метал'; + + @override + String get genreReggae => 'Регги'; + + @override + String get genreLatin => 'Латинская'; + + @override + String get alarmScreenTitle => 'Музыкальное пробуждение'; + + @override + String get alarmScreenSubtitle => + 'Будильники с радио, безопасным звуком, умными отпусками и всегда видимым следующим запуском.'; + + @override + String get createAlarmAction => 'Создать будильник'; + + @override + String alarmsCount(int count) { + return '$count будильников'; + } + + @override + String get activeAlarmsWithoutNextTitle => + 'Активные будильники без следующего запуска'; + + @override + String get noActiveAlarms => 'Нет активных будильников'; + + @override + String get nextAlarmTitle => 'Следующий будильник'; + + @override + String activeAlarmsWithoutNextSubtitle(int count) { + return 'Есть $count активных будильников, но сейчас у них нет допустимой будущей даты. Проверьте дату, дни и отпуска.'; + } + + @override + String get createAlarmHint => + 'Создайте будильник, и PluriWave автоматически рассчитает следующий запуск.'; + + @override + String get alarmVacationPlay => 'Звонит в отпуске'; + + @override + String get alarmVacationPause => 'Пауза в отпуске'; + + @override + String alarmFadeInLabel(int seconds) { + return 'Плавное усиление $secondsс'; + } + + @override + String alarmNextExecution(Object date) { + return 'Следующий запуск: $date'; + } + + @override + String get alarmNoNextExecution => 'Нет активного следующего запуска.'; + + @override + String alarmSkippedExecution(Object date) { + return 'Один запуск был пропущен: $date.'; + } + + @override + String get editAction => 'Изменить'; + + @override + String get skipNextAction => 'Пропустить следующий'; + + @override + String get deleteTooltip => 'Удалить'; + + @override + String get alarmSkippedNoNextSnackbar => + 'Будильник пропущен. Следующего запуска нет.'; + + @override + String alarmSkippedReturnsSnackbar(Object date) { + return 'Будильник пропущен. Вернётся $date.'; + } + + @override + String alarmVacationPausedNoNext(Object vacationName) { + return 'Приостановлен из-за отпуска ($vacationName) и без следующего запуска.'; + } + + @override + String alarmVacationPausedReturns(Object vacationName, Object date) { + return 'Приостановлен из-за отпуска ($vacationName) и вернётся $date.'; + } + + @override + String alarmVacationReturns(Object date) { + return 'С активным отпуском снова прозвучит $date.'; + } + + @override + String get defaultAlarmName => 'Музыкальный будильник'; + + @override + String get newAlarmTitle => 'Новый будильник'; + + @override + String get editAlarmTitle => 'Изменить будильник'; + + @override + String get nameField => 'Название'; + + @override + String get timeField => 'Время'; + + @override + String get dateField => 'Дата'; + + @override + String get onceOption => 'Один раз'; + + @override + String get dailyOption => 'Ежедневно'; + + @override + String get weekdaysOption => 'Дни'; + + @override + String get soundAndVolumeSection => 'Звук и громкость'; + + @override + String get alarmFadeInTitle => 'Плавное усиление будильника'; + + @override + String get alarmFadeInOff => '0 с (без перехода)'; + + @override + String alarmFadeInSummary(int seconds) { + return '$seconds с (с 5% до выбранной громкости)'; + } + + @override + String get internalSafeSoundLabel => 'Безопасный внутренний звук'; + + @override + String get soundWarmSunrise => 'Тёплый рассвет'; + + @override + String get soundSoftBell => 'Мягкий колокольчик'; + + @override + String get soundDigitalPulse => 'Цифровой импульс'; + + @override + String get favoriteStationLabel => 'Избранная станция'; + + @override + String get noStationUseInternalSound => + 'Без станции: использовать внутренний звук'; + + @override + String get saveFavoritesAlarmHint => + 'Сохраните станции в избранное, чтобы использовать их как музыкальный будильник.'; + + @override + String get useCurrentStationAction => 'Использовать текущую станцию'; + + @override + String get playDuringVacations => 'Звонить во время отпусков'; + + @override + String get playDuringVacationsHint => + 'Если выключить, следующий запуск перейдёт на первый допустимый день.'; + + @override + String get saveAlarmAction => 'Сохранить будильник'; + + @override + String get chooseOneWeekdayError => 'Выберите хотя бы один день недели.'; + + @override + String get androidReliabilityReview => 'Проверить надёжность Android'; + + @override + String get statusOk => 'ОК'; + + @override + String get statusPending => 'ожидает'; + + @override + String androidReliabilityStatus( + Object exact, + Object notifications, + Object screen, + ) { + return 'Надёжность: точные $exact · уведомления $notifications · экран $screen'; + } + + @override + String get vacationRangesTitle => 'Периоды отпусков'; + + @override + String get addAction => 'Добавить'; + + @override + String get vacationRangesHint => + 'Если у будильника включена «Пауза в отпуске», эти периоды будут автоматически пропущены.'; + + @override + String get noVacationRangesLoaded => 'Периоды не загружены.'; + + @override + String get deleteRangeTooltip => 'Удалить период'; + + @override + String get vacationsDefaultName => 'Отпуск'; + + @override + String get newVacationRangeTitle => 'Новый период отпуска'; + + @override + String get startField => 'Начало'; + + @override + String get endField => 'Конец'; + + @override + String get saveRangeAction => 'Сохранить период'; + + @override + String get noAlarmsYetTitle => 'Будильников пока нет.'; + + @override + String get noAlarmsYetSubtitle => + 'Создайте один, чтобы настроить своё музыкальное пробуждение.'; + + @override + String get ringingInternalAudioActive => + 'Звонит с безопасным внутренним звуком.'; + + @override + String get ringingPreparingInternalAudio => + 'Подготовка безопасного внутреннего звука.'; + + @override + String get stopAlarmAction => 'Остановить будильник'; + + @override + String get pauseAction => 'Пауза'; + + @override + String miniPlayerOpenLabel(Object stationName) { + return 'Открыть плеер для $stationName'; + } + + @override + String get playerIconLabel => 'Плеер'; + + @override + String get playbackStatusConnecting => 'Подключение...'; + + @override + String get playbackStatusLive => 'В эфире'; + + @override + String get playbackStatusPaused => 'Приостановлено'; + + @override + String get playbackStatusConnectionError => 'Ошибка подключения'; + + @override + String get playbackStatusStopped => 'Остановлено'; + + @override + String stationSemanticLabel(Object stationName) { + return 'Станция $stationName'; + } + + @override + String get favoritesAddTooltip => 'Добавить в избранное'; + + @override + String favoritesAddedMessage(Object stationName) { + return '$stationName добавлена в избранное'; + } + + @override + String get stationIconLabel => 'Значок станции'; + + @override + String get liveNow => 'В эфире'; + + @override + String equalizerBandLabel(Object band) { + return 'Полоса $band'; + } + + @override + String equalizerBandValue(Object value) { + return '$value дБ'; + } + + @override + String get equalizerPresetFlat => 'Плоский'; + + @override + String get equalizerPresetRock => 'Рок'; + + @override + String get equalizerPresetPop => 'Поп'; + + @override + String get equalizerPresetBassBoost => 'Усиление басов'; + + @override + String get equalizerPresetJazz => 'Джаз'; + + @override + String get equalizerPresetVoice => 'Голос'; + + @override + String get equalizerPresetCustom => 'Пользовательский'; + + @override + String get onboardingTitle => 'Добро пожаловать в PluriWave'; + + @override + String get onboardingNewsTitle => 'Что нового'; + + @override + String get onboardingStartAction => 'Начать'; + + @override + String get onboardingCloseTooltip => 'Закрыть'; + + @override + String radioRecordingError(Object error) { + return 'Ошибка записи радио: $error'; + } + + @override + String get radioApiConnectionError => 'Нет подключения к API радио'; + + @override + String get radioSearchError => 'Ошибка поиска. Проверьте подключение.'; + + @override + String get radioLoadMoreStationsError => + 'Не удалось загрузить больше станций.'; + + @override + String get radioNearbyStationsError => + 'Не удалось обнаружить ближайшие станции. Используйте фильтры по стране.'; + + @override + String radioCannotPlayStation(Object stationName) { + return 'Невозможно воспроизвести \"$stationName\"'; + } + + @override + String get recordingSelectStationFirst => + 'Сначала выберите станцию для записи.'; + + @override + String recordingStartError(Object error) { + return 'Не удалось начать запись: $error'; + } + + @override + String get unsupportedConfigVersion => 'Неподдерживаемая версия конфигурации'; + + @override + String get audioErrorGeneric => 'Ошибка воспроизведения'; + + @override + String get audioErrorNoInternet => 'Нет подключения к интернету'; + + @override + String get audioErrorInvalidUrl => 'URL радио недействителен'; + + @override + String get audioErrorNotFound => 'Радио недоступно (ошибка 404)'; + + @override + String get audioErrorTimeout => 'Время ожидания подключения истекло'; + + @override + String get audioErrorCannotConnect => 'Не удалось подключиться к радио'; + + @override + String get audioErrorUnsupportedFormat => 'Неподдерживаемый формат потока'; + + @override + String get audioErrorDecode => 'Ошибка декодирования аудиопотока'; + + @override + String get audioErrorCleartext => + 'Это радио использует незашифрованный HTTP, что не разрешено'; + + @override + String get audioErrorSsl => 'Недействительный SSL-сертификат у радио'; + + @override + String get audioErrorCannotPlay => 'Это радио невозможно воспроизвести'; + + @override + String get audioErrorUnexpectedPlayback => + 'Неожиданная ошибка воспроизведения'; + + @override + String get androidExactAlarmScheduleError => + 'Android не смог запланировать точный будильник. Проверьте разрешение для точных будильников.'; + + @override + String get recordingPathEmptyError => 'Путь записи не может быть пустым'; + + @override + String get recordingMaxSizeInvalidError => + 'Максимальный размер должен быть больше нуля'; + + @override + String get recordingAlreadyActiveError => 'Запись уже выполняется'; + + @override + String get alarmRingingFallbackActive => + 'Воспроизведение с внутренним безопасным аудио.'; + + @override + String get alarmRingingPreparingFallback => + 'Подготавливается внутреннее безопасное аудио.'; + + @override + String get alarmRingingTryingStation => + 'Пытаемся воспроизвести вашу станцию в максимально доступном качестве.'; + + @override + String alarmScheduleOnce(Object date) { + return 'Один раз · $date'; + } + + @override + String alarmScheduleWeekdays(Object days) { + return 'Дни: $days'; + } + + @override + String get androidReliabilityTitle => 'Проверить надёжность Android'; + + @override + String get closeAction => 'Закрыть'; + + @override + String get customOption => 'Своя'; + + @override + String get endLabel => 'Конец'; + + @override + String get equalizerDisable => 'Отключить эквалайзер'; + + @override + String get helpTitle => 'Помощь и руководство'; + + @override + String get helpSubtitle => 'Посмотрите функции, советы и новости PluriWave.'; + + @override + String get indefiniteOption => 'Без ограничения'; + + @override + String get invalidNumber => 'Недопустимое число'; + + @override + String get nameLabel => 'Название'; + + @override + String get notPlaying => 'Не воспроизводится'; + + @override + String get oneTimeOption => 'Один раз'; + + @override + String get pausePlaybackTooltip => 'Пауза'; + + @override + String qualityOriginal(Object quality) { + return 'Исходное качество: $quality'; + } + + @override + String get qualityUnknown => 'Качество не указано'; + + @override + String get recordAction => 'Записать'; + + @override + String get recordDurationTitle => 'Длительность записи'; + + @override + String get recordRadioSubtitle => 'Выберите длительность записи.'; + + @override + String get recordRadioTitle => 'Записать радио'; + + @override + String get recordingActiveTitle => 'Запись радио'; + + @override + String get recordingDirectTitle => 'Прямая запись'; + + @override + String get recordingsOpenFolderPlainError => + 'Не удалось открыть папку записей'; + + @override + String get recordingsOpenLatest => 'Открыть последнюю запись'; + + @override + String get recordingsOpenLatestError => 'Не удалось открыть последнюю запись'; + + @override + String get startLabel => 'Начало'; + + @override + String get startPlaybackTooltip => 'Начать воспроизведение'; + + @override + String get stopAction => 'Остановить'; + + @override + String get stopPlaybackTooltip => 'Остановить воспроизведение'; + + @override + String get weekdayShortMonday => 'Пн'; + + @override + String get weekdayShortTuesday => 'Вт'; + + @override + String get weekdayShortWednesday => 'Ср'; + + @override + String get weekdayShortThursday => 'Чт'; + + @override + String get weekdayShortFriday => 'Пт'; + + @override + String get weekdayShortSaturday => 'Сб'; + + @override + String get weekdayShortSunday => 'Вс'; } diff --git a/lib/l10n/gen/app_localizations_zh.dart b/lib/l10n/gen/app_localizations_zh.dart index fae7535..5acc588 100644 --- a/lib/l10n/gen/app_localizations_zh.dart +++ b/lib/l10n/gen/app_localizations_zh.dart @@ -12,440 +12,1140 @@ class AppLocalizationsZh extends AppLocalizations { String get appTitle => 'PluriWave'; @override - String get navHome => 'Home'; + String get navHome => '首页'; @override - String get navSearch => 'Search'; + String get navSearch => '搜索'; @override - String get navFavorites => 'Favorites'; + String get navFavorites => '收藏'; @override - String get navAlarms => 'Alarms'; + String get navAlarms => '闹钟'; @override - String get navSettings => 'Settings'; + String get navSettings => '设置'; @override - String get actionOk => 'OK'; + String get actionOk => '确定'; @override - String get sleepTimer => 'Sleep timer'; + String get sleepTimer => '睡眠定时器'; @override - String get sleepTimerDescription => - 'Smooth radio shutdown with an exact countdown.'; + String get sleepTimerDescription => '通过精准倒计时平滑关闭电台。'; @override - String get cancelTimer => 'Cancel timer'; + String get cancelTimer => '取消定时器'; @override - String get optionOther => 'Other'; + String get optionOther => '其他'; @override - String get customDurationTitle => 'Custom duration'; + String get customDurationTitle => '自定义时长'; @override - String get durationGreaterThanZero => 'Choose a duration greater than zero.'; + String get durationGreaterThanZero => '请选择大于零的时长。'; @override - String get hoursLabel => 'Hours'; + String get hoursLabel => '小时'; @override - String get minutesLabel => 'Minutes'; + String get minutesLabel => '分钟'; @override - String get secondsLabel => 'Seconds'; + String get secondsLabel => '秒'; @override - String get saveQuickAccess => 'Save as quick access'; + String durationHoursMinutesSeconds( + Object hours, + Object minutes, + Object seconds, + ) { + return '$hours ?? $minutes ? $seconds ?'; + } @override - String get startTimer => 'Start timer'; + String durationMinutesSeconds(Object minutes, Object seconds) { + return '$minutes ? $seconds ?'; + } + + @override + String durationMinutesOnly(Object minutes) { + return '$minutes ?'; + } + + @override + String durationSecondsOnly(Object seconds) { + return '$seconds ?'; + } + + @override + String get saveQuickAccess => '保存为快捷入口'; + + @override + String get startTimer => '启动定时器'; @override String skipCurrentAlarmExecution(Object alarmName) { - return 'Skipped this execution of $alarmName.'; + return '已跳过 $alarmName 本次执行。'; } @override - String get settingsTitle => 'Settings'; + String get settingsTitle => '设置'; @override - String get settingsSubtitle => - 'Fine-grained sound control, backups, and custom stations.'; + String get settingsSubtitle => '精细控制声音、备份和自定义电台。'; @override - String get languageSectionTitle => 'Language'; + String get languageSectionTitle => '语言'; @override - String get languageSectionDescription => - 'Choose how the app language is displayed.'; + String get languageSectionDescription => '选择应用语言的显示方式。'; @override - String get languageSystemDefault => 'System'; + String get languageSystemDefault => '系统'; @override - String get languageSpanish => 'Spanish'; + String get languageSpanish => '西班牙语'; @override - String get languageEnglish => 'English'; + String get languageEnglish => '英语'; @override String languageUpdated(Object languageName) { - return 'Language updated: $languageName'; + return '语言已更新:$languageName'; } @override - String get languageUpdatedSystem => 'Language updated: System'; + String get languageUpdatedSystem => '语言已更新:系统'; @override - String get timerSectionTitle => 'Sleep timer'; + String get timerSectionTitle => '睡眠定时器'; @override - String get timerSectionAdd => 'Add'; + String get timerSectionAdd => '添加'; @override - String get timerSectionDescription => - 'Customize the quick presets shown when automatically stopping the radio.'; + String get timerSectionDescription => '自定义自动关闭电台时显示的快捷预设。'; @override - String get timerSectionRestoreRecommended => 'Restore recommended times'; + String get timerSectionRestoreRecommended => '恢复推荐时长'; @override - String get newQuickAccessTitle => 'New quick access'; + String get newQuickAccessTitle => '新的快捷入口'; @override - String get saveQuickAccessButton => 'Save quick access'; + String get saveQuickAccessButton => '保存快捷入口'; @override - String get settingsSafeStatus => 'Safe'; + String get settingsSafeStatus => '安全'; @override - String get recordingsSectionTitle => 'Recordings'; + String get recordingsSectionTitle => '录音'; @override - String get recordingsFolderDialogTitle => 'Select recordings folder'; + String get recordingsFolderDialogTitle => '选择录音文件夹'; @override - String get recordingsPathUpdated => 'Recording path updated'; + String get recordingsPathUpdated => '录音路径已更新'; @override String recordingsPathSaveError(Object error) { - return 'Could not save the path: $error'; + return '无法保存路径:$error'; } @override - String get recordingsDefaultFolderRestored => - 'The internal default folder will be used'; + String get recordingsDefaultFolderRestored => '将使用默认内部文件夹'; @override - String get recordingsFolderTitle => 'Recordings folder'; + String get recordingsFolderTitle => '录音文件夹'; @override - String get recordingsPathCalculating => 'Calculating path...'; + String get recordingsPathCalculating => '正在计算路径...'; @override - String get recordingsChangePath => 'Change path'; + String get recordingsChangePath => '更改路径'; @override - String get recordingsUseDefaultPath => 'Use default path'; + String get recordingsUseDefaultPath => '使用默认路径'; @override - String get recordingsOriginalStreamHint => - 'The radio is saved from the original stream, without recompressing.'; + String get recordingsOriginalStreamHint => '电台将从原始音频流保存,不重新编码。'; @override - String get equalizerActive => 'Active'; + String get equalizerActive => '已启用'; @override - String get equalizerDisabled => 'Disabled'; + String get equalizerDisabled => '已停用'; @override - String get equalizerEnable => 'Enable equalizer'; + String get equalizerEnable => '启用均衡器'; @override - String get equalizerRealtimeSubtitle => - 'Changes are applied in real time to the current station.'; + String get equalizerRealtimeSubtitle => '更改会实时应用到当前电台。'; @override - String get equalizerPendingSubtitle => - 'Changes are saved and will apply when Android enables the effect.'; + String get equalizerPendingSubtitle => '更改已保存,并会在 Android 启用该效果后应用。'; @override - String get equalizerPerStationTitle => 'Use custom EQ for this favorite'; + String get equalizerPerStationTitle => '为此收藏使用专属均衡器'; @override String equalizerPerStationActive(Object stationName) { - return 'Active for $stationName'; + return '已为 $stationName 启用'; } @override String equalizerPerStationMain(Object stationName) { - return 'Using main EQ for $stationName'; + return '正在为 $stationName 使用主均衡器'; } @override - String get preferredStationTitle => 'Preferred station'; + String get preferredStationTitle => '首选电台'; @override - String get preferredStationDescription => - 'Preselected for new alarms and available for quick playback.'; + String get preferredStationDescription => '创建闹钟时会预先选择,也可用于快速播放。'; @override - String get preferredStationNoStationsTitle => 'No stations available yet'; + String get preferredStationNoStationsTitle => '暂时没有可用电台'; @override - String get preferredStationNoStationsSubtitle => - 'Save favorites or load stations to choose a preferred one.'; + String get preferredStationNoStationsSubtitle => '请先收藏或加载电台,再选择首选电台。'; @override - String get preferredStationAutomaticFallback => 'Automatic fallback'; + String get preferredStationAutomaticFallback => '自动后备'; @override - String get preferredStationDefaultFavorite => 'Default favorite'; + String get preferredStationDefaultFavorite => '默认收藏'; @override String preferredStationCurrent(Object stationName) { - return 'Current preferred: $stationName'; + return '当前首选:$stationName'; } @override String preferredStationAutoUsing(Object stationName) { - return 'No favorites: automatically using $stationName'; + return '没有收藏:自动使用 $stationName'; } @override - String get preferredStationPlay => 'Play preferred'; + String get preferredStationPlay => '播放首选电台'; @override - String get customStationsTitle => 'Custom stations'; + String get customStationsTitle => '自定义电台'; @override - String get customStationsAdd => 'Add'; + String get customStationsAdd => '添加'; @override - String get customStationsEmpty => 'No custom stations.'; + String get customStationsEmpty => '没有自定义电台。'; @override - String get playAction => 'Play'; + String get playAction => '播放'; @override - String get deleteAction => 'Delete'; + String get deleteAction => '删除'; @override - String get addStationTitle => 'Add station'; + String get addStationTitle => '添加电台'; @override - String get stationNameLabel => 'Name *'; + String get stationNameLabel => '名称 *'; @override - String get requiredField => 'Required field'; + String get unnamedStation => '未命名电台'; @override - String get streamUrlLabel => 'Stream URL *'; + String get requiredField => '必填字段'; @override - String get invalidUrl => 'Invalid URL'; + String get streamUrlLabel => '音频流 URL *'; @override - String get countryOptionalLabel => 'Country (optional)'; + String get invalidUrl => 'URL 无效'; @override - String get saveStation => 'Save station'; + String get countryOptionalLabel => '国家/地区(可选)'; @override - String get backupSectionTitle => 'Backup'; + String get saveStation => '保存电台'; @override - String get backupExportTitle => 'Export configuration'; + String get backupSectionTitle => '备份'; @override - String get backupExportSubtitle => - 'Favorites, custom stations, and EQ presets'; + String get backupExportTitle => '导出配置'; @override - String get backupImportTitle => 'Import configuration'; + String get backupExportSubtitle => '收藏、自定义电台和均衡器预设'; @override - String get backupImportSubtitle => 'Restore from a backup file'; + String get backupImportTitle => '导入配置'; @override - String get backupShareSubject => 'PluriWave — backup'; + String get backupImportSubtitle => '从备份文件恢复'; + + @override + String get backupShareSubject => 'PluriWave — 备份'; @override String backupShareText(Object date) { - return 'PluriWave configuration exported on $date'; + return 'PluriWave 配置已于 $date 导出'; } @override String backupExportError(Object error) { - return 'Export error: $error'; + return '导出错误:$error'; } @override - String get backupImportConfirmMessage => - 'This will add favorites, stations, and presets from the file. Continue?'; + String get backupImportConfirmMessage => '这会添加文件中的收藏、电台和预设。要继续吗?'; @override - String get backupImportSuccess => 'Configuration imported successfully'; + String get backupImportSuccess => '配置已成功导入'; @override String backupImportError(Object error) { - return 'Import error: $error'; + return '导入错误:$error'; } @override - String get appVersionLoading => 'Loading version...'; + String get appVersionLoading => '正在加载版本...'; @override String appVersionSubtitle(Object version) { - return '$version - World radio'; + return '$version - 全球电台'; } @override - String get savedFavoritesTitle => 'Saved favorites'; + String get savedFavoritesTitle => '已保存的收藏'; @override - String get stationFilterTitle => 'Station filter'; + String get stationFilterTitle => '电台筛选'; @override - String get stationFilterSubtitle => 'Only stations verified as active'; + String get stationFilterSubtitle => '仅显示已验证为活跃的电台'; @override - String get backgroundAudioTitle => 'Background audio'; + String get backgroundAudioTitle => '后台音频'; @override - String get backgroundAudioSubtitle => 'Continues when the screen turns off'; + String get backgroundAudioSubtitle => '屏幕关闭后继续播放'; @override String get dash => '—'; @override - String get cancelAction => 'Cancel'; + String get cancelAction => '取消'; @override - String get equalizerTitle => 'Equalizer'; + String get equalizerTitle => '均衡器'; @override - String get recordingsOpenFolder => 'Open folder'; + String get recordingsOpenFolder => '打开文件夹'; @override String recordingsOpenFolderError(Object error) { - return 'Could not open the folder: $error'; + return '无法打开文件夹:$error'; } @override - String get recordingsMaxSizeTitle => 'Maximum recording size'; + String get recordingsMaxSizeTitle => '最大录音大小'; @override String recordingsMaxSizeSubtitle(int size) { - return 'Current limit: $size MB'; + return '当前限制:$size MB'; } @override - String get recordingsMaxSizeDialogTitle => 'Maximum size per recording'; + String get recordingsMaxSizeDialogTitle => '每段录音的最大大小'; @override - String get recordingsMaxSizeMbLabel => 'Maximum megabytes'; + String get recordingsMaxSizeMbLabel => '最大兆字节数'; @override String recordingsMaxSizeSaved(int size) { - return 'Recording limit updated to $size MB'; + return '录音限制已更新为 $size MB'; } @override - String get stationOrderTitle => 'Station order'; + String get stationOrderTitle => '电台排序'; @override - String get stationOrderByName => 'By name'; + String get stationOrderByName => '按名称'; @override - String get stationOrderByQuality => 'By quality'; + String get stationOrderByQuality => '按质量'; @override - String get stationOrderScopeDescription => - 'Applies to favorites, searches, nearby stations and quick lists.'; + String get stationOrderScopeDescription => '适用于收藏、搜索、附近电台和快捷列表。'; @override - String get favoriteGroupsTitle => 'Favorite lists'; + String get favoriteGroupsTitle => '收藏列表'; @override - String get favoriteGroupsDescription => - 'Create short lists to organize your saved stations.'; + String get favoriteGroupsDescription => '创建短列表来整理已保存的电台。'; @override - String get favoriteGroupsAdd => 'Add list'; + String get favoriteGroupsAdd => '添加列表'; @override - String get favoriteGroupsEdit => 'Edit list'; + String get favoriteGroupsEdit => '编辑列表'; @override - String get favoriteGroupsDelete => 'Delete list'; + String get favoriteGroupsDelete => '删除列表'; @override - String get favoriteGroupsNameLabel => 'List name'; + String get favoriteGroupsNameLabel => '列表名称'; @override - String get favoriteGroupsNameTooLong => 'Maximum 28 characters.'; + String get favoriteGroupsNameTooLong => '最多 28 个字符。'; @override - String get favoriteGroupsUnassigned => 'Unassigned'; + String get favoriteGroupsUnassigned => '未分配'; @override - String get favoriteGroupsProtectedHint => - 'Default list: it cannot be edited or deleted.'; + String get favoriteGroupsProtectedHint => '默认列表:不能编辑或删除。'; @override - String get favoriteGroupsCreated => 'List created'; + String get favoriteGroupsCreated => '列表已创建'; @override - String get favoriteGroupsUpdated => 'List updated'; + String get favoriteGroupsUpdated => '列表已更新'; @override - String get favoriteGroupsDeleted => - 'List deleted; its stations return to Unassigned.'; + String get favoriteGroupsDeleted => '列表已删除;其中的电台已回到未分配。'; @override - String get favoriteGroupsAssign => 'Move to list'; + String get favoriteGroupsAssign => '移动到列表'; @override String favoriteGroupsAssignSubtitle(Object groupName) { - return 'Current list: $groupName'; + return '当前列表:$groupName'; } @override String favoriteGroupsAssigned(Object stationName, Object groupName) { - return '$stationName moved to $groupName'; + return '$stationName 已移动到 $groupName'; } @override - String get favoritesTitle => 'Favorites'; + String get favoritesTitle => '收藏'; @override - String get favoritesEmptyTitle => 'No favorites yet'; + String get favoritesEmptyTitle => '还没有收藏'; @override - String get favoritesEmptySubtitle => - 'Tap the heart on any station to save it to your collection.'; + String get favoritesEmptySubtitle => '点按任意电台上的爱心,将它保存到你的收藏。'; @override - String get favoritesHeaderSubtitle => - 'Organize your collection by lists and keep important radios close.'; + String get favoritesHeaderSubtitle => '按列表整理你的收藏,把重要电台放在手边。'; @override - String get favoritesCollection => 'Collection'; + String get favoritesCollection => '收藏集'; @override String favoritesSavedCount(int count) { - return '$count saved'; + return '已保存 $count 个'; } @override - String get favoritesRemoveTooltip => 'Remove from favorites'; + String get favoritesRemoveTooltip => '从收藏中移除'; @override String favoritesRemovedMessage(Object stationName) { - return '$stationName removed from favorites'; + return '$stationName 已从收藏中移除'; } + + @override + String get alarmPostponedCurrentExecution => '本次闹钟已推迟。'; + + @override + String get searchScreenTitle => '搜索信号'; + + @override + String get searchScreenSubtitle => '按名称、国家/地区或语言查找电台,支持快速筛选和高对比度显示。'; + + @override + String get searchFiltersLabel => '筛选'; + + @override + String get searchHint => '地平线电台、爵士、新闻...'; + + @override + String get searchCountryFilterLabel => '国家/地区'; + + @override + String get searchLanguageFilterLabel => '语言'; + + @override + String get searchMinQualityFilterLabel => '最低质量'; + + @override + String get searchEmptyTitle => '搜索电台'; + + @override + String get searchNoResultsTitle => '没有结果'; + + @override + String get searchEmptySubtitle => '使用顶部搜索栏或筛选标签,发现世界各地的电台信号。'; + + @override + String get searchNoResultsSubtitle => '尝试减少筛选条件,或换个名称搜索,找到正在播出的电台。'; + + @override + String get countrySpain => '西班牙'; + + @override + String get countryUsa => '美国'; + + @override + String get countryMexico => '墨西哥'; + + @override + String get countryArgentina => '阿根廷'; + + @override + String get countryUk => '英国'; + + @override + String get countryFrance => '法国'; + + @override + String get countryGermany => '德国'; + + @override + String get countryItaly => '意大利'; + + @override + String get countryBrazil => '巴西'; + + @override + String get countryJapan => '日本'; + + @override + String get languageNameSpanish => '西班牙语'; + + @override + String get languageNameEnglish => '英语'; + + @override + String get languageNameFrench => '法语'; + + @override + String get languageNameGerman => '德语'; + + @override + String get languageNamePortuguese => '葡萄牙语'; + + @override + String get languageNameItalian => '意大利语'; + + @override + String get languageNameJapanese => '日语'; + + @override + String get languageNameArabic => '阿拉伯语'; + + @override + String get languageNameRussian => '俄语'; + + @override + String get homeScreenSubtitle => '全球直播电台,清晰信号、智能收藏和竞赛风格的视觉体验。'; + + @override + String get exploreStations => '探索电台'; + + @override + String stationsCount(int count) { + return '$count 个电台'; + } + + @override + String get qualityHd => '高清音质'; + + @override + String get nearYou => '你附近'; + + @override + String nearYouInCountry(Object country) { + return '你附近 · $country'; + } + + @override + String get detectAction => '检测'; + + @override + String get liveRadar => '直播雷达'; + + @override + String get genresTitle => '类型'; + + @override + String get retryAction => '重试'; + + @override + String get noStationsAvailable => '没有可用电台'; + + @override + String get noStationsAvailableSubtitle => '尝试刷新或选择其他类型,重新捕捉信号。'; + + @override + String get genrePop => '流行'; + + @override + String get genreRock => '摇滚'; + + @override + String get genreJazz => '爵士'; + + @override + String get genreClassical => '古典'; + + @override + String get genreElectronic => '电子'; + + @override + String get genreNews => '新闻'; + + @override + String get genreTalk => '谈话'; + + @override + String get genreHipHop => '嘻哈'; + + @override + String get genreCountry => '乡村'; + + @override + String get genreMetal => '金属'; + + @override + String get genreReggae => '雷鬼'; + + @override + String get genreLatin => '拉丁'; + + @override + String get alarmScreenTitle => '音乐唤醒'; + + @override + String get alarmScreenSubtitle => '带电台、安全声音、智能假期和始终可见下次执行时间的闹钟。'; + + @override + String get createAlarmAction => '创建闹钟'; + + @override + String alarmsCount(int count) { + return '$count 个闹钟'; + } + + @override + String get activeAlarmsWithoutNextTitle => '没有下次执行时间的活跃闹钟'; + + @override + String get noActiveAlarms => '没有活跃闹钟'; + + @override + String get nextAlarmTitle => '下一个闹钟'; + + @override + String activeAlarmsWithoutNextSubtitle(int count) { + return '有 $count 个活跃闹钟,但现在没有有效的未来日期。请检查日期、星期和假期。'; + } + + @override + String get createAlarmHint => '创建闹钟后,PluriWave 会自动计算下次执行时间。'; + + @override + String get alarmVacationPlay => '假期时响铃'; + + @override + String get alarmVacationPause => '假期时暂停'; + + @override + String alarmFadeInLabel(int seconds) { + return '渐入 ${seconds}s'; + } + + @override + String alarmNextExecution(Object date) { + return '下次执行:$date'; + } + + @override + String get alarmNoNextExecution => '没有活跃的下次执行。'; + + @override + String alarmSkippedExecution(Object date) { + return '已跳过一次执行:$date。'; + } + + @override + String get editAction => '编辑'; + + @override + String get skipNextAction => '跳过下一个'; + + @override + String get deleteTooltip => '删除'; + + @override + String get alarmSkippedNoNextSnackbar => '已跳过闹钟。没有剩余的下次执行。'; + + @override + String alarmSkippedReturnsSnackbar(Object date) { + return '已跳过闹钟。将于 $date 恢复。'; + } + + @override + String alarmVacationPausedNoNext(Object vacationName) { + return '因假期($vacationName)暂停,且没有下次执行。'; + } + + @override + String alarmVacationPausedReturns(Object vacationName, Object date) { + return '因假期($vacationName)暂停,将于 $date 恢复。'; + } + + @override + String alarmVacationReturns(Object date) { + return '假期启用时,将于 $date 再次响铃。'; + } + + @override + String get defaultAlarmName => '音乐闹钟'; + + @override + String get newAlarmTitle => '新闹钟'; + + @override + String get editAlarmTitle => '编辑闹钟'; + + @override + String get nameField => '名称'; + + @override + String get timeField => '时间'; + + @override + String get dateField => '日期'; + + @override + String get onceOption => '一次'; + + @override + String get dailyOption => '每天'; + + @override + String get weekdaysOption => '星期'; + + @override + String get soundAndVolumeSection => '声音和音量'; + + @override + String get alarmFadeInTitle => '闹钟渐入'; + + @override + String get alarmFadeInOff => '0 s(无过渡)'; + + @override + String alarmFadeInSummary(int seconds) { + return '$seconds s(从 5% 到所选音量)'; + } + + @override + String get internalSafeSoundLabel => '内部安全声音'; + + @override + String get soundWarmSunrise => '温暖日出'; + + @override + String get soundSoftBell => '柔和铃声'; + + @override + String get soundDigitalPulse => '数字脉冲'; + + @override + String get favoriteStationLabel => '收藏电台'; + + @override + String get noStationUseInternalSound => '无电台:使用内部声音'; + + @override + String get saveFavoritesAlarmHint => '将电台保存到收藏,即可把它们用作音乐闹钟。'; + + @override + String get useCurrentStationAction => '使用当前电台'; + + @override + String get playDuringVacations => '假期期间响铃'; + + @override + String get playDuringVacationsHint => '如果关闭,下次执行会跳到第一个有效日期。'; + + @override + String get saveAlarmAction => '保存闹钟'; + + @override + String get chooseOneWeekdayError => '请至少选择一周中的一天。'; + + @override + String get androidReliabilityReview => '检查 Android 可靠性'; + + @override + String get statusOk => '正常'; + + @override + String get statusPending => '待处理'; + + @override + String androidReliabilityStatus( + Object exact, + Object notifications, + Object screen, + ) { + return '可靠性:精确闹钟 $exact · 通知 $notifications · 屏幕 $screen'; + } + + @override + String get vacationRangesTitle => '假期范围'; + + @override + String get addAction => '添加'; + + @override + String get vacationRangesHint => '如果闹钟设置为“假期时暂停”,会自动跳过这些范围。'; + + @override + String get noVacationRangesLoaded => '未加载范围。'; + + @override + String get deleteRangeTooltip => '删除范围'; + + @override + String get vacationsDefaultName => '假期'; + + @override + String get newVacationRangeTitle => '新的假期范围'; + + @override + String get startField => '开始'; + + @override + String get endField => '结束'; + + @override + String get saveRangeAction => '保存范围'; + + @override + String get noAlarmsYetTitle => '还没有闹钟。'; + + @override + String get noAlarmsYetSubtitle => '创建一个,设计你的音乐唤醒。'; + + @override + String get ringingInternalAudioActive => '正在使用内部安全音频响铃。'; + + @override + String get ringingPreparingInternalAudio => '正在准备内部安全音频。'; + + @override + String get stopAlarmAction => '停止闹钟'; + + @override + String get pauseAction => '暂停'; + + @override + String miniPlayerOpenLabel(Object stationName) { + return '打开 $stationName 的播放器'; + } + + @override + String get playerIconLabel => '播放器'; + + @override + String get playbackStatusConnecting => '正在连接...'; + + @override + String get playbackStatusLive => '直播中'; + + @override + String get playbackStatusPaused => '已暂停'; + + @override + String get playbackStatusConnectionError => '连接错误'; + + @override + String get playbackStatusStopped => '已停止'; + + @override + String stationSemanticLabel(Object stationName) { + return '电台 $stationName'; + } + + @override + String get favoritesAddTooltip => '添加到收藏'; + + @override + String favoritesAddedMessage(Object stationName) { + return '已将 $stationName 添加到收藏'; + } + + @override + String get stationIconLabel => '电台图标'; + + @override + String get liveNow => '直播中'; + + @override + String equalizerBandLabel(Object band) { + return '$band 频段'; + } + + @override + String equalizerBandValue(Object value) { + return '$value 分贝'; + } + + @override + String get equalizerPresetFlat => '平直'; + + @override + String get equalizerPresetRock => '摇滚'; + + @override + String get equalizerPresetPop => '流行'; + + @override + String get equalizerPresetBassBoost => '低音增强'; + + @override + String get equalizerPresetJazz => '爵士'; + + @override + String get equalizerPresetVoice => '人声'; + + @override + String get equalizerPresetCustom => '自定义'; + + @override + String get onboardingTitle => '欢迎使用 PluriWave'; + + @override + String get onboardingNewsTitle => '新功能'; + + @override + String get onboardingStartAction => '开始'; + + @override + String get onboardingCloseTooltip => '关闭'; + + @override + String radioRecordingError(Object error) { + return '录制电台时出错:$error'; + } + + @override + String get radioApiConnectionError => '无法连接到电台 API'; + + @override + String get radioSearchError => '搜索出错。请检查你的连接。'; + + @override + String get radioLoadMoreStationsError => '无法加载更多电台。'; + + @override + String get radioNearbyStationsError => '未能检测到附近的电台。请使用国家/地区筛选器。'; + + @override + String radioCannotPlayStation(Object stationName) { + return '无法播放“$stationName”'; + } + + @override + String get recordingSelectStationFirst => '请先选择一个电台再录制。'; + + @override + String recordingStartError(Object error) { + return '无法开始录制:$error'; + } + + @override + String get unsupportedConfigVersion => '不支持的配置版本'; + + @override + String get audioErrorGeneric => '播放错误'; + + @override + String get audioErrorNoInternet => '无互联网连接'; + + @override + String get audioErrorInvalidUrl => '电台 URL 无效'; + + @override + String get audioErrorNotFound => '该电台不可用(404 错误)'; + + @override + String get audioErrorTimeout => '连接超时'; + + @override + String get audioErrorCannotConnect => '无法连接到电台'; + + @override + String get audioErrorUnsupportedFormat => '不支持的音频流格式'; + + @override + String get audioErrorDecode => '解码音频流时出错'; + + @override + String get audioErrorCleartext => '此电台使用未加密的 HTTP,不被允许'; + + @override + String get audioErrorSsl => '电台的 SSL 证书无效'; + + @override + String get audioErrorCannotPlay => '无法播放此电台'; + + @override + String get audioErrorUnexpectedPlayback => '播放时出现意外错误'; + + @override + String get androidExactAlarmScheduleError => 'Android 无法安排精确闹钟。请检查精确闹钟权限。'; + + @override + String get recordingPathEmptyError => '录制路径不能为空'; + + @override + String get recordingMaxSizeInvalidError => '最大大小必须大于零'; + + @override + String get recordingAlreadyActiveError => '已有录制正在进行'; + + @override + String get alarmRingingFallbackActive => '正在使用内部安全音频播放。'; + + @override + String get alarmRingingPreparingFallback => '正在准备内部安全音频。'; + + @override + String get alarmRingingTryingStation => '正在尝试以最高可用音质播放你的电台。'; + + @override + String alarmScheduleOnce(Object date) { + return '一次 · $date'; + } + + @override + String alarmScheduleWeekdays(Object days) { + return '星期:$days'; + } + + @override + String get androidReliabilityTitle => '检查 Android 可靠性'; + + @override + String get closeAction => '关闭'; + + @override + String get customOption => '自定义'; + + @override + String get endLabel => '结束'; + + @override + String get equalizerDisable => '关闭均衡器'; + + @override + String get helpTitle => '帮助和教程'; + + @override + String get helpSubtitle => '查看 PluriWave 的功能、技巧和新内容。'; + + @override + String get indefiniteOption => '不限时'; + + @override + String get invalidNumber => '数字无效'; + + @override + String get nameLabel => '名称'; + + @override + String get notPlaying => '未播放'; + + @override + String get oneTimeOption => '一次'; + + @override + String get pausePlaybackTooltip => '暂停播放'; + + @override + String qualityOriginal(Object quality) { + return '原始质量:$quality'; + } + + @override + String get qualityUnknown => '未提供质量信息'; + + @override + String get recordAction => '录制'; + + @override + String get recordDurationTitle => '录制时长'; + + @override + String get recordRadioSubtitle => '选择要录制多长时间。'; + + @override + String get recordRadioTitle => '录制电台'; + + @override + String get recordingActiveTitle => '正在录制电台'; + + @override + String get recordingDirectTitle => '直接录制'; + + @override + String get recordingsOpenFolderPlainError => '无法打开录音文件夹'; + + @override + String get recordingsOpenLatest => '打开最新录音'; + + @override + String get recordingsOpenLatestError => '无法打开最新录音'; + + @override + String get startLabel => '开始'; + + @override + String get startPlaybackTooltip => '开始播放'; + + @override + String get stopAction => '停止'; + + @override + String get stopPlaybackTooltip => '停止播放'; + + @override + String get weekdayShortMonday => '周一'; + + @override + String get weekdayShortTuesday => '周二'; + + @override + String get weekdayShortWednesday => '周三'; + + @override + String get weekdayShortThursday => '周四'; + + @override + String get weekdayShortFriday => '周五'; + + @override + String get weekdayShortSaturday => '周六'; + + @override + String get weekdayShortSunday => '周日'; } diff --git a/lib/pantallas/pantalla_ajustes.dart b/lib/pantallas/pantalla_ajustes.dart index b46fdfc..4672c4f 100644 --- a/lib/pantallas/pantalla_ajustes.dart +++ b/lib/pantallas/pantalla_ajustes.dart @@ -11,7 +11,7 @@ import 'package:uuid/uuid.dart'; import '../estado/estado_idioma.dart'; import '../estado/estado_radio.dart'; -import '../l10n/app_localizations_ext.dart'; +import '../l10n/display_names.dart'; import '../l10n/gen/app_localizations.dart'; import '../modelos/emisora.dart'; import '../modelos/grupo_favoritos.dart'; @@ -291,7 +291,7 @@ class _SeccionTimerSueno extends StatelessWidget { ScaffoldMessenger.of(context).showSnackBar( SnackBar( content: Text( - '${l10n.saveQuickAccessButton}: ${_formatearDuracionTimer(duracion)}', + '${l10n.saveQuickAccessButton}: ${_formatearDuracionTimer(l10n, duracion)}', ), ), ); @@ -336,7 +336,10 @@ class _SeccionTimerSueno extends StatelessWidget { for (final segundos in presets) InputChip( label: Text( - _formatearDuracionTimer(Duration(seconds: segundos)), + _formatearDuracionTimer( + l10n, + Duration(seconds: segundos), + ), ), onDeleted: presets.length <= 1 @@ -907,7 +910,7 @@ class _SeccionEmisoraPreferida extends StatelessWidget { DropdownMenuItem( value: emisora.uuid, child: Text( - emisora.nombre, + localizedStationName(l10n, emisora.nombre), overflow: TextOverflow.ellipsis, ), ), @@ -923,8 +926,12 @@ class _SeccionEmisoraPreferida extends StatelessWidget { const SizedBox(height: 8), Text( favoritas.any((e) => e.uuid == preferida.uuid) - ? l10n.preferredStationCurrent(preferida.nombre) - : l10n.preferredStationAutoUsing(preferida.nombre), + ? l10n.preferredStationCurrent( + localizedStationName(l10n, preferida.nombre), + ) + : l10n.preferredStationAutoUsing( + localizedStationName(l10n, preferida.nombre), + ), ), const SizedBox(height: 8), Align( @@ -1001,7 +1008,12 @@ class _SeccionEmisoras extends StatelessWidget { ListTile( contentPadding: EdgeInsets.zero, leading: const Icon(Icons.radio), - title: Text(emisora.nombre), + title: Text( + localizedStationName( + AppLocalizations.of(context), + emisora.nombre, + ), + ), subtitle: Text( emisora.url, maxLines: 1, @@ -1179,11 +1191,7 @@ class _SeccionBackup extends StatelessWidget { } catch (e) { if (context.mounted) { ScaffoldMessenger.of(context).showSnackBar( - SnackBar( - content: Text( - l10n.backupExportError(e.toString()), - ), - ), + SnackBar(content: Text(l10n.backupExportError(e.toString()))), ); } } @@ -1229,20 +1237,14 @@ class _SeccionBackup extends StatelessWidget { final messenger = ScaffoldMessenger.of(context); await estado.importarConfig(json); messenger.showSnackBar( - SnackBar( - content: Text(l10n.backupImportSuccess), - ), + SnackBar(content: Text(l10n.backupImportSuccess)), ); } } } catch (e) { if (context.mounted) { ScaffoldMessenger.of(context).showSnackBar( - SnackBar( - content: Text( - l10n.backupImportError(e.toString()), - ), - ), + SnackBar(content: Text(l10n.backupImportError(e.toString()))), ); } } @@ -1324,7 +1326,8 @@ class _SeccionInfo extends StatelessWidget { AppLocalizations.of(ctx).savedFavoritesTitle, ), trailing: Text( - snap.data?.toString() ?? AppLocalizations.of(ctx).dash, + snap.data?.toString() ?? + AppLocalizations.of(ctx).dash, style: Theme.of(ctx).textTheme.bodyLarge, ), ), @@ -1362,15 +1365,27 @@ class _SeccionInfo extends StatelessWidget { } } -String _formatearDuracionTimer(Duration duracion) { +String _formatearDuracionTimer( + AppLocalizations l10n, + Duration duracion, +) { final horas = duracion.inHours; final minutos = duracion.inMinutes.remainder(60); final segundos = duracion.inSeconds.remainder(60); if (horas > 0) { - return '${horas}h ${minutos.toString().padLeft(2, '0')}m ${segundos.toString().padLeft(2, '0')}s'; + return l10n.durationHoursMinutesSeconds( + horas, + minutos.toString().padLeft(2, '0'), + segundos.toString().padLeft(2, '0'), + ); } if (minutos > 0) { - return segundos == 0 ? '$minutos min' : '${minutos}m ${segundos}s'; + return segundos == 0 + ? l10n.durationMinutesOnly(minutos) + : l10n.durationMinutesSeconds( + minutos, + segundos.toString().padLeft(2, '0'), + ); } - return '$segundos s'; + return l10n.durationSecondsOnly(segundos); } diff --git a/lib/pantallas/pantalla_alarma_sonando.dart b/lib/pantallas/pantalla_alarma_sonando.dart index a75dc6a..22edb16 100644 --- a/lib/pantallas/pantalla_alarma_sonando.dart +++ b/lib/pantallas/pantalla_alarma_sonando.dart @@ -1,4 +1,4 @@ -import 'dart:async'; +import 'dart:async'; import 'package:flutter/material.dart'; import 'package:just_audio/just_audio.dart'; @@ -6,7 +6,7 @@ import 'package:provider/provider.dart'; import '../estado/estado_alarmas.dart'; import '../estado/estado_radio.dart'; -import '../l10n/app_localizations_ext.dart'; +import '../l10n/display_names.dart'; import '../l10n/gen/app_localizations.dart'; import '../modelos/alarma_musical.dart'; import '../servicios/servicio_audio.dart'; @@ -183,7 +183,7 @@ class _PantallaAlarmaSonandoState extends State { ), const SizedBox(height: 8), Text( - alarma.nombre, + localizedAlarmName(l10n, alarma.nombre), textAlign: TextAlign.center, style: Theme.of(context).textTheme.titleLarge, ), @@ -213,11 +213,10 @@ class _PantallaAlarmaSonandoState extends State { } String _assetFallback(SonidoInternoAlarma sonido) => switch (sonido) { - SonidoInternoAlarma.amanecer => 'assets/audio/alarm_amanecer.wav', - SonidoInternoAlarma.campanaSuave => - 'assets/audio/alarm_campana_suave.wav', - SonidoInternoAlarma.pulsoDigital => 'assets/audio/alarm_pulso_digital.wav', - }; + SonidoInternoAlarma.amanecer => 'assets/audio/alarm_amanecer.wav', + SonidoInternoAlarma.campanaSuave => 'assets/audio/alarm_campana_suave.wav', + SonidoInternoAlarma.pulsoDigital => 'assets/audio/alarm_pulso_digital.wav', +}; String _hora(AlarmaMusical alarma) => '${alarma.hora.toString().padLeft(2, '0')}:${alarma.minuto.toString().padLeft(2, '0')}'; diff --git a/lib/pantallas/pantalla_alarmas.dart b/lib/pantallas/pantalla_alarmas.dart index d3e82cc..8d639f2 100644 --- a/lib/pantallas/pantalla_alarmas.dart +++ b/lib/pantallas/pantalla_alarmas.dart @@ -3,6 +3,7 @@ import 'package:provider/provider.dart'; import '../estado/estado_alarmas.dart'; import '../estado/estado_radio.dart'; +import '../l10n/display_names.dart'; import '../l10n/app_localizations_ext.dart'; import '../l10n/gen/app_localizations.dart'; import '../modelos/alarma_musical.dart'; @@ -83,9 +84,10 @@ class _PanelProximaAlarma extends StatelessWidget { Widget build(BuildContext context) { final l10n = AppLocalizations.of(context); final proxima = estado.proximaAlarma; - final activasSinProxima = estado.alarmas - .where((a) => a.activa && a.proximaProgramable == null) - .length; + final activasSinProxima = + estado.alarmas + .where((a) => a.activa && a.proximaProgramable == null) + .length; final proximaProgramable = proxima?.proximaProgramable; return PluriGlassSurface( @@ -102,24 +104,21 @@ class _PanelProximaAlarma extends StatelessWidget { proxima == null ? activasSinProxima > 0 ? l10n.activeAlarmsWithoutNextTitle - : l10n.activeAlarmsNoneTitle + : l10n.noActiveAlarms : l10n.nextAlarmTitle, style: Theme.of(context).textTheme.titleMedium?.copyWith( - fontWeight: FontWeight.w900, - ), + fontWeight: FontWeight.w900, + ), ), const SizedBox(height: 4), Text( proxima == null ? activasSinProxima > 0 ? l10n.activeAlarmsWithoutNextSubtitle( - activasSinProxima, - ) + activasSinProxima, + ) : l10n.createAlarmHint - : l10n.alarmNextSummary( - proxima.nombre, - _fechaHora(l10n, proximaProgramable!), - ), + : '${_nombreVisibleAlarma(l10n, proxima)} · ${_fechaHora(l10n, proximaProgramable!)}', ), ], ), @@ -166,7 +165,7 @@ class _TarjetaAlarma extends StatelessWidget { letterSpacing: -1, ), ), - Text(alarma.nombre), + Text(_nombreVisibleAlarma(l10n, alarma)), ], ), ), @@ -198,7 +197,7 @@ class _TarjetaAlarma extends StatelessWidget { ), _InfoChip( icon: Icons.trending_up_rounded, - label: l10n.fadeInSeconds(alarma.fadeInSegundos), + label: l10n.alarmFadeInLabel(alarma.fadeInSegundos), ), ], ), @@ -263,11 +262,11 @@ class _TarjetaAlarma extends StatelessWidget { actualizada?.proximaProgramable == null ? l10n.alarmSkippedNoNextSnackbar : l10n.alarmSkippedReturnsSnackbar( - _fechaHora( - l10n, - actualizada!.proximaProgramable!, - ), + _fechaHora( + l10n, + actualizada!.proximaProgramable!, ), + ), ), ), ); @@ -302,10 +301,12 @@ class _TarjetaAlarma extends StatelessWidget { } if (actual != null) { if (alarma.proximaProgramable == null) { - return l10n.alarmVacationPausedNoNext(actual.nombre); + return l10n.alarmVacationPausedNoNext( + _nombreVisibleVacaciones(l10n, actual), + ); } return l10n.alarmVacationPausedReturns( - actual.nombre, + _nombreVisibleVacaciones(l10n, actual), _fechaHora(l10n, alarma.proximaProgramable!), ); } @@ -357,7 +358,10 @@ class _EditorAlarmaSheetState extends State<_EditorAlarmaSheet> { final l10n = AppLocalizations.of(context); final ahora = DateTime.now().add(const Duration(minutes: 5)); _nombreController = TextEditingController( - text: alarma?.nombre ?? l10n.defaultAlarmName, + text: + alarma == null + ? l10n.defaultAlarmName + : _nombreVisibleAlarma(l10n, alarma), ); _hora = TimeOfDay( hour: alarma?.hora ?? ahora.hour, @@ -419,7 +423,9 @@ class _EditorAlarmaSheetState extends State<_EditorAlarmaSheet> { const SizedBox(width: 12), Expanded( child: Text( - widget.alarma == null ? l10n.newAlarmTitle : l10n.editAlarmTitle, + widget.alarma == null + ? l10n.newAlarmTitle + : l10n.editAlarmTitle, style: Theme.of(context).textTheme.titleLarge?.copyWith( fontWeight: FontWeight.w900, ), @@ -442,7 +448,7 @@ class _EditorAlarmaSheetState extends State<_EditorAlarmaSheet> { Expanded( child: _PickerButton( icon: Icons.schedule_rounded, - label: l10n.timeLabel, + label: l10n.timeField, value: _hora.format(context), onTap: _elegirHora, ), @@ -451,7 +457,7 @@ class _EditorAlarmaSheetState extends State<_EditorAlarmaSheet> { Expanded( child: _PickerButton( icon: Icons.event_rounded, - label: l10n.dateLabel, + label: l10n.dateField, value: _fechaCorta(_fecha), onTap: _tipo == TipoProgramacionAlarma.unica @@ -488,7 +494,7 @@ class _EditorAlarmaSheetState extends State<_EditorAlarmaSheet> { children: [ for (var i = DateTime.monday; i <= DateTime.sunday; i++) FilterChip( - label: Text(l10n.weekdayShort(i)), + label: Text(_weekdayShort(l10n, i)), selected: _diasSemana.contains(i), onSelected: (selected) => setState(() { @@ -503,7 +509,7 @@ class _EditorAlarmaSheetState extends State<_EditorAlarmaSheet> { const SizedBox(height: 14), _SectionLabel( icon: 'assets/icons/alarmas/fallback_sound.png', - text: l10n.soundAndVolumeTitle, + text: l10n.soundAndVolumeSection, ), Slider( value: _volumen, @@ -520,7 +526,7 @@ class _EditorAlarmaSheetState extends State<_EditorAlarmaSheet> { subtitle: Text( _fadeInSegundos == 0 ? l10n.alarmFadeInOff - : l10n.alarmFadeInProgress(_fadeInSegundos), + : l10n.alarmFadeInSummary(_fadeInSegundos), ), ), Slider( @@ -530,13 +536,12 @@ class _EditorAlarmaSheetState extends State<_EditorAlarmaSheet> { divisions: 60, label: '${_fadeInSegundos}s', onChanged: - (value) => - setState(() => _fadeInSegundos = value.round()), + (value) => setState(() => _fadeInSegundos = value.round()), ), DropdownButtonFormField( initialValue: _sonidoInterno, decoration: InputDecoration( - labelText: l10n.soundInternalSafe, + labelText: l10n.internalSafeSoundLabel, ), items: [ DropdownMenuItem( @@ -574,7 +579,7 @@ class _EditorAlarmaSheetState extends State<_EditorAlarmaSheet> { DropdownMenuItem( value: emisora.uuid, child: Text( - emisora.nombre, + localizedStationName(l10n, emisora.nombre), overflow: TextOverflow.ellipsis, ), ), @@ -608,7 +613,8 @@ class _EditorAlarmaSheetState extends State<_EditorAlarmaSheet> { SwitchListTile.adaptive( contentPadding: EdgeInsets.zero, value: _sonarEnVacaciones, - onChanged: (value) => setState(() => _sonarEnVacaciones = value), + onChanged: + (value) => setState(() => _sonarEnVacaciones = value), secondary: const _AssetIcon( 'assets/icons/alarmas/vacation_wave.png', size: 42, @@ -648,7 +654,9 @@ class _EditorAlarmaSheetState extends State<_EditorAlarmaSheet> { Future _guardar() async { if (_tipo == TipoProgramacionAlarma.diasSemana && _diasSemana.isEmpty) { ScaffoldMessenger.of(context).showSnackBar( - SnackBar(content: Text(AppLocalizations.of(context).chooseOneWeekdayError)), + SnackBar( + content: Text(AppLocalizations.of(context).chooseOneWeekdayError), + ), ); return; } @@ -711,9 +719,18 @@ class _AccesoDiagnostico extends StatelessWidget { Widget build(BuildContext context) { final l10n = AppLocalizations.of(context); final diag = estado.diagnostico; - final exactStatus = diag?.puedeProgramarExactas == true ? l10n.statusOk : l10n.statusPending; - final notificationStatus = diag?.notificacionesPermitidas == true ? l10n.statusOk : l10n.statusPending; - final screenStatus = diag?.puedeUsarPantallaCompleta == true ? l10n.statusOk : l10n.statusPending; + final exactStatus = + diag?.puedeProgramarExactas == true + ? l10n.statusOk + : l10n.statusPending; + final notificationStatus = + diag?.notificacionesPermitidas == true + ? l10n.statusOk + : l10n.statusPending; + final screenStatus = + diag?.puedeUsarPantallaCompleta == true + ? l10n.statusOk + : l10n.statusPending; return TextButton.icon( icon: const _AssetIcon( 'assets/icons/alarmas/android_reliability.png', @@ -723,10 +740,10 @@ class _AccesoDiagnostico extends StatelessWidget { diag == null ? l10n.androidReliabilityTitle : l10n.androidReliabilityStatus( - exactStatus, - notificationStatus, - screenStatus, - ), + exactStatus, + notificationStatus, + screenStatus, + ), ), onPressed: () async { if (diag != null && !diag.puedeProgramarExactas) { @@ -784,18 +801,18 @@ class _PanelVacaciones extends StatelessWidget { const SizedBox(height: 8), Text(l10n.vacationRangesHint), if (vacaciones.isEmpty) - Text(l10n.vacationRangesEmpty) + Text(l10n.noVacationRangesLoaded) else for (final rango in vacaciones) ListTile( contentPadding: EdgeInsets.zero, leading: const Icon(Icons.event_busy_rounded), - title: Text(rango.nombre), + title: Text(_nombreVisibleVacaciones(l10n, rango)), subtitle: Text( '${_fechaCorta(rango.inicioDia)} → ${_fechaCorta(rango.finDia)}', ), trailing: IconButton( - tooltip: l10n.deleteRangeAction, + tooltip: l10n.deleteRangeTooltip, onPressed: () => estado.eliminarRangoVacaciones(rango.id), icon: const Icon(Icons.delete_outline_rounded), ), @@ -1057,23 +1074,42 @@ class _EmptyAlarmas extends StatelessWidget { } } +String _nombreVisibleAlarma(AppLocalizations l10n, AlarmaMusical alarma) { + return localizedAlarmName(l10n, alarma.nombre); +} + +String _nombreVisibleVacaciones(AppLocalizations l10n, RangoVacaciones rango) { + return localizedVacationName(l10n, rango.nombre); +} + String _hora(AlarmaMusical alarma) => '${alarma.hora.toString().padLeft(2, '0')}:${alarma.minuto.toString().padLeft(2, '0')}'; String _programacion(AppLocalizations l10n, AlarmaMusical alarma) { return switch (alarma.tipoProgramacion) { - TipoProgramacionAlarma.unica => - l10n.alarmScheduleOnce(_fechaCorta(alarma.fechaUnica ?? DateTime.now())), + TipoProgramacionAlarma.unica => l10n.alarmScheduleOnce( + _fechaCorta(alarma.fechaUnica ?? DateTime.now()), + ), TipoProgramacionAlarma.diaria => l10n.dailyOption, - TipoProgramacionAlarma.diasSemana => - l10n.alarmScheduleWeekdays( - alarma.diasSemana.map(l10n.weekdayShort).join(', '), - ), + TipoProgramacionAlarma.diasSemana => l10n.alarmScheduleWeekdays( + alarma.diasSemana.map((day) => _weekdayShort(l10n, day)).join(', '), + ), }; } String _fechaHora(AppLocalizations l10n, DateTime fecha) => l10n.dateTimeSentence(fecha); +String _weekdayShort(AppLocalizations l10n, int day) => switch (day) { + DateTime.monday => l10n.weekdayShortMonday, + DateTime.tuesday => l10n.weekdayShortTuesday, + DateTime.wednesday => l10n.weekdayShortWednesday, + DateTime.thursday => l10n.weekdayShortThursday, + DateTime.friday => l10n.weekdayShortFriday, + DateTime.saturday => l10n.weekdayShortSaturday, + DateTime.sunday => l10n.weekdayShortSunday, + _ => '?', +}; + String _fechaCorta(DateTime fecha) => '${fecha.day.toString().padLeft(2, '0')}/${fecha.month.toString().padLeft(2, '0')}/${fecha.year}'; diff --git a/lib/pantallas/pantalla_favoritos.dart b/lib/pantallas/pantalla_favoritos.dart index eef7abd..c059e9c 100644 --- a/lib/pantallas/pantalla_favoritos.dart +++ b/lib/pantallas/pantalla_favoritos.dart @@ -2,6 +2,7 @@ import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; import '../estado/estado_radio.dart'; +import '../l10n/display_names.dart'; import '../l10n/gen/app_localizations.dart'; import '../modelos/emisora.dart'; import '../modelos/grupo_favoritos.dart'; @@ -212,10 +213,14 @@ class _FavoritoItem extends StatelessWidget { ); if (!context.mounted) return; final destino = grupos.firstWhere((g) => g.id == seleccionado); + final stationName = localizedStationName(l10n, emisora.nombre); ScaffoldMessenger.of(context).showSnackBar( SnackBar( content: Text( - l10n.favoriteGroupsAssigned(emisora.nombre, _nombreVisible(l10n, destino)), + l10n.favoriteGroupsAssigned( + stationName, + _nombreVisible(l10n, destino), + ), ), ), ); @@ -224,11 +229,12 @@ class _FavoritoItem extends StatelessWidget { Future _eliminar(BuildContext context) async { final l10n = AppLocalizations.of(context); final estado = context.read(); + final stationName = localizedStationName(l10n, emisora.nombre); await estado.favoritos.eliminar(emisora.uuid); await estado.cargarFavoritos(); if (!context.mounted) return; ScaffoldMessenger.of(context).showSnackBar( - SnackBar(content: Text(l10n.favoritesRemovedMessage(emisora.nombre))), + SnackBar(content: Text(l10n.favoritesRemovedMessage(stationName))), ); } diff --git a/lib/pantallas/pantalla_inicio.dart b/lib/pantallas/pantalla_inicio.dart index 7a47a1b..c541bf5 100644 --- a/lib/pantallas/pantalla_inicio.dart +++ b/lib/pantallas/pantalla_inicio.dart @@ -4,7 +4,6 @@ import 'package:provider/provider.dart'; import 'package:shimmer/shimmer.dart' as shimmer; import '../estado/estado_radio.dart'; -import '../l10n/app_localizations_ext.dart'; import '../l10n/gen/app_localizations.dart'; import '../widgets/pluri_glass_surface.dart'; import '../widgets/pluri_icon.dart'; @@ -56,7 +55,12 @@ class _PantallaInicioState extends State { if (estado.error != null) SliverToBoxAdapter(child: _errorBanner(estado, theme, l10n)), SliverPadding( - padding: const EdgeInsets.fromLTRB(PluriLayout.horizontal, 0, PluriLayout.horizontal, PluriLayout.bottomChromeInset), + padding: const EdgeInsets.fromLTRB( + PluriLayout.horizontal, + 0, + PluriLayout.horizontal, + PluriLayout.bottomChromeInset, + ), sliver: _gridEmisoras(estado, l10n), ), ], @@ -80,14 +84,11 @@ class _PantallaInicioState extends State { children: [ PluriStatusPill( icon: Icons.public_rounded, - label: l10n.homeStationsCount(estado.emisorasInicio.length), + label: l10n.stationsCount(estado.emisorasInicio.length), accent: Theme.of(context).colorScheme.secondary, ), const SizedBox(height: 8), - PluriStatusPill( - icon: Icons.hd_rounded, - label: l10n.qualityHd, - ), + PluriStatusPill(icon: Icons.hd_rounded, label: l10n.qualityHd), ], ), ); @@ -100,7 +101,12 @@ class _PantallaInicioState extends State { ) { final pais = estado.paisCercanoDetectado; return Padding( - padding: const EdgeInsets.fromLTRB(PluriLayout.horizontal, 8, PluriLayout.horizontal, 0), + padding: const EdgeInsets.fromLTRB( + PluriLayout.horizontal, + 8, + PluriLayout.horizontal, + 0, + ), child: PluriGlassSurface( padding: const EdgeInsets.all(12), child: Column( @@ -117,16 +123,18 @@ class _PantallaInicioState extends State { ), ), TextButton.icon( - onPressed: estado.cargandoCercanas - ? null - : estado.cargarEmisorasCercanas, - icon: estado.cargandoCercanas - ? const SizedBox( - width: 16, - height: 16, - child: CircularProgressIndicator(strokeWidth: 2), - ) - : const Icon(Icons.my_location_rounded, size: 18), + onPressed: + estado.cargandoCercanas + ? null + : estado.cargarEmisorasCercanas, + icon: + estado.cargandoCercanas + ? const SizedBox( + width: 16, + height: 16, + child: CircularProgressIndicator(strokeWidth: 2), + ) + : const Icon(Icons.my_location_rounded, size: 18), label: Text(l10n.detectAction), ), ], @@ -172,7 +180,12 @@ class _PantallaInicioState extends State { AppLocalizations l10n, ) { return Padding( - padding: const EdgeInsets.fromLTRB(PluriLayout.horizontal, 8, PluriLayout.horizontal, 0), + padding: const EdgeInsets.fromLTRB( + PluriLayout.horizontal, + 8, + PluriLayout.horizontal, + 0, + ), child: PluriGlassSurface( padding: const EdgeInsets.all(12), child: Column( @@ -202,8 +215,7 @@ class _PantallaInicioState extends State { size: 18, ), label: Text(e.nombre, maxLines: 1), - onPressed: - () => reproducirMinimizado(context, e), + onPressed: () => reproducirMinimizado(context, e), ).animate().fadeIn(delay: (i * 50).ms); }, ), @@ -220,7 +232,12 @@ class _PantallaInicioState extends State { AppLocalizations l10n, ) { return Padding( - padding: const EdgeInsets.fromLTRB(PluriLayout.horizontal, 16, PluriLayout.horizontal, 8), + padding: const EdgeInsets.fromLTRB( + PluriLayout.horizontal, + 16, + PluriLayout.horizontal, + 8, + ), child: PluriGlassSurface( padding: const EdgeInsets.all(12), child: Column( @@ -235,7 +252,7 @@ class _PantallaInicioState extends State { _generos.map((g) { final seleccionado = _generoSeleccionado == g; return FilterChip( - label: Text(l10n.genreName(g)), + label: Text(_genreName(l10n, g)), selected: seleccionado, onSelected: (_) { setState(() { @@ -332,6 +349,21 @@ class _PantallaInicioState extends State { } } +String _genreName(AppLocalizations l10n, String tag) => switch (tag) { + 'pop' => l10n.genrePop, + 'rock' => l10n.genreRock, + 'jazz' => l10n.genreJazz, + 'classical' => l10n.genreClassical, + 'electronic' => l10n.genreElectronic, + 'news' => l10n.genreNews, + 'talk' => l10n.genreTalk, + 'hip-hop' => l10n.genreHipHop, + 'country' => l10n.genreCountry, + 'metal' => l10n.genreMetal, + 'reggae' => l10n.genreReggae, + 'latin' => l10n.genreLatin, + _ => tag, +}; class _ChipShimmer extends StatelessWidget { final ThemeData theme; diff --git a/lib/pantallas/pantalla_reproductor.dart b/lib/pantallas/pantalla_reproductor.dart index 80fa1fc..72d5256 100644 --- a/lib/pantallas/pantalla_reproductor.dart +++ b/lib/pantallas/pantalla_reproductor.dart @@ -5,7 +5,6 @@ import 'package:provider/provider.dart'; import 'package:shimmer/shimmer.dart'; import '../estado/estado_radio.dart'; -import '../l10n/app_localizations_ext.dart'; import '../l10n/gen/app_localizations.dart'; import '../modelos/emisora.dart'; import '../servicios/servicio_audio.dart'; @@ -115,7 +114,10 @@ class _PantallaReproductorState extends State : Icons.favorite_outline_rounded, color: esFavorito ? theme.colorScheme.error : null, ), - tooltip: esFavorito ? l10n.favoritesRemoveTooltip : l10n.favoritesAddTooltip, + tooltip: + esFavorito + ? l10n.favoritesRemoveTooltip + : l10n.favoritesAddTooltip, onPressed: () async => estado.toggleFavorito(emisoraActiva), ), ], @@ -195,7 +197,7 @@ class _PantallaReproductorState extends State if (e.bitrate != null && e.bitrate! > 0) parts.add('${e.bitrate} kbps'); return parts.isEmpty ? AppLocalizations.of(context).qualityUnknown - : AppLocalizations.of(context).qualityOriginal(parts.join(' ? ')); + : AppLocalizations.of(context).qualityOriginal(parts.join(' · ')); } } @@ -385,14 +387,16 @@ class _GrabacionWidget extends StatelessWidget { mainAxisSize: MainAxisSize.min, children: [ Text( - activa ? l10n.recordingActiveTitle : l10n.recordingDirectTitle, + activa + ? l10n.recordingActiveTitle + : l10n.recordingDirectTitle, style: theme.textTheme.titleSmall?.copyWith( fontWeight: FontWeight.w700, ), ), Text( activa - ? '${_formatearDuracion(grabacion.transcurrido)} · ${_formatearBytes(grabacion.bytes)}' + ? '${_formatearDuracion(l10n, grabacion.transcurrido)} · ${_formatearBytes(grabacion.bytes)}' : l10n.recordingsOriginalStreamHint, style: theme.textTheme.bodySmall?.copyWith( color: theme.colorScheme.onSurface.withValues(alpha: 0.7), @@ -440,7 +444,9 @@ class _GrabacionWidget extends StatelessWidget { if (!context.mounted) return; if (!abierto) { messenger.showSnackBar( - SnackBar(content: Text(AppLocalizations.of(context).recordingsOpenLatestError)), + SnackBar( + content: Text(AppLocalizations.of(context).recordingsOpenLatestError), + ), ); } } @@ -452,7 +458,9 @@ class _GrabacionWidget extends StatelessWidget { if (!abierto) { messenger.showSnackBar( SnackBar( - content: Text(AppLocalizations.of(context).recordingsOpenFolderPlainError), + content: Text( + AppLocalizations.of(context).recordingsOpenFolderPlainError, + ), ), ); } @@ -493,7 +501,15 @@ class _GrabacionWidget extends StatelessWidget { ), for (final opcion in _opciones) ActionChip( - label: Text(opcion.label), + label: Text( + opcion.duracion.inMinutes > 0 + ? AppLocalizations.of( + ctx, + ).durationMinutesOnly(opcion.duracion.inMinutes) + : AppLocalizations.of( + ctx, + ).durationSecondsOnly(opcion.duracion.inSeconds), + ), onPressed: () { estado.iniciarGrabacion(duracion: opcion.duracion); Navigator.pop(ctx); @@ -533,7 +549,9 @@ class _GrabacionWidget extends StatelessWidget { Expanded( child: TextFormField( controller: minutosCtrl, - decoration: InputDecoration(labelText: AppLocalizations.of(ctx).minutesLabel), + decoration: InputDecoration( + labelText: AppLocalizations.of(ctx).minutesLabel, + ), keyboardType: TextInputType.number, validator: (value) => _validarNumero(ctx, value), ), @@ -542,7 +560,9 @@ class _GrabacionWidget extends StatelessWidget { Expanded( child: TextFormField( controller: segundosCtrl, - decoration: InputDecoration(labelText: AppLocalizations.of(ctx).secondsLabel), + decoration: InputDecoration( + labelText: AppLocalizations.of(ctx).secondsLabel, + ), keyboardType: TextInputType.number, validator: (value) => _validarNumero(ctx, value), ), @@ -585,11 +605,14 @@ class _GrabacionWidget extends StatelessWidget { return null; } - String _formatearDuracion(Duration d) { + String _formatearDuracion(AppLocalizations l10n, Duration d) { final h = d.inHours; final m = d.inMinutes.remainder(60).toString().padLeft(2, '0'); final s = d.inSeconds.remainder(60).toString().padLeft(2, '0'); - return h > 0 ? '${h}h ${m}m ${s}s' : '${m}m ${s}s'; + if (h > 0) { + return l10n.durationHoursMinutesSeconds(h, m, s); + } + return l10n.durationMinutesSeconds(m, s); } String _formatearBytes(int bytes) { @@ -600,17 +623,16 @@ class _GrabacionWidget extends StatelessWidget { } class _OpcionGrabacion { - const _OpcionGrabacion(this.label, this.duracion); - final String label; + const _OpcionGrabacion(this.duracion); final Duration duracion; } const _opciones = [ - _OpcionGrabacion('30 s', Duration(seconds: 30)), - _OpcionGrabacion('1 min', Duration(minutes: 1)), - _OpcionGrabacion('5 min', Duration(minutes: 5)), - _OpcionGrabacion('15 min', Duration(minutes: 15)), - _OpcionGrabacion('30 min', Duration(minutes: 30)), + _OpcionGrabacion(Duration(seconds: 30)), + _OpcionGrabacion(Duration(minutes: 1)), + _OpcionGrabacion(Duration(minutes: 5)), + _OpcionGrabacion(Duration(minutes: 15)), + _OpcionGrabacion(Duration(minutes: 30)), ]; class _Controles extends StatelessWidget { @@ -643,7 +665,7 @@ class _Controles extends StatelessWidget { ), const SizedBox(height: 8), Text( - l10n.playerPlaybackErrorTitle, + l10n.audioErrorCannotPlay, style: theme.textTheme.bodyMedium?.copyWith( color: theme.colorScheme.error, ), @@ -784,7 +806,14 @@ class _TimerWidget extends StatelessWidget { final t = snap.data ?? Duration.zero; final m = t.inMinutes.remainder(60).toString().padLeft(2, '0'); final s = t.inSeconds.remainder(60).toString().padLeft(2, '0'); - final label = t.inHours > 0 ? '${t.inHours}h ${m}m' : '${m}m ${s}s'; + final label = + t.inHours > 0 + ? AppLocalizations.of(context).durationHoursMinutesSeconds( + t.inHours, + m, + s, + ) + : AppLocalizations.of(context).durationMinutesSeconds(m, s); return Row( mainAxisAlignment: MainAxisAlignment.center, @@ -833,7 +862,11 @@ class _TimerWidget extends StatelessWidget { opcionesTimer .map( (min) => ActionChip( - label: Text('$min min'), + label: Text( + AppLocalizations.of( + ctx, + ).durationMinutesOnly(min), + ), onPressed: () { estado.iniciarTimer(min); Navigator.pop(ctx); diff --git a/lib/servicios/servicio_alarmas_android.dart b/lib/servicios/servicio_alarmas_android.dart index 1a10778..e195e94 100644 --- a/lib/servicios/servicio_alarmas_android.dart +++ b/lib/servicios/servicio_alarmas_android.dart @@ -1,8 +1,11 @@ import 'dart:async'; +import 'dart:ui' show Locale; import 'package:flutter/foundation.dart'; import 'package:flutter/services.dart'; +import '../l10n/display_names.dart'; +import '../l10n/gen/app_localizations.dart'; import '../modelos/alarma_musical.dart'; class EventoAlarmaAndroid { @@ -114,6 +117,17 @@ class ServicioAlarmasAndroid implements PuertoAlarmasAndroid { static final _eventosController = StreamController.broadcast(); static bool _handlerInstalado = false; + static AppLocalizations? _l10n; + + static AppLocalizations get _textos { + final actual = _l10n; + if (actual != null) return actual; + return lookupAppLocalizations(const Locale('es')); + } + + static void configurarLocalizaciones(AppLocalizations l10n) { + _l10n = l10n; + } @override Stream get eventosAlarma => _eventosController.stream; @@ -133,7 +147,7 @@ class ServicioAlarmasAndroid implements PuertoAlarmasAndroid { ); final programada = await _channel.invokeMethod('scheduleAlarm', { 'id': alarma.id, - 'title': alarma.nombre, + 'title': localizedAlarmName(_textos, alarma.nombre), 'triggerAtMillis': proxima.millisecondsSinceEpoch, 'preNoticeAtMillis': alarma.snoozeHasta == null @@ -150,15 +164,16 @@ class ServicioAlarmasAndroid implements PuertoAlarmasAndroid { 'lastHandledAtMillis': alarma.ultimaEjecucionGestionada?.millisecondsSinceEpoch, 'soundOnVacation': alarma.sonarEnVacaciones, - 'stationName': alarma.emisora?.nombre, + 'stationName': + alarma.emisora == null + ? null + : localizedStationName(_textos, alarma.emisora!.nombre), 'stationUrl': alarma.emisora?.url, 'fallbackSound': alarma.sonidoInterno.name, 'volume': alarma.volumen, }); if (programada != true) { - throw StateError( - 'Android no pudo programar una alarma exacta. Revisa el permiso de alarmas exactas.', - ); + throw StateError(_textos.androidExactAlarmScheduleError); } } diff --git a/lib/servicios/servicio_audio.dart b/lib/servicios/servicio_audio.dart index b19c8cb..f56aa8e 100644 --- a/lib/servicios/servicio_audio.dart +++ b/lib/servicios/servicio_audio.dart @@ -1,9 +1,12 @@ import 'dart:async'; import 'dart:developer' as developer; +import 'dart:ui' show Locale; import 'package:audio_service/audio_service.dart'; import 'package:just_audio/just_audio.dart'; +import '../l10n/display_names.dart'; +import '../l10n/gen/app_localizations.dart'; import '../modelos/emisora.dart'; import '../modelos/preset_ecualizador.dart'; @@ -31,6 +34,10 @@ class ServicioAudio { Emisora? get emisoraActual => _handler.emisoraActual; + void configurarLocalizaciones(AppLocalizations l10n) { + _handler.configurarLocalizaciones(l10n); + } + Stream get estadoStream => _handler.playbackState.map((s) { if (s.processingState == AudioProcessingState.error) { @@ -50,7 +57,10 @@ class ServicioAudio { Future reproducir(Emisora emisora) async { final item = MediaItem( id: emisora.url, - title: emisora.nombre, + title: localizedStationName( + lookupAppLocalizations(const Locale('es')), + emisora.nombre, + ), artist: emisora.pais ?? '', album: 'PluriWave', artUri: @@ -118,6 +128,7 @@ class PluriWaveAudioHandler extends BaseAudioHandler with SeekHandler { Emisora? emisoraActual; double _volumen = 1.0; double get volumen => _volumen; + AppLocalizations? _l10n; AndroidEqualizer? get ecualizador => _eq; bool _eqDisponible = false; @@ -135,6 +146,16 @@ class PluriWaveAudioHandler extends BaseAudioHandler with SeekHandler { _conectarStreamsPlayer(); } + AppLocalizations get _textos { + final actual = _l10n; + if (actual != null) return actual; + return lookupAppLocalizations(const Locale('es')); + } + + void configurarLocalizaciones(AppLocalizations l10n) { + _l10n = l10n; + } + AudioPlayer _crearPlayer() { return AudioPlayer( audioPipeline: AudioPipeline(androidAudioEffects: [_eq]), @@ -192,7 +213,7 @@ class PluriWaveAudioHandler extends BaseAudioHandler with SeekHandler { mensaje = _mensajeAmigable(error); } else { codigoLog = 'Error desconocido: $error'; - mensaje = 'Error de reproducción'; + mensaje = _textos.audioErrorGeneric; } developer.log( @@ -219,30 +240,30 @@ class PluriWaveAudioHandler extends BaseAudioHandler with SeekHandler { final code = e.code; if (code >= 2000 && code < 3000) { - if (code == 2001) return 'Sin conexión a internet'; - if (code == 2002) return 'La URL de la radio no es válida'; - if (code == 2003) return 'La radio no está disponible (error 404)'; - if (code == 2004) return 'Tiempo de espera agotado al conectar'; - return 'No se puede conectar a la radio'; + if (code == 2001) return _textos.audioErrorNoInternet; + if (code == 2002) return _textos.audioErrorInvalidUrl; + if (code == 2003) return _textos.audioErrorNotFound; + if (code == 2004) return _textos.audioErrorTimeout; + return _textos.audioErrorCannotConnect; } if (code >= 3000 && code < 4000) { - return 'Formato de stream no compatible'; + return _textos.audioErrorUnsupportedFormat; } if (code >= 4000 && code < 5000) { - return 'Error al decodificar el stream de audio'; + return _textos.audioErrorDecode; } final msg = e.message ?? ''; if (msg.contains('Cleartext') || msg.contains('cleartext')) { - return 'Esta radio usa HTTP sin cifrar (no permitido)'; + return _textos.audioErrorCleartext; } if (msg.contains('CERTIFICATE') || msg.contains('HandshakeException')) { - return 'Certificado SSL inválido en la radio'; + return _textos.audioErrorSsl; } - return 'No se puede reproducir esta radio'; + return _textos.audioErrorCannotPlay; } AudioProcessingState _mapProcState(ProcessingState state) { @@ -300,7 +321,7 @@ class PluriWaveAudioHandler extends BaseAudioHandler with SeekHandler { playbackState.value.copyWith( processingState: AudioProcessingState.error, playing: false, - errorMessage: 'Error inesperado al reproducir', + errorMessage: _textos.audioErrorUnexpectedPlayback, ), ); emisoraActual = null; diff --git a/lib/servicios/servicio_grabacion_radio.dart b/lib/servicios/servicio_grabacion_radio.dart index 11abd62..41d4e0f 100644 --- a/lib/servicios/servicio_grabacion_radio.dart +++ b/lib/servicios/servicio_grabacion_radio.dart @@ -1,10 +1,12 @@ import 'dart:async'; import 'dart:io'; +import 'dart:ui' show Locale; import 'package:http/http.dart' as http; import 'package:path_provider/path_provider.dart'; import 'package:shared_preferences/shared_preferences.dart'; +import '../l10n/gen/app_localizations.dart'; import '../modelos/emisora.dart'; enum EstadoGrabacionRadioTipo { @@ -92,6 +94,7 @@ class ServicioGrabacionRadio { final Future Function()? _resolverDirectorioBase; final DateTime Function() _reloj; final _estadoController = StreamController.broadcast(); + AppLocalizations? _l10n; EstadoGrabacionRadio _estado = const EstadoGrabacionRadio.inactiva(); StreamSubscription>? _subscripcionStream; @@ -108,6 +111,16 @@ class ServicioGrabacionRadio { int get maxBytes => _maxBytes; File? get ultimoArchivo => _ultimoArchivo; + AppLocalizations get _textos { + final actual = _l10n; + if (actual != null) return actual; + return lookupAppLocalizations(const Locale('es')); + } + + void configurarLocalizaciones(AppLocalizations l10n) { + _l10n = l10n; + } + Future inicializar() async { try { final prefs = await SharedPreferences.getInstance(); @@ -134,7 +147,7 @@ class ServicioGrabacionRadio { Future guardarDirectorio(String path) async { final normalizado = path.trim(); if (normalizado.isEmpty) { - throw ArgumentError('La ruta de grabación no puede estar vacía'); + throw ArgumentError(_textos.recordingPathEmptyError); } _directorioConfigurado = normalizado; try { @@ -155,7 +168,7 @@ class ServicioGrabacionRadio { Future guardarMaxBytes(int bytes) async { if (bytes <= 0) { - throw ArgumentError('El tamaño máximo debe ser mayor que cero'); + throw ArgumentError(_textos.recordingMaxSizeInvalidError); } _maxBytes = bytes; try { @@ -171,7 +184,7 @@ class ServicioGrabacionRadio { String? directorio, }) async { if (_estado.activa) { - throw StateError('Ya hay una grabación en curso'); + throw StateError(_textos.recordingAlreadyActiveError); } final inicio = _reloj(); diff --git a/lib/widgets/ecualizador_widget.dart b/lib/widgets/ecualizador_widget.dart index 6e16f3c..7b8a2b4 100644 --- a/lib/widgets/ecualizador_widget.dart +++ b/lib/widgets/ecualizador_widget.dart @@ -1,5 +1,6 @@ import 'package:flutter/material.dart'; +import '../l10n/gen/app_localizations.dart'; import '../modelos/preset_ecualizador.dart'; import '../tema/pluriwave_theme.dart'; import 'pluri_glass_surface.dart'; @@ -41,6 +42,7 @@ class _EcualizadorWidgetState extends State { Widget build(BuildContext context) { final theme = Theme.of(context); final tokens = context.pluriTokens; + final l10n = AppLocalizations.of(context); return PluriGlassSurface( borderRadius: BorderRadius.circular(tokens.radiusLg), @@ -50,10 +52,10 @@ class _EcualizadorWidgetState extends State { children: [ Row( children: [ - Text('Ecualizador', style: theme.textTheme.titleMedium?.copyWith(fontWeight: FontWeight.w700)), + Text(l10n.equalizerTitle, style: theme.textTheme.titleMedium?.copyWith(fontWeight: FontWeight.w700)), const Spacer(), Chip( - label: Text(widget.preset.nombre, style: theme.textTheme.labelMedium), + label: Text(_nombrePreset(l10n, widget.preset.nombre), style: theme.textTheme.labelMedium), backgroundColor: theme.colorScheme.secondaryContainer.withValues(alpha: 0.75), ), ], @@ -77,8 +79,8 @@ class _EcualizadorWidgetState extends State { height: 152, child: Semantics( slider: true, - label: 'Banda ${_etiquetas[i]}', - value: '${_bandas[i].toStringAsFixed(1)} decibelios', + label: l10n.equalizerBandLabel(_etiquetas[i]), + value: l10n.equalizerBandValue(_bandas[i].toStringAsFixed(1)), child: RotatedBox( quarterTurns: 3, child: Slider( @@ -110,6 +112,19 @@ class _EcualizadorWidgetState extends State { } } +String _nombrePreset(AppLocalizations l10n, String nombre) { + return switch (nombre) { + 'Flat' => l10n.equalizerPresetFlat, + 'Rock' => l10n.equalizerPresetRock, + 'Pop' => l10n.equalizerPresetPop, + 'Bass Boost' => l10n.equalizerPresetBassBoost, + 'Jazz' => l10n.equalizerPresetJazz, + 'Voz' => l10n.equalizerPresetVoice, + 'Personalizado' => l10n.equalizerPresetCustom, + _ => nombre, + }; +} + class PresetsEcualizadorWidget extends StatelessWidget { final PresetEcualizador presetActual; final void Function(PresetEcualizador) onSeleccionar; @@ -123,13 +138,14 @@ class PresetsEcualizadorWidget extends StatelessWidget { @override Widget build(BuildContext context) { final theme = Theme.of(context); + final l10n = AppLocalizations.of(context); return Wrap( spacing: 8, runSpacing: 6, children: PresetEcualizador.presets.map((p) { final selected = p.nombre == presetActual.nombre; return ChoiceChip( - label: Text(p.nombre), + label: Text(_nombrePreset(l10n, p.nombre)), selected: selected, showCheckmark: false, selectedColor: theme.colorScheme.primaryContainer, diff --git a/lib/widgets/mini_reproductor.dart b/lib/widgets/mini_reproductor.dart index 5ab03ac..26cd004 100644 --- a/lib/widgets/mini_reproductor.dart +++ b/lib/widgets/mini_reproductor.dart @@ -2,6 +2,8 @@ import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; import '../estado/estado_radio.dart'; +import '../l10n/display_names.dart'; +import '../l10n/gen/app_localizations.dart'; import '../pantallas/pantalla_reproductor.dart'; import '../servicios/servicio_audio.dart'; import '../tema/pluriwave_theme.dart'; @@ -17,11 +19,14 @@ class MiniReproductor extends StatelessWidget { @override Widget build(BuildContext context) { final estado = context.watch(); + final l10n = AppLocalizations.of(context); + estado.configurarLocalizaciones(l10n); final emisora = estado.emisoraActual; if (emisora == null) return const SizedBox.shrink(); final t = context.pluriTokens; + final stationName = localizedStationName(l10n, emisora.nombre); return SafeArea( top: false, @@ -43,7 +48,7 @@ class MiniReproductor extends StatelessWidget { Expanded( child: Semantics( button: true, - label: 'Abrir reproductor de ${emisora.nombre}', + label: l10n.miniPlayerOpenLabel(stationName), child: Material( color: Colors.transparent, child: InkWell( @@ -74,7 +79,7 @@ class MiniReproductor extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( - emisora.nombre, + stationName, style: Theme.of(context) .textTheme .titleSmall @@ -91,7 +96,7 @@ class MiniReproductor extends StatelessWidget { final activo = s == EstadoReproduccion.reproduciendo; return Text( - _labelEstado(s), + _labelEstado(l10n, s), style: Theme.of( context, ).textTheme.bodySmall?.copyWith( @@ -117,7 +122,7 @@ class MiniReproductor extends StatelessWidget { glyph: PluriIconGlyph.player, variant: PluriIconVariant.activeGlow, size: 18, - semanticLabel: 'Reproductor', + semanticLabel: l10n.playerIconLabel, ), ], ), @@ -144,7 +149,7 @@ class MiniReproductor extends StatelessWidget { if (s == EstadoReproduccion.error) { final emisoraActual = estado.emisoraActual; return IconButton( - tooltip: 'Reintentar', + tooltip: l10n.retryAction, icon: const Icon(Icons.refresh_rounded), onPressed: emisoraActual != null @@ -161,13 +166,13 @@ class MiniReproductor extends StatelessWidget { button: true, label: s == EstadoReproduccion.reproduciendo - ? 'Pausar' - : 'Reproducir', + ? l10n.pauseAction + : l10n.playAction, child: IconButton( tooltip: s == EstadoReproduccion.reproduciendo - ? 'Pausar' - : 'Reproducir', + ? l10n.pauseAction + : l10n.playAction, icon: Icon( s == EstadoReproduccion.reproduciendo ? Icons.pause_circle_filled_rounded @@ -190,13 +195,13 @@ class MiniReproductor extends StatelessWidget { ); } - String _labelEstado(EstadoReproduccion estado) { + String _labelEstado(AppLocalizations l10n, EstadoReproduccion estado) { return switch (estado) { - EstadoReproduccion.cargando => 'Conectando...', - EstadoReproduccion.reproduciendo => 'En directo', - EstadoReproduccion.pausado => 'Pausado', - EstadoReproduccion.error => 'Error de conexión', - EstadoReproduccion.detenido => 'Detenido', + EstadoReproduccion.cargando => l10n.playbackStatusConnecting, + EstadoReproduccion.reproduciendo => l10n.playbackStatusLive, + EstadoReproduccion.pausado => l10n.playbackStatusPaused, + EstadoReproduccion.error => l10n.playbackStatusConnectionError, + EstadoReproduccion.detenido => l10n.playbackStatusStopped, }; } } diff --git a/lib/widgets/pluri_icon.dart b/lib/widgets/pluri_icon.dart index 555220c..1b2f3f5 100644 --- a/lib/widgets/pluri_icon.dart +++ b/lib/widgets/pluri_icon.dart @@ -1,5 +1,6 @@ import 'package:flutter/material.dart'; +import '../l10n/gen/app_localizations.dart'; import '../tema/pluriwave_tokens.dart'; import '../tema/pluriwave_theme.dart'; @@ -62,7 +63,7 @@ class PluriIcon extends StatelessWidget { : icon; return Semantics( - label: semanticLabel ?? _fallbackLabel(glyph), + label: semanticLabel ?? _fallbackLabel(AppLocalizations.of(context), glyph), image: true, child: ExcludeSemantics(child: child), ); @@ -108,14 +109,14 @@ class PluriIcon extends StatelessWidget { }; } - String _fallbackLabel(PluriIconGlyph glyph) { + String _fallbackLabel(AppLocalizations l10n, PluriIconGlyph glyph) { return switch (glyph) { - PluriIconGlyph.home => 'Inicio', - PluriIconGlyph.search => 'Buscar', - PluriIconGlyph.favorites => 'Favoritos', - PluriIconGlyph.alarm => 'Alarmas', - PluriIconGlyph.player => 'Reproductor', - PluriIconGlyph.settings => 'Ajustes', + PluriIconGlyph.home => l10n.navHome, + PluriIconGlyph.search => l10n.navSearch, + PluriIconGlyph.favorites => l10n.navFavorites, + PluriIconGlyph.alarm => l10n.navAlarms, + PluriIconGlyph.player => l10n.playerIconLabel, + PluriIconGlyph.settings => l10n.navSettings, }; } } diff --git a/lib/widgets/pluri_onboarding_dialog.dart b/lib/widgets/pluri_onboarding_dialog.dart index 74f2cb1..9ea432e 100644 --- a/lib/widgets/pluri_onboarding_dialog.dart +++ b/lib/widgets/pluri_onboarding_dialog.dart @@ -1,5 +1,6 @@ import 'package:flutter/material.dart'; +import '../l10n/gen/app_localizations.dart'; import '../servicios/servicio_contenido_app.dart'; import 'pluri_glass_surface.dart'; import 'pluri_markdown.dart'; @@ -41,7 +42,7 @@ class _PluriOnboardingContent extends StatelessWidget { @override Widget build(BuildContext context) { - final labels = _labels(Localizations.localeOf(context).languageCode); + final l10n = AppLocalizations.of(context); final size = MediaQuery.sizeOf(context); return Dialog( insetPadding: const EdgeInsets.all(16), @@ -80,14 +81,14 @@ class _PluriOnboardingContent extends StatelessWidget { const SizedBox(width: 14), Expanded( child: Text( - labels.title, + l10n.onboardingTitle, style: Theme.of(context).textTheme.titleLarge?.copyWith( fontWeight: FontWeight.w900, ), ), ), IconButton( - tooltip: labels.close, + tooltip: l10n.onboardingCloseTooltip, onPressed: () => Navigator.of(context).pop(), icon: const Icon(Icons.close_rounded), ), @@ -102,7 +103,7 @@ class _PluriOnboardingContent extends StatelessWidget { if (contenido.notas.isNotEmpty) ...[ const SizedBox(height: 18), Text( - labels.news, + l10n.onboardingNewsTitle, style: Theme.of(context).textTheme.titleLarge?.copyWith( fontWeight: FontWeight.w900, ), @@ -131,7 +132,7 @@ class _PluriOnboardingContent extends StatelessWidget { child: FilledButton.icon( onPressed: () => Navigator.of(context).pop(), icon: const Icon(Icons.check_rounded), - label: Text(labels.start), + label: Text(l10n.onboardingStartAction), ), ), ], @@ -141,58 +142,3 @@ class _PluriOnboardingContent extends StatelessWidget { ); } } - -_OnboardingLabels _labels(String languageCode) { - return switch (languageCode) { - 'es' => const _OnboardingLabels( - title: 'Bienvenido a PluriWave', - news: 'Novedades', - start: 'Empezar', - close: 'Cerrar', - ), - 'fr' => const _OnboardingLabels( - title: 'Bienvenue sur PluriWave', - news: 'Nouveautés', - start: 'Commencer', - close: 'Fermer', - ), - 'de' => const _OnboardingLabels( - title: 'Willkommen bei PluriWave', - news: 'Neuigkeiten', - start: 'Starten', - close: 'Schließen', - ), - 'it' => const _OnboardingLabels( - title: 'Benvenuto in PluriWave', - news: 'Novità', - start: 'Inizia', - close: 'Chiudi', - ), - 'pt' => const _OnboardingLabels( - title: 'Bem-vindo ao PluriWave', - news: 'Novidades', - start: 'Começar', - close: 'Fechar', - ), - _ => const _OnboardingLabels( - title: 'Welcome to PluriWave', - news: 'What’s new', - start: 'Start', - close: 'Close', - ), - }; -} - -class _OnboardingLabels { - const _OnboardingLabels({ - required this.title, - required this.news, - required this.start, - required this.close, - }); - - final String title; - final String news; - final String start; - final String close; -} diff --git a/lib/widgets/tarjeta_emisora.dart b/lib/widgets/tarjeta_emisora.dart index 0257996..bc15dfc 100644 --- a/lib/widgets/tarjeta_emisora.dart +++ b/lib/widgets/tarjeta_emisora.dart @@ -4,6 +4,8 @@ import 'package:provider/provider.dart'; import 'package:shimmer/shimmer.dart'; import '../estado/estado_radio.dart'; +import '../l10n/display_names.dart'; +import '../l10n/gen/app_localizations.dart'; import '../modelos/emisora.dart'; import '../tema/pluriwave_theme.dart'; import 'pluri_glass_surface.dart'; @@ -37,12 +39,14 @@ class _TarjetaEmisoraState extends State { final esFav = await estado.toggleFavorito(widget.emisora); if (mounted) setState(() => _toggling = false); if (mounted) { + final l10n = AppLocalizations.of(context); + final stationName = localizedStationName(l10n, widget.emisora.nombre); ScaffoldMessenger.of(context).showSnackBar( SnackBar( content: Text( esFav - ? '${widget.emisora.nombre} añadida a favoritos' - : '${widget.emisora.nombre} eliminada de favoritos', + ? l10n.favoritesAddedMessage(stationName) + : l10n.favoritesRemovedMessage(stationName), ), duration: const Duration(seconds: 2), ), @@ -53,9 +57,11 @@ class _TarjetaEmisoraState extends State { @override Widget build(BuildContext context) { final t = context.pluriTokens; + final l10n = AppLocalizations.of(context); + final stationName = localizedStationName(l10n, widget.emisora.nombre); return Semantics( button: widget.onTap != null, - label: 'Emisora ${widget.emisora.nombre}', + label: l10n.stationSemanticLabel(stationName), child: PluriGlassSurface( padding: EdgeInsets.zero, borderRadius: BorderRadius.circular( @@ -74,6 +80,10 @@ class _TarjetaEmisoraState extends State { Widget _buildCompleta() { final t = context.pluriTokens; + final stationName = localizedStationName( + AppLocalizations.of(context), + widget.emisora.nombre, + ); return Stack( children: [ Column( @@ -116,7 +126,7 @@ class _TarjetaEmisoraState extends State { crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( - widget.emisora.nombre, + stationName, style: Theme.of(context).textTheme.titleSmall?.copyWith( fontWeight: FontWeight.w700, ), @@ -153,6 +163,10 @@ class _TarjetaEmisoraState extends State { Widget _buildCompacta() { final t = context.pluriTokens; + final stationName = localizedStationName( + AppLocalizations.of(context), + widget.emisora.nombre, + ); final subtitulo = [ widget.emisora.pais, widget.emisora.idioma, @@ -192,7 +206,7 @@ class _TarjetaEmisoraState extends State { crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( - widget.emisora.nombre, + stationName, style: Theme.of( context, ).textTheme.titleSmall?.copyWith(fontWeight: FontWeight.w700), @@ -223,6 +237,7 @@ class _TarjetaEmisoraState extends State { Widget _botonFavorito({required bool mini}) { final t = context.pluriTokens; + final l10n = AppLocalizations.of(context); final esFavorito = context.select( (estado) => estado.listaFavoritos.any((e) => e.uuid == widget.emisora.uuid), @@ -248,13 +263,16 @@ class _TarjetaEmisoraState extends State { : PluriIconVariant.outline, size: 20, semanticLabel: - esFavorito ? 'Quitar de favoritos' : 'Añadir a favoritos', + esFavorito + ? l10n.favoritesRemoveTooltip + : l10n.favoritesAddTooltip, ); return Semantics( button: true, toggled: esFavorito, - label: esFavorito ? 'Quitar de favoritos' : 'Añadir a favoritos', + label: + esFavorito ? l10n.favoritesRemoveTooltip : l10n.favoritesAddTooltip, child: Material( color: mini ? t.glassSurface : Colors.transparent, shape: const CircleBorder(), @@ -318,7 +336,7 @@ class _TarjetaEmisoraState extends State { glyph: PluriIconGlyph.player, variant: PluriIconVariant.activeGlow, size: size, - semanticLabel: 'Icono de emisora', + semanticLabel: AppLocalizations.of(context).stationIconLabel, ), ), ], @@ -345,6 +363,7 @@ class _LiveBadge extends StatelessWidget { @override Widget build(BuildContext context) { final color = Theme.of(context).colorScheme.secondary; + final l10n = AppLocalizations.of(context); return Container( padding: EdgeInsets.symmetric(horizontal: mini ? 8 : 6, vertical: mini ? 5 : 4), decoration: BoxDecoration( @@ -358,7 +377,7 @@ class _LiveBadge extends StatelessWidget { Icon(Icons.fiber_manual_record_rounded, size: mini ? 10 : 8, color: color), if (mini) ...[ const SizedBox(width: 5), - Text('Live', style: Theme.of(context).textTheme.labelSmall?.copyWith(fontWeight: FontWeight.w900)), + Text(l10n.liveNow, style: Theme.of(context).textTheme.labelSmall?.copyWith(fontWeight: FontWeight.w900)), ], ], ), diff --git a/test/pantallas/pantalla_inicio_test.dart b/test/pantallas/pantalla_inicio_test.dart index 573b207..a6dd1aa 100644 --- a/test/pantallas/pantalla_inicio_test.dart +++ b/test/pantallas/pantalla_inicio_test.dart @@ -22,6 +22,7 @@ void main() { testWidgets( 'PantallaInicio muestra custom, reproducir usa EstadoRadio y favorito usa flujo existente', (tester) async { + _setLargeSurfaceSize(tester); final audio = FakeServicioAudio(); final favoritos = FakeServicioFavoritos(); final radio = FakeServicioRadio(); @@ -47,6 +48,7 @@ void main() { ); await _pumpStableFrame(tester); + await _scrollUntilText(tester, 'Custom Uno'); expect(find.text('Custom Uno'), findsOneWidget); await tester.ensureVisible(find.text('Custom Uno')); @@ -82,6 +84,7 @@ void main() { testWidgets( 'PantallaInicio permite reintentar manualmente tras fallo inicial agotado', (tester) async { + _setLargeSurfaceSize(tester); final radio = FakeServicioRadio( erroresPopularesPorLlamada: [Exception('sin red')], popularesPorLlamada: [ @@ -113,6 +116,7 @@ void main() { ); await _pumpStableFrame(tester); + await _scrollUntilText(tester, 'Sin conexión a la API de radio'); expect(find.text('Sin conexión a la API de radio'), findsOneWidget); expect(find.text('Reintentar'), findsOneWidget); @@ -130,6 +134,7 @@ void main() { testWidgets('PantallaFavoritos muestra custom favorito tras recarga', ( tester, ) async { + _setLargeSurfaceSize(tester); final favoritos = FakeServicioFavoritos(); final custom = emisoraDemo(uuid: 'custom-1', nombre: 'Custom Uno'); final archivo = await _crearArchivoCustom([custom]); @@ -155,7 +160,7 @@ void main() { ); await _pumpStableFrame(tester); - await tester.ensureVisible(find.text('Custom Uno')); + await _scrollUntilText(tester, 'Custom Uno'); await _pumpStableFrame(tester); final tarjetaCustom = find.ancestor( of: find.text('Custom Uno'), @@ -185,6 +190,7 @@ void main() { Widget _testApp(Widget body) { return MaterialApp( + locale: const Locale('es'), localizationsDelegates: AppLocalizations.localizationsDelegates, supportedLocales: AppLocalizations.supportedLocales, home: Scaffold(body: body), @@ -209,7 +215,23 @@ class FakeServicioGrabacionRadio extends ServicioGrabacionRadio { Future _pumpStableFrame(WidgetTester tester) async { await tester.pump(); - await tester.pump(const Duration(milliseconds: 100)); + await tester.pumpAndSettle(const Duration(milliseconds: 100)); +} + +void _setLargeSurfaceSize(WidgetTester tester) { + tester.view.physicalSize = const Size(1440, 3200); + tester.view.devicePixelRatio = 1.0; + addTearDown(tester.view.resetPhysicalSize); + addTearDown(tester.view.resetDevicePixelRatio); +} + +Future _scrollUntilText(WidgetTester tester, String text) async { + await tester.scrollUntilVisible( + find.text(text), + 300, + scrollable: find.byType(Scrollable).first, + ); + await _pumpStableFrame(tester); } Future _crearArchivoCustom(List emisoras) async {