screentinker/frontend/js/i18n/es.js
ScreenTinker 8e7a093150 i18n: extract all strings, add 6 language translations, restructure i18n module
Session 1 of 2 of the i18n rollout.

- Split i18n module into per-language files under frontend/js/i18n/ so a
  translator can edit one language without touching the others.
- Add Portuguese (pt) and seed Hindi (hi). Hindi is intentionally a skeleton
  -- 0 keys, full English fallback -- because we have an active Indian user
  and would rather ship "no Hindi" than ship machine-quality Hindi that
  could read as unprofessional or get formality/gender register wrong.
- 183 keys, 100% parity across en/es/fr/de/pt; native review still
  recommended before publicizing as "fully supported".
- Add t(key, vars) variable substitution and tn(keyBase, n, vars) plural
  helper for _one/_other key pairs.
- setLanguage() now triggers a CustomEvent + HashChangeEvent so the
  existing hash router naturally re-renders the current view, plus a
  subscriber pattern for nav labels rendered once outside the router.
- Wire t() into 3 high-traffic views end-to-end: dashboard, login,
  content-library. Sidebar nav labels in app.js update on language change.
- The remaining 16 views still ship with hardcoded English; they will be
  wired in session 2. The t() lookup is robust against unwired views, so
  the dashboard works in 5 languages while clicking into e.g. Schedule
  still shows English. No regressions.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-04-29 19:25:22 -05:00

197 lines
10 KiB
JavaScript

