Extracts ServicioRadio's transport loop (server discovery, host rotation, bounded retries, User-Agent, timeout, status check, json.decode, sticky-host bookkeeping) out of `_get` into a new `_getJson(path, params) -> Future<List<dynamic>>` helper, moved as one block with no logic edits. `_get` is reimplemented on top, still owning every station-specific concern: `lastcheckok: '1'`, `Emisora.fromApi` + the empty-uuid/url filter, and the `_compararCalidad` quality sort. `_getJson` is deliberately sort-agnostic and filter-agnostic so a non-station endpoint can reuse the resilience behaviour without inheriting station-only semantics. Non-negotiable ordering followed per design ADR-4: new test/servicios/servicio_radio_transporte_test.dart characterises all 8 existing station calls (7 via `_get` plus `registrarClick`, which builds its own URI) against the UNMODIFIED `_get` first - green by construction - pinning path, lastcheckok=1, hidebroken=true, a non-empty User-Agent, exact order/reverse/limit/offset, and the exact returned UUID sequence from a fixture with deliberately shuffled bitrate/clickcount/votes. That last assertion is what makes the extraction safe: a sort that silently sank into transport would pass every other check. Re-running the same file after the extraction is byte-identical green. test/servicios/servicio_radio_test.dart is untouched by this work unit - its passing unmodified is itself a signal that transport wasn't disturbed. The 6 pre-existing `order: bitrate` occurrences (obtenerPopulares, buscarPorNombre, buscarPorPais, buscarPorIdioma, buscarPorTag, buscar) are untouched - a deliberate server-side quality bias deciding which stations return within `limit`, unrelated to and never to be confused with the user-facing "Ordenar" control, which stays entirely client-side via the existing OrdenEmisoras (Engram reference/radio-browser-sort-order). Behaviour delta, accepted per ADR-4, not a regression: moving `_servidorActual` bookkeeping into `_getJson` means a successful `/json/countries` call now warms the sticky host for subsequent station calls too - one shared warm mirror per instance, desirable, not per-call-type state. Adds the Paises browser over the verified `/json/countries` contract (Engram reference/radio-browser-countries-endpoint): new lib/modelos/pais_radio.dart (`PaisRadio.fromApi` parses `stationcount` via `int.tryParse` since the API returns it as a JSON string, not an int - an `as int` cast would throw), `obtenerPaises()` sends neither `lastcheckok` nor `order` (the screen sorts client-side by name; the API's raw byte order isn't proper collation for any locale this app ships), and inherits `hidebroken=true` from the unchanged `_uri` (desirable here too, since the endpoint's own default is false). `EstadoBusqueda` gains `paises`/`cargandoPaises`/`cargarPaises()` with an in-memory cache guard so re-entering the screen never refetches. New PantallaPaises (lib/pantallas/pantalla_paises.dart): a "Tus idiomas" shortlist (one representative country per the app's 13 supported locales, matched against the fetched list - the proposal/spec name this section but don't specify its derivation) above the full alphabetical list, each entry showing its parsed station count. Reachable from Buscar's discovery landing state via a new entry row, added now rather than left dangling per this file's own forward-reference comment (and the WU15/WU15b lesson: a fully-tested but unreachable screen is a real defect, not a follow-up). New ARB keys (en/es only, matching this change's established precedent): countriesScreenTitle, countriesYourLanguagesTitle, countriesAllTitle, radioCountriesError. Tests: 631 -> 649 (2 skipped, unchanged). flutter analyze unchanged at 1 pre-existing info. grep confirms `countrycodes` appears nowhere in lib/.
744 lines
26 KiB
Plaintext
744 lines
26 KiB
Plaintext
{
|
||
"@@locale": "en",
|
||
"appTitle": "PluriWave",
|
||
"navHome": "Listen",
|
||
"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",
|
||
"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}.",
|
||
"@skipCurrentAlarmExecution": {
|
||
"placeholders": {
|
||
"alarmName": {}
|
||
}
|
||
},
|
||
"settingsTitle": "Settings",
|
||
"settingsSubtitle": "Fine-grained sound control, backups, and custom stations.",
|
||
"settingsGroupAudioTitle": "AUDIO",
|
||
"settingsGroupStationsTitle": "STATIONS",
|
||
"settingsGroupRecordingsTitle": "RECORDINGS & MUSIC",
|
||
"settingsGroupApplicationTitle": "APPLICATION",
|
||
"infoSectionTitle": "Info",
|
||
"languageSectionTitle": "Language",
|
||
"languageSectionDescription": "Choose how the app language is displayed.",
|
||
"languageSystemDefault": "System",
|
||
"languageSpanish": "Spanish",
|
||
"languageEnglish": "English",
|
||
"languageUpdated": "Language updated: {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 default internal folder will be used",
|
||
"recordingsFolderTitle": "Recording 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 *",
|
||
"unnamedStation": "Unnamed station",
|
||
"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",
|
||
"dash": "—",
|
||
"@recordingsPathSaveError": {
|
||
"placeholders": {
|
||
"error": {}
|
||
}
|
||
},
|
||
"@equalizerPerStationActive": {
|
||
"placeholders": {
|
||
"stationName": {}
|
||
}
|
||
},
|
||
"@equalizerPerStationMain": {
|
||
"placeholders": {
|
||
"stationName": {}
|
||
}
|
||
},
|
||
"@preferredStationCurrent": {
|
||
"placeholders": {
|
||
"stationName": {}
|
||
}
|
||
},
|
||
"@preferredStationAutoUsing": {
|
||
"placeholders": {
|
||
"stationName": {}
|
||
}
|
||
},
|
||
"@backupShareText": {
|
||
"placeholders": {
|
||
"date": {}
|
||
}
|
||
},
|
||
"@backupExportError": {
|
||
"placeholders": {
|
||
"error": {}
|
||
}
|
||
},
|
||
"@backupImportError": {
|
||
"placeholders": {
|
||
"error": {}
|
||
}
|
||
},
|
||
"@appVersionSubtitle": {
|
||
"placeholders": {
|
||
"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",
|
||
"@recordingsOpenFolderError": {
|
||
"placeholders": {
|
||
"error": {}
|
||
}
|
||
},
|
||
"@recordingsMaxSizeSubtitle": {
|
||
"placeholders": {
|
||
"size": {
|
||
"type": "int"
|
||
}
|
||
}
|
||
},
|
||
"@recordingsMaxSizeSaved": {
|
||
"placeholders": {
|
||
"size": {
|
||
"type": "int"
|
||
}
|
||
}
|
||
},
|
||
"recordingsLibraryTitle": "My recordings",
|
||
"recordingsLibraryStorageCaption": "{usedMb} MB of {totalMb} MB used",
|
||
"@recordingsLibraryStorageCaption": {
|
||
"placeholders": {
|
||
"usedMb": {
|
||
"type": "int"
|
||
},
|
||
"totalMb": {
|
||
"type": "int"
|
||
}
|
||
}
|
||
},
|
||
"recordingsLibraryEmptyTitle": "No recordings yet",
|
||
"recordingsLibraryEmptySubtitle": "Recordings you save will appear here.",
|
||
"recordingActionRename": "Rename",
|
||
"recordingActionShare": "Share",
|
||
"recordingActionDelete": "Delete",
|
||
"recordingRenameDialogTitle": "Rename recording",
|
||
"recordingRenameLabel": "Name",
|
||
"recordingRenameEmptyError": "Enter a name",
|
||
"recordingDeleteConfirmTitle": "Delete recording?",
|
||
"recordingDeleteConfirmMessage": "This can't be undone.",
|
||
"recordingsLibrarySettingsTooltip": "Recording settings",
|
||
"stationOrderTitle": "Station order",
|
||
"stationOrderByName": "By name",
|
||
"stationOrderByQuality": "By quality",
|
||
"stationOrderByPopularity": "By popularity",
|
||
"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",
|
||
"@favoriteGroupsAssignSubtitle": {
|
||
"placeholders": {
|
||
"groupName": {}
|
||
}
|
||
},
|
||
"@favoriteGroupsAssigned": {
|
||
"placeholders": {
|
||
"stationName": {},
|
||
"groupName": {}
|
||
}
|
||
},
|
||
"@favoritesSavedCount": {
|
||
"placeholders": {
|
||
"count": {
|
||
"type": "int"
|
||
}
|
||
}
|
||
},
|
||
"@favoritesRemovedMessage": {
|
||
"placeholders": {
|
||
"stationName": {}
|
||
}
|
||
},
|
||
"favoritesFilterAllLabel": "All",
|
||
"favoriteGroupsChipLabel": "{groupName} · {count}",
|
||
"@favoriteGroupsChipLabel": {
|
||
"placeholders": {
|
||
"groupName": {},
|
||
"count": {
|
||
"type": "int"
|
||
}
|
||
}
|
||
},
|
||
"favoriteGroupsManage": "Manage lists",
|
||
"customStationsAddCta": "Add custom station",
|
||
"alarmPostponedCurrentExecution": "Alarm postponed for this occurrence.",
|
||
"searchScreenTitle": "Search signal",
|
||
"searchScreenSubtitle": "Find stations by name, country, or language with fast filters and high contrast.",
|
||
"searchFiltersLabel": "Filters",
|
||
"searchHint": "Radio Horizon, jazz, news...",
|
||
"searchCountryFilterLabel": "Country",
|
||
"searchLanguageFilterLabel": "Language",
|
||
"searchMinQualityFilterLabel": "Minimum quality",
|
||
"searchEmptyTitle": "Search for a station",
|
||
"searchNoResultsTitle": "No results",
|
||
"searchEmptySubtitle": "Use the top bar or chips to discover stations from around the world.",
|
||
"searchNoResultsSubtitle": "Try removing filters or typing another name to find an active station.",
|
||
"searchResultsCount": "{count, plural, =1{1 result} other{{count} results}}",
|
||
"searchClearFiltersAction": "{count, plural, =1{Clear filter} other{Clear {count} filters}}",
|
||
"countriesScreenTitle": "Countries",
|
||
"countriesYourLanguagesTitle": "Your languages",
|
||
"countriesAllTitle": "All countries",
|
||
"radioCountriesError": "We couldn't load the countries.",
|
||
"countrySpain": "Spain",
|
||
"countryUsa": "USA",
|
||
"countryMexico": "Mexico",
|
||
"countryArgentina": "Argentina",
|
||
"countryUk": "UK",
|
||
"countryFrance": "France",
|
||
"countryGermany": "Germany",
|
||
"countryItaly": "Italy",
|
||
"countryBrazil": "Brazil",
|
||
"countryJapan": "Japan",
|
||
"languageNameSpanish": "Spanish",
|
||
"languageNameEnglish": "English",
|
||
"languageNameFrench": "French",
|
||
"languageNameGerman": "German",
|
||
"languageNamePortuguese": "Portuguese",
|
||
"languageNameItalian": "Italian",
|
||
"languageNameJapanese": "Japanese",
|
||
"languageNameArabic": "Arabic",
|
||
"languageNameRussian": "Russian",
|
||
"homeScreenSubtitle": "Live global radio with clean signals, smart favorites, and a show-style visual experience.",
|
||
"exploreStations": "Explore stations",
|
||
"stationsCount": "{count} stations",
|
||
"@stationsCount": {
|
||
"placeholders": {
|
||
"count": {
|
||
"type": "int"
|
||
}
|
||
}
|
||
},
|
||
"qualityHd": "HD quality",
|
||
"yourStationsTitle": "Your stations",
|
||
"seeAllAction": "See all",
|
||
"openFullPlayerTooltip": "Open full player",
|
||
"nothingPlayingTitle": "Nothing playing yet",
|
||
"nothingPlayingSubtitle": "Pick a station from Your stations or search to start.",
|
||
"nearYou": "Near you",
|
||
"nearYouInCountry": "Near you · {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",
|
||
"@alarmsCount": {
|
||
"placeholders": {
|
||
"count": {
|
||
"type": "int"
|
||
}
|
||
}
|
||
},
|
||
"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.",
|
||
"@activeAlarmsWithoutNextSubtitle": {
|
||
"placeholders": {
|
||
"count": {
|
||
"type": "int"
|
||
}
|
||
}
|
||
},
|
||
"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",
|
||
"@alarmFadeInLabel": {
|
||
"placeholders": {
|
||
"seconds": {
|
||
"type": "int"
|
||
}
|
||
}
|
||
},
|
||
"alarmNextExecution": "Next occurrence: {date}",
|
||
"@alarmNextExecution": {
|
||
"placeholders": {
|
||
"date": {}
|
||
}
|
||
},
|
||
"alarmNoNextExecution": "It has no active next occurrence.",
|
||
"alarmSkippedExecution": "One occurrence was skipped: {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}.",
|
||
"@alarmSkippedReturnsSnackbar": {
|
||
"placeholders": {
|
||
"date": {}
|
||
}
|
||
},
|
||
"alarmVacationPausedNoNext": "It is paused for vacations ({vacationName}) and has no next occurrence.",
|
||
"@alarmVacationPausedNoNext": {
|
||
"placeholders": {
|
||
"vacationName": {}
|
||
}
|
||
},
|
||
"alarmVacationPausedReturns": "It is paused for vacations ({vacationName}) and returns on {date}.",
|
||
"@alarmVacationPausedReturns": {
|
||
"placeholders": {
|
||
"vacationName": {},
|
||
"date": {}
|
||
}
|
||
},
|
||
"alarmVacationReturns": "With vacations enabled, it will ring again on {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)",
|
||
"@alarmFadeInSummary": {
|
||
"placeholders": {
|
||
"seconds": {
|
||
"type": "int"
|
||
}
|
||
}
|
||
},
|
||
"internalSafeSoundLabel": "Internal safe sound",
|
||
"soundWarmSunrise": "Warm sunrise",
|
||
"soundSoftBell": "Soft bell",
|
||
"soundDigitalPulse": "Digital pulse",
|
||
"favoriteStationLabel": "Favorite station",
|
||
"noStationUseInternalSound": "No station: use internal sound",
|
||
"alarmFallbackStationLabel": "Backup station",
|
||
"alarmStationPickerSearchHint": "Search for a station by name",
|
||
"alarmSnoozeDurationTitle": "Snooze duration",
|
||
"snoozeAction": "Snooze",
|
||
"alarmSnoozeOptionLabel": "{minutes} min",
|
||
"@alarmSnoozeOptionLabel": {
|
||
"placeholders": {
|
||
"minutes": {
|
||
"type": "int"
|
||
}
|
||
}
|
||
},
|
||
"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}",
|
||
"@androidReliabilityStatus": {
|
||
"placeholders": {
|
||
"exact": {},
|
||
"notifications": {},
|
||
"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",
|
||
"alarmStopFailedMessage": "We couldn't confirm the alarm stopped. Try again.",
|
||
"alarmForceStopAction": "Force stop",
|
||
"alarmMissedNotificationTitle": "Missed alarm",
|
||
"alarmMissedNotificationText": "{name} was silenced automatically after 10 minutes.",
|
||
"@alarmMissedNotificationText": {
|
||
"placeholders": {
|
||
"name": {}
|
||
}
|
||
},
|
||
"pauseAction": "Pause",
|
||
"miniPlayerOpenLabel": "Open player for {stationName}",
|
||
"@miniPlayerOpenLabel": {
|
||
"placeholders": {
|
||
"stationName": {}
|
||
}
|
||
},
|
||
"playerIconLabel": "Player",
|
||
"playbackStatusConnecting": "Connecting...",
|
||
"playbackStatusLive": "Live",
|
||
"playbackStatusPaused": "Paused",
|
||
"playbackStatusReconnecting": "Reconnecting...",
|
||
"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",
|
||
"stationCount": "{count, plural, =1{1 station} other{{count} stations}}",
|
||
"alarmIconLabel": "Musical alarm",
|
||
"vacationIconLabel": "Vacation mode",
|
||
"streamUrlHint": "https://stream.example.com:8000/radio",
|
||
"advancedEqSectionTitle": "Advanced Equalization Options",
|
||
"advancedEqEnableToggle": "Enable per-device EQ",
|
||
"advancedEqEnableToggleSubtitle": "Automatically apply a different EQ preset when your audio output changes.",
|
||
"advancedEqKnownDevicesTitle": "Known audio devices",
|
||
"advancedEqKnownDevicesEmpty": "No audio devices recorded yet. Connect a device to get started.",
|
||
"advancedEqDevicePresetLabel": "Preset: {presetName}",
|
||
"@advancedEqDevicePresetLabel": {
|
||
"placeholders": {
|
||
"presetName": {}
|
||
}
|
||
},
|
||
"preNoticeCountdown": "Starts in {minutes} min",
|
||
"snoozeCountdown": "Rings in {minutes} min",
|
||
"@snoozeCountdown": {
|
||
"placeholders": {
|
||
"minutes": {
|
||
"type": "int"
|
||
}
|
||
}
|
||
},
|
||
"snoozeAgainAction": "Snooze again",
|
||
"alarmRingingNotificationTitle": "PluriWave alarm",
|
||
"alarmFireChannelName": "Ringing alarms",
|
||
"alarmFireChannelDescription": "Urgent sound and screen when a music alarm must ring",
|
||
"alarmPreNoticeChannelName": "Alarm reminders",
|
||
"alarmPreNoticeChannelDescription": "Silent notifications before the alarm",
|
||
"openFolderChooserTitle": "Open folder",
|
||
"openRecordingChooserTitle": "Open recording",
|
||
"@preNoticeCountdown": {
|
||
"placeholders": {
|
||
"minutes": {
|
||
"type": "int"
|
||
}
|
||
}
|
||
},
|
||
"eqDeviceEditTitle": "Edit device",
|
||
"eqDeviceNameLabel": "Device name",
|
||
"eqDeviceNameHint": "e.g. Living Room Speaker",
|
||
"eqDeviceNameConfirm": "Save",
|
||
"eqDeviceConnected": "Connected",
|
||
"eqDeviceActiveOutput": "Audio is playing through this device",
|
||
"eqDeviceRemove": "Remove device",
|
||
"eqDeviceRemoved": "{device} removed",
|
||
"@eqDeviceRemoved": {
|
||
"placeholders": {
|
||
"device": {}
|
||
}
|
||
},
|
||
"localMusicSectionTitle": "Local music (Android Auto)",
|
||
"localMusicSectionDescription": "Pick a folder on this device to browse and play its audio files from the car.",
|
||
"localMusicFolderNotConfigured": "No folder selected",
|
||
"localMusicFolderTitle": "Local music folder",
|
||
"localMusicChoosePath": "Choose folder",
|
||
"localMusicChangePath": "Change folder",
|
||
"localMusicFolderUpdated": "Local music folder updated",
|
||
"localMusicFolderSaveError": "Could not save the folder: {error}",
|
||
"@localMusicFolderSaveError": {
|
||
"placeholders": {
|
||
"error": {}
|
||
}
|
||
},
|
||
"localMusicFolderGenericName": "Selected folder"
|
||
}
|