diff --git a/lib/l10n/app_localizations.dart b/lib/l10n/app_localizations.dart index 07d59020..05bcad9f 100644 --- a/lib/l10n/app_localizations.dart +++ b/lib/l10n/app_localizations.dart @@ -107,6 +107,7 @@ abstract class AppLocalizations { Locale('de'), Locale('en'), Locale('es'), + Locale('es', 'ES'), Locale('fr'), Locale('hi'), Locale('id'), @@ -114,6 +115,7 @@ abstract class AppLocalizations { Locale('ko'), Locale('nl'), Locale('pt'), + Locale('pt', 'PT'), Locale('ru'), Locale('zh'), Locale('zh', 'CN'), @@ -816,6 +818,12 @@ abstract class AppLocalizations { /// **'The talented artist who created our beautiful app logo!'** String get aboutLogoArtist; + /// Section for translators + /// + /// In en, this message translates to: + /// **'Translators'** + String get aboutTranslators; + /// Section for special thanks /// /// In en, this message translates to: @@ -3699,6 +3707,22 @@ class _AppLocalizationsDelegate AppLocalizations lookupAppLocalizations(Locale locale) { // Lookup logic when language+country codes are specified. switch (locale.languageCode) { + case 'es': + { + switch (locale.countryCode) { + case 'ES': + return AppLocalizationsEsEs(); + } + break; + } + case 'pt': + { + switch (locale.countryCode) { + case 'PT': + return AppLocalizationsPtPt(); + } + break; + } case 'zh': { switch (locale.countryCode) { diff --git a/lib/l10n/app_localizations_de.dart b/lib/l10n/app_localizations_de.dart index b2175eb8..a02bc6c0 100644 --- a/lib/l10n/app_localizations_de.dart +++ b/lib/l10n/app_localizations_de.dart @@ -115,7 +115,7 @@ class AppLocalizationsDe extends AppLocalizations { String get settingsTitle => 'Einstellungen'; @override - String get settingsDownload => 'Download'; + String get settingsDownload => 'Herunterladen'; @override String get settingsAppearance => 'Erscheinungsbild'; @@ -130,7 +130,7 @@ class AppLocalizationsDe extends AppLocalizations { String get settingsAbout => 'Über'; @override - String get downloadTitle => 'Download'; + String get downloadTitle => 'Herunterladen'; @override String get downloadLocation => 'Download-Speicherort'; @@ -410,40 +410,46 @@ class AppLocalizationsDe extends AppLocalizations { @override String get aboutLogoArtist => - 'The talented artist who created our beautiful app logo!'; + 'Der talentierte Künstler, der unser wunderschönes App-Logo entworfen hat!'; @override - String get aboutSpecialThanks => 'Special Thanks'; + String get aboutTranslators => 'Translators'; + + @override + String get aboutSpecialThanks => 'Besonderer Dank'; @override String get aboutLinks => 'Links'; @override - String get aboutMobileSource => 'Mobile source code'; + String get aboutMobileSource => 'Mobiler Quellcode'; @override - String get aboutPCSource => 'PC source code'; + String get aboutPCSource => 'PC Quellcode'; @override - String get aboutReportIssue => 'Report an issue'; + String get aboutReportIssue => 'Problem melden'; @override - String get aboutReportIssueSubtitle => 'Report any problems you encounter'; + String get aboutReportIssueSubtitle => + 'Melde jedes Problem, die dir auftreten'; @override - String get aboutFeatureRequest => 'Feature request'; + String get aboutFeatureRequest => 'Feature vorschlagen'; @override - String get aboutFeatureRequestSubtitle => 'Suggest new features for the app'; + String get aboutFeatureRequestSubtitle => + 'Schlage neue Funktionen für die App vor'; @override String get aboutSupport => 'Support'; @override - String get aboutBuyMeCoffee => 'Buy me a coffee'; + String get aboutBuyMeCoffee => 'Spendiere mir einen Kaffee'; @override - String get aboutBuyMeCoffeeSubtitle => 'Support development on Ko-fi'; + String get aboutBuyMeCoffeeSubtitle => + 'Unterstütze die Entwicklung auf Ko-fi'; @override String get aboutApp => 'App'; @@ -453,25 +459,25 @@ class AppLocalizationsDe extends AppLocalizations { @override String get aboutBinimumDesc => - 'The creator of QQDL & HiFi API. Without this API, Tidal downloads wouldn\'t exist!'; + 'Der Schöpfer der QQDL & HiFi API. Ohne diese API gäbe es keine Tidal-Downloads!'; @override String get aboutSachinsenalDesc => - 'The original HiFi project creator. The foundation of Tidal integration!'; + 'Der ursprüngliche Entwickler des HiFi-Projekts. Die Grundlage der Tidal-Integration!'; @override String get aboutDoubleDouble => 'DoubleDouble'; @override String get aboutDoubleDoubleDesc => - 'Amazing API for Amazon Music downloads. Thank you for making it free!'; + 'Wundervolle API für Amazon Music Downloads.\nVielen Dank, dass Sie sie kostenlos zur Verfügung stellen!'; @override String get aboutDabMusic => 'DAB Music'; @override String get aboutDabMusicDesc => - 'The best Qobuz streaming API. Hi-Res downloads wouldn\'t be possible without this!'; + 'Die beste Qobuz-Streaming-API. Hi-Res-Downloads wären ohne diese nicht möglich!'; @override String get aboutAppDescription => diff --git a/lib/l10n/app_localizations_en.dart b/lib/l10n/app_localizations_en.dart index 141f8d15..eadd58ce 100644 --- a/lib/l10n/app_localizations_en.dart +++ b/lib/l10n/app_localizations_en.dart @@ -402,6 +402,9 @@ class AppLocalizationsEn extends AppLocalizations { String get aboutLogoArtist => 'The talented artist who created our beautiful app logo!'; + @override + String get aboutTranslators => 'Translators'; + @override String get aboutSpecialThanks => 'Special Thanks'; diff --git a/lib/l10n/app_localizations_es.dart b/lib/l10n/app_localizations_es.dart index 77660a73..2acbccf3 100644 --- a/lib/l10n/app_localizations_es.dart +++ b/lib/l10n/app_localizations_es.dart @@ -402,6 +402,9 @@ class AppLocalizationsEs extends AppLocalizations { String get aboutLogoArtist => 'The talented artist who created our beautiful app logo!'; + @override + String get aboutTranslators => 'Translators'; + @override String get aboutSpecialThanks => 'Special Thanks'; @@ -2019,3 +2022,2029 @@ class AppLocalizationsEs extends AppLocalizations { return 'Error: $message'; } } + +/// The translations for Spanish Castilian, as used in Spain (`es_ES`). +class AppLocalizationsEsEs extends AppLocalizationsEs { + AppLocalizationsEsEs() : super('es_ES'); + + @override + String get appName => 'SpotiFLAC'; + + @override + String get appDescription => + 'Descargue pistas de Spotify con calidad sin pérdida de Tidal, Qobuz y Amazon Music.'; + + @override + String get navHome => 'Inicio'; + + @override + String get navHistory => 'Historial'; + + @override + String get navSettings => 'Ajustes'; + + @override + String get navStore => 'Tienda'; + + @override + String get homeTitle => 'Inicio'; + + @override + String get homeSearchHint => 'Pegar URL Spotify o buscar...'; + + @override + String homeSearchHintExtension(String extensionName) { + return 'Buscar con $extensionName...'; + } + + @override + String get homeSubtitle => 'Pegar enlace de Spotify o buscar por nombre'; + + @override + String get homeSupports => + 'Soportes: Pista, Álbum, Lista de reproducción, URLs de Artistas'; + + @override + String get homeRecent => 'Recientes'; + + @override + String get historyTitle => 'Historial'; + + @override + String historyDownloading(int count) { + return 'Descargando ($count)'; + } + + @override + String get historyDownloaded => 'Descargado'; + + @override + String get historyFilterAll => 'Todo'; + + @override + String get historyFilterAlbums => 'Álbumes'; + + @override + String get historyFilterSingles => 'Pistas'; + + @override + String historyTracksCount(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$count pistas', + one: '1 pista', + ); + return '$_temp0'; + } + + @override + String historyAlbumsCount(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$count álbumes', + one: '1 álbum', + ); + return '$_temp0'; + } + + @override + String get historyNoDownloads => 'No hay historial de descargas'; + + @override + String get historyNoDownloadsSubtitle => + 'Las pistas descargadas aparecerán aquí'; + + @override + String get historyNoAlbums => 'No hay descargas de álbum'; + + @override + String get historyNoAlbumsSubtitle => + 'Descargar múltiples pistas de un álbum para verlas aquí'; + + @override + String get historyNoSingles => 'No hay descargas'; + + @override + String get historyNoSinglesSubtitle => + 'Las descargas de una sola pista aparecerán aquí'; + + @override + String get settingsTitle => 'Ajustes'; + + @override + String get settingsDownload => 'Descargar'; + + @override + String get settingsAppearance => 'Apariencia'; + + @override + String get settingsOptions => 'Opciones'; + + @override + String get settingsExtensions => 'Extensiones'; + + @override + String get settingsAbout => 'Acerca de'; + + @override + String get downloadTitle => 'Descargar'; + + @override + String get downloadLocation => 'Ubicación de descarga'; + + @override + String get downloadLocationSubtitle => 'Elija dónde guardar los archivos'; + + @override + String get downloadLocationDefault => 'Ubicación predeterminada'; + + @override + String get downloadDefaultService => 'Servicio por defecto'; + + @override + String get downloadDefaultServiceSubtitle => 'Servicio usado para descargas'; + + @override + String get downloadDefaultQuality => 'Calidad por defecto'; + + @override + String get downloadAskQuality => 'Preguntar calidad antes de descargar'; + + @override + String get downloadAskQualitySubtitle => + 'Mostrar selector de calidad para cada descarga'; + + @override + String get downloadFilenameFormat => 'Formato del nombre del archivo'; + + @override + String get downloadFolderOrganization => 'Organización de carpetas'; + + @override + String get downloadSeparateSingles => 'Separar Pistas'; + + @override + String get downloadSeparateSinglesSubtitle => + 'Colocar pistas individuales en una carpeta separada'; + + @override + String get qualityBest => 'Mejor disponible'; + + @override + String get qualityFlac => 'FLAC'; + + @override + String get quality320 => '320 kbps'; + + @override + String get quality128 => '128 kbps'; + + @override + String get appearanceTitle => 'Apariencia'; + + @override + String get appearanceTheme => 'Tema'; + + @override + String get appearanceThemeSystem => 'Sistema'; + + @override + String get appearanceThemeLight => 'Claro'; + + @override + String get appearanceThemeDark => 'Oscuro'; + + @override + String get appearanceDynamicColor => 'Color dinámico'; + + @override + String get appearanceDynamicColorSubtitle => + 'Usar colores de tu fondo de pantalla'; + + @override + String get appearanceAccentColor => 'Color Secundario'; + + @override + String get appearanceHistoryView => 'Vista de Historial'; + + @override + String get appearanceHistoryViewList => 'Lista'; + + @override + String get appearanceHistoryViewGrid => 'Cuadrícula'; + + @override + String get optionsTitle => 'Opciones'; + + @override + String get optionsSearchSource => 'Buscar Fuente'; + + @override + String get optionsPrimaryProvider => 'Proveedor Principal'; + + @override + String get optionsPrimaryProviderSubtitle => + 'Servicio usado al buscar por nombre de la pista.'; + + @override + String optionsUsingExtension(String extensionName) { + return 'Usando la extensión: $extensionName'; + } + + @override + String get optionsSwitchBack => + 'Toque Deezer o Spotify para volver desde la extensión'; + + @override + String get optionsAutoFallback => 'Alternativa automática'; + + @override + String get optionsAutoFallbackSubtitle => + 'Pruebe otros servicios si falla la descarga'; + + @override + String get optionsUseExtensionProviders => 'Usar proveedores de extensiones'; + + @override + String get optionsUseExtensionProvidersOn => + 'Las extensiones serán probadas primero'; + + @override + String get optionsUseExtensionProvidersOff => + 'Utilizando sólo proveedores integrados'; + + @override + String get optionsEmbedLyrics => 'Incrustar Letras'; + + @override + String get optionsEmbedLyricsSubtitle => + 'Insertar letras sincronizadas en archivos FLAC'; + + @override + String get optionsMaxQualityCover => 'Carátula de calidad máxima'; + + @override + String get optionsMaxQualityCoverSubtitle => + 'Descargar carátula de resolución máxima'; + + @override + String get optionsConcurrentDownloads => 'Descargas Simultáneas'; + + @override + String get optionsConcurrentSequential => 'Secuencial (1 a la vez)'; + + @override + String optionsConcurrentParallel(int count) { + return '$count descargas paralelas'; + } + + @override + String get optionsConcurrentWarning => + 'Las descargas paralelas pueden activar la limitación de velocidad'; + + @override + String get optionsExtensionStore => 'Tienda de extensiones'; + + @override + String get optionsExtensionStoreSubtitle => + 'Mostrar pestaña de tienda en la navegación'; + + @override + String get optionsCheckUpdates => 'Comprobar actualizaciones'; + + @override + String get optionsCheckUpdatesSubtitle => + 'Notificar cuando una nueva versión esté disponible'; + + @override + String get optionsUpdateChannel => 'Tipo de actualizaciones'; + + @override + String get optionsUpdateChannelStable => 'Sólo versiones estables'; + + @override + String get optionsUpdateChannelPreview => 'Versión preliminar'; + + @override + String get optionsUpdateChannelWarning => + 'La Versión preliminar puede contener errores o características incompletas'; + + @override + String get optionsClearHistory => 'Borrar el historial de descargas'; + + @override + String get optionsClearHistorySubtitle => + 'Eliminar todas las pistas descargadas del historial'; + + @override + String get optionsDetailedLogging => 'Registro detallado'; + + @override + String get optionsDetailedLoggingOn => + 'Registros detallados están siendo registrados'; + + @override + String get optionsDetailedLoggingOff => 'Habilitar para informes de errores'; + + @override + String get optionsSpotifyCredentials => 'Credenciales de Spotify'; + + @override + String optionsSpotifyCredentialsConfigured(String clientId) { + return 'ID de cliente: $clientId...'; + } + + @override + String get optionsSpotifyCredentialsRequired => + 'Requerido - toque para configurar'; + + @override + String get optionsSpotifyWarning => + 'Spotify requiere tus propias credenciales API. Obténgalas gratis de developer.spotify.com'; + + @override + String get extensionsTitle => 'Extensiones'; + + @override + String get extensionsInstalled => 'Extensiones instaladas'; + + @override + String get extensionsNone => 'No hay extensiones instaladas'; + + @override + String get extensionsNoneSubtitle => + 'Instalar extensiones desde la pestaña Tienda'; + + @override + String get extensionsEnabled => 'Habilitado'; + + @override + String get extensionsDisabled => 'Deshabilitado'; + + @override + String extensionsVersion(String version) { + return 'Versión $version'; + } + + @override + String extensionsAuthor(String author) { + return 'por $author'; + } + + @override + String get extensionsUninstall => 'Desinstalar'; + + @override + String get extensionsSetAsSearch => 'Establecer como proveedor de búsqueda'; + + @override + String get storeTitle => 'Tienda de extensiones'; + + @override + String get storeSearch => 'Buscar extensiones...'; + + @override + String get storeInstall => 'Instalar'; + + @override + String get storeInstalled => 'Instalada'; + + @override + String get storeUpdate => 'Actualizar'; + + @override + String get aboutTitle => 'Acerca de'; + + @override + String get aboutContributors => 'Colaboradores'; + + @override + String get aboutMobileDeveloper => 'Desarrollador de versiones móviles'; + + @override + String get aboutOriginalCreator => 'Creador original de SpotiFLAC'; + + @override + String get aboutLogoArtist => + '¡El talentoso artista que creó nuestro hermoso logo!'; + + @override + String get aboutSpecialThanks => 'Agradecimientos especiales'; + + @override + String get aboutLinks => 'Enlaces'; + + @override + String get aboutMobileSource => 'Código fuente móvil'; + + @override + String get aboutPCSource => 'Código fuente de PC'; + + @override + String get aboutReportIssue => 'Reportar un problema'; + + @override + String get aboutReportIssueSubtitle => + 'Reporta cualquier problema que encuentres'; + + @override + String get aboutFeatureRequest => 'Sugerir una función'; + + @override + String get aboutFeatureRequestSubtitle => + 'Sugerir nuevas funciones para la aplicación'; + + @override + String get aboutSupport => 'Soporte'; + + @override + String get aboutBuyMeCoffee => 'Invítame a un café'; + + @override + String get aboutBuyMeCoffeeSubtitle => 'Apoyar el desarrollo en Ko-fi'; + + @override + String get aboutApp => 'Aplicación'; + + @override + String get aboutVersion => 'Versión'; + + @override + String get aboutBinimumDesc => + 'El creador de la API QQDL & Hi-Fi. ¡Sin esta API, las descargas de Tidal no existiría!'; + + @override + String get aboutSachinsenalDesc => + 'El creador original del proyecto Hi-Fi. ¡La base de la integración de Tidal!'; + + @override + String get aboutDoubleDouble => 'DoubleDouble'; + + @override + String get aboutDoubleDoubleDesc => + 'API increible para descargas de Amazon Music. ¡Gracias por hacerla gratis!'; + + @override + String get aboutDabMusic => 'Música DAB'; + + @override + String get aboutDabMusicDesc => + 'La mejor API de streaming de Qobuz. ¡Las descargas de Hi-Res no serían posibles sin esto!'; + + @override + String get aboutAppDescription => + 'Descarga pistas de Spotify con calidad sin pérdida de Tidal, Qobuz y Amazon Music.'; + + @override + String get albumTitle => 'Álbum'; + + @override + String albumTracks(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$count pistas', + one: '1 pista', + ); + return '$_temp0'; + } + + @override + String get albumDownloadAll => 'Descargar Todo'; + + @override + String get albumDownloadRemaining => 'Descargas Restantes'; + + @override + String get playlistTitle => 'Lista de reproducción'; + + @override + String get artistTitle => 'Artista'; + + @override + String get artistAlbums => 'Álbumes'; + + @override + String get artistSingles => 'Pistas y EPs'; + + @override + String get artistCompilations => 'Compilaciones'; + + @override + String artistReleases(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$count lanzamientos', + one: '1 lanzamiento', + ); + return '$_temp0'; + } + + @override + String get artistPopular => 'Populares'; + + @override + String artistMonthlyListeners(String count) { + return '$count oyentes mensuales'; + } + + @override + String get trackMetadataTitle => 'Información de pista'; + + @override + String get trackMetadataArtist => 'Artista'; + + @override + String get trackMetadataAlbum => 'Álbum'; + + @override + String get trackMetadataDuration => 'Duración'; + + @override + String get trackMetadataQuality => 'Calidad'; + + @override + String get trackMetadataPath => 'Ruta del archivo'; + + @override + String get trackMetadataDownloadedAt => 'Descargado'; + + @override + String get trackMetadataService => 'Servicio'; + + @override + String get trackMetadataPlay => 'Reproducir'; + + @override + String get trackMetadataShare => 'Compartir'; + + @override + String get trackMetadataDelete => 'Eliminar'; + + @override + String get trackMetadataRedownload => 'Volver a descargar'; + + @override + String get trackMetadataOpenFolder => 'Abrir carpeta'; + + @override + String get setupTitle => 'Bienvenido a SpotiFLAC'; + + @override + String get setupSubtitle => 'Comencemos'; + + @override + String get setupStoragePermission => 'Permiso de almacenamiento'; + + @override + String get setupStoragePermissionSubtitle => + 'Necesario para guardar los archivos descargados'; + + @override + String get setupStoragePermissionGranted => 'Permiso aprobado'; + + @override + String get setupStoragePermissionDenied => 'Permiso denegado'; + + @override + String get setupGrantPermission => 'Conceder permiso'; + + @override + String get setupDownloadLocation => 'Ubicación de descarga'; + + @override + String get setupChooseFolder => 'Seleccionar Carpeta'; + + @override + String get setupContinue => 'Continuar'; + + @override + String get setupSkip => 'Omitir por ahora'; + + @override + String get setupStorageAccessRequired => 'Acceso al almacenamiento requerido'; + + @override + String get setupStorageAccessMessage => + 'SpotiFLAC necesita permiso de \"Todos los archivos de acceso\" para guardar los archivos de música en la carpeta elegida.'; + + @override + String get setupStorageAccessMessageAndroid11 => + 'Android 11+ requiere permiso \"Todos los archivos de acceso\" para guardar los archivos en la carpeta de descargas elegida.'; + + @override + String get setupOpenSettings => 'Abrir ajustes'; + + @override + String get setupPermissionDeniedMessage => + 'Permiso denegado. Por favor, conceda todos los permisos para continuar.'; + + @override + String setupPermissionRequired(String permissionType) { + return 'Permiso de $permissionType requerido'; + } + + @override + String setupPermissionRequiredMessage(String permissionType) { + return 'Se requiere un permiso $permissionType para la mejor experiencia. Puedes cambiar esto más tarde en ajustes.'; + } + + @override + String get setupSelectDownloadFolder => 'Seleccionar carpeta de descarga'; + + @override + String get setupUseDefaultFolder => '¿Usar carpeta por defecto?'; + + @override + String get setupNoFolderSelected => + 'No se ha seleccionado ninguna carpeta. ¿Desea utilizar la carpeta por defecto?'; + + @override + String get setupUseDefault => 'Usar por defecto'; + + @override + String get setupDownloadLocationTitle => 'Ubicación de descarga'; + + @override + String get setupDownloadLocationIosMessage => + 'En iOS, las descargas se guardan en la carpeta de documentos de la aplicación. Puede acceder a ellas desde la aplicación Archivos.'; + + @override + String get setupAppDocumentsFolder => 'Carpeta de documentos de App'; + + @override + String get setupAppDocumentsFolderSubtitle => + 'Recomendado - accesible desde la aplicación Archivos'; + + @override + String get setupChooseFromFiles => 'Elegir de archivos'; + + @override + String get setupChooseFromFilesSubtitle => + 'Seleccione iCloud u otra ubicación'; + + @override + String get setupIosEmptyFolderWarning => + 'Limitación de iOS: No se pueden seleccionar carpetas vacías. Elige una carpeta con al menos un archivo.'; + + @override + String get setupDownloadInFlac => 'Descargar pistas de Spotify en FLAC'; + + @override + String get setupStepStorage => 'Almacenamiento'; + + @override + String get setupStepNotification => 'Notificación'; + + @override + String get setupStepFolder => 'Carpeta'; + + @override + String get setupStepSpotify => 'Spotify'; + + @override + String get setupStepPermission => 'Permiso'; + + @override + String get setupStorageGranted => '¡Permiso de almacenamiento concedido!'; + + @override + String get setupStorageRequired => 'Permiso de almacenamiento requerido'; + + @override + String get setupStorageDescription => + 'SpotiFLAC necesita permiso de almacenamiento para guardar sus archivos de música descargados.'; + + @override + String get setupNotificationGranted => + '¡Acceso a las notificaciones permitido!'; + + @override + String get setupNotificationEnable => 'Activar notificaciones'; + + @override + String get setupNotificationDescription => + 'Recibe notificaciones cuando las descargas completen o requieran atención.'; + + @override + String get setupFolderSelected => '¡Carpeta de descarga seleccionada!'; + + @override + String get setupFolderChoose => 'Cambiar carpeta de descargas'; + + @override + String get setupFolderDescription => + 'Seleccione una carpeta donde se guardará la música descargada.'; + + @override + String get setupChangeFolder => 'Cambiar carpeta'; + + @override + String get setupSelectFolder => 'Seleccionar Carpeta'; + + @override + String get setupSpotifyApiOptional => 'API de Spotify (opcional)'; + + @override + String get setupSpotifyApiDescription => + 'Añade tus credenciales de la API de Spotify para mejores resultados de búsqueda y acceso al contenido exclusivo de Spotify.'; + + @override + String get setupUseSpotifyApi => 'Usar API de Spotify'; + + @override + String get setupEnterCredentialsBelow => + 'Ingresa tus credenciales a continuación'; + + @override + String get setupUsingDeezer => 'Usando Deezer (no se necesita cuenta)'; + + @override + String get setupEnterClientId => 'Introduzca el ID de cliente de Spotify'; + + @override + String get setupEnterClientSecret => 'Ingresa el Client Secret de Spotify'; + + @override + String get setupGetFreeCredentials => + 'Obtén tus credenciales gratuitas de la API desde el Spotify Developer Dashboard.'; + + @override + String get setupEnableNotifications => 'Activar notificaciones'; + + @override + String get setupProceedToNextStep => + 'Ahora puedes continuar con el siguiente paso.'; + + @override + String get setupNotificationProgressDescription => + 'Recibirás notificaciones de progreso de descargas.'; + + @override + String get setupNotificationBackgroundDescription => + 'Recibe notificaciones sobre el progreso de la descarga y la finalización. Esto te ayuda a rastrear las descargas cuando la aplicación está en segundo plano.'; + + @override + String get setupSkipForNow => 'Omitir por ahora'; + + @override + String get setupBack => 'Atrás'; + + @override + String get setupNext => 'Siguiente'; + + @override + String get setupGetStarted => 'Empezar'; + + @override + String get setupSkipAndStart => 'Saltar y empezar'; + + @override + String get setupAllowAccessToManageFiles => + 'Por favor, activa \"Permitir el acceso para gestionar todos los archivos\" en la siguiente pantalla.'; + + @override + String get setupGetCredentialsFromSpotify => + 'Obtener credenciales de developer.spotify.com'; + + @override + String get dialogCancel => 'Cancelar'; + + @override + String get dialogOk => 'Aceptar'; + + @override + String get dialogSave => 'Guardar'; + + @override + String get dialogDelete => 'Eliminar'; + + @override + String get dialogRetry => 'Volver a intentar'; + + @override + String get dialogClose => 'Cerrar'; + + @override + String get dialogYes => 'Sí'; + + @override + String get dialogNo => 'No'; + + @override + String get dialogClear => 'Borrar'; + + @override + String get dialogConfirm => 'Confirmar'; + + @override + String get dialogDone => 'Hecho'; + + @override + String get dialogImport => 'Importar'; + + @override + String get dialogDiscard => 'Descartar'; + + @override + String get dialogRemove => 'Eliminar'; + + @override + String get dialogUninstall => 'Desinstalar'; + + @override + String get dialogDiscardChanges => '¿Descartar cambios?'; + + @override + String get dialogUnsavedChanges => + 'Tienes cambios sin guardar. ¿Quieres descartarlos?'; + + @override + String get dialogDownloadFailed => 'Descarga fallida'; + + @override + String get dialogTrackLabel => 'Pista:'; + + @override + String get dialogArtistLabel => 'Artista:'; + + @override + String get dialogErrorLabel => 'Error:'; + + @override + String get dialogClearAll => 'Eliminar todo'; + + @override + String get dialogClearAllDownloads => + '¿Estás seguro de que quieres borrar todas las descargas?'; + + @override + String get dialogRemoveFromDevice => '¿Eliminar del dispositivo?'; + + @override + String get dialogRemoveExtension => 'Eliminar extensión'; + + @override + String get dialogRemoveExtensionMessage => + '¿Estás seguro de que quieres eliminar esta extensión? Esto no se puede deshacer.'; + + @override + String get dialogUninstallExtension => '¿Desinstalar extensión?'; + + @override + String dialogUninstallExtensionMessage(String extensionName) { + return '¿Estás seguro de que quieres eliminar $extensionName?'; + } + + @override + String get dialogClearHistoryTitle => 'Borrar historial'; + + @override + String get dialogClearHistoryMessage => + '¿Estás seguro de que quieres borrar todo el historial de descargas? Esta acción no se puede deshacer.'; + + @override + String get dialogDeleteSelectedTitle => 'Borrar Seleccionados'; + + @override + String dialogDeleteSelectedMessage(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'pistas', + one: 'pista', + ); + return '¿Eliminar $count $_temp0 del historial?\n\nEsto también eliminará los archivos del almacenamiento.'; + } + + @override + String get dialogImportPlaylistTitle => 'Importar lista de reproducción'; + + @override + String dialogImportPlaylistMessage(int count) { + return 'Se han encontrado pistas $count en CSV. ¿Añadirlas para descargar la cola?'; + } + + @override + String snackbarAddedToQueue(String trackName) { + return 'Añadido \"$trackName\" a la cola'; + } + + @override + String snackbarAddedTracksToQueue(int count) { + return 'Añadidas pistas $count a la cola'; + } + + @override + String snackbarAlreadyDownloaded(String trackName) { + return '\"$trackName\" ya descargado'; + } + + @override + String get snackbarHistoryCleared => 'Historial borrado'; + + @override + String get snackbarCredentialsSaved => 'Credenciales guardadas'; + + @override + String get snackbarCredentialsCleared => 'Credenciales borradas'; + + @override + String snackbarDeletedTracks(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'pistas', + one: 'pista', + ); + return 'Eliminado $count $_temp0'; + } + + @override + String snackbarCannotOpenFile(String error) { + return 'No se puede abrir el archivo: $error'; + } + + @override + String get snackbarFillAllFields => 'Por favor, completa todos los campos'; + + @override + String get snackbarViewQueue => 'Ver cola'; + + @override + String snackbarFailedToLoad(String error) { + return 'Error al cargar: $error'; + } + + @override + String snackbarUrlCopied(String platform) { + return 'URL $platform copiada al portapapeles'; + } + + @override + String get snackbarFileNotFound => 'Archivo no encontrado'; + + @override + String get snackbarSelectExtFile => + 'Por favor, seleccione un archivo .spotiflac-ext'; + + @override + String get snackbarProviderPrioritySaved => 'Prioridad de proveedor guardada'; + + @override + String get snackbarMetadataProviderSaved => + 'Prioridad de proveedor de metadatos guardada'; + + @override + String snackbarExtensionInstalled(String extensionName) { + return '$extensionName instalado.'; + } + + @override + String snackbarExtensionUpdated(String extensionName) { + return '$extensionName actualizada.'; + } + + @override + String get snackbarFailedToInstall => 'Fallo al instalar la extensión'; + + @override + String get snackbarFailedToUpdate => 'Error al actualizar la extensión'; + + @override + String get errorRateLimited => 'Límite Excedido'; + + @override + String get errorRateLimitedMessage => + 'Demasiadas solicitudes. Por favor, espere un momento antes de buscar de nuevo.'; + + @override + String errorFailedToLoad(String item) { + return 'Error al cargar $item'; + } + + @override + String get errorNoTracksFound => 'No se encontraron pistas'; + + @override + String errorMissingExtensionSource(String item) { + return 'No se puede cargar $item: falta una fuente de extensión'; + } + + @override + String get statusQueued => 'En cola'; + + @override + String get statusDownloading => 'Descargando'; + + @override + String get statusFinalizing => 'Finalizando'; + + @override + String get statusCompleted => 'Completado'; + + @override + String get statusFailed => 'Error'; + + @override + String get statusSkipped => 'Omitido'; + + @override + String get statusPaused => 'Pausado'; + + @override + String get actionPause => 'Pausar'; + + @override + String get actionResume => 'Reanudar'; + + @override + String get actionCancel => 'Cancelar'; + + @override + String get actionStop => 'Detener'; + + @override + String get actionSelect => 'Seleccionar'; + + @override + String get actionSelectAll => 'Seleccionar Todo'; + + @override + String get actionDeselect => 'Deseleccionar'; + + @override + String get actionPaste => 'Pegar'; + + @override + String get actionImportCsv => 'Importar CSV'; + + @override + String get actionRemoveCredentials => 'Eliminar credenciales'; + + @override + String get actionSaveCredentials => 'Guardar credenciales'; + + @override + String selectionSelected(int count) { + return '$count seleccionado'; + } + + @override + String get selectionAllSelected => 'Todas las pistas seleccionadas'; + + @override + String get selectionTapToSelect => 'Toca las pistas para seleccionar'; + + @override + String selectionDeleteTracks(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'pistas', + one: 'pista', + ); + return '¡Eliminar $count $_temp0'; + } + + @override + String get selectionSelectToDelete => 'Seleccionar pistas a eliminar'; + + @override + String progressFetchingMetadata(int current, int total) { + return 'Obteniendo metadatos... $current/$total'; + } + + @override + String get progressReadingCsv => 'Leyendo CSV...'; + + @override + String get searchSongs => 'Canciones'; + + @override + String get searchArtists => 'Artistas'; + + @override + String get searchAlbums => 'Álbumes'; + + @override + String get searchPlaylists => 'Listas de reproducción'; + + @override + String get tooltipPlay => 'Reproducir'; + + @override + String get tooltipCancel => 'Cancelar'; + + @override + String get tooltipStop => 'Detener'; + + @override + String get tooltipRetry => 'Volver a intentar'; + + @override + String get tooltipRemove => 'Eliminar'; + + @override + String get tooltipClear => 'Borrar'; + + @override + String get tooltipPaste => 'Pegar'; + + @override + String get filenameFormat => 'Formato del nombre del archivo'; + + @override + String filenameFormatPreview(String preview) { + return 'Vista previa: $preview'; + } + + @override + String get filenameAvailablePlaceholders => 'Marcadores disponibles:'; + + @override + String filenameHint(Object artist, Object title) { + return '$artist - $title'; + } + + @override + String get folderOrganization => 'Organización de carpetas'; + + @override + String get folderOrganizationNone => 'Ninguna organización'; + + @override + String get folderOrganizationByArtist => 'Por Artista'; + + @override + String get folderOrganizationByAlbum => 'Por Álbum'; + + @override + String get folderOrganizationByArtistAlbum => 'Artista/Álbum'; + + @override + String get folderOrganizationDescription => + 'Organizar los archivos descargados en carpetas'; + + @override + String get folderOrganizationNoneSubtitle => + 'Todos los archivos de la carpeta de descargas'; + + @override + String get folderOrganizationByArtistSubtitle => + 'Carpeta separada para cada artista'; + + @override + String get folderOrganizationByAlbumSubtitle => + 'Carpeta separada para cada artista'; + + @override + String get folderOrganizationByArtistAlbumSubtitle => + 'Carpetas organizadas por artista y álbum'; + + @override + String get updateAvailable => 'Actualización Disponible'; + + @override + String updateNewVersion(String version) { + return 'Versión $version está disponible'; + } + + @override + String get updateDownload => 'Descargar'; + + @override + String get updateLater => 'Más tarde'; + + @override + String get updateChangelog => 'Historial de cambios'; + + @override + String get updateStartingDownload => 'Iniciando descarga...'; + + @override + String get updateDownloadFailed => 'Descarga fallida'; + + @override + String get updateFailedMessage => 'Error al descargar la actualización'; + + @override + String get updateNewVersionReady => 'Una nueva versión está lista'; + + @override + String get updateCurrent => 'Actual'; + + @override + String get updateNew => 'Nuevo'; + + @override + String get updateDownloading => 'Descargando...'; + + @override + String get updateWhatsNew => 'Novedades'; + + @override + String get updateDownloadInstall => 'Descargar & Instalar'; + + @override + String get updateDontRemind => 'No recordar'; + + @override + String get providerPriority => 'Prioridad del proveedor'; + + @override + String get providerPrioritySubtitle => + 'Arrastre para reordenar los proveedores de descarga'; + + @override + String get providerPriorityTitle => 'Prioridad del proveedor'; + + @override + String get providerPriorityDescription => + 'Arrastra para reordenar los proveedores de descarga. La aplicación intentará usar los proveedores de arriba hacia abajo al descargar las pistas.'; + + @override + String get providerPriorityInfo => + 'Si una pista no está disponible en el primer proveedor, la aplicación intentará automáticamente el siguiente.'; + + @override + String get providerBuiltIn => 'Integrado'; + + @override + String get providerExtension => 'Extensión'; + + @override + String get metadataProviderPriority => 'Prioridad del proveedor de metadatos'; + + @override + String get metadataProviderPrioritySubtitle => + 'Orden usado al recuperar metadatos de la pista'; + + @override + String get metadataProviderPriorityTitle => 'Prioridad de los metadatos'; + + @override + String get metadataProviderPriorityDescription => + 'Arrastra para reordenar los proveedores de metadatos. La aplicación probará los proveedores de arriba hacia abajo al buscar pistas y obtener los metadatos.'; + + @override + String get metadataProviderPriorityInfo => + 'Deezer no tiene límites de tasa y se recomienda como principal. Spotify puede valorar el límite después de muchas solicitudes.'; + + @override + String get metadataNoRateLimits => 'Sin límites de tasa'; + + @override + String get metadataMayRateLimit => 'Sin límites de tasa'; + + @override + String get logTitle => 'Registros'; + + @override + String get logCopy => 'Copiar Registros'; + + @override + String get logClear => 'Limpiar registros'; + + @override + String get logShare => 'Compartir Registros'; + + @override + String get logEmpty => 'No hay registros aún'; + + @override + String get logCopied => 'Registros copiados al portapapeles'; + + @override + String get logSearchHint => 'Buscar registros...'; + + @override + String get logFilterLevel => 'Nivel'; + + @override + String get logFilterSection => 'Filtrar'; + + @override + String get logShareLogs => 'Compartir registros'; + + @override + String get logClearLogs => 'Borrar registros'; + + @override + String get logClearLogsTitle => 'Limpiar registros'; + + @override + String get logClearLogsMessage => + '¿Estás seguro que deseas limpiar todos los registros?'; + + @override + String get logIspBlocking => 'BLOQUEO POR EL ISP DETECTADO'; + + @override + String get logRateLimited => 'TASA LIMITADA'; + + @override + String get logNetworkError => 'ERROR DE RED'; + + @override + String get logTrackNotFound => 'PISTA NO ENCONTRADA'; + + @override + String get logFilterBySeverity => 'Filtrar los registros por gravedad'; + + @override + String get logNoLogsYet => 'No hay registros aún'; + + @override + String get logNoLogsYetSubtitle => + 'Los registros aparecerán aquí mientras usas la aplicación'; + + @override + String get logIssueSummary => 'Resumen de Incidencias'; + + @override + String get logIspBlockingDescription => + 'Tu ISP puede estar bloqueando el acceso a los servicios de descarga'; + + @override + String get logIspBlockingSuggestion => + 'Intente usar una VPN o cambie el DNS a 1.1.1.1 o 8.8.8.8'; + + @override + String get logRateLimitedDescription => 'Demasiadas solicitudes al servicio'; + + @override + String get logRateLimitedSuggestion => + 'Espere unos minutos antes de volver a intentarlo'; + + @override + String get logNetworkErrorDescription => 'Problemas de conexión detectados'; + + @override + String get logNetworkErrorSuggestion => 'Comprueba tu conexión a internet'; + + @override + String get logTrackNotFoundDescription => + 'No se pudieron encontrar algunas pistas en los servicios de descarga'; + + @override + String get logTrackNotFoundSuggestion => + 'La pista puede no estar disponible en calidad sin pérdida'; + + @override + String logTotalErrors(int count) { + return 'Total de errores: $count'; + } + + @override + String logAffected(String domains) { + return 'Afectado: $domains'; + } + + @override + String logEntriesFiltered(int count) { + return 'Entradas ($count filtradas)'; + } + + @override + String logEntries(int count) { + return 'Entradas ($count)'; + } + + @override + String get credentialsTitle => 'Credenciales de Spotify'; + + @override + String get credentialsDescription => + 'Introduzca su ID de cliente y secreto para utilizar su propia cuota de aplicación de Spotify.'; + + @override + String get credentialsClientId => 'ID del cliente'; + + @override + String get credentialsClientIdHint => 'Pegar ID de cliente'; + + @override + String get credentialsClientSecret => 'Client Secret'; + + @override + String get credentialsClientSecretHint => 'Pegar Client Secret'; + + @override + String get channelStable => 'Estable'; + + @override + String get channelPreview => 'Vista previa'; + + @override + String get sectionSearchSource => 'Buscar Fuente'; + + @override + String get sectionDownload => 'Descargar'; + + @override + String get sectionPerformance => 'Alto rendimiento'; + + @override + String get sectionApp => 'Aplicación'; + + @override + String get sectionData => 'Datos'; + + @override + String get sectionDebug => 'Depuración'; + + @override + String get sectionService => 'Servicio'; + + @override + String get sectionAudioQuality => 'Calidad de Sonido'; + + @override + String get sectionFileSettings => 'Ajustes del archivo'; + + @override + String get sectionColor => 'Colores'; + + @override + String get sectionTheme => 'Tema'; + + @override + String get sectionLayout => 'Diseño'; + + @override + String get sectionLanguage => 'Idioma'; + + @override + String get appearanceLanguage => 'Idioma de la aplicación'; + + @override + String get appearanceLanguageSubtitle => 'Elija su idioma preferido'; + + @override + String get settingsAppearanceSubtitle => 'Tema, colores, pantalla'; + + @override + String get settingsDownloadSubtitle => + 'Servicio, calidad, formato del nombre del archivo'; + + @override + String get settingsOptionsSubtitle => + 'Alternativa, letras, carátula, actualizaciones'; + + @override + String get settingsExtensionsSubtitle => + 'Administrar proveedores de descarga'; + + @override + String get settingsLogsSubtitle => + 'Ver registros de aplicaciones para depuración'; + + @override + String get loadingSharedLink => 'Cargando enlace compartido...'; + + @override + String get pressBackAgainToExit => 'Presione de nuevo para salir'; + + @override + String get tracksHeader => 'Pistas'; + + @override + String downloadAllCount(int count) { + return 'Descargar Todo ($count)'; + } + + @override + String tracksCount(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$count pistas', + one: '1 pista', + ); + return '$_temp0'; + } + + @override + String get trackCopyFilePath => 'Copiar ruta de archivo'; + + @override + String get trackRemoveFromDevice => 'Eliminar del dispositivo'; + + @override + String get trackLoadLyrics => 'Cargar letras'; + + @override + String get trackMetadata => 'Metadatos'; + + @override + String get trackFileInfo => 'Información de archivo'; + + @override + String get trackLyrics => 'Letras'; + + @override + String get trackFileNotFound => 'Archivo no encontrado'; + + @override + String get trackOpenInDeezer => 'Abrir en Deezer'; + + @override + String get trackOpenInSpotify => 'Abrir en Spotify'; + + @override + String get trackTrackName => 'Nombre de pista'; + + @override + String get trackArtist => 'Artista'; + + @override + String get trackAlbumArtist => 'Artista del álbum'; + + @override + String get trackAlbum => 'Álbum'; + + @override + String get trackTrackNumber => 'Número de pista'; + + @override + String get trackDiscNumber => 'Número de disco'; + + @override + String get trackDuration => 'Duración'; + + @override + String get trackAudioQuality => 'Calidad del sonido'; + + @override + String get trackReleaseDate => 'Fecha de lanzamiento'; + + @override + String get trackDownloaded => 'Descargado'; + + @override + String get trackCopyLyrics => 'Copiar letras'; + + @override + String get trackLyricsNotAvailable => 'Letras no disponibles para este tema'; + + @override + String get trackLyricsTimeout => + 'Tiempo de espera agotado. Inténtalo de nuevo más tarde.'; + + @override + String get trackLyricsLoadFailed => 'Error al cargar la letra'; + + @override + String get trackCopiedToClipboard => 'Copiado al portapapeles'; + + @override + String get trackDeleteConfirmTitle => '¿Eliminar del dispositivo?'; + + @override + String get trackDeleteConfirmMessage => + 'Esto eliminará permanentemente el archivo descargado y lo eliminará de tu historial.'; + + @override + String trackCannotOpen(String message) { + return 'No se puede abrir: $message'; + } + + @override + String get dateToday => 'Hoy'; + + @override + String get dateYesterday => 'Ayer'; + + @override + String dateDaysAgo(int count) { + return 'Hace $count días'; + } + + @override + String dateWeeksAgo(int count) { + return '$count semanas antes'; + } + + @override + String dateMonthsAgo(int count) { + return '$count meses atrás'; + } + + @override + String get concurrentSequential => 'Secuencial'; + + @override + String get concurrentParallel2 => '2 simultáneamente'; + + @override + String get concurrentParallel3 => '3 simultáneamente'; + + @override + String get tapToSeeError => 'Pulse para ver los detalles del error'; + + @override + String get storeFilterAll => 'Todo'; + + @override + String get storeFilterMetadata => 'Metadatos'; + + @override + String get storeFilterDownload => 'Descargar'; + + @override + String get storeFilterUtility => 'Utilidad'; + + @override + String get storeFilterLyrics => 'Letras'; + + @override + String get storeFilterIntegration => 'Integración'; + + @override + String get storeClearFilters => 'Limpiar filtros'; + + @override + String get storeNoResults => 'No se encontraron extensiones'; + + @override + String get extensionProviderPriority => 'Prioridad del proveedor'; + + @override + String get extensionInstallButton => 'Instalar extensión'; + + @override + String get extensionDefaultProvider => 'Por defecto (Deezer/Spotify)'; + + @override + String get extensionDefaultProviderSubtitle => 'Usar búsqueda integrada'; + + @override + String get extensionAuthor => 'Autor/a'; + + @override + String get extensionId => 'ID'; + + @override + String get extensionError => 'Error'; + + @override + String get extensionCapabilities => 'Recursos'; + + @override + String get extensionMetadataProvider => 'Proveedor de metadatos'; + + @override + String get extensionDownloadProvider => 'Proveedor de descargas'; + + @override + String get extensionLyricsProvider => 'Proveedor de letras'; + + @override + String get extensionUrlHandler => 'Gestor de URL'; + + @override + String get extensionQualityOptions => 'Opciones de calidad'; + + @override + String get extensionPostProcessingHooks => 'Hooks post-procesamiento'; + + @override + String get extensionPermissions => 'Permisos'; + + @override + String get extensionSettings => 'Ajustes'; + + @override + String get extensionRemoveButton => 'Eliminar extensión'; + + @override + String get extensionUpdated => 'Actualizado'; + + @override + String get extensionMinAppVersion => 'Versión Mínima de la aplicación'; + + @override + String get extensionCustomTrackMatching => + 'Coincidencia de pista personalizada'; + + @override + String get extensionPostProcessing => 'Post-Procesamiento'; + + @override + String extensionHooksAvailable(int count) { + return '$count hook(s) disponibles'; + } + + @override + String extensionPatternsCount(int count) { + return 'Patrón(es) $count'; + } + + @override + String extensionStrategy(String strategy) { + return 'Estrategia: $strategy'; + } + + @override + String get extensionsProviderPrioritySection => 'Prioridad del proveedor'; + + @override + String get extensionsInstalledSection => 'Extensiones instaladas'; + + @override + String get extensionsNoExtensions => 'No hay extensiones instaladas'; + + @override + String get extensionsNoExtensionsSubtitle => + 'Instalar archivos .spotiflac-ext para añadir nuevos proveedores'; + + @override + String get extensionsInstallButton => 'Instalar extensión'; + + @override + String get extensionsInfoTip => + 'Las extensiones pueden añadir nuevos metadatos y proveedores de descargas. Sólo instalar extensiones desde fuentes confiables.'; + + @override + String get extensionsInstalledSuccess => 'Extensión instalada correctamente'; + + @override + String get extensionsDownloadPriority => 'Prioridad de descarga'; + + @override + String get extensionsDownloadPrioritySubtitle => + 'Establecer orden de servicio de descarga'; + + @override + String get extensionsNoDownloadProvider => + 'No hay extensiones con proveedor de descargas'; + + @override + String get extensionsMetadataPriority => 'Prioridad de los metadatos'; + + @override + String get extensionsMetadataPrioritySubtitle => + 'Establecer orden de búsqueda y metadatos'; + + @override + String get extensionsNoMetadataProvider => + 'No hay extensiones con el proveedor de metadatos'; + + @override + String get extensionsSearchProvider => 'Proveedor de búsqueda'; + + @override + String get extensionsNoCustomSearch => + 'No hay extensiones con búsqueda personalizada'; + + @override + String get extensionsSearchProviderDescription => + 'Elegir qué servicio usar para buscar pistas'; + + @override + String get extensionsCustomSearch => 'Búsqueda personalizada'; + + @override + String get extensionsErrorLoading => 'Error al cargar la extensión'; + + @override + String get qualityFlacLossless => 'FLAC Lossless'; + + @override + String get qualityFlacLosslessSubtitle => '16-bit / 44.1kHz'; + + @override + String get qualityHiResFlac => 'Hi-Res FLAC'; + + @override + String get qualityHiResFlacSubtitle => '24 bits/hasta 96kHz'; + + @override + String get qualityHiResFlacMax => 'Hi-Res FLAC Max'; + + @override + String get qualityHiResFlacMaxSubtitle => '24 bits / hasta 192kHz'; + + @override + String get qualityNote => + 'La calidad real depende de la disponibilidad de la pista del servicio'; + + @override + String get downloadAskBeforeDownload => 'Preguntar antes de descargar'; + + @override + String get downloadDirectory => 'Carpeta de descarga'; + + @override + String get downloadSeparateSinglesFolder => 'Carpeta separada para pistas'; + + @override + String get downloadAlbumFolderStructure => 'Estructura de carpeta del álbum'; + + @override + String get downloadSaveFormat => 'Guardar Formato'; + + @override + String get downloadSelectService => 'Seleccionar Servicio'; + + @override + String get downloadSelectQuality => 'Seleccionar Calidad'; + + @override + String get downloadFrom => 'Descargar Desde'; + + @override + String get downloadDefaultQualityLabel => 'Calidad por Defecto'; + + @override + String get downloadBestAvailable => 'La mejor disponible'; + + @override + String get folderNone => 'Ninguna'; + + @override + String get folderNoneSubtitle => + 'Guardar todos los archivos directamente para descargar la carpeta'; + + @override + String get folderArtist => 'Artista'; + + @override + String get folderArtistSubtitle => 'Nombre del Artista/nombre de archivo'; + + @override + String get folderAlbum => 'Álbum'; + + @override + String get folderAlbumSubtitle => 'Nombre del álbum/nombre de archivo'; + + @override + String get folderArtistAlbum => 'Artista/Álbum'; + + @override + String get folderArtistAlbumSubtitle => + 'Nombre del Artista/Nombre del Álbum/Nombre del Archivo'; + + @override + String get serviceTidal => 'Tidal'; + + @override + String get serviceQobuz => 'Qobuz'; + + @override + String get serviceAmazon => 'Amazon'; + + @override + String get serviceDeezer => 'Deezer'; + + @override + String get serviceSpotify => 'Spotify'; + + @override + String get appearanceAmoledDark => 'AMOLED Oscuro'; + + @override + String get appearanceAmoledDarkSubtitle => 'Fondo negro puro'; + + @override + String get appearanceChooseAccentColor => 'Elegir color principal'; + + @override + String get appearanceChooseTheme => 'Modo de tema'; + + @override + String get queueTitle => 'Descargas en proceso'; + + @override + String get queueClearAll => 'Eliminar todo'; + + @override + String get queueClearAllMessage => + '¿Estás seguro de que quieres borrar todas las descargas?'; + + @override + String get queueEmpty => 'No hay descargas en cola'; + + @override + String get queueEmptySubtitle => 'Añadir pistas desde la pantalla de inicio'; + + @override + String get queueClearCompleted => 'Limpiar tareas finalizadas'; + + @override + String get queueDownloadFailed => 'Descarga fallida'; + + @override + String get queueTrackLabel => 'Pista:'; + + @override + String get queueArtistLabel => 'Artista:'; + + @override + String get queueErrorLabel => 'Error:'; + + @override + String get queueUnknownError => 'Error desconocido'; + + @override + String get albumFolderArtistAlbum => 'Artista / Álbum'; + + @override + String get albumFolderArtistAlbumSubtitle => + 'Álbumes/Nombre del Artista/Nombre del Álbum/'; + + @override + String get albumFolderArtistYearAlbum => 'Artista / [Año] Álbum'; + + @override + String get albumFolderArtistYearAlbumSubtitle => + 'Álbumes/Nombre del Artista /[2005] Nombre del Álbum/'; + + @override + String get albumFolderAlbumOnly => 'Sólo álbum'; + + @override + String get albumFolderAlbumOnlySubtitle => 'Álbumes/Nombre del Álbum/'; + + @override + String get albumFolderYearAlbum => 'Álbum [Año]'; + + @override + String get albumFolderYearAlbumSubtitle => 'Álbumes/[2005] Nombre del Álbum/'; + + @override + String get downloadedAlbumDeleteSelected => 'Borrar Seleccionados'; + + @override + String downloadedAlbumDeleteMessage(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'pistas', + one: 'pista', + ); + return '¿Eliminar $count $_temp0 del historial?\n\nEsto también eliminará los archivos del almacenamiento.'; + } + + @override + String get downloadedAlbumTracksHeader => 'Pistas'; + + @override + String downloadedAlbumDownloadedCount(int count) { + return '$count descargado'; + } + + @override + String downloadedAlbumSelectedCount(int count) { + return '$count seleccionado'; + } + + @override + String get downloadedAlbumAllSelected => 'Todas las pistas seleccionadas'; + + @override + String get downloadedAlbumTapToSelect => 'Toca las pistas para seleccionar'; + + @override + String downloadedAlbumDeleteCount(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'pistas', + one: 'pista', + ); + return '¡Eliminar $count $_temp0'; + } + + @override + String get downloadedAlbumSelectToDelete => 'Seleccionar pistas a eliminar'; + + @override + String get utilityFunctions => 'Funciones de utilidad'; + + @override + String get recentTypeArtist => 'Artista'; + + @override + String get recentTypeAlbum => 'Álbum'; + + @override + String get recentTypeSong => 'Canción'; + + @override + String get recentTypePlaylist => 'Lista de reproducción'; + + @override + String recentPlaylistInfo(String name) { + return 'Lista de reproducción: $name'; + } + + @override + String errorGeneric(String message) { + return 'Error: $message'; + } +} diff --git a/lib/l10n/app_localizations_fr.dart b/lib/l10n/app_localizations_fr.dart index 7fe07412..77d394b8 100644 --- a/lib/l10n/app_localizations_fr.dart +++ b/lib/l10n/app_localizations_fr.dart @@ -402,6 +402,9 @@ class AppLocalizationsFr extends AppLocalizations { String get aboutLogoArtist => 'The talented artist who created our beautiful app logo!'; + @override + String get aboutTranslators => 'Translators'; + @override String get aboutSpecialThanks => 'Special Thanks'; diff --git a/lib/l10n/app_localizations_hi.dart b/lib/l10n/app_localizations_hi.dart index bfe0e9cf..640394a4 100644 --- a/lib/l10n/app_localizations_hi.dart +++ b/lib/l10n/app_localizations_hi.dart @@ -402,6 +402,9 @@ class AppLocalizationsHi extends AppLocalizations { String get aboutLogoArtist => 'The talented artist who created our beautiful app logo!'; + @override + String get aboutTranslators => 'Translators'; + @override String get aboutSpecialThanks => 'Special Thanks'; diff --git a/lib/l10n/app_localizations_id.dart b/lib/l10n/app_localizations_id.dart index 4be2cad8..a15135e6 100644 --- a/lib/l10n/app_localizations_id.dart +++ b/lib/l10n/app_localizations_id.dart @@ -406,6 +406,9 @@ class AppLocalizationsId extends AppLocalizations { String get aboutLogoArtist => 'Seniman berbakat yang membuat logo aplikasi kita yang indah!'; + @override + String get aboutTranslators => 'Translators'; + @override String get aboutSpecialThanks => 'Terima Kasih Khusus'; diff --git a/lib/l10n/app_localizations_ja.dart b/lib/l10n/app_localizations_ja.dart index a61062ba..e88e31e3 100644 --- a/lib/l10n/app_localizations_ja.dart +++ b/lib/l10n/app_localizations_ja.dart @@ -402,6 +402,9 @@ class AppLocalizationsJa extends AppLocalizations { String get aboutLogoArtist => 'The talented artist who created our beautiful app logo!'; + @override + String get aboutTranslators => 'Translators'; + @override String get aboutSpecialThanks => 'スペシャルサンクス'; diff --git a/lib/l10n/app_localizations_ko.dart b/lib/l10n/app_localizations_ko.dart index ef5b02cc..20ab8701 100644 --- a/lib/l10n/app_localizations_ko.dart +++ b/lib/l10n/app_localizations_ko.dart @@ -402,6 +402,9 @@ class AppLocalizationsKo extends AppLocalizations { String get aboutLogoArtist => 'The talented artist who created our beautiful app logo!'; + @override + String get aboutTranslators => 'Translators'; + @override String get aboutSpecialThanks => 'Special Thanks'; diff --git a/lib/l10n/app_localizations_nl.dart b/lib/l10n/app_localizations_nl.dart index e5972c08..e91357a9 100644 --- a/lib/l10n/app_localizations_nl.dart +++ b/lib/l10n/app_localizations_nl.dart @@ -402,6 +402,9 @@ class AppLocalizationsNl extends AppLocalizations { String get aboutLogoArtist => 'The talented artist who created our beautiful app logo!'; + @override + String get aboutTranslators => 'Translators'; + @override String get aboutSpecialThanks => 'Special Thanks'; diff --git a/lib/l10n/app_localizations_pt.dart b/lib/l10n/app_localizations_pt.dart index ed340a24..25a17d29 100644 --- a/lib/l10n/app_localizations_pt.dart +++ b/lib/l10n/app_localizations_pt.dart @@ -402,6 +402,9 @@ class AppLocalizationsPt extends AppLocalizations { String get aboutLogoArtist => 'The talented artist who created our beautiful app logo!'; + @override + String get aboutTranslators => 'Translators'; + @override String get aboutSpecialThanks => 'Special Thanks'; @@ -2019,3 +2022,2019 @@ class AppLocalizationsPt extends AppLocalizations { return 'Error: $message'; } } + +/// The translations for Portuguese, as used in Portugal (`pt_PT`). +class AppLocalizationsPtPt extends AppLocalizationsPt { + AppLocalizationsPtPt() : super('pt_PT'); + + @override + String get appName => 'SpotiFLAC'; + + @override + String get appDescription => + 'Baixe faixas do Spotify em qualidade sem perdas de Tidal, Qobuz e Amazon Music.'; + + @override + String get navHome => 'Início'; + + @override + String get navHistory => 'Histórico'; + + @override + String get navSettings => 'Configurações'; + + @override + String get navStore => 'Loja'; + + @override + String get homeTitle => 'Início'; + + @override + String get homeSearchHint => 'Pesquise ou cole a URL do Spotify...'; + + @override + String homeSearchHintExtension(String extensionName) { + return 'Pesquisar com $extensionName...'; + } + + @override + String get homeSubtitle => 'Cole um link do Spotify ou procure por nome'; + + @override + String get homeSupports => + 'Suporte: Faixas, Álbuns, Playlists, URLs de Artista'; + + @override + String get homeRecent => 'Recentes'; + + @override + String get historyTitle => 'Histórico'; + + @override + String historyDownloading(int count) { + return 'Baixando ($count)'; + } + + @override + String get historyDownloaded => 'Baixados'; + + @override + String get historyFilterAll => 'Tudo'; + + @override + String get historyFilterAlbums => 'Álbuns'; + + @override + String get historyFilterSingles => 'Singles'; + + @override + String historyTracksCount(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$count faixas', + one: '1 faixa', + ); + return '$_temp0'; + } + + @override + String historyAlbumsCount(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$count álbuns', + one: '1 álbum', + ); + return '$_temp0'; + } + + @override + String get historyNoDownloads => 'Nenhum histórico de downloads'; + + @override + String get historyNoDownloadsSubtitle => 'As faixas baixadas aparecerão aqui'; + + @override + String get historyNoAlbums => 'Sem álbuns baixados'; + + @override + String get historyNoAlbumsSubtitle => + 'Baixe várias faixas de um álbum para vê-las aqui'; + + @override + String get historyNoSingles => 'Sem singles baixados'; + + @override + String get historyNoSinglesSubtitle => + 'Os downloads de faixa individuais aparecerão aqui'; + + @override + String get settingsTitle => 'Configurações'; + + @override + String get settingsDownload => 'Download'; + + @override + String get settingsAppearance => 'Aparência'; + + @override + String get settingsOptions => 'Opções'; + + @override + String get settingsExtensions => 'Extensões'; + + @override + String get settingsAbout => 'Sobre'; + + @override + String get downloadTitle => 'Download'; + + @override + String get downloadLocation => 'Local dos Downloads'; + + @override + String get downloadLocationSubtitle => 'Escolha onde salvar os arquivos'; + + @override + String get downloadLocationDefault => 'Local padrão'; + + @override + String get downloadDefaultService => 'Serviço Padrão'; + + @override + String get downloadDefaultServiceSubtitle => 'Serviço usado para downloads'; + + @override + String get downloadDefaultQuality => 'Qualidade Predefinida'; + + @override + String get downloadAskQuality => 'Perguntar qualidade antes de baixar'; + + @override + String get downloadAskQualitySubtitle => + 'Mostrar seletor de qualidade para cada download'; + + @override + String get downloadFilenameFormat => 'Formato do Nome do Arquivo'; + + @override + String get downloadFolderOrganization => 'Organização de Pastas'; + + @override + String get downloadSeparateSingles => 'Separar Singles'; + + @override + String get downloadSeparateSinglesSubtitle => + 'Colocar singles numa pasta separada'; + + @override + String get qualityBest => 'Melhor Disponível'; + + @override + String get qualityFlac => 'FLAC'; + + @override + String get quality320 => '320 kbps'; + + @override + String get quality128 => '128 kbps'; + + @override + String get appearanceTitle => 'Aparência'; + + @override + String get appearanceTheme => 'Tema'; + + @override + String get appearanceThemeSystem => 'Sistema'; + + @override + String get appearanceThemeLight => 'Claro'; + + @override + String get appearanceThemeDark => 'Escuro'; + + @override + String get appearanceDynamicColor => 'Cores Dinâmicas'; + + @override + String get appearanceDynamicColorSubtitle => + 'Usar cores do seu papel de parede'; + + @override + String get appearanceAccentColor => 'Cor de Destaque'; + + @override + String get appearanceHistoryView => 'Visualização do Histórico'; + + @override + String get appearanceHistoryViewList => 'Lista'; + + @override + String get appearanceHistoryViewGrid => 'Grade'; + + @override + String get optionsTitle => 'Opções'; + + @override + String get optionsSearchSource => 'Origem da Pesquisa'; + + @override + String get optionsPrimaryProvider => 'Provedor Primário'; + + @override + String get optionsPrimaryProviderSubtitle => + 'Serviço usado ao pesquisar por nome da faixa.'; + + @override + String optionsUsingExtension(String extensionName) { + return 'Usando a extensão: $extensionName'; + } + + @override + String get optionsSwitchBack => + 'Toque no Deezer ou Spotify para alternar de volta da extensão'; + + @override + String get optionsAutoFallback => 'Fallback Automático'; + + @override + String get optionsAutoFallbackSubtitle => + 'Tentar outros serviços se o download falhar'; + + @override + String get optionsUseExtensionProviders => 'Usar Provedores de Extensão'; + + @override + String get optionsUseExtensionProvidersOn => + 'Extensões serão tentadas primeiro'; + + @override + String get optionsUseExtensionProvidersOff => + 'Usando apenas provedores integrados'; + + @override + String get optionsEmbedLyrics => 'Incorporar Letras'; + + @override + String get optionsEmbedLyricsSubtitle => + 'Incorporar letras sincronizadas aos arquivos FLAC'; + + @override + String get optionsMaxQualityCover => 'Capa de Qualidade Máxima'; + + @override + String get optionsMaxQualityCoverSubtitle => + 'Baixar capa do álbum com a mais alta resolução'; + + @override + String get optionsConcurrentDownloads => 'Downloads Simultâneos'; + + @override + String get optionsConcurrentSequential => 'Sequencial (1 por vez)'; + + @override + String optionsConcurrentParallel(int count) { + return '$count downloads paralelos'; + } + + @override + String get optionsConcurrentWarning => + 'Downloads simultâneos podem causar um limite da taxa (ratelimit)'; + + @override + String get optionsExtensionStore => 'Loja de Extensões'; + + @override + String get optionsExtensionStoreSubtitle => + 'Mostrar aba da Loja na navegação'; + + @override + String get optionsCheckUpdates => 'Procurar Atualizações'; + + @override + String get optionsCheckUpdatesSubtitle => + 'Notificar quando uma nova versão estiver disponível'; + + @override + String get optionsUpdateChannel => 'Canal de Atualização'; + + @override + String get optionsUpdateChannelStable => 'Somente versões estáveis'; + + @override + String get optionsUpdateChannelPreview => 'Obter versões de prévia'; + + @override + String get optionsUpdateChannelWarning => + 'A prévia pode conter erros ou recursos incompletos'; + + @override + String get optionsClearHistory => 'Limpar Histórico de Download'; + + @override + String get optionsClearHistorySubtitle => + 'Remover todas as faixas baixadas do histórico'; + + @override + String get optionsDetailedLogging => 'Registro detalhado'; + + @override + String get optionsDetailedLoggingOn => + 'Registros detalhados estão sendo gravados'; + + @override + String get optionsDetailedLoggingOff => 'Habilitar para relatórios de erros'; + + @override + String get optionsSpotifyCredentials => 'Credenciais do Spotify'; + + @override + String optionsSpotifyCredentialsConfigured(String clientId) { + return 'Client ID: $clientId...'; + } + + @override + String get optionsSpotifyCredentialsRequired => + 'Obrigatório - toque para configurar'; + + @override + String get optionsSpotifyWarning => + 'O Spotify requer as suas próprias credenciais de API. Consiga gratuitamente em developer.spotify.com'; + + @override + String get extensionsTitle => 'Extensões'; + + @override + String get extensionsInstalled => 'Extensões Instaladas'; + + @override + String get extensionsNone => 'Nenhuma extensão instalada'; + + @override + String get extensionsNoneSubtitle => + 'Instalar extensões a partir da aba Loja'; + + @override + String get extensionsEnabled => 'Habilitado'; + + @override + String get extensionsDisabled => 'Desabilitado'; + + @override + String extensionsVersion(String version) { + return 'Versão $version'; + } + + @override + String extensionsAuthor(String author) { + return 'por $author'; + } + + @override + String get extensionsUninstall => 'Desinstalar'; + + @override + String get extensionsSetAsSearch => 'Definir como Provedor de Pesquisa'; + + @override + String get storeTitle => 'Loja de Extensões'; + + @override + String get storeSearch => 'Pesquisar extensões...'; + + @override + String get storeInstall => 'Instalar'; + + @override + String get storeInstalled => 'Instalado'; + + @override + String get storeUpdate => 'Atualizar'; + + @override + String get aboutTitle => 'Sobre'; + + @override + String get aboutContributors => 'Colaboradores'; + + @override + String get aboutMobileDeveloper => 'Desenvolvedor da versão móvel'; + + @override + String get aboutOriginalCreator => 'Criador do SpotiFLAC original'; + + @override + String get aboutLogoArtist => + 'O artista talentoso que criou o nosso lindo logotipo do aplicativo!'; + + @override + String get aboutSpecialThanks => 'Agradecimentos Especiais'; + + @override + String get aboutLinks => 'Links'; + + @override + String get aboutMobileSource => 'Código-fonte do app móvel'; + + @override + String get aboutPCSource => 'Código-fonte do app desktop'; + + @override + String get aboutReportIssue => 'Reportar um problema'; + + @override + String get aboutReportIssueSubtitle => + 'Reporte qualquer problema que encontrar'; + + @override + String get aboutFeatureRequest => 'Solicitação de recurso'; + + @override + String get aboutFeatureRequestSubtitle => + 'Sugira novos recursos para o aplicativo'; + + @override + String get aboutSupport => 'Apoiar'; + + @override + String get aboutBuyMeCoffee => 'Compre-me um café'; + + @override + String get aboutBuyMeCoffeeSubtitle => 'Apoie o desenvolvimento na Ko-fi'; + + @override + String get aboutApp => 'Aplicativo'; + + @override + String get aboutVersion => 'Versão'; + + @override + String get aboutBinimumDesc => + 'O criador da API QQDL e HiFi. Sem esta API, os downloads Tidal não existiriam!'; + + @override + String get aboutSachinsenalDesc => + 'O criador original do projeto HiFi. A base da integração do Tidal!'; + + @override + String get aboutDoubleDouble => 'DoubleDouble'; + + @override + String get aboutDoubleDoubleDesc => + 'API incrível para downloads do Amazon Music. Obrigado por fazê-lo gratuitamente!'; + + @override + String get aboutDabMusic => 'DAB Music'; + + @override + String get aboutDabMusicDesc => + 'A melhor API de streaming do Qobuz. Downloads de alta resolução não seriam possíveis sem isso!'; + + @override + String get aboutAppDescription => + 'Baixe faixas do Spotify em qualidade sem perdas do Tidal, Qobuz e Amazon Music.'; + + @override + String get albumTitle => 'Álbum'; + + @override + String albumTracks(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$count faixas', + one: '1 faixa', + ); + return '$_temp0'; + } + + @override + String get albumDownloadAll => 'Baixar Tudo'; + + @override + String get albumDownloadRemaining => 'Downloads Restantes'; + + @override + String get playlistTitle => 'Playlist'; + + @override + String get artistTitle => 'Artista'; + + @override + String get artistAlbums => 'Álbuns'; + + @override + String get artistSingles => 'Singles e EPs'; + + @override + String get artistCompilations => 'Compilações'; + + @override + String artistReleases(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$count lançamentos', + one: '1 lançamento', + ); + return '$_temp0'; + } + + @override + String get artistPopular => 'Populares'; + + @override + String artistMonthlyListeners(String count) { + return '$count ouvintes mensais'; + } + + @override + String get trackMetadataTitle => 'Informações da Faixa'; + + @override + String get trackMetadataArtist => 'Artista'; + + @override + String get trackMetadataAlbum => 'Álbum'; + + @override + String get trackMetadataDuration => 'Duração'; + + @override + String get trackMetadataQuality => 'Qualidade'; + + @override + String get trackMetadataPath => 'Caminho do Arquivo'; + + @override + String get trackMetadataDownloadedAt => 'Baixado'; + + @override + String get trackMetadataService => 'Serviço'; + + @override + String get trackMetadataPlay => 'Reproduzir'; + + @override + String get trackMetadataShare => 'Compartilhar'; + + @override + String get trackMetadataDelete => 'Apagar'; + + @override + String get trackMetadataRedownload => 'Baixar Novamente'; + + @override + String get trackMetadataOpenFolder => 'Abrir Pasta'; + + @override + String get setupTitle => 'Bem-vindo ao SpotiFLAC'; + + @override + String get setupSubtitle => 'Vamos começar'; + + @override + String get setupStoragePermission => 'Permissão de Armazenamento'; + + @override + String get setupStoragePermissionSubtitle => + 'Necessária para salvar arquivos baixados'; + + @override + String get setupStoragePermissionGranted => 'Permissão concedida'; + + @override + String get setupStoragePermissionDenied => 'Permissão negada'; + + @override + String get setupGrantPermission => 'Conceder Permissão'; + + @override + String get setupDownloadLocation => 'Local do Download'; + + @override + String get setupChooseFolder => 'Selecionar Pasta'; + + @override + String get setupContinue => 'Continuar'; + + @override + String get setupSkip => 'Ignorar por enquanto'; + + @override + String get setupStorageAccessRequired => 'Acesso ao Armazenamento Necessário'; + + @override + String get setupStorageAccessMessage => + 'O SpotiFLAC precisa da permissão \"Acesso a todos os arquivos\" para salvar arquivos de música na sua pasta escolhida.'; + + @override + String get setupStorageAccessMessageAndroid11 => + 'O Android 11+ requer a permissão \"Acesso a Todos os Arquivos\" para salvar arquivos na pasta de download escolhida.'; + + @override + String get setupOpenSettings => 'Abrir Configurações'; + + @override + String get setupPermissionDeniedMessage => + 'Permissão negada. Por favor, conceda todas as permissões para continuar.'; + + @override + String setupPermissionRequired(String permissionType) { + return 'Permissão $permissionType Necessária'; + } + + @override + String setupPermissionRequiredMessage(String permissionType) { + return 'A permissão $permissionType é necessária para a melhor experiência. Você pode alterar isso mais tarde em Configurações.'; + } + + @override + String get setupSelectDownloadFolder => 'Escolher Pasta de Download'; + + @override + String get setupUseDefaultFolder => 'Usar Pasta Padrão?'; + + @override + String get setupNoFolderSelected => + 'Nenhuma pasta selecionada. Você gostaria de usar a pasta padrão de música?'; + + @override + String get setupUseDefault => 'Usar Padrão'; + + @override + String get setupDownloadLocationTitle => 'Local do Download'; + + @override + String get setupDownloadLocationIosMessage => + 'No iOS, downloads são salvos na pasta Documentos do aplicativo. Você pode acessá-los através do app Arquivos.'; + + @override + String get setupAppDocumentsFolder => 'Pasta Documentos do App'; + + @override + String get setupAppDocumentsFolderSubtitle => + 'Recomendado - acessível através do aplicativo Arquivos'; + + @override + String get setupChooseFromFiles => 'Escolher dos Arquivos'; + + @override + String get setupChooseFromFilesSubtitle => + 'Selecione o iCloud ou outro local'; + + @override + String get setupIosEmptyFolderWarning => + 'Limitação do iOS: Pastas vazias não podem ser selecionadas. Escolha uma pasta com pelo menos um arquivo.'; + + @override + String get setupDownloadInFlac => 'Download Spotify tracks in FLAC'; + + @override + String get setupStepStorage => 'Storage'; + + @override + String get setupStepNotification => 'Notification'; + + @override + String get setupStepFolder => 'Folder'; + + @override + String get setupStepSpotify => 'Spotify'; + + @override + String get setupStepPermission => 'Permission'; + + @override + String get setupStorageGranted => 'Storage Permission Granted!'; + + @override + String get setupStorageRequired => 'Storage Permission Required'; + + @override + String get setupStorageDescription => + 'SpotiFLAC needs storage permission to save your downloaded music files.'; + + @override + String get setupNotificationGranted => 'Permissão de Notificações Concedida!'; + + @override + String get setupNotificationEnable => 'Habilitar Notificações'; + + @override + String get setupNotificationDescription => + 'Seja notificado quando os downloads completarem ou exigirem atenção.'; + + @override + String get setupFolderSelected => 'Pasta para Download Selecionada!'; + + @override + String get setupFolderChoose => 'Escolher Pasta de Download'; + + @override + String get setupFolderDescription => + 'Selecione uma pasta onde as suas músicas baixadas serão salvas.'; + + @override + String get setupChangeFolder => 'Alterar Pasta'; + + @override + String get setupSelectFolder => 'Seleccionar Pasta'; + + @override + String get setupSpotifyApiOptional => 'API do Spotify (opcional)'; + + @override + String get setupSpotifyApiDescription => + 'Adicione as suas credenciais da API do Spotify para obter melhores resultados de busca e acesso a conteúdo exclusivo do Spotify.'; + + @override + String get setupUseSpotifyApi => 'Usar API do Spotify'; + + @override + String get setupEnterCredentialsBelow => 'Insira as suas credenciais abaixo'; + + @override + String get setupUsingDeezer => 'Usando o Deezer (nenhuma conta necessária)'; + + @override + String get setupEnterClientId => 'Insira o Spotify Client ID'; + + @override + String get setupEnterClientSecret => 'Insira o Spotify Client Secret'; + + @override + String get setupGetFreeCredentials => + 'Receba as suas credenciais de API gratuitas na Spotify Developer Dashboard.'; + + @override + String get setupEnableNotifications => 'Habilitar Notificações'; + + @override + String get setupProceedToNextStep => + 'Você já pode prosseguir para o próximo passo.'; + + @override + String get setupNotificationProgressDescription => + 'Você receberá notificações de progresso dos downloads.'; + + @override + String get setupNotificationBackgroundDescription => + 'Seja notificado sobre o progresso e conclusão do download. Isso ajuda você a acompanhar os downloads quando o app estiver em segundo plano.'; + + @override + String get setupSkipForNow => 'Ignorar por enquanto'; + + @override + String get setupBack => 'Voltar'; + + @override + String get setupNext => 'Próximo'; + + @override + String get setupGetStarted => 'Começar'; + + @override + String get setupSkipAndStart => 'Ignorar e Iniciar'; + + @override + String get setupAllowAccessToManageFiles => + 'Por favor, habilite \"Permitir acesso para gerenciar todos os arquivos\" na próxima tela.'; + + @override + String get setupGetCredentialsFromSpotify => + 'Obter credenciais do developer.spotify.com'; + + @override + String get dialogCancel => 'Cancelar'; + + @override + String get dialogOk => 'OK'; + + @override + String get dialogSave => 'Salvar'; + + @override + String get dialogDelete => 'Apagar'; + + @override + String get dialogRetry => 'Tentar novamente'; + + @override + String get dialogClose => 'Fechar'; + + @override + String get dialogYes => 'Sim'; + + @override + String get dialogNo => 'Não'; + + @override + String get dialogClear => 'Limpar'; + + @override + String get dialogConfirm => 'Confirmar'; + + @override + String get dialogDone => 'Concluído'; + + @override + String get dialogImport => 'Importar'; + + @override + String get dialogDiscard => 'Descartar'; + + @override + String get dialogRemove => 'Remover'; + + @override + String get dialogUninstall => 'Desinstalar'; + + @override + String get dialogDiscardChanges => 'Descartar Alterações?'; + + @override + String get dialogUnsavedChanges => + 'Você tem alterações não salvas. Deseja descartá-las?'; + + @override + String get dialogDownloadFailed => 'Download Falhou'; + + @override + String get dialogTrackLabel => 'Faixa:'; + + @override + String get dialogArtistLabel => 'Artista:'; + + @override + String get dialogErrorLabel => 'Erro:'; + + @override + String get dialogClearAll => 'Limpar Tudo'; + + @override + String get dialogClearAllDownloads => + 'Você tem certeza que deseja limpar todos os downloads?'; + + @override + String get dialogRemoveFromDevice => 'Remove from device?'; + + @override + String get dialogRemoveExtension => 'Remove Extension'; + + @override + String get dialogRemoveExtensionMessage => + 'Are you sure you want to remove this extension? This cannot be undone.'; + + @override + String get dialogUninstallExtension => 'Uninstall Extension?'; + + @override + String dialogUninstallExtensionMessage(String extensionName) { + return 'Are you sure you want to remove $extensionName?'; + } + + @override + String get dialogClearHistoryTitle => 'Clear History'; + + @override + String get dialogClearHistoryMessage => + 'Are you sure you want to clear all download history? This cannot be undone.'; + + @override + String get dialogDeleteSelectedTitle => 'Delete Selected'; + + @override + String dialogDeleteSelectedMessage(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'tracks', + one: 'track', + ); + return 'Delete $count $_temp0 from history?\n\nThis will also delete the files from storage.'; + } + + @override + String get dialogImportPlaylistTitle => 'Import Playlist'; + + @override + String dialogImportPlaylistMessage(int count) { + return 'Found $count tracks in CSV. Add them to download queue?'; + } + + @override + String snackbarAddedToQueue(String trackName) { + return 'Added \"$trackName\" to queue'; + } + + @override + String snackbarAddedTracksToQueue(int count) { + return 'Added $count tracks to queue'; + } + + @override + String snackbarAlreadyDownloaded(String trackName) { + return '\"$trackName\" already downloaded'; + } + + @override + String get snackbarHistoryCleared => 'History cleared'; + + @override + String get snackbarCredentialsSaved => 'Credentials saved'; + + @override + String get snackbarCredentialsCleared => 'Credentials cleared'; + + @override + String snackbarDeletedTracks(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'tracks', + one: 'track', + ); + return 'Deleted $count $_temp0'; + } + + @override + String snackbarCannotOpenFile(String error) { + return 'Cannot open file: $error'; + } + + @override + String get snackbarFillAllFields => 'Please fill all fields'; + + @override + String get snackbarViewQueue => 'View Queue'; + + @override + String snackbarFailedToLoad(String error) { + return 'Failed to load: $error'; + } + + @override + String snackbarUrlCopied(String platform) { + return '$platform URL copied to clipboard'; + } + + @override + String get snackbarFileNotFound => 'File not found'; + + @override + String get snackbarSelectExtFile => 'Please select a .spotiflac-ext file'; + + @override + String get snackbarProviderPrioritySaved => 'Provider priority saved'; + + @override + String get snackbarMetadataProviderSaved => + 'Metadata provider priority saved'; + + @override + String snackbarExtensionInstalled(String extensionName) { + return '$extensionName installed.'; + } + + @override + String snackbarExtensionUpdated(String extensionName) { + return '$extensionName updated.'; + } + + @override + String get snackbarFailedToInstall => 'Failed to install extension'; + + @override + String get snackbarFailedToUpdate => 'Failed to update extension'; + + @override + String get errorRateLimited => 'Rate Limited'; + + @override + String get errorRateLimitedMessage => + 'Too many requests. Please wait a moment before searching again.'; + + @override + String errorFailedToLoad(String item) { + return 'Failed to load $item'; + } + + @override + String get errorNoTracksFound => 'No tracks found'; + + @override + String errorMissingExtensionSource(String item) { + return 'Cannot load $item: missing extension source'; + } + + @override + String get statusQueued => 'Queued'; + + @override + String get statusDownloading => 'Downloading'; + + @override + String get statusFinalizing => 'Finalizing'; + + @override + String get statusCompleted => 'Completed'; + + @override + String get statusFailed => 'Failed'; + + @override + String get statusSkipped => 'Ignorado'; + + @override + String get statusPaused => 'Pausado'; + + @override + String get actionPause => 'Pausar'; + + @override + String get actionResume => 'Retomar'; + + @override + String get actionCancel => 'Cancelar'; + + @override + String get actionStop => 'Parar'; + + @override + String get actionSelect => 'Selecionar'; + + @override + String get actionSelectAll => 'Selecionar Tudo'; + + @override + String get actionDeselect => 'Desselecionar'; + + @override + String get actionPaste => 'Colar'; + + @override + String get actionImportCsv => 'Importar CSV'; + + @override + String get actionRemoveCredentials => 'Remover Credenciais'; + + @override + String get actionSaveCredentials => 'Salvar Credenciais'; + + @override + String selectionSelected(int count) { + return '$count selecionado(s)'; + } + + @override + String get selectionAllSelected => 'Todas as faixas selecionadas'; + + @override + String get selectionTapToSelect => 'Toque nas faixas para selecionar'; + + @override + String selectionDeleteTracks(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'faixas', + one: 'faixa', + ); + return 'Apagar $count $_temp0'; + } + + @override + String get selectionSelectToDelete => 'Selecione as faixas para apagar'; + + @override + String progressFetchingMetadata(int current, int total) { + return 'Buscando metadados... $current/$total'; + } + + @override + String get progressReadingCsv => 'Lendo CSV...'; + + @override + String get searchSongs => 'Músicas'; + + @override + String get searchArtists => 'Artistas'; + + @override + String get searchAlbums => 'Álbuns'; + + @override + String get searchPlaylists => 'Playlists'; + + @override + String get tooltipPlay => 'Reproduzir'; + + @override + String get tooltipCancel => 'Cancelar'; + + @override + String get tooltipStop => 'Parar'; + + @override + String get tooltipRetry => 'Tentar Novamente'; + + @override + String get tooltipRemove => 'Remover'; + + @override + String get tooltipClear => 'Limpar'; + + @override + String get tooltipPaste => 'Colar'; + + @override + String get filenameFormat => 'Formato do Nome do Arquivo'; + + @override + String filenameFormatPreview(String preview) { + return 'Prévia: $preview'; + } + + @override + String get filenameAvailablePlaceholders => 'Substituições permitidas:'; + + @override + String filenameHint(Object artist, Object title) { + return '$artist - $title'; + } + + @override + String get folderOrganization => 'Organização de Pastas'; + + @override + String get folderOrganizationNone => 'Nenhuma organização'; + + @override + String get folderOrganizationByArtist => 'Por Artista'; + + @override + String get folderOrganizationByAlbum => 'Por Album'; + + @override + String get folderOrganizationByArtistAlbum => 'Artista/Álbum'; + + @override + String get folderOrganizationDescription => + 'Organizar arquivos baixados em pastas'; + + @override + String get folderOrganizationNoneSubtitle => + 'Todos os arquivos na pasta de download'; + + @override + String get folderOrganizationByArtistSubtitle => + 'Pasta separada para cada artista'; + + @override + String get folderOrganizationByAlbumSubtitle => + 'Pasta separada para cada álbum'; + + @override + String get folderOrganizationByArtistAlbumSubtitle => + 'Pastas aninhadas para artista e álbum'; + + @override + String get updateAvailable => 'Atualização Disponível'; + + @override + String updateNewVersion(String version) { + return 'A versão $version está disponível'; + } + + @override + String get updateDownload => 'Baixar'; + + @override + String get updateLater => 'Depois'; + + @override + String get updateChangelog => 'Lista de alterações'; + + @override + String get updateStartingDownload => 'Iniciando download...'; + + @override + String get updateDownloadFailed => 'Download falhou'; + + @override + String get updateFailedMessage => 'Falha ao baixar a atualização'; + + @override + String get updateNewVersionReady => 'Uma nova versão está pronta'; + + @override + String get updateCurrent => 'Atual'; + + @override + String get updateNew => 'Novo'; + + @override + String get updateDownloading => 'Baixando...'; + + @override + String get updateWhatsNew => 'Novidades'; + + @override + String get updateDownloadInstall => 'Baixar e Instalar'; + + @override + String get updateDontRemind => 'Não lembrar'; + + @override + String get providerPriority => 'Prioridade de Provedor'; + + @override + String get providerPrioritySubtitle => + 'Arraste para reordenar os provedores de download'; + + @override + String get providerPriorityTitle => 'Prioridade de Provedor'; + + @override + String get providerPriorityDescription => + 'Arraste para reordenar provedores de download. O aplicativo irá tentar provedores de cima para baixo ao baixar as faixas.'; + + @override + String get providerPriorityInfo => + 'Se uma faixa não estiver disponível no primeiro provedor, o aplicativo irá tentar automaticamente a próxima.'; + + @override + String get providerBuiltIn => 'Embutido'; + + @override + String get providerExtension => 'Extensão'; + + @override + String get metadataProviderPriority => 'Prioridade de Provedor de Metadados'; + + @override + String get metadataProviderPrioritySubtitle => + 'Ordem usada para obter metadados de faixa'; + + @override + String get metadataProviderPriorityTitle => 'Prioridade de Metadados'; + + @override + String get metadataProviderPriorityDescription => + 'Arraste para reordenar provedores de metadados. O aplicativo tentará provedores de cima para baixo ao procurar por faixas e buscar metadados.'; + + @override + String get metadataProviderPriorityInfo => + 'O Deezer não tem limites de taxa e é recomendado como principal. O Spotify pode limitar a taxa após muitas solicitações.'; + + @override + String get metadataNoRateLimits => 'Sem limites de taxa'; + + @override + String get metadataMayRateLimit => 'Pode ter limites de taxa'; + + @override + String get logTitle => 'Registros'; + + @override + String get logCopy => 'Copiar Registros'; + + @override + String get logClear => 'Limpar Registros'; + + @override + String get logShare => 'Compartilhar Registros'; + + @override + String get logEmpty => 'Ainda não há registros'; + + @override + String get logCopied => 'Registros copiados para área de transferência'; + + @override + String get logSearchHint => 'Pesquisar registros...'; + + @override + String get logFilterLevel => 'Nível'; + + @override + String get logFilterSection => 'Filtro'; + + @override + String get logShareLogs => 'Compartilhar registros'; + + @override + String get logClearLogs => 'Limpar registros'; + + @override + String get logClearLogsTitle => 'Limpar Registros'; + + @override + String get logClearLogsMessage => + 'Tem certeza de que deseja limpar todos os registros?'; + + @override + String get logIspBlocking => 'BLOQUEIO DE ISP DETECTADO'; + + @override + String get logRateLimited => 'TAXA LIMITADA (RATELIMITED)'; + + @override + String get logNetworkError => 'ERRO DE REDE'; + + @override + String get logTrackNotFound => 'FAIXA NÃO ENCONTRADA'; + + @override + String get logFilterBySeverity => 'Filtrar registros por gravidade'; + + @override + String get logNoLogsYet => 'Ainda não há registros'; + + @override + String get logNoLogsYetSubtitle => + 'Os registros aparecerão aqui enquanto você usa o aplicativo'; + + @override + String get logIssueSummary => 'Resumo do Problemas'; + + @override + String get logIspBlockingDescription => + 'O seu provedor pode estar bloqueando o acesso aos serviços de download'; + + @override + String get logIspBlockingSuggestion => + 'Tente usar uma VPN ou altere o DNS para 1.1.1 ou 8.8.8.8'; + + @override + String get logRateLimitedDescription => 'Muitas solicitações ao serviço'; + + @override + String get logRateLimitedSuggestion => + 'Aguarde alguns minutos antes de tentar novamente'; + + @override + String get logNetworkErrorDescription => 'Problemas de conexão detectados'; + + @override + String get logNetworkErrorSuggestion => 'Check your internet connection'; + + @override + String get logTrackNotFoundDescription => + 'Some tracks could not be found on download services'; + + @override + String get logTrackNotFoundSuggestion => + 'The track may not be available in lossless quality'; + + @override + String logTotalErrors(int count) { + return 'Total errors: $count'; + } + + @override + String logAffected(String domains) { + return 'Affected: $domains'; + } + + @override + String logEntriesFiltered(int count) { + return 'Entries ($count filtered)'; + } + + @override + String logEntries(int count) { + return 'Entries ($count)'; + } + + @override + String get credentialsTitle => 'Spotify Credentials'; + + @override + String get credentialsDescription => + 'Enter your Client ID and Secret to use your own Spotify application quota.'; + + @override + String get credentialsClientId => 'Client ID'; + + @override + String get credentialsClientIdHint => 'Colar Client ID'; + + @override + String get credentialsClientSecret => 'Client Secret'; + + @override + String get credentialsClientSecretHint => 'Colar Client Secret'; + + @override + String get channelStable => 'Estável'; + + @override + String get channelPreview => 'Prévia'; + + @override + String get sectionSearchSource => 'Origem da Pesquisa'; + + @override + String get sectionDownload => 'Download'; + + @override + String get sectionPerformance => 'Desempenho'; + + @override + String get sectionApp => 'Aplicativo'; + + @override + String get sectionData => 'Dados'; + + @override + String get sectionDebug => 'Depuração'; + + @override + String get sectionService => 'Serviço'; + + @override + String get sectionAudioQuality => 'Qualidade de Áudio'; + + @override + String get sectionFileSettings => 'Configurações de Arquivo'; + + @override + String get sectionColor => 'Cor'; + + @override + String get sectionTheme => 'Tema'; + + @override + String get sectionLayout => 'Layout'; + + @override + String get sectionLanguage => 'Idioma'; + + @override + String get appearanceLanguage => 'Idioma do aplicativo'; + + @override + String get appearanceLanguageSubtitle => 'Escolha o seu idioma preferido'; + + @override + String get settingsAppearanceSubtitle => 'Tema, cores, exibição'; + + @override + String get settingsDownloadSubtitle => + 'Serviço, qualidade, formato de nome de arquivo'; + + @override + String get settingsOptionsSubtitle => + 'Fallback, letras, arte de capa, atualizações'; + + @override + String get settingsExtensionsSubtitle => 'Gerenciar provedores de download'; + + @override + String get settingsLogsSubtitle => 'Ver logs do app para depuração'; + + @override + String get loadingSharedLink => 'Carregando link compartilhado...'; + + @override + String get pressBackAgainToExit => 'Pressione voltar novamente para sair'; + + @override + String get tracksHeader => 'Faixas'; + + @override + String downloadAllCount(int count) { + return 'Baixar Todos ($count)'; + } + + @override + String tracksCount(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$count faixas', + one: '1 faixa', + ); + return '$_temp0'; + } + + @override + String get trackCopyFilePath => 'Copiar caminho do arquivo'; + + @override + String get trackRemoveFromDevice => 'Remover do dispositivo'; + + @override + String get trackLoadLyrics => 'Carregar Letras'; + + @override + String get trackMetadata => 'Metadados'; + + @override + String get trackFileInfo => 'Informações do Arquivo'; + + @override + String get trackLyrics => 'Letras'; + + @override + String get trackFileNotFound => 'Arquivo não encontrado'; + + @override + String get trackOpenInDeezer => 'Abrir no Deezer'; + + @override + String get trackOpenInSpotify => 'Abrir no Spotify'; + + @override + String get trackTrackName => 'Nome da faixa'; + + @override + String get trackArtist => 'Artista'; + + @override + String get trackAlbumArtist => 'Artista do álbum'; + + @override + String get trackAlbum => 'Álbum'; + + @override + String get trackTrackNumber => 'Número da faixa'; + + @override + String get trackDiscNumber => 'Número do disco'; + + @override + String get trackDuration => 'Duração'; + + @override + String get trackAudioQuality => 'Qualidade de Áudio'; + + @override + String get trackReleaseDate => 'Data de lançamento'; + + @override + String get trackDownloaded => 'Baixado'; + + @override + String get trackCopyLyrics => 'Copy lyrics'; + + @override + String get trackLyricsNotAvailable => 'Lyrics not available for this track'; + + @override + String get trackLyricsTimeout => 'Request timed out. Try again later.'; + + @override + String get trackLyricsLoadFailed => 'Failed to load lyrics'; + + @override + String get trackCopiedToClipboard => 'Copied to clipboard'; + + @override + String get trackDeleteConfirmTitle => 'Remove from device?'; + + @override + String get trackDeleteConfirmMessage => + 'This will permanently delete the downloaded file and remove it from your history.'; + + @override + String trackCannotOpen(String message) { + return 'Cannot open: $message'; + } + + @override + String get dateToday => 'Today'; + + @override + String get dateYesterday => 'Yesterday'; + + @override + String dateDaysAgo(int count) { + return '$count days ago'; + } + + @override + String dateWeeksAgo(int count) { + return '$count weeks ago'; + } + + @override + String dateMonthsAgo(int count) { + return '$count months ago'; + } + + @override + String get concurrentSequential => 'Sequential'; + + @override + String get concurrentParallel2 => '2 Parallel'; + + @override + String get concurrentParallel3 => '3 Parallel'; + + @override + String get tapToSeeError => 'Tap to see error details'; + + @override + String get storeFilterAll => 'All'; + + @override + String get storeFilterMetadata => 'Metadata'; + + @override + String get storeFilterDownload => 'Download'; + + @override + String get storeFilterUtility => 'Utility'; + + @override + String get storeFilterLyrics => 'Lyrics'; + + @override + String get storeFilterIntegration => 'Integration'; + + @override + String get storeClearFilters => 'Clear filters'; + + @override + String get storeNoResults => 'No extensions found'; + + @override + String get extensionProviderPriority => 'Provider Priority'; + + @override + String get extensionInstallButton => 'Install Extension'; + + @override + String get extensionDefaultProvider => 'Default (Deezer/Spotify)'; + + @override + String get extensionDefaultProviderSubtitle => 'Use built-in search'; + + @override + String get extensionAuthor => 'Author'; + + @override + String get extensionId => 'ID'; + + @override + String get extensionError => 'Error'; + + @override + String get extensionCapabilities => 'Capabilities'; + + @override + String get extensionMetadataProvider => 'Metadata Provider'; + + @override + String get extensionDownloadProvider => 'Download Provider'; + + @override + String get extensionLyricsProvider => 'Lyrics Provider'; + + @override + String get extensionUrlHandler => 'URL Handler'; + + @override + String get extensionQualityOptions => 'Quality Options'; + + @override + String get extensionPostProcessingHooks => 'Post-Processing Hooks'; + + @override + String get extensionPermissions => 'Permissions'; + + @override + String get extensionSettings => 'Settings'; + + @override + String get extensionRemoveButton => 'Remover Extensão'; + + @override + String get extensionUpdated => 'Atualizado'; + + @override + String get extensionMinAppVersion => 'Versão Mínima do App'; + + @override + String get extensionCustomTrackMatching => + 'Correspondência de Faixa Personalizada'; + + @override + String get extensionPostProcessing => 'Pós-Processamento'; + + @override + String extensionHooksAvailable(int count) { + return '$count gancho(s) disponíveis'; + } + + @override + String extensionPatternsCount(int count) { + return '$count padrão(ões)'; + } + + @override + String extensionStrategy(String strategy) { + return 'Estratégia: $strategy'; + } + + @override + String get extensionsProviderPrioritySection => 'Prioridade de Provedor'; + + @override + String get extensionsInstalledSection => 'Extensões Instaladas'; + + @override + String get extensionsNoExtensions => 'Nenhuma extensão instalada'; + + @override + String get extensionsNoExtensionsSubtitle => + 'Instale arquivos .spotiflac-ext para adicionar novos provedores'; + + @override + String get extensionsInstallButton => 'Instalar Extensão'; + + @override + String get extensionsInfoTip => + 'Extensões podem adicionar novos metadados e baixar provedores. Somente instale extensões a partir de fontes confiáveis.'; + + @override + String get extensionsInstalledSuccess => 'Extensão instalada com sucesso'; + + @override + String get extensionsDownloadPriority => 'Prioridade de Download'; + + @override + String get extensionsDownloadPrioritySubtitle => + 'Definir ordem do serviço de download'; + + @override + String get extensionsNoDownloadProvider => + 'Nenhuma extensão com provedor de download'; + + @override + String get extensionsMetadataPriority => 'Prioridade de Metadados'; + + @override + String get extensionsMetadataPrioritySubtitle => + 'Definir ordem de origem de pesquisa e metadados'; + + @override + String get extensionsNoMetadataProvider => + 'Nenhuma extensão com provedor de metadados'; + + @override + String get extensionsSearchProvider => 'Provedor de Pesquisa'; + + @override + String get extensionsNoCustomSearch => + 'Nenhuma extensão com pesquisa personalizada'; + + @override + String get extensionsSearchProviderDescription => + 'Escolha qual serviço utilizar para pesquisar faixas'; + + @override + String get extensionsCustomSearch => 'Busca personalizada'; + + @override + String get extensionsErrorLoading => 'Erro ao carregar extensão'; + + @override + String get qualityFlacLossless => 'FLAC Lossless'; + + @override + String get qualityFlacLosslessSubtitle => '16-bit / 44.1kHz'; + + @override + String get qualityHiResFlac => 'Hi-Res FLAC'; + + @override + String get qualityHiResFlacSubtitle => '24-bit / até 96kHz'; + + @override + String get qualityHiResFlacMax => 'Hi-Res FLAC Max'; + + @override + String get qualityHiResFlacMaxSubtitle => '24-bit / até 192kHz'; + + @override + String get qualityNote => + 'A qualidade real depende da faixa que estiver disponível no serviço'; + + @override + String get downloadAskBeforeDownload => 'Perguntar qualidade antes de baixar'; + + @override + String get downloadDirectory => 'Pasta de Download'; + + @override + String get downloadSeparateSinglesFolder => 'Pasta de Singles Separada'; + + @override + String get downloadAlbumFolderStructure => 'Estrutura da Pasta de Álbum'; + + @override + String get downloadSaveFormat => 'Formato para Salvar'; + + @override + String get downloadSelectService => 'Selecionar Serviço'; + + @override + String get downloadSelectQuality => 'Selecionar Qualidade'; + + @override + String get downloadFrom => 'Baixar De'; + + @override + String get downloadDefaultQualityLabel => 'Qualidade Padrão'; + + @override + String get downloadBestAvailable => 'Melhor Disponível'; + + @override + String get folderNone => 'Nenhum'; + + @override + String get folderNoneSubtitle => 'Save all files directly to download folder'; + + @override + String get folderArtist => 'Artist'; + + @override + String get folderArtistSubtitle => 'Artist Name/filename'; + + @override + String get folderAlbum => 'Album'; + + @override + String get folderAlbumSubtitle => 'Album Name/filename'; + + @override + String get folderArtistAlbum => 'Artist/Album'; + + @override + String get folderArtistAlbumSubtitle => 'Artist Name/Album Name/filename'; + + @override + String get serviceTidal => 'Tidal'; + + @override + String get serviceQobuz => 'Qobuz'; + + @override + String get serviceAmazon => 'Amazon'; + + @override + String get serviceDeezer => 'Deezer'; + + @override + String get serviceSpotify => 'Spotify'; + + @override + String get appearanceAmoledDark => 'AMOLED Dark'; + + @override + String get appearanceAmoledDarkSubtitle => 'Pure black background'; + + @override + String get appearanceChooseAccentColor => 'Choose Accent Color'; + + @override + String get appearanceChooseTheme => 'Theme Mode'; + + @override + String get queueTitle => 'Download Queue'; + + @override + String get queueClearAll => 'Clear All'; + + @override + String get queueClearAllMessage => + 'Are you sure you want to clear all downloads?'; + + @override + String get queueEmpty => 'No downloads in queue'; + + @override + String get queueEmptySubtitle => 'Add tracks from the home screen'; + + @override + String get queueClearCompleted => 'Clear completed'; + + @override + String get queueDownloadFailed => 'Download Failed'; + + @override + String get queueTrackLabel => 'Track:'; + + @override + String get queueArtistLabel => 'Artist:'; + + @override + String get queueErrorLabel => 'Error:'; + + @override + String get queueUnknownError => 'Unknown error'; + + @override + String get albumFolderArtistAlbum => 'Artist / Album'; + + @override + String get albumFolderArtistAlbumSubtitle => 'Albums/Artist Name/Album Name/'; + + @override + String get albumFolderArtistYearAlbum => 'Artist / [Year] Album'; + + @override + String get albumFolderArtistYearAlbumSubtitle => + 'Albums/Artist Name/[2005] Album Name/'; + + @override + String get albumFolderAlbumOnly => 'Album Only'; + + @override + String get albumFolderAlbumOnlySubtitle => 'Albums/Album Name/'; + + @override + String get albumFolderYearAlbum => '[Year] Album'; + + @override + String get albumFolderYearAlbumSubtitle => 'Albums/[2005] Album Name/'; + + @override + String get downloadedAlbumDeleteSelected => 'Delete Selected'; + + @override + String downloadedAlbumDeleteMessage(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'tracks', + one: 'track', + ); + return 'Delete $count $_temp0 from this album?\n\nThis will also delete the files from storage.'; + } + + @override + String get downloadedAlbumTracksHeader => 'Tracks'; + + @override + String downloadedAlbumDownloadedCount(int count) { + return '$count downloaded'; + } + + @override + String downloadedAlbumSelectedCount(int count) { + return '$count selected'; + } + + @override + String get downloadedAlbumAllSelected => 'All tracks selected'; + + @override + String get downloadedAlbumTapToSelect => 'Tap tracks to select'; + + @override + String downloadedAlbumDeleteCount(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'tracks', + one: 'track', + ); + return 'Delete $count $_temp0'; + } + + @override + String get downloadedAlbumSelectToDelete => 'Select tracks to delete'; + + @override + String get utilityFunctions => 'Utility Functions'; + + @override + String get recentTypeArtist => 'Artist'; + + @override + String get recentTypeAlbum => 'Album'; + + @override + String get recentTypeSong => 'Song'; + + @override + String get recentTypePlaylist => 'Playlist'; + + @override + String recentPlaylistInfo(String name) { + return 'Playlist: $name'; + } + + @override + String errorGeneric(String message) { + return 'Error: $message'; + } +} diff --git a/lib/l10n/app_localizations_ru.dart b/lib/l10n/app_localizations_ru.dart index eab39f44..7aa28243 100644 --- a/lib/l10n/app_localizations_ru.dart +++ b/lib/l10n/app_localizations_ru.dart @@ -414,6 +414,9 @@ class AppLocalizationsRu extends AppLocalizations { String get aboutLogoArtist => 'Талантливый художник, который создал наш красивый логотип приложения!'; + @override + String get aboutTranslators => 'Translators'; + @override String get aboutSpecialThanks => 'Особая благодарность'; @@ -1533,7 +1536,7 @@ class AppLocalizationsRu extends AppLocalizations { String get trackFileInfo => 'Информация о файле'; @override - String get trackLyrics => 'Тексты песен'; + String get trackLyrics => 'Текст песни'; @override String get trackFileNotFound => 'Файл не найден'; @@ -1545,7 +1548,7 @@ class AppLocalizationsRu extends AppLocalizations { String get trackOpenInSpotify => 'Открыть в Spotify'; @override - String get trackTrackName => 'Название трека'; + String get trackTrackName => 'Название'; @override String get trackArtist => 'Исполнитель'; diff --git a/lib/l10n/app_localizations_zh.dart b/lib/l10n/app_localizations_zh.dart index e949682c..ac47c5fa 100644 --- a/lib/l10n/app_localizations_zh.dart +++ b/lib/l10n/app_localizations_zh.dart @@ -402,6 +402,9 @@ class AppLocalizationsZh extends AppLocalizations { String get aboutLogoArtist => 'The talented artist who created our beautiful app logo!'; + @override + String get aboutTranslators => 'Translators'; + @override String get aboutSpecialThanks => 'Special Thanks'; @@ -4056,7 +4059,7 @@ class AppLocalizationsZhTw extends AppLocalizationsZh { String get homeSupports => 'Supports: Track, Album, Playlist, Artist URLs'; @override - String get homeRecent => 'Recent'; + String get homeRecent => '最新的'; @override String get historyTitle => 'History'; diff --git a/lib/l10n/arb/app_en.arb b/lib/l10n/arb/app_en.arb index 5fa657bc..d54ab75d 100644 --- a/lib/l10n/arb/app_en.arb +++ b/lib/l10n/arb/app_en.arb @@ -290,6 +290,8 @@ "@aboutOriginalCreator": {"description": "Role description for original creator"}, "aboutLogoArtist": "The talented artist who created our beautiful app logo!", "@aboutLogoArtist": {"description": "Role description for logo artist"}, + "aboutTranslators": "Translators", + "@aboutTranslators": {"description": "Section for translators"}, "aboutSpecialThanks": "Special Thanks", "@aboutSpecialThanks": {"description": "Section for special thanks"}, "aboutLinks": "Links", diff --git a/lib/l10n/arb/app_es_ES.arb b/lib/l10n/arb/app_es_ES.arb index c5d40717..b451b4a5 100644 --- a/lib/l10n/arb/app_es_ES.arb +++ b/lib/l10n/arb/app_es_ES.arb @@ -1,5 +1,5 @@ { - "@@locale": "es-ES", + "@@locale": "es_ES", "@@last_modified": "2026-01-16", "appName": "SpotiFLAC", "@appName": { diff --git a/lib/l10n/arb/app_pt_PT.arb b/lib/l10n/arb/app_pt_PT.arb index b2703f94..cc4dbc02 100644 --- a/lib/l10n/arb/app_pt_PT.arb +++ b/lib/l10n/arb/app_pt_PT.arb @@ -1,5 +1,5 @@ { - "@@locale": "pt-PT", + "@@locale": "pt_PT", "@@last_modified": "2026-01-16", "appName": "SpotiFLAC", "@appName": { diff --git a/lib/l10n/arb/app_zh_CN.arb b/lib/l10n/arb/app_zh_CN.arb index 7e545a0b..5b9f70aa 100644 --- a/lib/l10n/arb/app_zh_CN.arb +++ b/lib/l10n/arb/app_zh_CN.arb @@ -1,5 +1,5 @@ { - "@@locale": "zh-CN", + "@@locale": "zh_CN", "@@last_modified": "2026-01-16", "appName": "SpotiFLAC", "@appName": { diff --git a/lib/l10n/arb/app_zh_TW.arb b/lib/l10n/arb/app_zh_TW.arb index 3798a905..57beac71 100644 --- a/lib/l10n/arb/app_zh_TW.arb +++ b/lib/l10n/arb/app_zh_TW.arb @@ -1,5 +1,5 @@ { - "@@locale": "zh-TW", + "@@locale": "zh_TW", "@@last_modified": "2026-01-16", "appName": "SpotiFLAC", "@appName": { diff --git a/lib/screens/settings/about_page.dart b/lib/screens/settings/about_page.dart index 83e2f401..25e15d38 100644 --- a/lib/screens/settings/about_page.dart +++ b/lib/screens/settings/about_page.dart @@ -86,6 +86,13 @@ class AboutPage extends StatelessWidget { ), ), + SliverToBoxAdapter( + child: SettingsSectionHeader(title: context.l10n.aboutTranslators), + ), + const SliverToBoxAdapter( + child: _TranslatorsSection(), + ), + SliverToBoxAdapter( child: SettingsSectionHeader(title: context.l10n.aboutSpecialThanks), ), @@ -395,7 +402,149 @@ class _ContributorItem extends StatelessWidget { } } -/// Settings item with 40x40 icon area to align with contributor avatars +/// Translator data model +class _Translator { + final String name; + final String githubUsername; + final String language; + final String flag; + + const _Translator({ + required this.name, + required this.githubUsername, + required this.language, + required this.flag, + }); +} + +/// Translators section with compact chip-style layout +class _TranslatorsSection extends StatelessWidget { + const _TranslatorsSection(); + + static const List<_Translator> _translators = [ + _Translator( + name: 'Pedro Marcondes', + githubUsername: 'justapedro', + language: 'Portuguese', + flag: '🇵🇹', + ), + _Translator( + name: 'Credits 125', + githubUsername: 'credits125', + language: 'Spanish', + flag: '🇪🇸', + ), + _Translator( + name: 'Владислав', + githubUsername: 'OdiNoKiY_KoT', + language: 'Russian', + flag: '🇷🇺', + ), + _Translator( + name: 'Max', + githubUsername: 'Amonoman', + language: 'German', + flag: '🇩🇪', + ), + ]; + + @override + Widget build(BuildContext context) { + final colorScheme = Theme.of(context).colorScheme; + final isDark = Theme.of(context).brightness == Brightness.dark; + + final cardColor = isDark + ? Color.alphaBlend(Colors.white.withValues(alpha: 0.08), colorScheme.surface) + : colorScheme.surfaceContainerHighest; + + return Padding( + padding: const EdgeInsets.symmetric(horizontal: 16), + child: Container( + decoration: BoxDecoration( + color: cardColor, + borderRadius: BorderRadius.circular(20), + ), + padding: const EdgeInsets.all(16), + child: Wrap( + spacing: 8, + runSpacing: 8, + children: _translators.map((translator) => _TranslatorChip( + translator: translator, + )).toList(), + ), + ), + ); + } +} + +/// Individual translator chip +class _TranslatorChip extends StatelessWidget { + final _Translator translator; + + const _TranslatorChip({required this.translator}); + + @override + Widget build(BuildContext context) { + final colorScheme = Theme.of(context).colorScheme; + + return Material( + color: colorScheme.secondaryContainer, + borderRadius: BorderRadius.circular(20), + child: InkWell( + onTap: () => _launchGitHub(translator.githubUsername), + borderRadius: BorderRadius.circular(20), + child: Padding( + padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 8), + child: Row( + mainAxisSize: MainAxisSize.min, + children: [ + ClipRRect( + borderRadius: BorderRadius.circular(10), + child: CachedNetworkImage( + imageUrl: 'https://github.com/${translator.githubUsername}.png', + width: 20, + height: 20, + fit: BoxFit.cover, + placeholder: (context, url) => Container( + width: 20, + height: 20, + color: colorScheme.surface, + child: Icon(Icons.person, size: 12, color: colorScheme.onSurfaceVariant), + ), + errorWidget: (context, url, error) => Container( + width: 20, + height: 20, + color: colorScheme.surface, + child: Icon(Icons.person, size: 12, color: colorScheme.onSurfaceVariant), + ), + ), + ), + const SizedBox(width: 8), + Text( + translator.name, + style: Theme.of(context).textTheme.labelLarge?.copyWith( + color: colorScheme.onSecondaryContainer, + fontWeight: FontWeight.w500, + ), + ), + const SizedBox(width: 6), + Text( + translator.flag, + style: const TextStyle(fontSize: 14), + ), + ], + ), + ), + ), + ); + } + + Future _launchGitHub(String username) async { + final uri = Uri.parse('https://github.com/$username'); + await launchUrl(uri, mode: LaunchMode.inAppBrowserView); + } +} + class _AboutSettingsItem extends StatelessWidget { final IconData icon; final String title;