// Spanish translations. Reviewed for UI register (informal tú).
// Native review still recommended before publicizing as fully supported.
export default {
// Nav
'nav.displays': 'Pantallas',
'nav.content': 'Contenido',
'nav.playlists': 'Listas de reproducción',
'nav.layouts': 'Diseños',
'nav.widgets': 'Widgets',
'nav.schedule': 'Horario',
'nav.walls': 'Muros de video',
'nav.reports': 'Informes',
'nav.kiosk': 'Kiosco',
'nav.designer': 'Diseñador',
'nav.activity': 'Actividad',
'nav.teams': 'Equipos',
'nav.help': 'Ayuda',
'nav.settings': 'Configuración',
'nav.subscription': 'Suscripción',
'nav.admin': 'Administrador',
// Common
'common.save': 'Guardar',
'common.cancel': 'Cancelar',
'common.delete': 'Eliminar',
'common.edit': 'Editar',
'common.done': 'Listo',
'common.loading': 'Cargando...',
'common.connected': 'Conectado',
'common.disconnected': 'Desconectado',
'common.never': 'Nunca',
'common.just_now': 'Ahora mismo',
'common.minutes_ago': 'hace {n}m',
'common.hours_ago': 'hace {n}h',
'common.days_ago': 'hace {n}d',
'common.unknown': 'Desconocido',
// Auth
'auth.sign_in': 'Iniciar sesión',
'auth.sign_out': 'Cerrar sesión',
'auth.create_account': 'Crear cuenta',
'auth.create_admin_account': 'Crear cuenta de administrador',
'auth.email': 'Correo electrónico',
'auth.password': 'Contraseña',
'auth.name': 'Nombre',
'auth.placeholder_email': 'tu@ejemplo.com',
'auth.placeholder_password': '••••••••',
'auth.placeholder_name': 'Tu nombre',
'auth.placeholder_register_password': 'Mínimo 6 caracteres',
'auth.subtitle_setup': 'Crea tu cuenta de administrador para comenzar',
'auth.subtitle_signin': 'Inicia sesión para gestionar tus pantallas',
'auth.trial_notice': 'Las cuentas nuevas reciben 14 días de prueba Pro gratis',
'auth.divider_or': 'O',
'auth.signin_google': 'Iniciar sesión con Google',
'auth.signin_microsoft': 'Iniciar sesión con Microsoft',
'auth.back_to_signin': 'Volver a iniciar sesión',
'auth.support_access': 'Acceso de soporte',
'auth.support_token_placeholder': 'Pega el token de soporte',
'auth.support_authenticate': 'Autenticar con token de soporte',
'auth.terms': 'Términos del servicio',
'auth.privacy': 'Política de privacidad',
'auth.error_email_password_required': 'Se requieren correo y contraseña',
'auth.error_password_min_6': 'La contraseña debe tener al menos 6 caracteres',
'auth.error_login_failed': 'Error al iniciar sesión',
'auth.error_registration_failed': 'Error al registrarse',
'auth.error_paste_support_token': 'Pega un token de soporte',
'auth.error_support_failed': 'Error en el inicio de sesión de soporte',
'auth.error_google_failed': 'Error al iniciar sesión con Google',
'auth.error_microsoft_failed': 'Error al iniciar sesión con Microsoft',
// Dashboard
'dashboard.title': 'Pantallas',
'dashboard.subtitle': 'Administra tus pantallas remotas',
'dashboard.help_tip': 'Tus dispositivos vinculados. Verde = en línea, rojo = desconectado. Haz clic en uno para gestionar su lista de reproducción, ver telemetría o usar el control remoto.',
'dashboard.add': 'Agregar pantalla',
'dashboard.create_group': '+ Grupo',
'dashboard.search': 'Buscar pantallas...',
'dashboard.all_status': 'Todos los estados',
'dashboard.online': 'En línea',
'dashboard.offline': 'Desconectado',
'dashboard.awaiting_pairing': 'Esperando vinculación',
'dashboard.no_preview': 'Vista previa no disponible',
'dashboard.total_displays': 'Pantallas totales',
'dashboard.ungrouped': 'Sin grupo',
'dashboard.no_displays': 'Aún no hay pantallas',
'dashboard.no_displays_desc': 'Instala la aplicación de ScreenTinker en tu TV y vincúlala con el botón de arriba.',
'dashboard.failed_to_load': 'Error al cargar las pantallas',
'dashboard.unknown_playlist': 'Lista desconocida',
'dashboard.mixed_playlists': 'Listas variadas',
'dashboard.playlist_label': 'Lista: {name}',
'dashboard.devices_count_one': '{n} dispositivo',
'dashboard.devices_count_other': '{n} dispositivos',
'dashboard.online_count': '{n} en línea',
'dashboard.set_playlist_placeholder': 'Asignar lista...',
'dashboard.send_command_placeholder': 'Enviar comando...',
'dashboard.manage': 'Gestionar',
'dashboard.manage_tooltip': 'Agregar/quitar dispositivos',
'dashboard.delete_group_tooltip': 'Eliminar grupo',
'dashboard.no_devices_in_group': 'No hay dispositivos en este grupo. Haz clic en Gestionar para agregar.',
'dashboard.manage_group_subtitle': 'Marca los dispositivos para agregarlos a este grupo',
'dashboard.draft_suffix': '(borrador)',
'dashboard.cmd.screen_on': 'Encender pantalla',
'dashboard.cmd.screen_off': 'Apagar pantalla',
'dashboard.cmd.restart_app': 'Reiniciar app',
'dashboard.cmd.check_update': 'Buscar actualización',
'dashboard.cmd.reboot': 'Reiniciar',
'dashboard.cmd.shutdown': 'Apagar',
'dashboard.prompt_group_name': 'Nombre del grupo:',
'dashboard.error_pairing_code': 'Ingresa un código de vinculación válido de 6 dígitos',
'dashboard.confirm_add_to_group': '{name} ya está en: {groups}\n\n¿Agregarlo también a "{target}"?',
'dashboard.confirm_assign_playlist': '¿Asignar la lista "{playlist}" a todos los dispositivos de "{group}"?',
'dashboard.confirm_destructive_command': '¿{cmd} todos los {n} dispositivos de "{group}"?\n\nEsto no se puede deshacer.',
'dashboard.confirm_delete_group': '¿Eliminar este grupo? Los dispositivos no se verán afectados.',
'dashboard.toast.display_paired': '¡Pantalla vinculada con éxito!',
'dashboard.toast.group_created': 'Grupo creado',
'dashboard.toast.group_deleted': 'Grupo eliminado',
'dashboard.toast.already_in_group': '{name} ya está en {group}',
'dashboard.toast.moved_device': 'Se movió {name} a {group}',
'dashboard.toast.removed_device_one': 'Se quitó {name} de 1 grupo',
'dashboard.toast.removed_device_other': 'Se quitó {name} de {n} grupos',
'dashboard.toast.playlist_assigned_one': 'Lista asignada a 1 dispositivo',
'dashboard.toast.playlist_assigned_other': 'Lista asignada a {n} dispositivos',
'dashboard.toast.command_sent': '{cmd} enviado a {sent}/{total} dispositivos',
'dashboard.toast.command_sent_with_offline': '{cmd} enviado a {sent}/{total} dispositivos ({offline} desconectados)',
// Content library
'content.title': 'Biblioteca de contenido',
'content.subtitle': 'Sube y administra tus archivos multimedia',
'content.help_tip': 'Sube videos e imágenes aquí. Selecciona varios archivos para subir en lote. Usa URL remota para transmitir desde fuentes externas. Haz clic en una miniatura para previsualizar.',
'content.drop': 'Arrastra archivos aquí o haz clic para subir',
'content.upload_hint': 'Soporta MP4, WebM, AVI, MKV, JPEG, PNG, GIF, WebP',
'content.upload_progress': 'Subiendo...',
'content.upload_progress_named': 'Subiendo {name}...',
'content.upload_progress_named_pct': 'Subiendo {name}... {pct}%',
'content.remote_url': 'URL remota',
'content.remote_desc': 'Transmite directamente desde una URL. Ahorra ancho de banda local.',
'content.remote_url_placeholder': 'https://ejemplo.com/video.mp4',
'content.remote_name_placeholder': 'Nombre para mostrar (opcional)',
'content.remote_add_btn': 'Agregar URL remota',
'content.youtube': 'YouTube',
'content.youtube_desc': 'Inserta un video de YouTube en tus pantallas.',
'content.youtube_url_placeholder': 'https://youtube.com/watch?v=...',
'content.youtube_name_placeholder': 'Nombre para mostrar (opcional)',
'content.youtube_add_btn': 'Agregar video de YouTube',
'content.search_placeholder': 'Buscar contenido...',
'content.new_folder_btn': '+ Nueva carpeta',
'content.breadcrumb_root': 'Todo el contenido',
'content.rename_btn': 'Renombrar',
'content.delete_folder_btn': 'Eliminar carpeta',
'content.prompt_folder_name': 'Nombre de la carpeta:',
'content.prompt_rename_folder': 'Renombrar carpeta:',
'content.confirm_delete_folder': '¿Eliminar esta carpeta? El contenido volverá al nivel raíz. Las subcarpetas también se eliminarán.',
'content.empty_folder_title': 'Esta carpeta está vacía',
'content.empty_folder_desc': 'Arrastra contenido aquí o usa la acción Mover.',
'content.no_content': 'Aún no hay contenido',
'content.no_content_desc': 'Sube videos e imágenes para comenzar.',
'content.failed_to_load': 'Error al cargar el contenido',
'content.type_youtube': 'YouTube',
'content.type_remote': 'URL remota',
'content.type_remote_short': 'Remota',
'content.type_video': 'Video',
'content.type_image': 'Imagen',
'content.btn_edit': 'Editar',
'content.btn_delete': 'Eliminar',
'content.btn_confirm_delete': '¿Confirmar eliminación?',
'content.btn_deleting': 'Eliminando...',
'content.edit_modal_title': 'Editar contenido',
'content.label_filename': 'Nombre del archivo / Mostrar como',
'content.label_remote_url_field': 'URL remota',
'content.label_mime_type': 'Tipo MIME',
'content.label_folder': 'Carpeta',
'content.label_replace_file': 'Reemplazar archivo',
'content.replace_file_hint': 'Déjalo vacío para mantener el archivo actual',
'content.folder_root_option': '— Raíz —',
'content.save_changes': 'Guardar cambios',
'content.mime.video_mp4': 'Video (MP4)',
'content.mime.video_webm': 'Video (WebM)',
'content.mime.image_jpeg': 'Imagen (JPEG)',
'content.mime.image_png': 'Imagen (PNG)',
'content.mime.image_gif': 'Imagen (GIF)',
'content.mime.image_webp': 'Imagen (WebP)',
'content.error_enter_url': 'Ingresa una URL',
'content.error_enter_youtube_url': 'Ingresa una URL de YouTube',
'content.error_update_failed': 'Error al actualizar',
'content.toast.remote_added': 'Contenido remoto agregado',
'content.toast.youtube_added': 'Video de YouTube agregado',
'content.toast.deleted': 'Contenido eliminado',
'content.toast.updated': 'Contenido actualizado',
'content.toast.uploaded_named': '{name} se subió correctamente',
'content.toast.upload_failed_named': 'Error al subir {name}: {error}',
'content.toast.folder_created_named': 'Carpeta "{name}" creada',
'content.toast.folder_renamed': 'Carpeta renombrada',
'content.toast.folder_deleted': 'Carpeta eliminada',
'content.toast.moved': 'Movido',
'content.toast.moved_to_root': 'Movido a la raíz',
};