From e8465e473297b463ff51558417a851ab4a0bc67e Mon Sep 17 00:00:00 2001 From: Alec Schitzkat Date: Sat, 22 Aug 2026 03:27:22 +0200 Subject: [PATCH] Auto stash before merge of "dev" and "origin/dev" --- .../src/stores/phone-locale-contract.test.ts | 104 +- frontend/src/utils/appStorePreviews.test.ts | 23 +- sky_phone/config/locales/es.lua | 2110 +++++++++++++++++ sky_phone/fxmanifest.lua | 2 + 4 files changed, 2201 insertions(+), 38 deletions(-) create mode 100644 sky_phone/config/locales/es.lua diff --git a/frontend/src/stores/phone-locale-contract.test.ts b/frontend/src/stores/phone-locale-contract.test.ts index 03e6a40..e695d38 100644 --- a/frontend/src/stores/phone-locale-contract.test.ts +++ b/frontend/src/stores/phone-locale-contract.test.ts @@ -10,14 +10,22 @@ type LuaToken = { } const frontendSourceDirectory = fileURLToPath(new URL('../', import.meta.url)) -const englishLocaleSource = readFileSync( - new URL('../../../sky_phone/config/locales/en.lua', import.meta.url), - 'utf8', +const localeDirectory = fileURLToPath( + new URL('../../../sky_phone/config/locales/', import.meta.url), ) -const germanLocaleSource = readFileSync( - new URL('../../../sky_phone/config/locales/de.lua', import.meta.url), - 'utf8', +const localeSources = new Map( + readdirSync(localeDirectory, { withFileTypes: true }) + .filter((entry) => entry.isFile() && entry.name.endsWith('.lua')) + .map((entry) => [ + entry.name.replace(/\.lua$/, ''), + readFileSync(join(localeDirectory, entry.name), 'utf8'), + ]), ) +const englishLocaleSource = localeSources.get('en') +const germanLocaleSource = localeSources.get('de') +if (!englishLocaleSource || !germanLocaleSource) { + throw new Error('The bundled English and German phone locales are required.') +} const phoneStoreSource = readFileSync( new URL('./phone.ts', import.meta.url), 'utf8', @@ -148,6 +156,10 @@ function collectPlaceholders(value: string): string[] { return [...new Set(value.match(/\{[A-Za-z0-9_]+\}/g) ?? [])].sort() } +function collectNumberTokens(value: string): string[] { + return value.match(/\d+/g) ?? [] +} + function collectDefaultLocalePaths(source: string): Set { const ast = ts.createSourceFile( 'phone.ts', @@ -223,10 +235,26 @@ function collectFrontendFiles(directory: string): string[] { } describe('phone locale contract', () => { - const englishValues = collectLuaLocaleValues(englishLocaleSource) - const germanValues = collectLuaLocaleValues(germanLocaleSource) + const localeValues = new Map( + [...localeSources].map(([locale, source]) => [ + locale, + collectLuaLocaleValues(source), + ]), + ) + const englishValues = localeValues.get('en')! + const germanValues = localeValues.get('de')! + const translatedLocaleValues = [...localeValues].filter( + ([locale]) => locale !== 'en', + ) const englishPaths = new Set(englishValues.keys()) + it.each([...localeSources])( + 'registers the %s locale under its file name', + (locale, source) => { + expect(source.match(/^Locales\["([^"]+)"\]/)?.[1]).toBe(locale) + }, + ) + it('keeps every bundled frontend fallback in en.lua', () => { const missing = [...collectDefaultLocalePaths(phoneStoreSource)].filter( (path) => !englishPaths.has(`Nui.${path}`), @@ -271,26 +299,52 @@ describe('phone locale contract', () => { } }) - it('keeps German structurally aligned with English', () => { - const germanPaths = new Set(germanValues.keys()) + it.each(translatedLocaleValues)( + 'keeps %s structurally aligned with English', + (_locale, values) => { + expect([...values.keys()].sort()).toEqual([...englishPaths].sort()) + }, + ) - expect([...germanPaths].sort()).toEqual([...englishPaths].sort()) - }) + it.each(translatedLocaleValues)( + 'keeps %s interpolation placeholders aligned with English', + (_locale, values) => { + const mismatches = [...englishValues].flatMap( + ([path, englishValue]) => { + const translatedValue = values.get(path) + return translatedValue !== undefined && + JSON.stringify(collectPlaceholders(translatedValue)) !== + JSON.stringify(collectPlaceholders(englishValue)) + ? [ + `${path}: ${collectPlaceholders(englishValue).join(', ')} != ${collectPlaceholders(translatedValue).join(', ')}`, + ] + : [] + }, + ) - it('keeps German interpolation placeholders aligned with English', () => { - const mismatches = [...englishValues].flatMap(([path, englishValue]) => { - const germanValue = germanValues.get(path) - return germanValue !== undefined && - JSON.stringify(collectPlaceholders(germanValue)) !== - JSON.stringify(collectPlaceholders(englishValue)) - ? [ - `${path}: ${collectPlaceholders(englishValue).join(', ')} != ${collectPlaceholders(germanValue).join(', ')}`, - ] - : [] - }) + expect(mismatches).toEqual([]) + }, + ) - expect(mismatches).toEqual([]) - }) + it.each(translatedLocaleValues)( + 'keeps %s numeric source values intact', + (_locale, values) => { + const mismatches = [...englishValues].flatMap(([path, englishValue]) => { + const expected = collectNumberTokens(englishValue) + if (!expected.length) return [] + + const remaining = collectNumberTokens(values.get(path) ?? '') + for (const token of expected) { + const index = remaining.indexOf(token) + if (index >= 0) remaining.splice(index, 1) + else return [`${path}: missing numeric token ${token}`] + } + return [] + }) + + expect(mismatches).toEqual([]) + }, + ) it('keeps standard app names German and custom game names unchanged', () => { const standardAppNames = { diff --git a/frontend/src/utils/appStorePreviews.test.ts b/frontend/src/utils/appStorePreviews.test.ts index 12974eb..b67e57d 100644 --- a/frontend/src/utils/appStorePreviews.test.ts +++ b/frontend/src/utils/appStorePreviews.test.ts @@ -1,4 +1,4 @@ -import { readFileSync } from 'node:fs' +import { readdirSync, readFileSync } from 'node:fs' import { fileURLToPath } from 'node:url' import { describe, expect, it } from 'vitest' @@ -41,24 +41,21 @@ describe('App Store preview catalog', () => { expect(visualSignatures.size).toBe(storeAppIds.length) }) - it('localizes every specialized preview in the fallback, English and German locales', () => { + it('localizes every specialized preview in the fallback and every configured locale', () => { + const localeDirectory = fileURLToPath( + new URL('../../../sky_phone/config/locales/', import.meta.url), + ) const localeSources = [ readFileSync( fileURLToPath(new URL('../stores/phone.ts', import.meta.url)), 'utf8', ), - readFileSync( - fileURLToPath( - new URL('../../../sky_phone/config/locales/en.lua', import.meta.url), + ...readdirSync(localeDirectory) + .filter((fileName) => fileName.endsWith('.lua')) + .sort() + .map((fileName) => + readFileSync(`${localeDirectory}/${fileName}`, 'utf8'), ), - 'utf8', - ), - readFileSync( - fileURLToPath( - new URL('../../../sky_phone/config/locales/de.lua', import.meta.url), - ), - 'utf8', - ), ] for (const appId of PREVIEWABLE_BUILTIN_APP_IDS) { diff --git a/sky_phone/config/locales/es.lua b/sky_phone/config/locales/es.lua new file mode 100644 index 0000000..799c9e6 --- /dev/null +++ b/sky_phone/config/locales/es.lua @@ -0,0 +1,2110 @@ +Locales["es"] = { + CommandDescription = "Abrir tu teléfono.", + Controls = { + OpenPhone = "Abrir teléfono", + }, + TestData = { + CommandDescription = "Crear o actualizar contenido de prueba en cada aplicación basada en datos.", + Success = "El contenido de prueba está listo. Tu inicio de sesión en Sky Cloud es {email}. Reabre el teléfono para actualizar cada aplicación.", + Failed = "No se pudo crear el contenido de prueba. Revisa la consola del servidor para obtener más información.", + }, + FlipTokCommand = { + usage = "Uso: /{command} <@handle> [on|off]", + noPermission = "No tienes permiso para gestionar la verificación de FlipTok.", + notFound = "El perfil de FlipTok @{handle} no fue encontrado.", + updated = "El perfil de FlipTok @{handle} ahora está {state}.", + verified = "verificado", + unverified = "no verificado", + }, + PicstagramCommand = { + usage = "Uso: /{command} <@handle> ", + noPermission = "No tienes permiso para gestionar la verificación de Picstagram.", + notFound = "El perfil de Picstagram @{handle} no fue encontrado.", + updated = "El perfil de Picstagram @{handle} ahora está {state}.", + verified = "verificado", + unverified = "no verificado", + }, + DeviceErrors = { + phone_slot_missing = "El teléfono utilizado no pudo ser identificado. Asegúrate de que los teléfonos no estén apilados.", + phone_stacked = "Los teléfonos no pueden apilarse.", + invalid_imei = "Este teléfono tiene metadatos de IMEI inválidos.", + metadata_unsupported = "La configuración del inventario no puede almacenar metadatos únicos de teléfono.", + player_unavailable = "Tu identidad de personaje no está disponible.", + sim_slot_missing = "La tarjeta SIM utilizada no pudo ser identificada.", + sim_stacked = "Las tarjetas SIM no pueden apilarse.", + invalid_sim = "Esta tarjeta SIM tiene metadatos inválidos.", + phone_required = "Necesitas un teléfono en tu inventario.", + operation_in_progress = "Otra operación de teléfono ya está en progreso.", + voice_unavailable = "El servicio de voz configurado para el teléfono no está disponible.", + default = "No se pudo abrir el teléfono.", + }, + Payphone = { + Interact = "Usar el teléfono público.", + RingingHelp = "Llamando {number}... | Colgar", + ConnectedHelp = "Conectado a {number} | {duration} | {currency}{cost} | Colgar", + }, + Nui = { + Payphone = { + title = "TELÉFONO PÚBLICO DE LOS SANTOS", + subtitle = "TELÉFONO PÚBLICO", + numberLabel = "NÚMERO A MARCAR", + numberPlaceholder = "Introduce un número de teléfono", + rate = "{currency}{price} / s", + ready = "LISTO", + dialing = "MARCANDO", + ringing = "SONANDO", + connected = "CONECTADO", + callEnded = "LLAMADA FINALIZADA", + unavailable = "NÚMERO NO DISPONIBLE", + busy = "LÍNEA OCUPADA", + noAnswer = "NO HAY RESPUESTA", + declined = "LLAMADA RECHAZADA", + disconnected = "DESCONECTADO", + insufficientFunds = "SIN DINERO", + invalidNumber = "INGRESA UN NÚMERO VÁLIDO", + requestFailed = "NO SE PUDO INICIAR LA LLAMADA", + voiceUnavailable = "SERVICIO DE VOZ NO DISPONIBLE", + call = "LLAMAR", + hangup = "COLGAR", + close = "Cerrar el teléfono público", + delete = "Eliminar dígito", + clear = "Borrar número", + keypad = "Teclado numérico", + elapsed = "TIEMPO", + cost = "COSTE", + }, + Setup = { + title = "Sky Phone Setup Assistant", ownerFallback = "Sky Phone Owner", getStarted = "Empezar", setUpLater = "Configurar más tarde", + development = { skip = "Saltar configuración" }, + welcome = { title = "Bienvenido a Sky Phone", eyebrow = "Diseñado para ti", hello = "hola", hallo = "hola", bonjour = "bonjour", body = "Hola, {name}. Haz que sea tan único como tú.", private = "Privado por diseño", personal = "Hecho para ti" }, + connection = { + eyebrow = "Conexión móvil", title = "Tu conexión está lista", body = "Sky Phone detecta automáticamente la SIM instalada en este dispositivo.", + noSim = "No hay ninguna SIM instalada", ready = "Conectado a la red Sky", offline = "El teléfono funciona sin conexión; las llamadas y mensajes requieren una SIM", + preserved = "Tu número de SIM y conversaciones respaldadas por SIM permanecen con la SIM, incluso si este teléfono se borra.", + }, + cloud = { + eyebrow = "Sky Cloud", title = "Mantén los datos importantes contigo", body = "Inicia sesión para sincronizar los datos de las aplicaciones compatibles y recuperarlos en otro Sky Phone.", + signIn = "Iniciar sesión", create = "Crear cuenta", email = "Correo de Sky Cloud", password = "Contraseña", connected = "Sky Cloud conectado", + signInTitle = "Iniciar sesión en Sky Cloud", createTitle = "Crear cuenta de Sky Cloud", + signInBody = "Accede a tus datos protegidos, compras y ajustes en este teléfono.", createBody = "Elige tu dirección personal de iFruit y mantén los datos importantes disponibles en varios dispositivos.", + accountPreview = "Tu ID de Sky Cloud", accountName = "Nombre de cuenta", addressPlaceholder = "alex.morgan", confirmPassword = "Confirmar contraseña", + passwordMismatch = "Las contraseñas no coinciden.", strength0 = "Al menos 6 caracteres", strength1 = "Contraseña básica", strength2 = "Contraseña buena", strength3 = "Contraseña fuerte", strength4 = "Contraseña excelente", + signInAction = "Iniciar sesión de forma segura", createAction = "Crear cuenta de Sky Cloud", securityNote = "Conexión cifrada · Tu contraseña permanece privada", + invalid = "Introduce un correo electrónico válido y una contraseña con al menos 6 caracteres.", + errors = { + invalid_email = "Introduce un correo electrónico válido de Sky Cloud.", invalid_password = "Tu contraseña debe contener al menos 6 caracteres.", + invalid_credentials = "El correo electrónico o la contraseña es incorrecta.", email_taken = "Este correo electrónico de Sky Cloud ya está registrado.", + rate_limited = "Demasiados intentos. Inténtalo de nuevo pronto.", request_failed = "Sky Cloud está temporalmente inaccesible.", + }, + }, + security = { + eyebrow = "Privacidad y seguridad", title = "Proteger este teléfono", body = "Elige un código de acceso de 4 o 6 dígitos para mantener tus aplicaciones e información local privada.", + ["local"] = "El código de acceso pertenece a este teléfono físico y nunca se transfiere con la SIM.", create = "Crear código de acceso", createSelected = "Crear código de acceso de {count} dígitos", + lengthTitle = "Elegir longitud del código de acceso", fourDigit = "Código de 4 dígitos", sixDigit = "Código de 6 dígitos", + enter = "Crear un código de acceso", confirm = "Verificar tu código de acceso", codeHint = "Introduce un código memorable de seis dígitos.", fourDigitHint = "Introduce un código memorable de cuatro dígitos.", sixDigitHint = "Introduce un código memorable de seis dígitos.", + mismatch = "Los códigos no coincidieron. Inténtalo de nuevo.", failed = "El código de acceso no se pudo guardar.", + }, + appearance = { eyebrow = "Pantalla", title = "Elige tu apariencia", body = "El modo Automático sigue el tema del sistema. Puedes cambiarlo en cualquier momento desde Ajustes." }, + performance = { + eyebrow = "Rendimiento", title = "Elige cómo se siente tu teléfono", body = "Equilibra la respuesta y los efectos visuales para tu configuración de FiveM.", + performance = "Respuesta más rápida con pantalla optimizada y sin desenfoque.", ultimate = "Riqueza de profundidad, desenfoque en vivo y experiencia completa de pantalla.", + changeLater = "Puedes cambiar los modos más tarde en Ajustes › Apariencia.", + }, + wallpaper = { eyebrow = "Personalizar", title = "Hazlo tuyo", body = "Elige uno de doce fondos personalizados para Sky Phone." }, + notifications = { + eyebrow = "Mantente informado", title = "Notificaciones a tu manera", body = "Elige cómo pueden avisarte las aplicaciones. Las alarmas críticas y las llamadas seguirán disponibles.", + allow = "Permitir notificaciones de la aplicación", allowBody = "Muestra banners, avisos en la pantalla de bloqueo e indicadores.", + sounds = "Sonidos de notificación", soundsBody = "Reproducir un sonido suave para las actualizaciones entrantes.", + }, + apps = { + eyebrow = "Sugeridos para ti", title = "Empieza con tus favoritos", body = "Elige aplicaciones adicionales. Cada aplicación esencial del teléfono ya está incluida.", install = "Añadir {count} aplicaciones", + descriptions = { banking = "Banca urbana segura", garage = "Tus vehículos de un vistazo", skyride = "Solicitar un viaje", citymarkt = "Explora anuncios locales", picstagram = "Compartir fotos", snake = "Juego clásico" }, + }, + ready = { + eyebrow = "Configuración completa", title = "Bienvenido, {name}", body = "Tu Sky Phone está configurado y listo. Siempre puedes ajustar tus preferencias desde Ajustes.", + localOnly = "Guardado en este teléfono", enter = "Entrar en Sky Phone", review = "Revisar configuración", + saving = "Guardando configuración", saveFailed = "La configuración no se pudo guardar. Inténtalo de nuevo.", + }, + }, + Common = { + add = "Agregar", back = "Atrás", cancel = "Cancelar", clear = "Borrar", close = "Cerrar", continue = "Continuar", delete = "Eliminar", done = "Listo", edit = "Editar", home = "Inicio", loading = "Cargando", pause = "Pausar", use = "Usar", + phone = "Teléfono", phoneStatus = "Estado del teléfono", reset = "Restablecer", + save = "Guardar", search = "Buscar", send = "Enviar", start = "Inicio", stop = "Detener", + signOut = "Cerrar sesión", signingOut = "Cerrando sesión...", signOutTitle = "¿Cerrar sesión en {app}?", + signOutBody = "Solo cerrarás la sesión de {app}. Tus otras aplicaciones de iFruit mantendrán la sesión iniciada.", signOutFailed = "No se pudo cerrar sesión. Por favor, inténtalo de nuevo.", + appAuth = { + eyebrow = "Cuenta iFruit", title = "Continuar en {app}", body = "Usa tu correo electrónico y contraseña de iFruit. Este inicio de sesión solo aplica a {app}.", + login = "Iniciar sesión", register = "Registrarse", email = "Correo de iFruit", password = "Contraseña", confirm = "Confirmar contraseña", + loginAction = "Iniciar sesión", registerAction = "Crear cuenta", + errors = { + invalid_email = "Introduce un correo electrónico válido de iFruit.", invalid_password = "La contraseña debe tener entre 6 y 64 caracteres.", + invalid_credentials = "El correo electrónico o la contraseña es incorrecta.", email_taken = "Ese correo de iFruit ya está registrado.", + rate_limited = "Demasiados intentos. Inténtalo de nuevo en un minuto.", default = "La solicitud de cuenta falló.", + }, + }, + }, + ControlCenter = { + airplaneMode = "Modo avión", bluetooth = "Bluetooth", brightness = "Brillo", calculator = "Calculadora", + camera = "Cámara", cellular = "Datos móviles", close = "Cerrar Centro de control", easyShareContact = "Compartir mi contacto con jugadores cercanos", flashlight = "Linterna", + focus = "Concentración", label = "Centro de control", media = "Medios", muteRingtone = "Silenciar sonido y notificaciones", next = "Canción siguiente", notPlaying = "No está reproduciéndose", + open = "Abrir Centro de control", play = "Reproducir", previous = "Canción anterior", quickActions = "Acciones rápidas", + timer = "Temporizador", unmuteRingtone = "Activar sonido y notificaciones", volume = "Volumen", wifi = "Wi-Fi", + }, + Notifications = { clearAll = "Borrar todo", clear = "Borrar", now = "ahora", open = "Abrir notificaciones" }, + LockScreen = { + label = "Pantalla bloqueada", flashlight = "Linterna", camera = "Cámara", swipeUp = "Deslizar hacia arriba para abrir", + passcode = { + enter = "Introduce el código de acceso", unlockSubtitle = "Introduce el código de acceso para este teléfono.", cancel = "Cancelar", delete = "Eliminar dígito", + incorrect = "Código incorrecto", locked = "Demasiados intentos. Inténtalo de nuevo en {seconds} segundos.", + tryAgain = "Inténtalo de nuevo en {seconds} segundos", rateLimited = "Demasiados intentos. Por favor, espera.", + }, + }, + HardwareButtons = { + lock = "Bloquear teléfono", mute = "Silenciar sonido y notificaciones", unlock = "Desbloquear el teléfono", + unmute = "Activar sonido y notificaciones", volumeDown = "Volumen bajo", + volumeLevel = "Volumen {value} por ciento", volumeUp = "Volumen más alto", + }, + Home = { + appLibrary = "Biblioteca de aplicaciones", appLibrarySearch = "Buscar aplicaciones", allApps = "Todas las aplicaciones", apps = "Aplicaciones", + dock = "Dock", noApps = "No se encontraron aplicaciones", removeApp = "Eliminar {app} de la Pantalla de inicio", addToHome = "Añadir {app} a la pantalla de inicio", addPage = "Añadir página de pantalla de inicio", deletePage = "Eliminar página actual de la pantalla de inicio", removedFromHome = "Eliminado de la Pantalla de inicio", page = "Página", pages = "Páginas de pantalla de inicio", + folders = { defaultName = "Carpeta", close = "Cerrar carpeta", rename = "Renombrar carpeta", name = "Nombre de carpeta", pages = "Páginas de carpeta" }, + groups = { + suggestions = "Sugerencias", recentlyAdded = "Recientemente añadido", games = "Juegos", + productivity = "Productividad", shopping = "Compras", social = "Redes sociales", utilities = "Herramientas", + }, + widgets = { + label = "Widgets", + weather = { city = "Los Santos", condition = "Parcialmente nublado" }, + calendar = { event = "No hay más eventos hoy" }, + battery = { label = "Teléfono" }, + media = { title = "Noche de conducción", artist = "Sky Radio", play = "Reproducir", pause = "Pausar" }, + }, + widgetSystem = { + galleryTitle = "Widgets", search = "Buscar widgets", size = "Tamaño", add = "Añadir elemento gráfico", addWidget = "Añadir elemento gráfico", + editWidget = "Editar widget", removeWidget = "Eliminar widget", remove = "Eliminar widget", configure = "Configurar el elemento gráfico", noResults = "No se encontraron widgets", + sizes = { small = "Pequeño", medium = "Mediano", large = "Grande" }, + categories = { essentials = "Esenciales", information = "Información", media = "Medios", finance = "Finanzas", people = "Personas" }, + clock = { name = "Reloj", description = "La hora actual, con una fecha opcional.", showDate = "Mostrar fecha" }, + date = { name = "Fecha", description = "Día de la semana, mes y fecha de vista general." }, + weather = { name = "Clima", description = "Condiciones actuales, ubicación, máxima y mínima.", range = "Máx.: {high}° · Mín.: {low}°" }, + music = { name = "Reproduciendo", description = "Controles de música y reproducción actual", empty = "No hay música reciente" }, + wallet = { name = "Billetera", description = "Tu saldo bancario o efectivo actual.", balance = "Saldo mostrado", bank = "Banco", cash = "Efectivo" }, + transactions = { name = "Transacciones", description = "Pagos entrantes y salientes recientes" }, + contacts = { name = "Favoritos", description = "Llamar o enviar mensaje a tus contactos favoritos.", choose = "Contactos favoritos" }, + }, + }, + Apps = { + health = { + name = "Salud", + navigation = "Navegación de salud", + tabs = { today = "Hoy", trends = "Tendencias", medicalId = "Identificador médico" }, + loading = "Cargando datos de salud...", + errorTitle = "Salud no disponible", + errorBody = "Los datos de actividad no se pudieron cargar.", + tryAgain = "Inténtalo de nuevo", + goal = "{count}", + steps = "Pasos", + distance = "Distancia", + active = "Actividad", + energy = "Energía", + kilometers = "{count} km", + minutes = "{count} min", + kilocalories = "{count} kcal", + thisWeek = "Esta semana", + snapshot = "Instantánea de la salud", + trends = { + title = "Tendencias", week = "Semana", month = "Mes", total = "{count} pasos", + more = "{count}% más que la semana pasada", less = "{count}% menos que la semana pasada", + same = "Igual que la semana pasada", dailyAverage = "Promedio diario", activeTime = "Tiempo activo", + dailyActivity = "Actividad diaria", goal = "Objetivo", + }, + medicalId = { + title = "Identificador médico", edit = "Editar", done = "Listo", resident = "Residente de Los Santos", + emergencyInformation = "Información de emergencia", bloodType = "Tipo sanguíneo", + allergies = "Alergias", conditions = "Condiciones", medication = "Medicación", + noneRecorded = "Ninguno registrado", emergencyContact = "Contacto de emergencia", + contactName = "Nombre de contacto", relation = "Relación", phoneNumber = "Número de teléfono", + emergencyCall = "Llamada de emergencia", callContact = "Llamar al contacto de emergencia", + saveFailed = "No se pudo guardar la identificación médica.", + }, + errors = { + invalid_phone_number = "Introduce un número de teléfono válido en el juego.", + invalid_request = "Revisa los campos del identificador médico.", + rate_limited = "Por favor espera antes de intentarlo de nuevo.", + request_failed = "No se pudo completar la solicitud de salud.", + }, + }, + customApps = { + loading = "Abriendo aplicación...", + unavailableTitle = "Aplicación no disponible", + unavailableBody = "Esta aplicación personalizada no se pudo cargar. Verifica que su recurso esté iniciado, luego vuelve a abrir la aplicación.", + close = "Cerrar aplicación", + }, + weazelNews = { + name = "Weazel News", + brand = "WEAZEL NEWS", + navigation = "Navegación Weazel News", + tabs = { + home = "Inicio", + categories = "Categorías", + search = "Buscar", + editorial = "Editorial", + }, + back = "Atrás", + retry = "Inténtalo de nuevo", + loadMore = "Cargar más", + home = { + eyebrow = "Los Santos, en vivo", + latest = "Últimas noticias", + }, + categories = { + title = "Categorías", + subtitle = "Explora todas las noticias de la redacción de Weazel News.", + all = "Todas las noticias", + official = "Noticias oficiales", + events = "Eventos y ocio", + jobs = "Trabajos", + news = "Noticias y Eventos", + business = "Negocios", + }, + search = { + placeholder = "Buscar artículos...", + title = "Buscar Weazel News", + emptyTitle = "No se encontraron artículos", + emptyBody = "Inténtalo con otro título, tema o categoría", + }, + states = { + loading = "Cargando Weazel News...", + emptyTitle = "No hay noticias aún", + emptyBody = "La redacción de Weazel News aún no ha publicado artículos aquí.", + errorTitle = "Weazel News no está disponible", + readOnlyTitle = "Acceso solo lectura", + readOnlyBody = "Tu cargo actual puede leer Weazel News, pero no puede gestionar artículos.", + noManagedTitle = "No hay artículos editoriales", + noManagedBody = "Crea un artículo o cambia el filtro editorial actual.", + }, + article = { + readMore = "Leer artículo", + byline = "Por {author}", + updated = "Actualizado {date}", + published = "Publicado {date}", + coverAlt = "Portada para {title}", + }, + editorial = { + title = "Redacción", + subtitle = "Crear, publicar y mantener artículos de Weazel News.", + newArticle = "Nuevo Artículo", + published = "Publicado", + drafts = "Borradores", + all = "Todos", + jobAccess = "Iniciado como {job}", + edit = "Editar Artículo", + delete = "Eliminar artículo", + }, + composer = { + newTitle = "Nuevo Artículo", + editTitle = "Editar Artículo", + title = "Título", + titlePlaceholder = "Escribe un titular claro", + body = "Artículo", + bodyPlaceholder = "Escribe la historia completa...", + category = "Categoría", + status = "Estado de publicación", + cover = "Imagen de portada", + photos = "Fotos del artículo", + photoCount = "{count} de {maximum} fotos", + addPhotos = "Agregar fotos", + choosePhotos = "Elegir de Fotos", + takePhoto = "Tomar foto", + photoSourceHint = "Elige varias fotos de tu biblioteca o toma una nueva.", + primaryPhoto = "Portada", + makePrimary = "Usar como portada", + chooseCover = "Elegir de Fotos", + changeCover = "Cambiar portada", + removeCover = "Eliminar portada", + coverAlt = "Portada de artículo seleccionado", + publish = "Publicar artículo", + saveDraft = "Guardar borrador", + saveChanges = "Guardar cambios", + statusPublished = "Publicado", + statusDraft = "Borrador", + }, + delete = { + title = "¿Borrar artículo?", + body = "Este artículo será eliminado de Weazel News.", + cancel = "Cancelar", + confirm = "Eliminar", + }, + feedback = { + created = "Artículo creado.", + updated = "Artículo actualizado.", + deleted = "Artículo eliminado.", + }, + accessibility = { + articleList = "Artículos de Weazel News", + categoryList = "Categorías de noticias", + editorialList = "Artículos editoriales", + openArticle = "Abrir {title}", + openCategory = "Abrir {category}", + openEditorial = "Abrir el escritorio editorial", + newArticle = "Crear un nuevo artículo", + editArticle = "Editar {title}", + deleteArticle = "Eliminar {title}", + search = "Buscar Weazel News", + clearSearch = "Borrar búsqueda de artículos", + articleImages = "Fotos del artículo", + previousPhoto = "Mostrar la foto anterior del artículo", + nextPhoto = "Mostrar la siguiente foto del artículo", + showPhoto = "Mostrar foto {current} de {total}", + coverPreview = "Vista previa de la portada del artículo", + removeCover = "Eliminar la imagen de portada seleccionada", + removePhoto = "Eliminar esta foto del artículo", + status = "Estado del artículo: {status}", + }, + errors = { + feature_disabled = "Weazel News está desactivado actualmente.", + invalid_article = "Introduce un título, artículo y categoría válidos.", + invalid_draft = "Introduce un título y el texto del artículo antes de guardar el borrador.", + invalid_publish = "Introduce un título y un texto de artículo antes de publicar.", + invalid_request = "Revisa los detalles del artículo e inténtalo de nuevo.", + invalid_image = "Elige una imagen válida de este teléfono.", + invalid_attachment = "Elige una imagen válida de este teléfono.", + not_authorized = "Tu cargo actual no puede gestionar los artículos de Weazel News.", + article_not_found = "Este artículo ya no está disponible.", + not_found = "Este artículo ya no está disponible.", + revision_conflict = "Este artículo se modificó en otro dispositivo. Vuelve a cargarlo e inténtalo de nuevo.", + rate_limited = "Demasiadas solicitudes. Inténtalo de nuevo pronto.", + request_failed = "Weazel News no pudo completar la solicitud.", + default = "Weazel News no está disponible temporalmente.", + }, + }, + crewlink = { + name = "CrewLink", connecting = "Conectando con tu grupo...", privateNetwork = "Red de ubicación privada", + signInTitle = "Conecta tu cuenta de Sky Cloud", signInBody = "CrewLink usa tu identidad privada de Sky Cloud para mantener tus grupos y roles disponibles en todos tus teléfonos.", openSettings = "Abrir ajustes de Sky Cloud", + authEyebrow = "Red privada del grupo", authTitle = "Bienvenido a CrewLink", + authBody = "Tu correo de iFruit se vincula automáticamente. Introduce tu contraseña para continuar.", + login = "Iniciar sesión", register = "Registrarse", ifruitEmail = "Dirección de iFruit", password = "Contraseña", passwordPlaceholder = "8-72 caracteres", gallery = "Fotos", camera = "Cámara", backToLogin = "Volver al inicio de sesión de CrewLink", + authErrors = { + no_ifruit_account = "Inicia sesión en tu cuenta de Sky Cloud desde Ajustes.", invalid_username = "Usa 3-20 letras, números, puntos o subrayados.", invalid_password = "La contraseña debe tener entre 8 y 72 caracteres.", invalid_credentials = "La contraseña para este correo electrónico iFruit es incorrecta.", + profile_not_found = "No existe un perfil de CrewLink para este correo de iFruit.", profile_exists = "Este correo electrónico iFruit ya tiene un perfil de CrewLink.", + username_taken = "Ese nombre de usuario para CrewLink ya está en uso.", invalid_profile_image = "Elige una imagen válida de este teléfono.", + rate_limited = "Demasiados intentos. Inténtalo de nuevo pronto.", request_failed = "CrewLink no pudo completar la solicitud.", + }, + welcomeEyebrow = "Tu grupo. Una señal.", welcomeTitle = "Encuentra a tu gente", welcomeBody = "Elige un nombre de usuario privado para CrewLink. Solo los miembros confirmados del grupo pueden ver tu presencia y la ubicación que compartes.", + username = "Nombre de usuario de CrewLink", usernamePlaceholder = "p. ej. Skyline", createProfile = "Crear perfil de CrewLink", profileCreated = "Tu perfil de CrewLink está listo.", privacyNote = "Privado por diseño. No hay búsqueda pública de jugadores.", + noGroupEyebrow = "Sin grupo activo", noGroupTitle = "Construye tu red privada", noGroupBody = "Crea un grupo o únete a amigos con un código de invitación privado.", + createGroup = "Crear Grupo", createGroupBody = "Da un nombre reconocible a tu grupo y un color de señal.", joinGroup = "Unirse al Grupo", joinWithCode = "Únete con código", joinWithCodeBody = "Introduce el código privado de ocho caracteres compartido por un coordinador.", + groupName = "Nombre del grupo", groupNamePlaceholder = "p. ej. Turno de noche", groupColour = "Color de señal", createCrew = "Crear grupo", joinCrew = "Unirse a un Grupo", inviteCode = "Código de invitación", inviteCodePlaceholder = "AB12CD34", + groupCreated = "Grupo creado.", joinedGroup = "Has entrado en el grupo.", activeGroupChanged = "Grupo activo cambiado.", pendingInvitations = "Invitaciones", invitedBy = "Invitado por @{username}", inviteAccepted = "Invitación aceptada.", inviteDeclined = "Invitación rechazada.", + navigation = "Navegación de CrewLink", map = "Mapa", crew = "Grupo", pings = "Pings", profile = "Perfil", onlineNow = "en línea ahora", zoomIn = "Acercar", zoomOut = "Alejar", myLocation = "Centrar mi ubicación", + member = "Miembro", members = "Miembros", openCrew = "Ver equipo", newPing = "Nueva señal", shareLocation = "Marcar un lugar", locationUnavailable = "Tu ubicación en vivo está oculta actualmente.", activeCrew = "Grupo privado activo", groupSummarySingle = "{online} de {total} miembros en línea", groupSummary = "{online} de {total} miembros en línea", private = "Privado", + nearby = "Cercano", copyCode = "Copiar código", shareInvite = "Invitar por mensaje", shareInviteTitle = "Únete a {group} en CrewLink", shareInviteBody = "Usa el código de invitación {code} para unirte a {group}.", manage = "Gestionar", refresh = "Actualizar", codeCopied = "Código de invitación copiado.", codeRotated = "Un nuevo código de invitación está activo.", + peopleNearby = "Personas cerca", peopleNearbyBody = "Solo los usuarios de CrewLink dentro de {distance} metros aparecen aquí.", metersAway = "{distance} m de distancia", invite = "Invitar", inviteSent = "Invitación enviada a @{username}.", nobodyNearby = "Nadie en rango", nobodyNearbyBody = "Acércate a otro usuario de CrewLink y escanea de nuevo.", scanAgain = "Escanear de nuevo", + liveCoordination = "Coordinación en vivo", noPings = "No hay pings activos", noPingsBody = "Comparte un punto de encuentro, una advertencia o un objetivo con tu grupo.", expiresMinutes = "{count} min restantes", expiresSeconds = "{count} s restantes", sharedBy = "Compartido por @{username}", setRoute = "Establecer ruta", routeSet = "Ruta GPS establecida.", pingCreated = "Ping compartido con tu grupo.", pingRemoved = "Ping eliminado.", + newPingBody = "Elige un punto en el mapa, luego agrega una etiqueta y tipo de ping.", pingLabel = "Etiqueta de ping", pingLabelPlaceholder = "Por ejemplo, nos vemos en el garaje", placeOnMap = "Colocar ping en el mapa", placeOnMapBody = "Mueve el mapa hasta que el punto de mira marque el punto exacto.", positionSelected = "Posición seleccionada · tocar para cambiar", addHere = "Colocar aquí", sharePing = "Compartir ping", + pingTypes = { meeting = "Reunión", danger = "Peligro", help = "Ayuda", target = "Objetivo", info = "Información" }, + status = { live = "En vivo", hidden = "Ubicación oculta", offline = "Desconectado" }, + roles = { owner = "Propietario", coordinator = "Coordinador", moderator = "Moderador", member = "Miembro", guest = "Invitado" }, + roleDescriptions = { coordinator = "Gestionar invitaciones, ajustes, roles y pings.", moderator = "Invitar a usuarios cercanos y moderar los pings del grupo.", member = "Compartir presencia y crear pings cuando esté activado.", guest = "Ver el equipo activo sin permisos de coordinación." }, + manageCrew = "Gestionar grupo", manageCrewBody = "Actualiza la identidad, los permisos y las invitaciones.", memberPings = "Pings de miembros", memberPingsBody = "Permite que miembros e invitados creen pings.", allowOverhead = "Etiquetas sobre jugadores", allowOverheadBody = "Permite mostrar en el mundo las etiquetas de los miembros cercanos.", groupSaved = "Configuración del grupo guardada.", + assignRole = "Asignar Rol", roleUpdated = "Rol del miembro actualizado.", transferOwnership = "Transferir Propiedad", removeMember = "Eliminar de la tripulación", yourCrewLinkId = "Tu ID de CrewLink", privacyVisibility = "Privacidad y visibilidad", shareOnMap = "Compartir en mapa de grupo", shareOnMapBody = "Los miembros activos pueden ver tu posición en vivo.", overheadLabels = "Etiquetas de jugadores cercanos", overheadLabelsBody = "Muestra tu nombre de CrewLink a los miembros cercanos que también hayan activado esta opción.", + yourGroups = "Tus Grupos", createAnotherGroup = "Crear otro grupo", account = "Cuenta de CrewLink", externalApi = "Recursos conectados", externalApiBody = "Los scripts aprobados pueden agregar pings temporales.", editUsername = "Editar nombre de usuario", editUsernameBody = "Tu nombre de usuario es único en CrewLink.", + editProfile = "Editar perfil de CrewLink", editProfileBody = "Cambiar tu nombre de usuario y foto de perfil.", removeProfilePhoto = "Eliminar foto de perfil", profileSaved = "Perfil de CrewLink guardado.", deleteGroup = "Eliminar grupo", leaveGroup = "Salir del Grupo", confirmAction = "Confirmar", + confirm = { + ["delete-group"] = { title = "¿Eliminar este grupo?", body = "El grupo, los miembros, las invitaciones y los pings activos se eliminarán permanentemente." }, + ["leave-group"] = { title = "¿Abandonar este grupo?", body = "Perderás acceso a sus miembros, mapa y pings." }, + ["remove-member"] = { title = "¿Retirar a este miembro?", body = "Este miembro perderá inmediatamente el acceso al grupo." }, + ["transfer-owner"] = { title = "¿Transferencia de propiedad?", body = "El miembro seleccionado se convierte en dueño y tú en coordinador." }, + }, + ["delete-groupDone"] = "Grupo eliminado.", ["leave-groupDone"] = "Has abandonado el grupo.", ["remove-memberDone"] = "Miembro eliminado.", ["transfer-ownerDone"] = "Propiedad transferida.", + notifications = { invite = "{actor} te invitó a {group}.", member_joined = "{actor} se unió a {group}.", ping = "{actor} compartió '{ping}' con {group}.", role = "Tu rol en CrewLink cambió en {group}.", removed = "Te han eliminado de {group}.", default = "Tu grupo de CrewLink tiene una actualización." }, + errors = { + not_authenticated = "Inicia sesión en tu cuenta de Sky Cloud primero.", profile_required = "Crea tu perfil de CrewLink primero.", invalid_username = "Usa 3-20 letras, números, puntos o subrayados.", invalid_profile = "Verifica los detalles de tu perfil.", invalid_profile_image = "Elige una imagen válida de este teléfono.", username_taken = "Ese nombre de usuario para CrewLink ya está en uso.", + invalid_group = "Elige un nombre de grupo válido y un color de señal.", group_limit = "Has alcanzado el límite de grupos.", member_limit = "Este grupo ya tiene su límite de miembros.", group_not_found = "Este grupo ya no está disponible.", invalid_code = "Ese código de invitación es inválido.", already_member = "Ya eres miembro de este grupo.", forbidden = "Tu rol actual no te permite realizar esta acción.", + player_not_nearby = "Ese jugador ya no está cerca.", player_unavailable = "Ese jugador no puede recibir una invitación de CrewLink.", invalid_invitation = "Esta invitación es inválida.", invitation_expired = "Esta invitación ha expirado.", invalid_role = "Ese rol no puede asignarse.", owner_must_transfer = "Transfiere la propiedad antes de salir de este grupo.", + invalid_ping = "Elige un tipo de ping, etiqueta y posición válidos.", ping_limit = "Este grupo ya tiene demasiados pings activos.", ping_not_found = "Este ping ya no está activo.", rate_limited = "Demasiadas acciones de CrewLink. Inténtalo de nuevo pronto.", request_failed = "CrewLink está temporalmente inaccesible.", + }, + }, + flare = { + name = "Flare", signInTitle = "Iniciar sesión en Flare", signInBody = "Los perfiles y las coincidencias de Flare están vinculados a tu cuenta privada de Sky Cloud.", + createProfile = "Crea tu perfil", welcome = "Encuentra tu chispa", welcomeBody = "Construye un perfil y conoce a personas en Los Santos.", + photo = "Foto de perfil", profilePhotos = "Fotos de perfil", profilePhotosBody = "Añade entre una y seis fotos desde Fotos o Cámara. La primera se mostrará como foto principal.", profilePhotoRequired = "Añade al menos una foto de perfil para continuar.", addPhotos = "Añade fotos", choosePhotos = "Elegir de Fotos", primaryPhoto = "Principal", removePhoto = "Eliminar foto {number}", + profilePhotoFallback = "Avatar de perfil de Flare", profilePhotoNumber = "Foto de perfil {number} de {count}", viewProfilePhoto = "Mostrar foto de perfil {number} de {count}", + yourName = "Tu nombre", namePlaceholder = "¿Cómo deben llamarte las personas?", age = "Edad", bio = "Sobre ti", bioPlaceholder = "Una línea breve que inicia una conversación...", + gender = "Soy", showMe = "Muestra", woman = " Mujer", man = "Hombre", nonbinary = "No binario", women = " Mujeres", men = "Hombres", nonbinaryPeople = "Personas no binarias", everyone = "Todos", + minimumAge = "Edad mínima", maximumAge = "Edad máxima", start = "Explorar ahora", saveProfile = "Guardar perfil", editProfileBody = "Mantén tu perfil actualizado y hazlo inconfundiblemente tuyo.", + navigation = "Navegación de Flare", discover = "Descubre", matches = "Coincidencias", profile = "Perfil", + tabs = { discover = "Desliza", explore = "Explorar", likes = "Me gusta", matches = "Chat", profile = "Perfil" }, + filters = "Configuración de descubrimiento", nearby = "Cercano", rewind = "Rebobinar", superLike = "Super Like", explore = "Explorar", clearExploreFilter = "Mostrar todos los perfiles", + exploreTitle = "Explorar", exploreBody = "Encontrar a personas que estén interesadas en lo mismo.", + exploreModes = { forYou = "Para ti", dateNight = "Noche de citas", freeTonight = "Libre esta noche", longTerm = "Relación a largo plazo", newFriends = "Nuevos amigos", weekend = "Plan de fin de semana" }, + likesTitle = "Les gustas", likesBody = "Mira a quién le gustas antes de tomar una decisión.", matched = "Coincidencia", newMatches = "Nuevas coincidencias", messages = "Mensajes", + settings = "Ajustes", editProfile = "Editar perfil", editRelationshipGoal = "Editar objetivo de relación", profileGoalBody = "Mostrado en tu tarjeta de descubrimiento.", like = "Me gusta", pass = "Descartar", + accountActions = "Cuenta", signOut = "Cerrar sesión", signOutTitle = "¿Cerrar sesión de Sky Cloud?", signOutBody = "Esto cierra la sesión de Sky Cloud en todo el teléfono. Tu perfil de Flare, tus coincidencias y tus chats permanecerán guardados.", signingOut = "Cerrando sesión...", signOutHint = "Cerrar sesión afecta a todas las aplicaciones que usan Sky Cloud en este teléfono.", + deleteAccount = "Eliminar cuenta de Flare", deleteAccountTitle = "¿Eliminar tu cuenta de Flare?", deleteAccountBody = "Tu perfil de Flare, deslizamientos, coincidencias y conversaciones serán eliminados permanentemente. Tu cuenta de Sky Cloud y biblioteca de fotos permanecen disponibles.", deletingAccount = "Eliminando...", + relationshipGoal = "Objetivo de relación", interests = "Intereses", interestsPlaceholder = "Música, viaje, café", interestsHint = "Separa hasta cinco intereses con comas.", + discoverySettings = "Descubrir", discoveryPreferences = "Quienes quieres conocer", showProfile = "Mostrarme en Flare", showProfileBody = "Deja que nuevas personas descubran tu perfil.", + discoveryPrivacyNote = "Desactivar Descubrimiento te oculta de nuevas personas. Tus coincidencias y chats existentes siguen disponibles.", + discoveryOffTitle = "Descubrimiento desactivado", discoveryOffBody = "Tu perfil está oculto de nuevas personas. Tus coincidencias y chats existentes siguen disponibles.", discoveryOffShort = "Solo las coincidencias existentes pueden alcanzarte.", enableDiscovery = "Activar Descubrimiento", saveSettings = "Guardar configuraciones", + likedYou = "Le gustas", superLikedYou = "Le gustas mucho", noLikes = "No hay nuevos Me gusta", noLikesBody = "Las personas que indiquen que les gustas antes de que decidas aparecerán aquí.", + matchActions = "Acciones de coincidencia", unmatch = "Deshacer coincidencia", unmatchTitle = "¿Deshacer la coincidencia con esta persona?", unmatchBody = "Tú y {name} desaparecerán de sus respectivas listas de coincidencias. Esta acción no se puede deshacer.", + messagePhoto = "Foto", gif = "GIF", video = "Vídeo", attachPhoto = "Adjuntar foto", takePhoto = "Tomar foto", emoji = "Emoji", attachGif = "Adjuntar GIF", attachVideo = "Adjuntar video", gifs = "GIFs", searchGifs = "Buscar GIPHY", loadMore = "Cargar más", retryGifs = "Inténtalo de nuevo", moreActions = "Más acciones", + noProfiles = "Estás al día", noProfilesBody = "Vuelve más tarde cuando nuevas personas se unan a Flare.", yourMatches = "Tus coincidencias", matchesBody = "Una chispa va en ambos sentidos.", newMatch = "¡Habéis coincidido! Saluda.", noMatches = "Todavía no hay chispas", noMatchesBody = "Cuando alguien también indique que le gustas, aparecerá aquí.", + messagePlaceholder = "Escribe un mensaje", itsAMatch = "¡Es una chispa!", matchBody = "Tú y {name} se gustan mutuamente.", sayHello = "Saluda", keepSwiping = "Explora más", newMatchNotification = "¡Tú y {sender} han hecho match!", newMessageNotification = "Nuevo mensaje de {sender}", + lookingFor = { longTerm = "Conexión a largo plazo", dates = "Buenas citas", friends = "Nuevos amigos" }, + errors = { + invalid_profile = "Verifica tu nombre, edad y texto de perfil.", profile_not_found = "Esta cuenta de Flare ya no está disponible.", invalid_profile_photos = "Elige o toma al menos una y hasta seis fotos guardadas en tu propia biblioteca de fotos.", request_failed = "Flare no pudo guardar esos cambios. Inténtalo de nuevo.", invalid_target = "Este perfil ya no está disponible.", invalid_choice = "Ese deslizamiento no se pudo guardar.", invalid_discovery = "Ese ajuste de descubrimiento no es válido.", discovery_disabled = "Activa el descubrimiento antes de deslizar.", + nothing_to_rewind = "No hay ningún perfil reciente al que volver.", cannot_rewind_match = "No puedes volver a un perfil con el que ya hiciste match.", + match_not_found = "Esta coincidencia ya no está disponible.", invalid_message = "Escribe un mensaje antes de enviarlo.", invalid_attachment = "Este archivo adjunto no está disponible.", gif_provider_unconfigured = "Buscar GIF no está configurado.", gif_provider_unauthorized = "La clave del proveedor de GIF es inválida.", gif_provider_rate_limited = "Buscar GIF está ocupado. Inténtalo de nuevo pronto.", gif_provider_failed = "Los GIFs están temporalmente inaccesibles.", rate_limited = "Ve más despacio. Inténtalo de nuevo.", default = "Flare no pudo completar la solicitud.", + }, + }, + picstagram = { + name = "Picstagram", loading = "Cargando Picstagram", home = "Inicio", explore = "Explorar", + create = "Crear", activity = "Actividad", profile = "Perfil", following = "Siguiendo", + city = "Ciudad", posts = "Publicaciones", followers = "Seguidores", verified = "Perfil verificado", + editProfile = "Editar perfil", saved = "Guardado", photos = "Fotos", allPosts = "Todas las publicaciones", videos = "Vídeos", taggedPosts = "Publicaciones etiquetadas", emptyBio = "No hay biografía aún.", + authTitle = "Tu perfil de Picstagram", login = "Iniciar sesión", register = "Registrarse", + createAccount = "Crear perfil", logout = "Cerrar sesión", signingOut = "Cerrando sesión...", + loginBody = "Inicia sesión para continuar con tus fotos, historias, seguidores y publicaciones guardadas.", + registerBody = "Crea un acceso privado de Picstagram para tu perfil de fotos.", + registrationHint = "Se requiere una cuenta de Sky Cloud para crear y poseer un perfil de Picstagram.", + displayName = "Nombre", username = "Nombre de usuario", password = "Contraseña", + confirmPassword = "Confirmar contraseña", passwordsMismatch = "Las contraseñas no coinciden.", + displayNamePlaceholder = "Tu nombre", usernamePlaceholder = "nombre de usuario", + passwordPlaceholder = "Al menos 8 caracteres", confirmPasswordPlaceholder = "Introduce contraseña nuevamente", + signOutTitle = "¿Cerrar sesión en Picstagram?", + signOutBody = "Tu perfil y tus publicaciones permanecen en línea. Este teléfono vuelve a la pantalla de inicio de sesión.", + stories = "Historias", yourStory = "Tu historia", noStories = "Sin historias activas", + storyViews = "{count} vistas", storyViewers = "Vistas de historia", seenBy = "Visto por {count}", + nextStory = "Siguiente historia", closeStory = "Cerrar historia", removeStory = "Eliminar historia", storyRemoved = "Historia eliminada.", + emptyFeed = "Tu muro está tranquilo", emptyFeedBody = "Descubre perfiles o comparte la primera foto.", + discoverPeople = "Descubre personas", searchPlaceholder = "Buscar perfiles, descripciones, lugares o etiquetas", + noResults = "Sin resultados", noResultsBody = "Intenta otro nombre de usuario, título, lugar o hashtag.", + newPost = "Nueva publicación", newStory = "Nueva historia", post = "Publicación", story = "Historia", + choosePhotos = "Elegir fotos", choosePhoto = "Elegir foto", photo = "Foto", video = "Vídeo", gallery = "Galería", camera = "Cámara", + choosePhotosHint = "Selecciona hasta cinco fotos o un video", chooseStoryHint = "Elige una foto o video", + selectedPhotos = "{count} seleccionadas", changePhotos = "Cambiar selección", previousPhoto = "Foto anterior", nextPhoto = "Siguiente foto", caption = "Descripción", + captionPlaceholder = "Escribe una descripción...", storyTextPlaceholder = "Añade un texto breve...", + location = "Ubicación", locationPlaceholder = "Añade un lugar", allowComments = "Permitir comentarios", + publishing = "Publicando...", published = "Tu publicación está activa.", storyPublished = "Tu historia ya está publicada.", + comments = "Comentarios", comment = "Comentar", noComments = "No hay comentarios aún", addComment = "Añade un comentario...", + reply = "Responder", replyPlaceholder = "Escribe una respuesta...", replyingTo = "Respondiendo a {handle}", removeComment = "Eliminar comentario", likes = "{count} Me gusta", + viewComments = "Ver todos los {count} comentarios", showReplies = "Mostrar {count} respuestas", hideReplies = "Ocultar respuestas", like = "Me gusta", unlike = "Ya no me gusta", save = "Guardar", + unsave = "Eliminar de guardados", more = "Más opciones", archive = "Archivo", restore = "Restaurar", + deletePost = "Eliminar publicación", deletePostTitle = "¿Eliminar esta publicación?", + deletePostBody = "La publicación y sus reacciones ya no estarán disponibles.", + privateProfile = "Este perfil es privado", privateProfileBody = "Sigue este perfil para ver sus publicaciones e historias.", + follow = "Seguir", requested = "Pendiente", unfollow = "Dejar de seguir", accept = "Aceptar", decline = "Rechazar", noConnections = "No hay perfiles aquí todavía", shareProfile = "Compartir perfil", share = "Compartir", + followRequests = "Solicitudes de seguimiento", requestAccepted = "Solicitud aceptada", requestDeclined = "Solicitud de seguimiento rechazada.", noActivity = "Sin actividad", markRead = "Marcar como leído", + publicProfile = "Perfil público", privateProfileSetting = "Perfil privado", profileVisibility = "Visibilidad de perfil", + privacyHint = "Solo los seguidores aceptados pueden ver tus publicaciones e historias.", bio = "Bio", + avatar = "Foto de perfil", chooseAvatar = "Elegir foto de perfil", removeAvatar = "Eliminar foto de perfil", + saveProfile = "Guardar perfil", profileSaved = "Perfil actualizado.", cancel = "Cancelar", done = "Listo", + report = "Denunciar", reportTarget = "Denunciar {target}", reportReason = "Razón", + reportDetails = "Detalles adicionales (opcional)", submitReport = "Enviar denuncia", reported = "Denuncia enviada.", + block = "Bloquear perfil", unblock = "Desbloquear perfil", blocked = "Perfil bloqueado.", + blockTitle = "¿Bloquear @{handle}?", blockBody = "Ya no verás ni interactuarás con el contenido de Picstagram del otro.", + moderation = "Moderación", reports = "Denuncias abiertas", noReports = "No hay denuncias abiertas", + noDetails = "Sin detalles adicionales", hide = "Ocultar", remove = "Eliminar", restoreAction = "Restaurar", dismiss = "Descartar", + reportTargets = { post = "Publicación", profile = "Perfil", comment = "Comentar", story = "Historia" }, + reportReasons = { spam = "Spam o engañoso", harassment = "Acoso o bullying", dangerous = "Actividad peligrosa", illegal = "Contenido ilegal", other = "Algo más" }, + activityKinds = { follow_request = "solicitó seguirte", follow = "empezó a seguirte", request_accepted = "aceptó tu solicitud para seguirle", like = "indicó que le gusta tu publicación", comment = "comentó tu publicación", comment_like = "indicó que le gusta tu comentario", reply = "respondió a tu comentario", verified = "Verificación modificada" }, + notifications = { follow_request = "{actor} solicitó seguirte.", follow = "{actor} comenzó a seguirte.", request_accepted = "{actor} aceptó tu solicitud de seguimiento.", like = "A {actor} le gustó tu publicación.", comment = "{actor} comentó en tu publicación.", comment_like = "A {actor} le gustó tu comentario.", reply = "{actor} respondió a tu comentario.", verified = "Tu perfil de Picstagram ahora está verificado.", default = "Tienes nueva actividad en Picstagram." }, + errors = { + invalid_post = "Revisa los detalles de la publicación.", invalid_story = "Revisa los detalles de la historia.", + invalid_media = "Elige fotos propiedad de este teléfono.", invalid_comment = "Ingresa un comentario válido.", + comments_disabled = "Los comentarios están desactivados.", invalid_profile = "Verifica los detalles de tu perfil.", + invalid_handle = "Usa 3–24 letras, números, puntos o subrayados.", + invalid_display_name = "Introduce un nombre para mostrar.", invalid_password = "La contraseña debe tener 8–72 caracteres.", + invalid_credentials = "El nombre de usuario o la contraseña es incorrecto.", + already_registered = "Esta cuenta de Sky Cloud ya tiene un perfil de Picstagram.", + handle_taken = "Este nombre de usuario ya está tomado.", post_not_found = "Esta publicación no está disponible.", + story_not_found = "Esta historia no está disponible.", profile_not_found = "Este perfil no está disponible.", + request_not_found = "Esta solicitud de seguimiento ya no está pendiente.", profile_unavailable = "Este perfil no está disponible.", + blocked = "Este perfil está bloqueado.", already_reported = "Ya has denunciado este contenido.", + invalid_report = "Elige una razón de denuncia válida.", invalid_search = "Introduce una búsqueda válida.", + invalid_cursor = "El contenido ha cambiado. Actualízalo e inténtalo de nuevo.", invalid_status = "Esta acción no está disponible.", + not_authorized = "No tienes permiso para hacer eso.", report_not_found = "Esta denuncia ya no está pendiente.", + rate_limited = "Demasiadas acciones. Vuelve a intentarlo pronto.", not_authenticated = "Inicia sesión en Sky Cloud primero.", + picstagram_not_authenticated = "Inicia sesión en Picstagram primero.", request_failed = "La solicitud falló.", + default = "Picstagram no pudo completar la solicitud." + }, + }, + feather = { + name = "Feather", loading = "Cargando Feather", home = "Inicio", explore = "Explorar", activity = "Notificaciones", activityNav = "Alertas", profile = "Perfil", back = "Atrás", + settings = "Ajustes", settingsEyebrow = "Preferencias de Feather", compactMode = "Cronología compacta", compactModeBody = "Mostrar más conversaciones en la pantalla.", showSuggestions = "Sugerencias de perfil", showSuggestionsBody = "Mostrar a las personas que seguir en tu perfil.", + forYou = "Para ti", following = "Siguiendo", add = "Agregar", network = "Red", networkTitle = "Encuentra a tu gente", networkBody = "Sigue voces de todo Los Santos y crea una línea de tiempo que te parezca tuya.", networkSearchPlaceholder = "Buscar nombres o @usernames", postSearchPlaceholder = "Buscar publicaciones o #hashtags", searchResults = "Resultados de búsqueda", suggestedPeople = "Sugerido para ti", noPeopleFound = "No se encontraron personas", noPeopleFoundBody = "Intenta otro nombre o nombre de usuario.", noSuggestions = "No hay sugerencias aún", noSuggestionsBody = "Nuevos perfiles de Feather aparecerán aquí.", all = "Todos", mentions = "Menciones", media = "Medios", trending = "Tendencias", peopleTab = "Personas", searchPlaceholder = "Buscar Feather", search = "Buscar", cancel = "Cancelar", done = "Listo", + authEyebrow = "Red Feather", authWelcome = "Bienvenido a Feather", authBody = "Tu correo electrónico de iFruit está enlazado automáticamente. Usa tu nombre de usuario de Feather para continuar.", + login = "Iniciar sesión", register = "Registrarse", loginTitle = "Bienvenido de nuevo", loginBody = "Usa tu nombre de usuario de Feather. Tu correo electrónico de iFruit está enlazado automáticamente.", + registerTitle = "Crear tu perfil de Feather", registerBody = "Elige un nombre de usuario y una foto de perfil opcional. No se necesita contraseña.", + email = "Dirección de iFruit", emailPlaceholder = "tu nombre", password = "Contraseña", passwordPlaceholder = "6–64 caracteres", + confirmPassword = "Confirmar contraseña", confirmPasswordPlaceholder = "Volver a escribirlo", showPassword = "Mostrar contraseña", hidePassword = "Ocultar contraseña", + loginAction = "Continuar a Feather", registerAction = "Crear perfil", noAccount = "¿Nuevo en Feather?", haveAccount = "¿Ya tienes cuenta?", + registerNow = "Crear perfil", loginNow = "Iniciar sesión", authTrust = "Tu perfil de Feather está vinculado a tu cuenta de Sky Cloud a través de tu correo electrónico de iFruit.", + profileStep = "Paso 2 de 2", accountConnected = "Cuenta de Sky Cloud conectada", + authErrors = { + no_ifruit_account = "Inicia sesión en tu cuenta de Sky Cloud desde Ajustes.", invalid_handle = "Usa 3-30 letras, números o guiones bajos.", invalid_username = "Ese nombre de usuario no coincide con tu perfil de Feather.", + profile_not_found = "No existe un perfil Feather para este correo de iFruit.", already_registered = "Este correo electrónico de iFruit ya tiene un perfil de Feather.", + handle_taken = "Ese nombre de usuario Feather ya está tomado.", invalid_media = "Elige una imagen válida de este teléfono.", + rate_limited = "Demasiados intentos. Inténtalo de nuevo en un minuto.", default = "Feather no pudo completar la solicitud. Por favor, inténtalo de nuevo.", + }, + welcome = "Encuentra tu voz", welcomeBody = "Únete a la conversación en vivo en Los Santos. Tu perfil de Feather permanece vinculado a tu cuenta de Sky Cloud.", + createProfile = "Crear perfil Feather", profileDetailsHint = "Elige cómo las personas te reconocerán.", displayName = "Nombre para mostrar", displayNamePlaceholder = "Tu nombre", handle = "Nombre de usuario", handlePlaceholder = "tu_usuario", handleHint = "3-30 letras, números o guiones bajos", + bio = "Bio", bioPlaceholder = "¿Qué debería saber la gente sobre ti?", start = "Unirse a Feather", chooseAvatar = "Elegir foto de perfil", changeAvatar = "Cambiar foto", + newPost = "Nueva publicación de Feather", reply = "Responder", replyingTo = "Respondiendo a @{handle}", quote = "Citación", post = "Publicar", posting = "Publicando...", + composerPlaceholder = "¿Qué está pasando?", replyPlaceholder = "Publica tu respuesta", addPhotos = "Añade fotos", removePhoto = "Eliminar foto {number}", charactersLeft = "{count} restantes", composerAudience = "Todo el mundo puede unirse a la conversación", mediaTitle = "Añadir a tu publicación", mediaBody = "Comparte hasta cuatro fotos de tu teléfono o toma una nueva.", chooseGallery = "Fotos", chooseGalleryBody = "Elige una o varias fotos guardadas.", takePhoto = "Cámara", takePhotoBody = "Toma una foto nueva", selectedPhotos = "Fotos seleccionadas", photoLimit = "Puedes agregar hasta cuatro fotos.", + emptyFeed = "Tu cronología está tranquila", emptyFeedBody = "Sigue a otras personas o publica el primer mensaje.", emptyExplore = "No se encontraron resultados", emptyExploreBody = "Intenta otra búsqueda o explora un tema.", noTrendingHashtags = "No hay hashtags aún", noTrendingHashtagsBody = "Las etiquetas de las publicaciones aparecerán aquí.", + happeningNow = "¿Qué está pasando?", trends = "Tendencias para ti", trendingIn = "Tendencias en Los Santos", openTopic = "Ver conversación", postsCount = "{count} publicaciones", + exploreTabs = { explore = "Explorar", trending = "Tendencias", news = "Noticias" }, + trendKinds = { explore = "Tendencias en Los Santos", trending = "Popular ahora mismo", news = "Noticias · Tendencias", sports = "Deportes · Tendencias", entertainment = "Entretenimiento · Tendencias" }, + people = "A quién seguir", posts = "Publicaciones", followers = "Seguidores", followingCount = "Siguiendo", removeConnection = "Eliminar", followerRemoved = "Seguidor eliminado.", followingRemoved = "Has dejado de seguir la cuenta.", noConnections = "Nadie aquí todavía", noConnectionsBody = "Los perfiles aparecerán aquí una vez que se establezcan conexiones.", follow = "Seguir", unfollow = "Dejar de seguir", + editProfile = "Editar perfil", saveProfile = "Guardar", joined = "Se unió a Feather", joinedDate = "Se unió en agosto de 2026", shareProfile = "Compartir perfil", profileCopied = "Enlace del perfil copiado.", postCopied = "Publicación copiada.", verified = "Perfil verificado", noBio = "No hay biografía aún.", showMore = "Mostrar más", moreActions = "Más acciones", + now = "ahora", minutesShort = "{count}m", hoursShort = "{count}h", daysShort = "{count}d", comments = "Comentarios", noComments = "No hay comentarios aún", addComment = "Añade un comentario...", postComment = "Comentar publicación", likeComment = "A {name} le gustó tu comentario", likesCount = "{count} Me gusta", + replies = "Respuestas", noReplies = "Aún no hay respuestas. Inicia la conversación.", likes = "Me gusta", bookmarks = "Favoritos", noBookmarks = "Aún no hay publicaciones guardadas", noBookmarksBody = "Las publicaciones que marques como favoritas aparecerán aquí.", imagePreview = "Vista previa de la imagen", openImage = "Ver imagen {number}", postImage = "Imagen de la publicación {number}", previousImage = "Imagen anterior", nextImage = "Imagen siguiente", delete = "Eliminar", report = "Denunciar", block = "Bloquear @{handle}", + reportTitle = "Denunciar publicación de Feather", reportBody = "Dinos por qué debería revisarse esta publicación de Feather.", reportSubmit = "Enviar denuncia", reported = "Denuncia enviada.", blocked = "Perfil bloqueado.", deleted = "Publicación de Feather eliminada.", + reasons = { spam = "Spam", harassment = "Acoso", dangerous = "Contenido peligroso", illegal = "Contenido ilegal", other = "Otro" }, + noActivity = "Sin actividad", activityBody = "Los Me gusta, las respuestas y los nuevos seguidores aparecerán aquí.", + activityKinds = { like = "indicó que le gusta tu publicación de Feather", reply = "respondió a tu publicación de Feather", follow = "empezó a seguirte", quote = "citó tu publicación de Feather" }, + errors = { accountRequired = "Inicia sesión en Sky Cloud en Ajustes primero.", invalidHandle = "Usa 3–30 letras, números o guiones bajos.", handleTaken = "Ese nombre de usuario ya está en uso.", invalidPost = "Escribe algo o adjunta una foto.", generic = "Algo salió mal. Por favor, inténtalo de nuevo." }, + notifications = { default = "Tienes actividad nueva.", like = "A {actor} le gustó tu publicación de Feather.", reply = "{actor} respondió a tu Feather.", follow = "{actor} te siguió.", quote = "{actor} citó tu Feather." }, + }, + fliptok = { + name = "FlipTok", loading = "Cargando FlipTok", following = "Siguiendo", forYou = "Para ti", verified = "Cuenta verificada", + originalSound = "Sonido original", save = "Guardar", home = "Inicio", discover = "Descubre", create = "Crear", activity = "Actividad", profile = "Perfil", navigation = "Navegación de FlipTok", + emptyFeed = "Aún no hay videos", emptyFeedBody = "Sigue a creadores o publica el primer FlipTok.", searchPlaceholder = "Buscar creadores y videos", clearSearch = "Limpiar búsqueda", + trendLosSantos = "Los Santos", trendRoleplay = "# Juego de roles", trendTrending = "# Tendencias", + noActivity = "Sin actividad", followers = "Seguidores", videos = "Vídeos", emptyBio = "No hay biografía aún.", editProfile = "Editar perfil", more = "Más opciones", + newVideo = "Nuevo FlipTok", createTitle = "Crea tu próximo FlipTok", createBody = "Graba un clip o convierte fotos en un FlipTok deslizable.", chooseMedia = "Elige medios", chooseMediaHint = "Registra un video, elige un clip o selecciona hasta 10 fotos.", recordVideo = "Grabar video", camera = "Cámara", chooseVideo = "Elegir vídeo", photoSlideshow = "Fotos como FlipTok", changeMedia = "Cambiar", previousPhoto = "Foto anterior", nextPhoto = "Siguiente foto", + caption = "Descripción", captionPlaceholder = "Escribe una descripción...", location = "Añadir ubicación", whoCanWatch = "¿Quién puede verlo?", public = "Todos", + followersOnly = "Seguidores", private = "Solo para mí", allowComments = "Permitir comentarios", saveDraft = "Borradores", publishing = "Publicando...", post = "Publicar", + draftSaved = "Borrador guardado.", published = "Tu FlipTok ya está publicado.", videoDeleted = "Video eliminado.", deleteVideoTitle = "¿Quitar este vídeo?", deleteVideoBody = "El video desaparece de FlipTok y no puede recuperarse.", deletingVideo = "Eliminando...", linkCopied = "Enlace de video copiado.", reported = "Denuncia enviada.", blocked = "Creador bloqueado.", + comments = "Comentarios", noComments = "No hay comentarios aún", addComment = "Añadir comentario...", reply = "Responder", showReplies = "Mostrar {count} respuestas", hideReplies = "Ocultar {count} respuestas", replyPlaceholder = "Escribe una respuesta...", replyingTo = "Respondiendo a {handle}", cancelReply = "Cancelar respuesta", report = "Denunciar vídeo", reportReason = "Razón", + reportDetails = "Detalles adicionales (opcional)", submitReport = "Enviar denuncia", reportDiscordNote = "Esta denuncia se envía directamente al equipo de moderación a través de Discord.", + reportReasons = { spam = "Spam o engañoso", harassment = "Acoso o bullying", dangerous = "Actividad peligrosa", illegal = "Contenido ilegal", other = "Algo más" }, + block = "Bloquear creador", follow = "Seguir", unfollow = "Dejar de seguir", backToProfile = "Atrás", cancel = "Cancelar", + sounds = "Sonido", chooseSound = "Elegir música", originalOnly = "Sonido original solo", noMusic = "No hay pistas de música configuradas.", + customSound = "Sonido personalizado", customSoundLink = "YouTube o enlace de audio", customSoundHint = "Pega un enlace de YouTube o un enlace directo de archivo de audio HTTPS.", customSoundPlaceholder = "https://youtu.be/... o https://example.com/song.mp3", + customSoundFormats = "YouTube, YouTube Music, Shorts, MP3, M4A, AAC, OGG, OPUS, WAV o WEBM", useCustomSound = "Usar sonido", loadingSound = "Cargando sonido", invalidCustomSoundLink = "Usa un enlace de YouTube o un enlace directo de archivo de audio público HTTPS.", customSoundLoadFailed = "Este sonido no se pudo cargar.", + trimAndCover = "Recorte y portada", trimStart = "Inicio", trimEnd = "Finalizar", coverFrame = "Portada", originalVolume = "Sonido original", musicVolume = "Música", + moderation = "Moderación", reports = "Denuncias abiertas", noReports = "No hay denuncias abiertas", removeVideo = "Eliminar video", dismissReport = "Descartar", + done = "Listo", savingProfile = "Guardando...", displayName = "Nombre", username = "Nombre de usuario", bio = "Bio", accountType = "Tipo de cuenta", profilePhoto = "Foto de perfil", changePhoto = "Cambiar foto", chooseFromGallery = "Fotos", takePhoto = "Cámara", removePhoto = "Eliminar foto", noConnections = "No hay perfiles para mostrar", + authTitle = "Cuenta de FlipTok", login = "Iniciar sesión", register = "Registrarse", createAccount = "Crear cuenta", logout = "Cerrar sesión", + loginBody = "Inicia sesión para continuar con tus videos, seguidos y publicaciones guardadas.", registerBody = "Crear una cuenta privada de FlipTok para este perfil.", + password = "Contraseña", confirmPassword = "Confirmar contraseña", passwordsMismatch = "Las contraseñas no coinciden.", + displayNamePlaceholder = "Tu nombre", usernamePlaceholder = "nombre de usuario", passwordPlaceholder = "Al menos 8 caracteres", confirmPasswordPlaceholder = "Introduce contraseña nuevamente", + registrationHint = "Se requiere una cuenta de Sky Cloud una vez para crear y poseer un perfil de FlipTok.", + accountDetails = "Detalles de cuenta", profileDetails = "Detalles del perfil", account = "Cuenta", + signOutTitle = "¿Cerrar sesión en FlipTok?", signOutBody = "Tu perfil y videos permanecen en línea. Este teléfono regresará a la pantalla de inicio de sesión de FlipTok.", signingOut = "Cerrando sesión...", + accountTypes = { person = "Persona", business = "Empresa", organization = "Organización", media = "Medios", event = "Evento" }, + activityKinds = { like = "le gustó tu video", comment = "comentó tu video", follow = "empezó a seguirte", verified = "Verificación modificada" }, + notifications = { like = "A {actor} le gustó tu video.", comment = "{actor} comentó tu video.", follow = "{actor} comenzó a seguirte.", verified = "Tu cuenta de FlipTok ahora está verificada.", default = "Tienes nueva actividad de FlipTok." }, + errors = { invalid_video = "Revisa los detalles de FlipTok.", invalid_music_url = "Usa un enlace de YouTube o archivo de audio directo válido.", invalid_media = "Elige medios válidos de este teléfono.", invalid_comment = "Ingresa un comentario válido.", comments_disabled = "Los comentarios están desactivados.", invalid_profile = "Verifica los detalles de tu perfil.", invalid_profile_image = "Elige una imagen válida de este teléfono.", invalid_handle = "Usa 3–24 letras, números, puntos o subrayados.", invalid_display_name = "Introduce un nombre para mostrar.", invalid_password = "La contraseña debe tener 8–72 caracteres.", invalid_credentials = "El nombre de usuario o la contraseña es incorrecto.", already_registered = "Esta cuenta de Sky Cloud ya posee un perfil registrado de FlipTok.", handle_taken = "Este nombre de usuario ya está tomado.", video_not_found = "Este video no está disponible.", profile_not_found = "Este perfil no está disponible.", blocked = "Esta cuenta está bloqueada.", not_authorized = "No tienes acceso a moderación.", report_not_found = "Esta denuncia ya no está pendiente.", report_unavailable = "Las denuncias mediante Discord aún no están configuradas.", request_failed = "Tu solicitud de FlipTok no se completó. Inténtalo de nuevo.", rate_limited = "Demasiadas acciones. Vuelve a intentarlo pronto.", not_authenticated = "Inicia sesión en Sky Cloud primero.", default = "FlipTok no pudo completar la solicitud." }, + }, + darkchat = { + name = "DarkChat", newMessage = "Nuevo mensaje de DarkChat de {sender}", privateNotification = "Nuevo mensaje de DarkChat", + signInBody = "Las identidades de DarkChat están vinculadas a tu cuenta privada de Sky Cloud.", signInHint = "Inicia sesión desde Ajustes para continuar.", + createIdentity = "Crear identidad privada", createIdentityBody = "Crea una identidad privada antes de iniciar una conversación de DarkChat.", + security = "Seguridad", privateNetwork = "Red privada de invitación exclusiva", noResults = "No hay resultados", noResultsBody = "Prueba otro alias o Dark-ID.", + noChats = "No hay chats privados", noChatsBody = "Conéctate con un Dark-ID o código de invitación. No hay búsqueda pública.", newChat = "Nuevo chat", to = "Para:", + connectPrivately = "Conectar de forma privada", newChatBody = "Ingresa el Dark-ID o código de invitación de otra persona. Puedes compartir tu propio ID desde tu perfil.", darkIdOrInvite = "Dark-ID o código de invitación", continue = "Continuar", contacts = "Contactos de DarkChat", contactsHint = "Las identidades guardadas aparecen solo en tu cuenta de DarkChat.", noContacts = "No hay contactos guardados de DarkChat", private = "Privado", shareIdentity = "Pulsa para compartir tu identidad privada", + message = "Mensaje privado", activeNow = "Actividad compartida", encryptedSession = "Sesión cifrada", serverPrivate = "Conversación privada almacenada en el servidor", + emoji = "Emoji", gif = "GIF", gifs = "GIFs", photo = "Foto", video = "Vídeo", attachPhoto = "Adjuntar foto", takePhoto = "Tomar foto", attachGif = "Adjuntar GIF", attachVideo = "Adjuntar video", searchGifs = "Buscar GIFs", loadMore = "Cargar más", + voiceMessage = "Mensaje de voz", sending = "Enviando", failed = "No entregado", delivered = "Entregado", read = "Leído", replying = "Respondiendo a", + messageDeleted = "Mensaje eliminado", securityUpdate = "Configuración de seguridad actualizada", timerChanged = "Mensajes desaparecerán en {timer}", + timerOff = "Apagado", timerAfterRead = "Después de leer", timerMinute = "1 minuto", timerFiveMinutes = "5 minutos", timerHour = "1 hora", timerDay = "24 horas", timerWeek = "7 días", + copied = "Copiado", reply = "Responder", copy = "Copiar", deleteForMe = "Eliminar para mí", deleteForBoth = "Eliminar para ambos", report = "Denunciar", returnToCall = "Volver a la llamada", + contactSecurity = "Contacto y Seguridad", chatSince = "Chat privado desde {date}", notifications = "Notificaciones", readReceipts = "Confirmaciones de lectura", disappearing = "Mensajes que desaparecen", contactAlias = "Alias de contacto", saveContact = "Guardar Contacto", addContact = "Agregar Contacto", contactSaved = "Contacto guardado", removeContact = "Eliminar Contacto", block = "Bloquear Usuario", unblock = "Desbloquear Usuario", clearChat = "Limpiar Chat", chatCleared = "Chat limpio", + myIdentity = "Mi identidad oscura", alias = "Alias", notificationPrivacy = "Privacidad de notificaciones", notificationFull = "Notificación completa · alias y mensaje", notificationPrivate = "Privado · mensaje general", notificationHidden = "Notificación invisible · solo el sello", shareActivity = "Compartir estado de actividad", inviteCode = "Código de invitación privado", copyInvite = "Copiar Invitación", shareInvite = "Compartir invitación", privacyDisclaimer = "DarkChat almacena los mensajes en el servidor y no afirma el cifrado de extremo a extremo.", + messageActions = "Acciones de mensaje", chatSettings = "Configuración de Chat", contactActions = "Acciones de contacto", privacySettings = "Configuración de Privacidad", + profileActions = "Acciones de cuenta", signOut = "Cerrar sesión", signOutTitle = "¿Cerrar sesión de Sky Cloud?", signOutBody = "Esto cierra la sesión de Sky Cloud en todo el teléfono. Tu perfil y tus mensajes de DarkChat permanecerán guardados.", signingOut = "Cerrando sesión...", signOutHint = "Cerrar sesión afecta a todas las aplicaciones que usan Sky Cloud en este teléfono.", deleteProfile = "Eliminar perfil de DarkChat", deleteProfileTitle = "¿Borrar perfil DarkChat?", deleteProfileBody = "Tu identidad, contactos y conversaciones de DarkChat se eliminarán permanentemente.", deletingProfile = "Eliminando...", + unknownIdentity = "Identidad desconocida", unknownIdentityBody = "Continúa solo si esperabas esta identidad. La cuenta no se puede encontrar mediante la búsqueda pública.", openSecureChat = "Abrir chat privado", + reportUser = "Denunciar usuario", reportSpam = "Spam", reportHarassment = "Acoso", reportThreats = "Amenazas", reportIllegal = "Contenido ilegal", reportOther = "Otro", reportDetails = "Detalles opcionales", submitReport = "Enviar denuncia", reported = "Denuncia enviada", + microphoneUnavailable = "El micrófono no está disponible.", recordingTooLarge = "El mensaje de voz es demasiado grande.", + errors = { + sign_out_failed = "Sky Cloud no pudo cerrar sesión.", + not_authenticated = "Inicia sesión en tu cuenta de Sky Cloud primero.", invalid_dark_id = "Introduce un Dark-ID o un código de invitación válido.", profile_not_found = "Esta identidad privada no fue encontrada.", self_chat = "No puedes enviar mensajes a tu propia identidad.", conversation_not_found = "Esta conversación no está disponible.", blocked = "Los mensajes están bloqueados en esta conversación.", invalid_message = "Introduce un mensaje válido.", invalid_gif = "Este GIF no es válido.", invalid_voice = "Este mensaje de voz es inválido.", invalid_attachment = "Esta foto o video no está disponible.", invalid_profile = "Comprueba tu alias y los ajustes de privacidad.", rate_limited = "Demasiadas solicitudes. Inténtalo de nuevo pronto.", gif_provider_unconfigured = "Buscar GIF no está configurado.", gif_provider_unauthorized = "La clave del proveedor de GIF es inválida.", gif_provider_rate_limited = "Buscar GIF está ocupado. Inténtalo de nuevo pronto.", gif_provider_failed = "Los GIFs están temporalmente inaccesibles.", default = "DarkChat no pudo completar la solicitud.", + }, + }, + messages = { + name = "Mensajes", newMessage = "Nuevo mensaje de {sender}", compose = "Nuevo Mensaje", + search = "Buscar", to = "Para:", message = "Mensaje", send = "Enviar", details = "Detalles", + officialContact = "Contacto oficial de la empresa", messagingUnavailable = "Este contacto de empresa no acepta mensajes.", + filterUnread = "Mostrar mensajes no leídos", filterLabel = "Filtro de conversación", allMessages = "Todos", unreadMessages = "No leídos", smsLabel = "Mensaje de texto · SMS", + photo = "Foto", gif = "GIF", video = "Vídeo", contact = "Contacto", attachPhoto = "Adjuntar foto", takePhoto = "Tomar foto", + attachGif = "Adjuntar GIF", attachVideo = "Adjuntar video", photos = "Fotos", gifs = "GIFs", videos = "Vídeos", + contacts = "Contactos", shareContact = "Compartir contacto", noContactsToShare = "Guarda un contacto primero para compartirlo aquí.", contactSaved = "Contacto guardado", + noPhotos = "Toma una foto primero para adjuntarla aquí.", noVideos = "Graba primero un vídeo con la Cámara.", searchGifs = "Buscar GIPHY", loadMore = "Cargar más", retryGifs = "Inténtalo de nuevo", + moreActions = "Más acciones", inboxActions = "Acciones de conversación", sortLabel = "Ordenar conversaciones", sortNewest = "Más reciente primero", sortOldest = "Más antiguo primero", unreadConversation = "{name}, {count} mensajes no leídos", + attachmentPreview = "Adjuntos seleccionados", attachmentLimit = "Puedes adjuntar hasta {count} fotos o videos.", removeAttachment = "Eliminar adjunto {number}", + contactDetails = "Detalles del contacto", contactName = "Nombre", phoneNumber = "Número de teléfono", company = "Empresa", contactActions = "Acciones de contacto", + call = "Llamar", messageAction = "Mensaje", addContact = "Agregar Contacto", showInContacts = "Mostrar en contactos", blockContact = "Bloquear contacto", + blockContactTitle = "¿Bloquear este contacto?", blockContactBody = "{name} ya no podrá llamar o enviar un mensaje a esta SIM.", blockContactFailed = "El contacto no pudo ser bloqueado.", contactBlocked = "Contacto bloqueado.", deleteContact = "Eliminar contacto", + selectedCount = "{count} seleccionado", deleteSelected = "Eliminar", + contactSaveFailed = "El contacto no pudo ser guardado.", contactDeleteFailed = "El contacto no pudo ser eliminado.", + callFailed = "La llamada no pudo iniciarse.", + emoji = "Emoji", emojiPicker = "Selector de emojis", emojiCategories = "Categorías de emojis", skinTone = "Tono de piel {number}", + gifLabels = { celebrate = "¡A celebrar!", hearts = "Me encanta", party = "¡Fiesta!", thumbsUp = "Perfecto", wow = "WOW" }, + voiceMessage = "Mensaje de audio", recordVoice = "Grabar audio", + playAudio = "Reproducir audio", pauseAudio = "Pausar audio", seekAudio = "Buscar posición en el audio", + recording = "Grabación", stopAndSend = "Detener y enviar", cancelRecording = "Cancelar grabación", + sending = "Enviando...", delivered = "Entregado", notDelivered = "No entregado", + microphoneUnavailable = "El micrófono no está disponible.", recordingTooLarge = "La grabación es demasiado grande.", + noSim = "Sin SIM", noSimBody = "Inserta una tarjeta SIM en Ajustes para enviar y recibir mensajes.", + noMessages = "No hay mensajes", noMessagesBody = "Inicia una conversación con un número de teléfono.", + noResults = "No hay resultados", today = "Hoy", yesterday = "Ayer", + errors = { + invalid_number = "Introduce un número de teléfono válido.", invalid_message = "Escribe un mensaje.", invalid_voice = "El mensaje de audio es inválido.", + invalid_attachment = "El archivo adjunto es inválido.", invalid_contact = "El contacto es inválido.", + contact_not_found = "Este contacto ya no está disponible.", + media_provider_unconfigured = "La subida de fotos no está configurada.", + capture_provider_unavailable = "El recurso de captura de pantalla no está disponible.", capture_failed = "La foto no se pudo capturar.", + video_provider_unavailable = "La captura de video requiere el recurso de captura de pantalla.", video_capture_failed = "El video no se pudo grabar.", + recording_in_progress = "Ya hay un video en proceso de grabación.", recording_not_found = "No se encontró grabación activa de video.", + gif_provider_unconfigured = "Buscar GIF no está configurado.", gif_provider_unauthorized = "La clave API de GIPHY configurada es inválida.", + gif_provider_rate_limited = "GIPHY está ocupado. Inténtalo de nuevo en un momento.", gif_provider_failed = "La búsqueda de GIFs está temporalmente inaccesible.", + self_message = "No puedes enviar mensajes a tu propio número.", recipient_not_found = "Ese número no está disponible.", blocked = "Este contacto ha bloqueado las llamadas y los mensajes de esta SIM.", + messaging_unavailable = "Este contacto de empresa no acepta mensajes.", + no_sim = "Este teléfono no tiene tarjeta SIM.", rate_limited = "Demasiados mensajes, inténtalo de nuevo en un minuto.", + request_failed = "Los mensajes están temporalmente inaccesibles.", default = "El mensaje no se pudo enviar.", + }, + }, + companies = { + name = "Empresas", + navigation = "Navegación de empresas", + actions = "Acciones de solicitud", + request = "Solicitud de servicio", + verified = "Empresa verificada", + back = "Atrás", + close = "Cerrar", + tryAgain = "Inténtalo de nuevo", + loadMore = "Cargar más", + routeSet = "Ruta GPS establecida.", + tabs = { + directory = "Directorio", + requests = "Solicitudes", + work = "Trabajo", + }, + availability = { + available = "Disponible", + busy = "Ocupado", + closed = "Cerrado", + }, + requestStatuses = { + new = "Nuevo", + assigned = "Asignado", + in_progress = "En progreso", + waiting_customer = "Esperando", + completed = "Completado", + cancelled = "Cancelado", + }, + roles = { + employee = "Empleado", + manager = "Gerente", + }, + categories = { + gastronomy = "Alimentación y bebida", + vehicles = "Vehículos", + transport = "Transporte", + crafts = "Oficios", + retail = "Comercio al por menor", + real_estate = "Bienes inmuebles", + media = "Medios", + nightlife = "Entretenimiento nocturno", + public_services = "Servicios públicos", + emergency = "Servicios de emergencia", + medical = "Servicios médicos", + mechanics = "Mecánica", + government = "Gobierno", + }, + days = { + monday = "Lun", + tuesday = "Mar", + wednesday = "Mié", + thursday = "Jue", + friday = "Vie", + saturday = "Sáb", + sunday = "Dom", + }, + directory = { + searchPlaceholder = "Buscar empresas o servicios", + categories = "Categorías de empresa", + allCategories = "Todos", + allCompanies = "Todas las empresas", + availableNow = "Disponible ahora", + availableNowHint = "Muestra solo las empresas que aceptan llamadas ahora.", + availableSection = "Disponible ahora", + moreFilters = "Más filtros", + hasLocation = "Ubicación", + acceptsRequests = "Solicitudes", + resetFilters = "Restablecer filtros", + }, + loading = { + directory = "Cargando empresas...", + profile = "Cargando perfil de empresa...", + request = "Cargando solicitud...", + requests = "Cargando tus solicitudes...", + work = "Cargando espacio de trabajo...", + }, + states = { + directoryError = "Empresas no disponibles", + requestsError = "Las solicitudes no están disponibles", + workError = "Espacio de trabajo no disponible", + profileError = "La empresa no está disponible", + requestError = "Solicitud no disponible", + noCompanies = "No hay empresas registradas", + noCompaniesBody = "Las empresas públicas aparecerán aquí cuando se configuren.", + noResults = "No hay empresas que coincidan", + noResultsBody = "Prueba otra búsqueda o restablece tus filtros.", + noOpenRequests = "Sin solicitudes abiertas", + noClosedRequests = "No hay solicitudes completadas", + noRequestsBody = "Las solicitudes que crees con una empresa aparecerán aquí.", + }, + actionUnavailable = { + call = "No se puede llamar a esta empresa ahora.", + message = "Esta línea de servicio no acepta mensajes de texto.", + route = "Esta empresa no tiene ubicación pública.", + request = "Esta empresa no acepta solicitudes de servicio.", + }, + profile = { + updated = "Estado actualizado {time}", + announcement = "Actualización más reciente", + location = "Ubicación", + noLocation = "No hay ubicación pública", + hours = "Horario de apertura", + closed = "Cerrado", + byAvailability = "Abierto por disponibilidad", + services = "Servicios", + noServices = "No hay servicios públicos listados", + call = "Llamar", + message = "Mensaje", + route = "Ruta", + request = "Solicitar", + }, + composer = { + title = "Nueva solicitud de servicio", + chooseService = "Seleccionar un servicio", + subject = "Asunto", + subjectPlaceholder = "¿Qué necesitas?", + description = "Detalles", + descriptionPlaceholder = "Describe lo que pasó y cómo la compañía puede ayudar.", + contact = "Número de contacto", + registeredSim = "Las respuestas llegarán a tu SIM registrada {number}.", + registeredSimRequired = "Se necesita una SIM registrada para enviar una solicitud.", + addPhotos = "Añadir fotos ({count}/3)", + selectedPhoto = "Foto seleccionada de la solicitud", + removePhoto = "Eliminar foto", + review = "Revisar solicitud", + confirmTitle = "¿Enviar esta solicitud?", + confirmBody = "Envía tu solicitud de {service} a {company}.", + edit = "Continuar editando", + send = "Enviar solicitud", + }, + requests = { + open = "Abierto", + closed = "Completado", + findCompany = "Buscar una Empresa", + generalService = "Servicios generales", + attachments = "Fotos de la solicitud", + attachedPhoto = "Foto de solicitud adjunta", + timeline = "Cronología", + conversation = "Conversación", + noMessages = "No hay respuestas todavía", + replyPlaceholder = "Escribe una respuesta", + sendReply = "Enviar respuesta", + call = "Llamar a la empresa", + cancel = "Cancelar solicitud", + cancelTitle = "¿Cancelar esta petición?", + cancelBody = "La empresa será notificada y ya no podrá completarlo.", + keep = "Mantener la solicitud", + cancelConfirm = "Cancelar solicitud", + }, + timeline = { + created = "Solicitud creada", + assigned = "Solicitud asignada", + cancelled = "Solicitud cancelada", + completed = "Solicitud completada", + statusChanged = "Estado cambiado a {status}", + }, + time = { + justNow = "ahora mismo", + minutesAgo = "hace {count} min", + hoursAgo = "hace {count} h", + daysAgo = "hace {count} días", + }, + work = { + notAuthorized = "No hay espacio de la empresa", + notAuthorizedBody = "Tu cargo actual no está conectado a una empresa configurada.", + workspace = "Espacio de la empresa", + publicAvailability = "Disponibilidad pública", + takeCalls = "Atender llamadas de la empresa", + takeCallsBody = "Envía las nuevas llamadas de la línea de servicio a esta SIM activa.", + dialServiceLine = "Llamar desde la línea de servicio", + dialServiceLineBody = "Hacer una llamada saliente que muestre {number}.", + dialServiceLineHint = "El destinatario verá {number} como número de llamada entrante.", + targetNumber = "Número de teléfono", + targetNumberHint = "Introduce un número de teléfono", + callNow = "Llamar ahora", + overview = "Resumen de hoy", + metrics = { + new = "Nuevo", + assigned = "Mío", + waiting = "Esperando", + completedToday = "Completadas hoy", + }, + queue = "Cola de solicitudes", + filters = { + new = "Nuevo", + assigned = "Mío", + in_progress = "En progreso", + waiting_customer = "Esperando", + completed = "Listo", + }, + unassigned = "Sin asignar", + emptyQueue = "La cola está vacía", + emptyQueueBody = "No hay solicitudes que coincidan con este filtro.", + }, + workActions = { + claim = "Reclamar solicitud", + assign = "Asignar empleado", + callCustomer = "Llamar al cliente", + setStatus = "Establecer estado: {status}", + }, + assignment = { + title = "Asignar empleado", + online = "En línea", + offline = "Desconectado", + unknownMember = "Empleado desconocido", + confirm = "Asignar solicitud", + }, + assignmentLabels = { + you = "Asignado a ti", + assigned = "Asignado a un compañero", + }, + messageAuthors = { + you = "Tú", + customer = "Cliente", + company = "Empresa", + }, + manager = { + title = "Perfil de empresa", + subtitle = "Gestionar información pública, servicios y anuncios.", + revision = "Revisión del servidor {revision}", + availability = "Disponibilidad", + profile = "Perfil público", + description = "Descripción", + descriptionPlaceholder = "Describe la empresa y lo que ofrece.", + phoneNumber = "Número de servicio", + phoneNumberManaged = "Configurado por el servidor y no puede editarse aquí.", + noPhoneNumber = "No hay número de servicio configurado", + chooseCover = "Elige foto de portada", + chooseLogo = "Elegir logo", + coverPhoto = "Foto de portada de la empresa", + logoPhoto = "Logo de la empresa", + locationLabel = "Nombre del lugar", + locationReady = "Se ha asignado una posición en el mapa a este perfil.", + useCurrentLocation = "Usar ubicación actual", + address = "Dirección", + district = "Distrito", + acceptRequests = "Aceptar solicitudes de servicio", + acceptRequestsBody = "Permite que las SIM registradas abran solicitudes estructuradas.", + saveProfile = "Guardar perfil", + hours = "Horario de apertura", + dayOpen = "La empresa está abierta este día", + opensAt = "Abierto", + closesAt = "Cierra", + saveHours = "Guardar horario", + services = "Servicios", + serviceTitle = "Nombre del servicio", + serviceDescription = "Descripción", + priceText = "Texto de precio", + serviceActive = "Visible públicamente", + serviceRequests = "Aceptar solicitudes para este servicio", + removeService = "Eliminar Servicio", + addService = "Agregar servicio", + saveServices = "Guardar Servicios", + announcement = "Anuncio actual", + announcementText = "Anuncio", + announcementPlaceholder = "Comparte una breve y oportuna actualización.", + expiresAt = "Vence el", + publish = "Publicar anuncio", + }, + feedback = { + requestCreated = "Solicitud enviada.", + requestCancelled = "Solicitud cancelada.", + requestClaimed = "Solicitud reclamada.", + requestAssigned = "Solicitud asignada.", + statusUpdated = "Estado de la solicitud actualizado.", + availabilityUpdated = "Disponibilidad pública actualizada.", + locationUpdated = "Ubicación actual seleccionada.", + callsEnabled = "Llamadas de la empresa habilitadas.", + callsDisabled = "Llamadas de la empresa desactivadas.", + profileSaved = "Perfil de la empresa guardado.", + hoursSaved = "Horarios de apertura guardados.", + servicesSaved = "Servicios guardados.", + announcementPublished = "Anuncio publicado.", + }, + conflict = { + title = "Cambios más recientes disponibles", + body = "Otro administrador actualizó esta información. Vuelve a cargar antes de guardar nuevamente.", + reload = "Recargar", + }, + notifications = { + newRequest = "Nueva solicitud de empresa", + requestUpdated = "Una solicitud de empresa fue actualizada.", + newMessage = "Nueva respuesta a tu solicitud de empresa.", + assigned = "Se te ha asignado una solicitud de empresa.", + }, + errors = { + anonymous_sim = "Se necesita una SIM registrada para enviar solicitudes de servicio.", + call_unavailable = "Esta línea de servicio no está disponible en este momento.", + company_not_found = "Esta empresa ya no está disponible.", + invalid_profile = "Revisa los campos del perfil de la empresa.", + invalid_request = "Revisa el tema y los detalles de la solicitud.", + invalid_media = "Una o más fotos adjuntas no están disponibles.", + invalid_expiration = "Elige una fecha de expiración válida para el anuncio.", + invalid_service = "Este servicio ya no está disponible.", + invalid_status = "Este cambio de estado no es permitido.", + messaging_unavailable = "Esta empresa no acepta mensajes de texto.", + no_sim = "Inserta una tarjeta SIM para continuar.", + not_authorized = "No tienes autorización para esta acción de empresa.", + rate_limited = "Por favor espera antes de intentarlo de nuevo.", + request_not_found = "Esta solicitud ya no está disponible.", + revision_conflict = "Los datos cambiaron en otro dispositivo. Recarga e intenta de nuevo.", + service_unavailable = "El servicio de Empresas no está disponible temporalmente.", + too_many_open_requests = "Ya tienes demasiadas solicitudes abiertas.", + request_failed = "El servicio de Empresas no pudo completar la solicitud.", + }, + }, + phone = { + name = "Teléfono", recents = "Recientes", contacts = "Contactos", keypad = "Teclado numérico", + noSim = "Sin SIM", noSimBody = "Inserta una tarjeta SIM en Ajustes para hacer llamadas.", + noRecents = "Sin llamadas recientes", allCalls = "Todos", missedCalls = "Perdidas", searchRecents = "Buscar llamadas", + contactDetails = "Detalles del contacto", unknownCaller = "Desconocido", callHistory = "Historial de llamadas", + noCallHistory = "No hay llamadas con este número aún.", noContacts = "Sin contactos", searchContacts = "Buscar Contactos", favorites = "Favoritos", + myCard = "Mi tarjeta", myNumber = "Mi Número", device = "Dispositivo", contactIndex = "Índice de Contactos", + addContact = "Nuevo contacto", newContact = "Nuevo", editContact = "Editar Contacto", contactName = "Nombre", firstName = "Nombre", lastName = "Apellido", companyOrGroup = "Empresa o Grupo", phoneNumber = "Número de teléfono", + officialContact = "Contacto oficial de la empresa", + choosePhoto = "Elegir Foto de Contacto", chooseGallery = "Fotos", takePhoto = "Cámara", removePhoto = "Eliminar foto", + message = "Mensaje", video = "Vídeo", mail = "Correo", defaultLabel = "Predeterminado", privateLabel = "Privado", + contactCard = "Tarjeta de contacto", removeContact = "Eliminar Contacto", returnToCall = "Volver a Llamar", mobile = "Móvil", messagesProfile = "Mensajes", notes = "Notas", + sendMessage = "Enviar mensaje", shareContact = "Compartir contacto", addFavorite = "Añadir a Favoritos", removeFavorite = "Eliminar de favoritos", + addEmergency = "Añadir a Contactos de Emergencia", blockContact = "Bloquear contacto", + block = "Bloquear", blockCaller = "Bloquear número", blockCallerTitle = "¿Bloquear este número?", + blockCallerBody = "{number} ya no podrá llamar a esta SIM.", + faceTime = "FaceTime", hideKeypad = "Ocultar Teclado Numérico", more = "Más opciones", mute = "Silenciar", speaker = "Altavoz", viewContact = "Ver contacto", + call = "Llamar", callFailed = "La llamada no pudo iniciarse.", calling = "Llamando...", incoming = "Llamada entrante", incomingDirection = "Entrante", outgoingDirection = "Saliente", connected = "Conectado", + missed = "Perdida", declined = "Rechazado", busy = "Ocupado", unavailable = "No disponible", + noAnswer = "Sin respuesta", cancelled = "Cancelado", disconnected = "Desconectado", sim_removed = "SIM eliminada", completed = "Llamada finalizada", + answer = "Responder", decline = "Rechazar", hangup = "Finalizar", addToContacts = "Añadir a contactos", + deleteContact = "Eliminar contacto", replaceTitle = "¿Reemplazar SIM?", + replaceBody = "La tarjeta SIM actual será devuelta a tu inventario.", choosePhone = "Elige un teléfono", + choosePhoneBody = "Selecciona el teléfono que recibirá {number}.", emptyPhone = "No hay ninguna SIM insertada", + errors = { + invalid_contact = "Introduce un nombre y un número de teléfono válido.", invalid_number = "Introduce un número de teléfono válido.", + invalid_sim = "La tarjeta SIM activa no está disponible.", + no_sim = "Este teléfono no tiene tarjeta SIM.", airplane_mode = "Apaga el modo avión para hacer llamadas.", + self_call = "No puedes llamar a tu propio número.", busy = "La línea está ocupada.", + company_unavailable = "Esta línea de servicio de la empresa no está disponible.", + readonly_contact = "Los contactos oficiales de la empresa no pueden modificarse.", + message_unavailable = "No se pudo abrir la conversación.", contact_remove_failed = "No se pudo eliminar el contacto.", contact_favorite_failed = "No se pudo actualizar el favorito.", + blocked = "Este número está bloqueado.", recipient_not_found = "Este número no es conocido.", + rate_limited = "Demasiadas llamadas. Inténtalo de nuevo en un minuto.", voice_unavailable = "El servicio de voz configurado para el teléfono no está disponible.", + call_not_connected = "Conecta la llamada antes de cambiar los controles de audio.", speaker_unavailable = "El modo de altavoz no está disponible para el servicio de voz configurado del teléfono.", + speaker_unsupported = "El servicio de voz configurado para el teléfono no admite el modo altavoz.", + mute_unavailable = "El modo de silencio no está disponible para el servicio de voz configurado del teléfono.", mute_unsupported = "El servicio de voz configurado para el teléfono no admite el silencio.", + inventory_full = "No hay espacio para la tarjeta SIM expulsada.", request_failed = "La solicitud del teléfono falló.", + operation_in_progress = "Otra operación de teléfono ya está en progreso.", sim_request_expired = "La selección de la tarjeta SIM ha expirado. Utiliza la tarjeta SIM de nuevo.", + sim_not_owned = "Esa tarjeta SIM ya no está en tu inventario.", phone_not_owned = "Ese teléfono ya no está en tu inventario.", + metadata_unsupported = "El inventario configurado no puede almacenar metadatos únicos de SIM.", + default = "La solicitud del teléfono falló.", + }, + }, + radio = { + name = "Radio", disconnected = "No conectado", connectedTo = "Conectado - {frequency} MHz", + noProvider = "Servicio de voz no disponible", channel = "Canal", primaryFrequency = "Frecuencia principal", + secondaryFrequency = "Frecuencia secundaria", frequencyPlaceholder = "Por ejemplo, 120.5", optional = "Opcional", + mhz = "MHz", volume = "Volumen", connect = "Conectar", disconnect = "Desconectar", + speaker = "Altavoz", speakerDescription = "Reproducir radio a través del modo altavoz", + providerFeatureUnavailable = "No compatible con este servicio de voz", notSupported = "No compatible", + members = "Conectados actualmente ({count})", noMembers = "Sin participantes", history = "Conexiones recientes", + noHistory = "Sin historial", badge = "Número de servicio", badgePlaceholder = "Por ejemplo, 231", + profileSaved = "Perfil de radio guardado", otherSettings = "Otro", autoRejoin = "Reconectar automáticamente", + displayName = "Nombre para mostrar en la radio", displayNamePlaceholder = "Nombre de jugador", + displayNameDescription = "Déjalo en blanco para usar el nombre de tu personaje. Este nombre se muestra a los demás participantes y en la superposición de radio integrada.", + displayNameNotAllowed = "Tu cargo actual no te permite cambiar el nombre de radio.", + autoRejoinDescription = "Vuelve a conectarte después de aparecer o reiniciar el recurso del teléfono.", + radioNotifications = "Notificaciones de radio", notificationsDescription = "Muestra las entradas y salidas de tu canal actual.", + memberJoined = "{name} se unió a la radio", memberLeft = "{name} salió de la radio", unknownMember = "Desconocido", + tabs = { radio = "Radio", settings = "Ajustes" }, + errors = { + invalid_frequency = "Introduce una frecuencia válida.", invalid_volume = "Introduce un volumen válido.", + channel_locked = "No tienes acceso a este canal.", secondary_locked = "No tienes acceso al canal secundario.", + voice_unavailable = "El servicio de voz de radio configurado no está disponible.", player_unavailable = "Los datos del jugador no están disponibles.", + rate_limited = "Espera antes de cambiar de canal nuevamente.", invalid_setting = "Esta configuración es inválida.", + radio_not_connected = "Conéctate a un canal de radio antes de activar el modo de altavoz.", + speaker_unavailable = "El modo altavoz no está disponible para el servicio de voz de radio configurado.", + speaker_unsupported = "El servicio de voz de radio configurado no admite el modo de altavoz.", + badge_disabled = "Los números de servicio están desactivados.", badge_forbidden = "Este número de servicio no está permitido.", + display_name_disabled = "Los nombres para mostrar en la radio están desactivados.", + display_name_forbidden = "Tu cargo o grado no te permite cambiar el nombre de radio.", + invalid_display_name = "Introduce un nombre de pantalla de radio válido.", + request_failed = "La solicitud de radio falló.", default = "La solicitud de radio falló.", + }, + }, + crypto = { + name = "VaultX", subtitle = "Intercambio de activos ficticios", loading = "Abriendo intercambio seguro…", logout = "Cerrar sesión", logoutConfirm = { title = "¿Cerrar sesión en VaultX?", body = "Necesitarás tu contraseña de VaultX para desbloquear este perfil nuevamente.", cancel = "Cancelar", confirm = "Cerrar sesión", signingOut = "Cerrando sesión…" }, refresh = "Actualizar cartera", navigation = "Navegación de VaultX", + auth = { + eyebrow = "Intercambio vinculado a personaje", loginTitle = "Bienvenido de nuevo", registerTitle = "Crear tu perfil de VaultX", body = "Intercambiar y transferir activos digitales ficticios a través de una cuenta controlada por el servidor.", network = "RED DE VAULT EN LÍNEA", serverSecured = "Servidor seguro", personalKey = "Clave criptográfica personal", characterBound = "Identidad vinculada", login = "Iniciar sesión", register = "Registrarse", accountEmail = "Correo de Sky Cloud", accountMissing = "No hay cuenta de Sky Cloud", loginPanelTitle = "Acceso seguro a la cuenta", loginPanelBody = "La identidad de tu personaje se detecta automáticamente.", registerPanelTitle = "Configura tu cartera privada", registerPanelBody = "Elige una identidad de perfil y una frase de acceso segura.", handle = "Alias de VaultX", handlePlaceholder = "3–20 letras o números", password = "Contraseña", passwordPlaceholder = "8–72 caracteres", confirmPassword = "Confirmar contraseña", confirmPasswordPlaceholder = "Introduce la misma contraseña de nuevo", showPassword = "Mostrar contraseña", hidePassword = "Ocultar contraseña", security = "Usa una contraseña del personaje. Nunca reutilices una contraseña real.", ruleLength = "8+ caracteres", ruleMixed = "Mayúsculas y minúsculas", ruleNumber = "Contiene un número", ruleSpecial = "Carácter especial", strength0 = "Empieza a escribir una contraseña segura", strength1 = "Protección débil", strength2 = "Protección básica", strength3 = "Protección fuerte", strength4 = "Protección excelente", acceptTitle = "Crear una cartera ficticia", acceptBody = "Entiendo que los activos de VaultX no tienen valor en el mundo real.", footer = "Sesión cifrada · Acceso limitado · Contraseña protegida en memoria", loginAction = "Desbloquear VaultX", registerAction = "Crear perfil seguro", + }, + tabs = { portfolio = "Cartera", markets = "Mercados", activity = "Actividad", profile = "Perfil" }, + portfolio = { total = "Cartera total", performance = "Beneficio / pérdida", ["return"] = "Rendimiento total", current = "Posición actual", history = "Rendimiento", forecast = "Pronóstico", chartLabel = "Evolución de pérdidas y ganancias con previsión discontinua", cash = "Efectivo disponible", invested = "Activos invertidos", allocation = "Asignación de cartera", inMarket = "en mercados", assets = "activos", holdings = "Tus activos", empty = "Aún no hay activos", emptyBody = "Abre Mercados para solicitar una cotización protegida.", avg = "Prom.", insightTitle = "Resumen de la cartera", insightBody = "Tus posiciones se valoran según los últimos precios sintéticos del servidor." }, + quick = { trade = "Operar", send = "Enviar", more = "Más opciones" }, + actions = { deposit = "Depositar", withdraw = "Retirar" }, + markets = { title = "Mercados ficticios", live = "Precio del servidor", noticeTitle = "Intercambio en el juego", notice = "Los precios son sintéticos y no tienen valor en el mundo real. Cada operación se verifica contra la liquidez de intercambio limitada.", eyebrow = "Pulso del mercado", movers = "Mayores movimientos", today = "Hoy" }, + marketDetail = { back = "Volver a los mercados", today = "Hoy", description = "El precio de referencia se genera por el servidor. Los precios ejecutables usan una cotización protegida y temporal.", investment = "Tu inversión", totalValue = "Valor actual", statistics = "Estadísticas de mercado", high24h = "Máximo de 24 h", low24h = "Mínimo de 24 h", supply = "Oferta en circulación", liquidity = "Liquidez cambiaria" }, + trade = { actions = "Acciones de operación", buy = "Comprar", buyBody = "Agregar", sell = "Vender", sellBody = "Reducir", quantity = "Cantidad", available = "Disponible:", estimated = "Valor estimado", marketPrice = "Precio de mercado", protected = "Cotización protegida", protectedBody = "VaultX verifica el precio, la liquidez, el saldo y los límites antes de la ejecución.", review = "Revisión de orden", price = "Precio de cotización", gross = "Bruto", fee = "Tarifa de intercambio", total = "Total", quoteExpiry = "Este precio del servidor caduca después de 8 segundos y solo puede usarse una vez.", getQuote = "Obtener cotización protegida", confirm = "Confirmar operación" }, + settlement = { depositBody = "Mueve fondos bancarios a tu saldo consolidado de VaultX.", withdrawBody = "Devuelve el saldo consolidado de VaultX a la cuenta bancaria de tu personaje.", amount = "Importe bancario entero", confirm = "Confirmar con seguridad" }, + transfer = { title = "Enviar cripto", subtitle = "Transferencia de VaultX", keyTitle = "Clave de recepción pública", keyBody = "Comprueba el destinatario antes de elegir un activo. Aquí nunca se puede enviar efectivo.", walletKey = "Clave de cripto del destinatario", verify = "Verificar", verifiedRecipient = "Destinatario verificado de VaultX", asset = "Elegir activo", quantity = "Cantidad de cripto", available = "Saldo disponible", password = "Confirmar con contraseña", protected = "Transferencia atómica entre carteras", protectedBody = "VaultX vuelve a comprobar en el servidor el destinatario, la propiedad, la cantidad y el saldo antes de registrar ambas carteras juntas.", confirm = "Enviar cripto de forma segura" }, + activity = { title = "Actividad financiera", empty = "No hay actividad", emptyBody = "Depósitos, retiros, operaciones y transferencias de cripto aparecerán aquí.", volume = "Volumen de negociación de por vida", completedTrades = "operaciones completadas", cash = "Efectivo", filters = { all = "Todos", trades = "Operaciones", wallet = "Billetera" } }, + profile = { verified = "Propiedad del personaje verificada", walletKey = "Clave criptográfica pública", walletKeyBody = "Comparte esta clave para recibir criptomonedas. No permite acceder a tu cuenta.", copyKey = "Copiar", copied = "Copiado", shareKey = "Compartir", shareTitle = "Mi clave criptográfica de VaultX", shareText = "Enviar cripto a mi clave pública de VaultX:", trades = "Operaciones", volume = "Volumen", memberSince = "Miembro desde", preferences = "Preferencias", priceAlerts = "Alertas de precio", priceAlertsBody = "Notificarme sobre movimientos destacados del mercado.", confirmations = "Confirmaciones comerciales", confirmationsBody = "Mantener una confirmación extra antes de la ejecución.", hideBalances = "Modo privacidad", hideBalancesBody = "Ocultar balances en VaultX.", identity = "Identidad del perfil", edit = "Editar", account = "Cuenta y seguridad", editTitle = "Editar perfil", editBody = "Actualiza tu alias o establece una contraseña nueva. Tu contraseña actual confirma los cambios de identidad.", currentPassword = "Contraseña actual", currentPasswordPlaceholder = "Necesaria para cambiar el alias o la contraseña", newPassword = "Nueva contraseña", newPasswordPlaceholder = "Deja en blanco para mantener tu contraseña actual", passwordSecurity = "Las contraseñas usan una función hash resistente a la memoria y nunca vuelven a mostrarse.", saved = "Perfil guardado de forma segura.", save = "Guardar perfil", saveChanges = "Guardar cambios", securityTitle = "Perfil protegido", securityBody = "Tu perfil permanece vinculado a este personaje y a su sesión financiera." }, + activityTypes = { buy = "Compra de activos", sell = "Venta de activos", deposit = "Depósito bancario", withdrawal = "Retirar dinero", transfer_in = "Cripto recibida", transfer_out = "Cripto enviada" }, + statuses = { completed = "Completado", pending = "Revisión pendiente", failed = "Error", manual_review = "Revisión manual" }, + errors = { invalid_profile = "Comprueba tus ajustes de perfil de VaultX.", invalid_handle = "Usa 3–20 letras, números, puntos o guiones bajos.", handle_taken = "Ese alias de VaultX ya está en uso.", profile_exists = "Este personaje ya tiene un perfil de VaultX.", invalid_password = "Usa 8–72 caracteres con mayúsculas, minúsculas, un número y un carácter especial.", password_mismatch = "Las contraseñas no coinciden.", accept_terms = "Confirma que se trata de una cartera ficticia del juego.", invalid_credentials = "La contraseña es incorrecta.", locked = "Demasiados intentos. Inténtalo de nuevo más tarde.", not_authenticated = "Inicia sesión en VaultX primero.", invalid_amount = "Ingresa una cantidad entera positiva.", invalid_quantity = "Introduce una cantidad con hasta seis decimales.", invalid_wallet_key = "Introduce una clave de recepción VX completa.", recipient_not_found = "Ninguna cuenta VaultX activa utiliza esta clave.", self_transfer = "No puedes enviar criptomonedas a tu propia clave.", invalid_transfer = "Verifica un destinatario, activo y cantidad válida de cripto.", recipient_limit_exceeded = "La billetera del destinatario no puede contener esa cantidad.", insufficient_funds = "Tu saldo disponible es demasiado bajo.", insufficient_liquidity = "El mercado no puede completar esa cantidad ahora mismo.", quote_expired = "Esta cotización ha expirado. Solicita una nueva.", quote_unavailable = "La cotización ya no está disponible.", market_unavailable = "Este mercado está temporalmente pausado.", limit_exceeded = "Esta solicitud excede el límite de intercambio.", duplicate_request = "Esta solicitud ya fue procesada.", rate_limited = "Demasiadas solicitudes. Inténtalo de nuevo pronto.", settlement_pending = "Una transferencia de dinero ya está pendiente de revisión.", service_unavailable = "VaultX está temporalmente inalcanzable.", request_failed = "La solicitud de intercambio seguro falló.", default = "VaultX no pudo completar la solicitud." }, + }, + banking = { + name = "Banca", welcome = "Bienvenido de nuevo", totalBalance = "Saldo total", recentPeriod = "en actividad reciente", + actions = "Acciones bancarias", send = "Enviar", + accounts = "Cuentas", bankAccount = "Cuenta bancaria", cash = "Efectivo", + latestTransactions = "Transacciones recientes", allTransactions = "Todas las transacciones", viewAll = "Ver todo", + noTransactions = "Tu actividad bancaria aparecerá aquí.", home = "Inicio", activity = "Actividad", + chartDaySummary = "{day}: {incoming} entrantes, {outgoing} salientes", + navigation = "Navegación bancaria", incoming = "Entrante", outgoing = "Saliente", + refresh = "Actualizar datos bancarios", unavailable = "Banca no disponible", tryAgain = "Inténtalo de nuevo", + recipientPhone = "Número de teléfono", recipientPhonePlaceholder = "Introduce el número del destinatario", + chooseContact = "Elige de contactos", noContacts = "No hay contactos guardados aún.", + amount = "Cantidad", amountPlaceholder = "Ingresa una cantidad", + transactionDetails = "Detalles de la transacción", transactionDate = "Fecha", + transactionDirection = "Dirección", transactionReference = "Referencia", + notifications = { + receivedTitle = "Dinero recibido", + received = "Has recibido {amount} de {sender}.", + }, + transactions = { + deposit = "Depósito en efectivo", withdrawal = "Retiro en efectivo", + transfer_in = "Transferencia entrante", transfer_out = "Transferencia saliente", + }, + forms = { + transfer = { title = "Enviar dinero", body = "Transfiere dinero de tu cuenta bancaria a un jugador conectado.", submit = "Enviar transferencia" }, + }, + errors = { + invalid_request = "Introduce un número de teléfono válido y una cantidad completa.", insufficient_funds = "No hay suficiente dinero en esta cuenta.", + target_not_found = "El destinatario no está en línea.", self_transfer = "No puedes enviarte dinero a ti mismo.", + rate_limited = "Espera antes de realizar otra transacción.", reload_cooldown = "Demasiadas actualizaciones. Espera un momento antes de volver a intentarlo.", transfer_failed = "La transferencia no pudo completarse.", + banking_unavailable = "El banco no está disponible en este momento.", request_failed = "La solicitud bancaria falló.", + default = "La solicitud bancaria falló.", + }, + }, + billing = { + name = "Facturación", back = "Atrás", navigation = "Navegación de facturación", + search = "Buscar facturas", loadMore = "Cargar más", tryAgain = "Inténtalo de nuevo", + tabs = { overview = "Resumen", inbox = "Buzón", history = "Historial" }, + direction = { inbox = "Recibidas", sent = "Enviadas" }, + summary = { open = "Facturas abiertas", due = "Importe debido", overdue = "Atrasado" }, + overview = { eyebrow = "Centro de pagos", urgent = "Necesita atención", viewAll = "Ver todas las facturas" }, + filters = { scope = "Fuente de factura", status = "Estado", all = "Todos", open = "Abierto", overdue = "Atrasado", paid = "Pagado" }, + status = { open = "Abierto", overdue = "Atrasado", processing = "Procesando", paid = "Pagado", disputed = "Disputado", cancelled = "Cancelado", refunded = "Reembolsado" }, + detail = { + title = "Detalles de la factura", noDueDate = "Sin fecha de vencimiento", total = "Total", reason = "Motivo", + issued = "Publicada", due = "Vence", paidAt = "Pagado", paidOn = "Pago el {date}", + issuer = "Emisor", invoiceNumber = "Número de factura", + invoiceInformation = "Información de la factura", paymentInformation = "Información de pago", + note = "Nota de la factura", + paymentReference = "Referencia de pago", dispute = "Reclamar factura", + disputedSuccess = "La factura fue disputada.", + }, + payment = { + payNow = "Pagar esta factura", title = "Confirmar pago", + body = "Paga esta factura de {issuer} con tu cuenta bancaria.", + confirm = "Pagar factura", cancel = "Cancelar", success = "Factura pagada con éxito.", + }, + empty = { + openTitle = "Estás al día", openBody = "Las facturas que requieren tu atención aparecerán aquí.", + inboxTitle = "No se encontraron facturas", inboxBody = "Las facturas recibidas que coincidan con tus filtros aparecerán aquí.", + historyTitle = "No hay historial de pagos", historyBody = "Las facturas completadas y cerradas aparecerán aquí.", + }, + notifications = { newInvoice = "Nueva factura de {issuer}: {amount}" }, + errors = { + billing_unavailable = "La facturación no está disponible actualmente.", invoice_not_found = "Esta factura no se encontró.", + invoice_not_payable = "Esta factura ya no puede pagarse.", invoice_already_paid = "Esta factura ya fue pagada.", + insufficient_funds = "No hay suficiente dinero en tu cuenta bancaria.", payment_in_progress = "Esta factura ya está siendo procesada.", + payment_failed = "La transacción no pudo completarse.", dispute_unavailable = "Esta factura no se puede reclamar.", + rate_limited = "Por favor espera antes de intentarlo de nuevo.", request_failed = "La solicitud de cobro falló.", + default = "La solicitud de cobro falló.", + }, + }, + garage = { + name = "Garaje", subtitle = "Tu colección de vehículos", myVehicles = "Mis vehículos", + searchPlaceholder = "Buscar nombre, matrícula o garaje", + tryAgain = "Inténtalo de nuevo", unavailable = "Garaje no disponible", + noVehicles = "No hay vehículos", noVehiclesBody = "Los vehículos propiedad de este personaje aparecerán aquí.", + noResults = "No hay resultados", noResultsBody = "Prueba con otro vehículo, matrícula o ubicación.", + unknownVehicle = "Vehículo desconocido", unknownLocation = "Ubicación no disponible", + location = "Ubicación actual", fuel = "Combustible", engine = "Motor", body = "Carrocería", + vin = "Número de identificación del vehículo", notAvailable = "—", + filtersLabel = "Filtrar vehículos", + valetDelivered = "Tu vehículo ha llegado.", + valet = { + title = "Sky Valet", eyebrow = "Entrega prémium", + body = "Un conductor profesional llevará este vehículo directamente a tu ubicación actual.", + deliver = "Entregar vehículo", liveEyebrow = "Entrega en vivo", tracked = "Seguimiento en tiempo real", + onDemand = "Bajo demanda", cancel = "Cancelar", confirmTitle = "¿Solicitar el servicio de valet?", + confirmBody = "{vehicle} se te entregará por {price}.", confirm = "Solicitar Valet", + ordering = "Solicitando…", account = "El coste se cargará a tu cuenta {account}.", + connecting = "Localizando conductor", arriving = "Llegando ahora", eta = "A unos {seconds} s", + distance = "{distance} m de distancia", unavailableStatus = "Solo se pueden entregar vehículos aparcados.", + unsupported = "La entrega mediante valet está desactivada para este tipo de vehículo.", + activeOrder = "Un conductor de valet ya está entregando otro vehículo.", + status = { ordering = "Confirmando pedido", preparing = "Preparando vehículo", en_route = "Conductor en camino", + arriving = "Llegando ahora", delivered = "Vehículo entregado", cancelled = "Entrega cancelada", failed = "Entrega fallida" }, + }, + filters = { all = "Todos", garaged = "Aparcado", out = "En circulación", impounded = "Incautados" }, + status = { garaged = "Aparcado", out = "En circulación", impounded = "Incautado" }, + kinds = { car = "Vehículo", bike = "Moto", boat = "Barco", plane = "Avión", helicopter = "Helicóptero" }, + errors = { + garage_unavailable = "Los datos del vehículo no están disponibles para este personaje.", + valet_disabled = "El servicio de valet no está disponible en este momento.", + valet_active = "Un servicio de aparcacoches ya está activo.", + valet_cooldown = "Espera antes de solicitar otro vehículo.", + invalid_vehicle = "Selecciona un vehículo válido.", vehicle_not_owned = "Este vehículo no pertenece a este personaje.", + vehicle_not_garaged = "Este vehículo no está estacionado en un garaje.", + valet_vehicle_type = "El valet solo admite coches y motos.", + insufficient_funds = "No tienes suficiente dinero para esta entrega.", + valet_status_unsupported = "Este sistema de garaje no puede liberar el vehículo.", + valet_not_found = "La orden de aparcacoches ya no está activa.", + valet_not_cancellable = "La entrega ya no puede cancelarse.", + invalid_vehicle_model = "El modelo del vehículo no se pudo cargar.", + vehicle_already_out = "Este vehículo ya está cerca.", + valet_spawn_failed = "El conductor no pudo preparar tu vehículo.", + valet_no_road = "No se encontró una ruta adecuada cerca de ti.", + valet_interrupted = "La entrega mediante valet se interrumpió.", + valet_timeout = "El conductor no pudo llegar a ti a tiempo. Tu tarifa fue reembolsada.", + valet_completion_failed = "La entrega no pudo confirmarse.", + valet_vehicle_unverified = "El vehículo entregado no pudo verificarse.", + rate_limited = "Espera antes de volver a actualizar.", + device_not_open = "Abre el teléfono de nuevo para ver tus vehículos.", + request_failed = "La solicitud del garaje falló.", default = "La solicitud del garaje falló.", + }, + }, + skyride = { + name = "SkyRide", loading = "Cargando SkyRide", unavailable = "SkyRide no disponible", tryAgain = "Inténtalo de nuevo", + mode = { rider = "Viajar", driver = "Conducción" }, + riderEyebrow = "Viaja a cualquier lugar", whereTo = "¿Dónde?", pickup = "Recogida", destination = "Destino", + currentLocation = "Ubicación actual", notSelected = "No seleccionado", location = "Elige una ubicación", + chooseLocation = { pickup = "Seleccionar recogida", destination = "Elegir destino" }, + chooseOnMap = "Seleccionar en el mapa", chooseOnMapBody = "Toca un punto preciso en el mapa de Los Santos.", + pickOnMap = { pickup = "Pulsa tu punto de recogida", destination = "Toca tu destino" }, + tapMapHint = "Arrastra y amplía el mapa; después, toca para colocar el marcador.", mapPoint = "Marcador de mapa", map = "Mapa", useGps = "Usar tu posición actual", + zoomIn = "Acercar", zoomOut = "Alejar", resetMap = "Restablecer vista del mapa", + savedPlaces = "Lugares guardados", savedPlace = "Lugar guardado", quickDestinations = "Destinos rápidos", + quickLocations = { ["legion-square"] = "Legion Square", ["diamond-casino"] = "Casino de diamantes", airport = "Aeropuerto de Los Santos", vinewood = "Vinewood" }, + viewRides = "Ver opciones de viaje", change = "Cambiar", requestRide = "Solicitar SkyRide", playerDriverNotice = "SkyRide te asigna conductores reales. Un conductor debe estar en línea y aceptar tu solicitud.", + serviceMeta = "{eta} min · {seats} plazas", distanceMeters = "{distance} m", + distanceKilometers = "{distance} km", distanceMiles = "{distance} mi", durationMinutes = "{minutes} mín.", + fare = "Viaje", calculatedFare = "Calculado", customFare = "Precio propio", + calculatedFareBody = "Distancia, tiempo y servicio seleccionado incluido.", + customFareRange = "Rango permitido: {minimum} a {maximum}", applyCustomFare = "Aplicar precio personalizado", + perKilometer = "{price} / km", perMile = "{price} / mi", rideStatus = "Estado del viaje", + services = { + taxi = { name = "Taxi" }, comfort = { name = "Comodidad" }, xl = { name = "XL" }, premium = { name = "Premium" }, + }, + ride = "SkyRide", + driver = { + online = "Estás en línea", offline = "Estás desconectado", + onlineBody = "Los nuevos pedidos de viaje pueden llegar a ti ahora.", offlineBody = "Conéctate cuando estés listo para conducir.", + toggleStatus = "Alternar estado del conductor", today = "Hoy", requests = "Solicitudes cercanas", accept = "Aceptar viaje", + noRequests = "No hay solicitudes cercanas", noRequestsBody = "Los nuevos pedidos aparecerán aquí automáticamente.", + goOnline = "Conéctate para recibir viajes", goOnlineBody = "Activa tu estado de conductor para ver los pedidos cercanos.", + statusBody = { + searching = "Un pasajero está esperando un conductor.", accepted = "Dirígete al punto de recogida del pasajero.", + driver_arriving = "Estás dirigiéndote al pasajero.", arrived = "Confirmar cuando el pasajero está en el vehículo.", + in_progress = "Sigue la ruta hacia el destino.", completed = "El viaje ha terminado.", + cancelled = "Este viaje fue cancelado.", + }, + actions = { arrive = "He llegado", start = "Iniciar viaje", complete = "Finalizar viaje" }, + }, + passenger = "Pasajero", vehicle = "Vehículo", navigate = "Navegar", call = "Llamar", message = "Mensaje", + cancelRide = "Cancelar viaje", cancelTitle = "¿Cancelar este viaje?", + cancelBody = "Tu conductor o pasajero será notificado. Puede aplicarse una tarifa de cancelación.", + safetyNote = "Los detalles del viaje solo se comparten mientras este viaje está activo.", waypointSet = "Ruta añadida a tu GPS.", + status = { + searching = "Buscando conductor", accepted = "Conductor encontrado", driver_arriving = "Conductor en camino", + arrived = "Conductor llegó", in_progress = "En camino", completed = "Completado", cancelled = "Cancelado", + }, + statusBody = { + searching = "Tu solicitud está esperando a que la acepte un conductor disponible.", accepted = "Tu conductor se dirige al punto de recogida.", + driver_arriving = "Tu conductor está en camino hacia tu recogida.", arrived = "Tu conductor está esperando en el punto de recogida.", + in_progress = "Estás en camino hacia tu destino.", completed = "Has llegado a tu destino.", + cancelled = "Este viaje ya no está activo.", + }, + navigation = "Navegación de SkyRide", + tabs = { home = "Inicio", rides = "Viajes", activity = "Actividad", messages = "Abrir chat", profile = "Perfil" }, + rides = "Tus viajes", ridesBody = "Revisa los viajes completados y cancelados.", noRides = "Sin viajes aún", + noRidesBody = "Los viajes completados y cancelados aparecerán aquí.", activity = "Actividad", + activityBody = "Actualizaciones recientes de viaje e hitos.", noActivity = "No hay actividad reciente", + noActivityBody = "Las actualizaciones de viaje aparecerán aquí.", messages = "Mensajes", + messagesBody = "Contacta a tu conductor o pasajero activo.", noMessages = "Sin contacto activo", + noMessagesBody = "Reserva o acepta un viaje para contactar a la otra persona.", openMessages = "Abrir Mensajes", + account = "Cuenta", paymentMethod = "Método de pago", paymentMethods = { bank = "Banco", cash = "Efectivo", default = "Método de pago" }, safety = "Centro de seguridad", + safetyBody = "Ayuda, compartir viaje e información de emergencia", driverMode = "Modo conductor", + driverModeBody = "Aceptar solicitudes de viaje y rastrear tus ingresos", completedRides = "Completados", + cancelledRides = "Cancelados", acceptance = "Aceptación", rating = "Calificación", notAvailable = "N/A", + profile = "Tu perfil", editProfile = "Editar Perfil", editProfileBody = "Cambia tu nombre público y foto de perfil", + profilePhoto = "Foto de perfil", gallery = "Fotos", camera = "Cámara", profileDetails = "Detalles del perfil", + profileName = "Nombre", profileNamePlaceholder = "Tu nombre en SkyRide", removeProfilePhoto = "Eliminar foto de perfil", + saveProfile = "Guardar perfil", profileSaved = "Tu perfil de SkyRide fue actualizado.", + memberSince = "Miembro de SkyRide desde {date}", rideComplete = "Viaje completado", rateRide = "Califica tu viaje", + rateRideBody = "¿Cómo fue tu viaje? Tu feedback ayuda a todos los conductores.", ratingValue = "{rating} estrellas", + tip = "Añadir comentario", noTip = "No dejar propina", comment = "Comentar", commentPlaceholder = "Comparte un comentario opcional...", + submitRating = "Enviar calificación", notNow = "No ahora", ratingSaved = "Gracias por tu feedback.", + errors = { + skyride_unavailable = "SkyRide no está disponible en este momento.", + invalid_location = "Elige un punto de recogida y destino válido.", quote_not_found = "Estas opciones de viaje ya no están disponibles.", + pickup_too_far = "Acércate al punto de recogida seleccionado.", invalid_route = "No se encontró una ruta adecuada para este viaje.", + invalid_custom_fare = "Elige un precio personal dentro del rango permitido.", + quote_expired = "Estas opciones de viaje expiraron. Solicita una nueva cotización.", active_ride_exists = "Finaliza o cancela tu viaje activo primero.", + invalid_driver_status = "Ese estado del conductor no está disponible.", driver_not_eligible = "Esta cuenta no es apta para el modo Conductor.", + driver_offline = "Ponte en línea antes de aceptar un viaje.", driver_unavailable = "Ese conductor ya no está disponible.", + driver_vehicle_required = "Siéntate en el asiento del conductor de un vehículo antes de aceptar un viaje.", + ride_not_found = "Este viaje ya no está disponible.", not_ride_participant = "No eres parte de este viaje.", + invalid_ride_status = "Esta acción no está disponible para este viaje.", invalid_rating = "Elige una calificación entre una y cinco estrellas.", + driver_too_far = "Acércate a la ubicación requerida para el viaje.", passenger_too_far = "El pasajero no está lo suficientemente cerca para iniciar.", + destination_too_far = "Acércate al destino para completar el viaje.", payout_failed = "El pago al conductor no se pudo completar.", + refund_failed = "La devolución de viaje no se pudo completar.", invalid_cancel_reason = "Elige una razón de cancelación válida.", + invalid_tip = "Elige una cantidad de propina válida.", invalid_comment = "El comentario de calificación no es válido.", + invalid_profile = "Elige un nombre y foto de perfil válidos.", invalid_profile_name = "Tu nombre de perfil debe contener entre 2 y 50 caracteres.", + invalid_profile_image = "Elige una foto de perfil de tu propia galería.", + tip_failed = "El pago no se pudo procesar.", insufficient_funds = "El método de pago seleccionado no tiene fondos suficientes.", + rate_limited = "Por favor espera un momento antes de intentarlo de nuevo.", request_failed = "SkyRide no pudo completar la solicitud.", + device_not_open = "Abre el teléfono de nuevo para usar SkyRide.", device_not_owned = "Este teléfono no pertenece a este personaje.", + device_locked = "Desbloquea este teléfono para usar SkyRide.", + default = "SkyRide no pudo completar la solicitud.", + }, + }, + house = { + name = "Casa", subtitle = "Gestionar viviendas y acceso", myHomes = "Tus casas", + properties = "Propiedades", owned = "Propiedad", shared = "Compartido contigo", + locked = "Bloqueada", unlocked = "Desbloqueada", lockDoor = "Bloquear puerta", unlockDoor = "Desbloquear puerta", owner = "Propietario", keyholder = "Titular de la llave", + openDetails = "Abrir detalles de propiedad", tryAgain = "Inténtalo de nuevo", refresh = "Actualizar", + offline = "La casa está fuera de línea", offlineBody = "Inicia un recurso de vivienda compatible o revisa Config.Housing.", + unavailable = "Casas no disponibles", empty = "No hay viviendas aún", emptyBody = "Las casas que posees o puedes acceder aparecerán aquí automáticamente.", + provider = "Datos de vivienda · {system}", access = "Acceso", status = "Estado", + actions = "Acciones rápidas", setWaypoint = "Obtener direcciones", viewCamera = "Ver cámara", + garage = "Garaje", garageEnabled = "Activado", garageDisabled = "No disponible", + storedVehicles = "{count} guardados", camera = "Cámara", cameraAvailable = "Listo", cameraUnavailable = "No disponible", + keys = "Llaves", manageKeys = "Gestionar llaves", addKey = "Agregar llave", revokeKey = "Revocar llave", + noKeys = "No hay llaves compartidas", noKeysBody = "Solo tú tienes acceso a esta casa actualmente.", + chooseResident = "Dar una llave", chooseResidentBody = "Elige a una persona que esté dentro de esta propiedad.", + noCandidates = "Nadie está esperando dentro", noCandidatesBody = "Debe haber alguien dentro de la propiedad para poder darle una llave.", + revokeTitle = "¿Revocar llave?", revokeBody = "{name} perderá el acceso a esta propiedad.", + offlineKey = "Desconectado", onlineKey = "En línea", cancel = "Cancelar", confirm = "Confirmar", + lockSuccess = "Estado de la puerta actualizado.", waypointSuccess = "Ruta establecida en tu mapa.", + keyGranted = "Llave concedida.", keyRevoked = "Llave revocada.", cameraStarting = "Abriendo la cámara…", + errors = { + provider_unavailable = "El proveedor de vivienda no está disponible.", provider_error = "No se puede contactar con el proveedor de vivienda.", + housing_unavailable = "Los datos de vivienda no están disponibles para este personaje.", property_not_found = "Esta propiedad ya no existe.", + property_access_denied = "Ya no tienes acceso a esta propiedad.", owner_required = "Solo el dueño de la propiedad puede hacer eso.", + invalid_property = "Selecciona una propiedad válida.", invalid_action = "Esta acción de vivienda no está disponible.", capability_unavailable = "Este proveedor de propiedades no admite ese control.", + invalid_target = "Selecciona un residente válido.", target_not_in_property = "Esa persona ya no está dentro de la propiedad.", + key_not_found = "Esa llave ya no existe.", key_already_exists = "Esa persona ya tiene acceso a esta propiedad.", keyholder_offline = "Las llaves de usuarios desconectados deben revocarse desde el menú de la propiedad.", + cctv_unavailable = "La cámara no está disponible para esta propiedad.", provider_rejected = "El proveedor de vivienda rechazó la solicitud.", + action_failed = "La propiedad no se pudo guardar.", rate_limited = "Espera antes de usar otro control de vivienda.", reload_cooldown = "Demasiadas actualizaciones. Espera un momento antes de volver a intentarlo.", device_not_open = "Abre el teléfono de nuevo para gestionar tus casas.", + device_locked = "Desbloquea el teléfono para gestionar tus casas.", request_failed = "La solicitud de vivienda falló.", default = "La solicitud de vivienda falló.", + }, + }, + calculator = { + name = "Calculadora", history = "Historial de cálculos", changeMode = "Cambiar modo de calculadora", + scientificFunctions = "Funciones científicas", edit = "Editar", done = "Listo", closeHistory = "Cerrar historial", + today = "Hoy", yesterday = "Ayer", earlier = "Anterior", noHistory = "No hay cálculos aún", clearHistory = "Borrar historial", + }, + snake = { + name = "Snake", backToMenu = "Volver al menú del juego", board = "Tablero del juego de serpiente", + controls = "Controles de dirección", + directions = { down = "Mover abajo", left = "Mover a la izquierda", right = "Mover a la derecha", up = "Mover hacia arriba" }, + gameOver = "Fin del juego", highScore = "Puntuación máxima", menu = "Menú principal", pause = "Pausar juego", paused = "Pausado", + readyBody = "Recolecta frutas, crece más y evita todas las paredes.", readyTitle = "¿Listo para jugar?", + restart = "Jugar de nuevo", resume = "Continuar juego", score = "Puntuación", speed = "Velocidad", + speeds = { fast = "Rápido", normal = "Normal", relaxed = "Relajado" }, start = "Empezar juego", + swipeHint = "Usa las teclas de flecha para dirigir", + }, + memory = { + name = "Memoria", backToMenu = "Volver a selección de tableros", board = "Tablero de tarjetas de memoria", + chooseBody = "Encuentra cada pareja coincidente con el menor número de movimientos", + chooseTitle = "Elegir un tablero", completeEyebrow = "Tablero limpio", completeTitle = "¡Gran memoria!", + difficulties = { large = "Experto", medium = "Clásico", small = "Rápido" }, eyebrow = "Juego de parejas", + hiddenCard = "Carta oculta", menu = "Selección de tableros", moves = "Movimientos", mute = "Silenciar sonidos del juego", + noBest = "Aún no hay mejor puntuación", playAgain = "Jugar de nuevo", restart = "Reiniciar", + revealedCard = "Carta revelada", time = "Tiempo", unmute = "Activar sonidos del juego", + }, + numberMerge = { + name = "2048", backToMenu = "Volver al menú del juego", best = "Mejor", board = "Tablero de 2048", + cancel = "Mantener juego actual", confirmBody = "Tu tablero actual será reemplazado. No se puede deshacer.", + confirmNew = "Iniciar partida nueva", confirmTitle = "¿Reemplazar el juego actual?", continueGame = "Continuar juego", + controls = "Controles de movimiento", directions = { + down = "Mover fichas hacia abajo", left = "Mover fichas a la izquierda", right = "Mover fichas a la derecha", up = "Mover fichas hacia arriba", + }, + eyebrow = "Juego de números", gameOverBody = "No hay espacios vacíos ni vecinos coincidentes restantes.", + gameOverTitle = "No más movimientos", highest = "Ficha más alta", + howToBody = "Desliza para unir fichas coincidentes. Cada pareja se convierte en una ficha más grande.", + howToExample = "2 + 2 = 4 · 4 + 4 = 8 · … · 1024 + 1024 = 2048", + howToGoal = "Objetivo: crear la ficha 2048 antes de que el tablero no tenga más movimientos.", howToTitle = "Cómo jugar", + keepPlaying = "Seguir jugando", mainMenu = "Menú principal", + menuBody = "Desliza números coincidentes y avanza hacia 2048.", menuTitle = "Construir la ficha 2048", + mute = "Silenciar sonidos del juego", newGame = "Partida nueva", score = "Puntuación", + swipeHint = "Deslizar el tablero o usar las teclas de dirección / WASD", + unmute = "Activar sonidos del juego", + wonBody = "Llegaste a la ficha legendaria. Continúa subiendo o vuelve a empezar.", wonTitle = "¡Hiciste 2048!", + }, + minesweeper = { + name = "Buscaminas", backToMenu = "Volver al menú del juego", board = "Tablero de Buscaminas", + chooseBody = "Descubre todas las casillas seguras. Los números indican cuántas minas tocan cada casilla.", + chooseTitle = "Elegir un campo de minas", difficulties = { classic = "Clásico", expert = "Experto", quick = "Rápido" }, + emptyCell = "Campo descubierto vacío", eyebrow = "Juego de minas", flaggedCell = "Campo marcado", + gameHint = "Toca para revelar · Mantén o haz clic derecho para marcar", hiddenCell = "Campo oculto", + longPressHint = "Pulsa para revelar · Mantén pulsado para colocar una bandera", + lostBody = "Una mina estaba oculta allí. Marca campos sospechosos y vuelve a intentarlo.", lostTitle = "Minas activadas", + mainMenu = "Menú principal", mineCell = "Mina descubierta", mines = "Minas", mute = "Silenciar sonidos del juego", + noBest = "No hay mejor tiempo aún", numberCell = "Campo revelado con {count} minas vecinas", + playAgain = "Jugar de nuevo", restart = "Reiniciar", resume = "Continuar juego", time = "Tiempo", + unmute = "Activar sonidos del juego", wonBody = "Campo minado eliminado en {time}.", wonTitle = "¡Campo despejado!", + }, + towerStack = { + name = "Tower Stack", backToMenu = "Volver al menú del juego", bestHeight = "Mejor altura", + bestScore = "Mejor puntuación", blocks = "Bloques", eyebrow = "Desafío de tiempo", finalScore = "Puntuación final", + gameHint = "Pulsa el campo de juego para colocar el bloque en movimiento", gameOver = "Torre colapsada", + height = "Altura", mainMenu = "Menú principal", + menuBody = "Detén cada bloque en movimiento sobre la torre. Solo permanecerá la parte superpuesta.", + menuTitle = "¿Qué altura puedes alcanzar?", mute = "Silenciar sonidos del juego", newGame = "Juego nuevo", + pause = "Pausar o continuar el juego", paused = "Pausado", perfect = "¡PERFECTO!", + placeBlock = "Colocar bloque en movimiento", playAgain = "Jugar de nuevo", ready = "¿Listo para apilar?", + resume = "Continuar juego", score = "Puntuación", start = "Empezar juego", + tapHint = "Cada toque coloca un bloque · los encajes perfectos dan puntos extra", + unmute = "Activar sonidos del juego", + }, + skyFlappy = { + name = "Sky Flappy", backToMenu = "Volver al menú del juego", best = "Mejor", design = "Diseño del cielo", + designs = { dawn = "Amanecer", neon = "Neón", storm = "Tormenta" }, eyebrow = "Reto del cielo", + firstTap = "Pulsa para lanzar", flap = "Volar hacia arriba", gameHint = "Toca en cualquier lugar del cielo para volar hacia arriba", + gameOver = "Vuelo terminado", highScore = "Puntuación máxima", mainMenu = "Menú principal", + menuBody = "Guía al pájaro del cielo a través de cada abertura de la torre sin tocar los bordes.", + menuTitle = "Volar entre las torres", mute = "Silenciar sonidos del juego", pause = "Pausar o continuar el juego", + paused = "Pausado", playAgain = "Volar de nuevo", points = "Puntos", ready = "¿Listo para despegar?", + resume = "Continuar vuelo", score = "Puntuación", start = "Iniciar vuelo", + tapHint = "Toca para aletear · la gravedad empuja al pájaro hacia abajo", unmute = "Activar sonidos del juego", + }, + neonDrop = { + name = "Neon Drop", backToMenu = "Volver al menú del juego", bestLines = "Mejores líneas", + bestScore = "Mejor puntuación", board = "Tablero del reactor de Neón", controls = "Control de bloque", + eyebrow = "Juego de bloques de energía", gameHint = "Desliza el reactor o usa los cinco controles", + gameOver = "Reactor sobrecargado", hardDrop = "Colocar el bloque inmediatamente", + howToBody = "Completa filas horizontales para eliminarlas y mantener despejado el reactor.", + howToTitle = "Cargar el reactor", left = "Mover bloque a la izquierda", level = "Nivel", lines = "Filas", + mainMenu = "Menú principal", menuBody = "Girar y colocar formas de energía caídas. Cada fila limpia aumenta tu carga.", + menuTitle = "Construir líneas de energía completas", mute = "Silenciar sonidos del juego", newGame = "Juego nuevo", + next = "Siguiente", pause = "Pausar o continuar el juego", paused = "Pausado", playAgain = "Jugar de nuevo", + points = "Puntos", ready = "Reactor listo", resume = "Continuar juego", right = "Mover bloque a la derecha", + rotate = "Rotar bloque", score = "Puntuación", softDrop = "Mover bloque hacia abajo", start = "Iniciar reactor", + unmute = "Activar sonidos del juego", + }, + camera = { + name = "Cámara", flash = "Linterna", flip = "Cambiar de cámara", landscape = "Cambiar a paisaje", + portrait = "Cambiar a vertical", photo = "Foto", video = "Vídeo", microphoneOn = "Micrófono encendido", microphoneOff = "Micrófono silenciado", + focusHelp = "Presionar Espacio para mirar alrededor", returnHelp = "Soltar espacio para controles", lockCamera = "Bloquear movimiento de la cámara", + unlockCamera = "Desbloquear movimiento de la cámara", spaceKey = "Espacio", uploading = "Subiendo {count}", + saving = "Guardando video...", openGallery = "Abrir fotos", takePhoto = "Tomar foto", + startRecording = "Iniciar grabación", stopRecording = "Detener grabación", saved = "Guardado en fotos.", + zoom = "Establecer zoom de la cámara en {zoom}", + errors = { + cancelled = "Captura cancelada.", capture_failed = "No se puede capturar la vista del juego.", + invalid_media_type = "El tipo de medio subido es inválido.", invalid_upload = "La subida no se pudo verificar.", + invalid_upload_token = "La sesión de subida ya no es válida.", media_provider_failed = "El servicio de subida de la cámara no está disponible.", + media_provider_rate_limited = "El servicio de subida de la cámara está ocupado. Inténtalo de nuevo pronto.", media_provider_unauthorized = "La clave API de FiveManage configurada fue rechazada.", + missing_config = "La subida de la cámara no está configurada.", + microphone_unavailable = "Permite el acceso al micrófono o siléncialo antes de grabar.", + not_found = "El elemento de medio ya no existe.", owner_changed = "La cuenta del teléfono activa cambió durante la subida.", + operation_in_progress = "Otra operación de medio está en progreso.", + rate_limited = "Demasiadas acciones de medios. Inténtalo de nuevo pronto.", request_failed = "La solicitud de la cámara falló.", + request_timeout = "Se agotó el tiempo de espera del servicio multimedia.", unsupported = "La grabación de vídeo no es compatible.", + upload_failed = "La subida de medios falló.", upload_timeout = "Se agotó el tiempo de espera de la subida multimedia.", + }, + }, + calendar = { + name = "Calendario", today = "Hoy", calendars = "Calendarios", calendar = "Calendario", calendarName = "Sky Cloud", + searchPlaceholder = "Buscar eventos", previousMonth = "Mes anterior", nextMonth = "Próximo mes", + eyebrow = "Tu tiempo, planificado con claridad.", schedule = "Agenda", event = "Evento", appointment = "Cita", + newEvent = "Nuevo evento", editEvent = "Editar evento", deleteEvent = "Eliminar evento", details = "Detalles del evento", + title = "Título", titlePlaceholder = "¿Qué tienes planeado?", date = "Fecha", allDay = "Todo el día", starts = "Comienza", ends = "Finaliza", + reminder = "Recordatorio", reminderNotification = "Próximos: {title}", note = "Nota", + notePlaceholder = "Añade detalles, una dirección o cualquier otra cosa para recordar...", noEvents = "Nada planeado", + noEventsBody = "Este día aún está libre. Añade un evento cuando estés listo.", + signInTitle = "Tu calendario de Sky Cloud", + signInBody = "Inicia sesión en Sky Cloud en Ajustes para sincronizar citas y recibir recordatorios.", + views = { compact = "Compacto", stacked = "Apilada", details = "Detalles", list = "Lista" }, + reminders = { + none = "Sin recordatorio", atStart = "A la hora de inicio", tenMinutes = "10 minutos antes", + thirtyMinutes = "30 minutos antes", oneHour = "1 hora antes", oneDay = "1 día antes", + }, + errors = { + invalid_event = "Introduce un título y asegúrate de que el final sea después del inicio.", + invalid_range = "Este período de calendario es inválido.", + conflict = "Este evento cambió en otro teléfono. Ábrelo de nuevo.", + rate_limited = "Demasiados cambios. Inténtalo de nuevo pronto.", + not_authenticated = "Inicia sesión en tu cuenta de Sky Cloud primero.", + request_failed = "El calendario no está disponible temporalmente.", default = "La solicitud de calendario falló.", + }, + }, + clock = { + name = "Reloj", lap = "Vuelta", minutes = "Minutos", add = "Añadir alarma", location = "Los Santos", + tabs = { world = "Reloj", alarm = "Alarma", stopwatch = "Cronómetro", timer = "Temporizador" }, + alarm = { + add = "Agregar alarma", edit = "Editar alarma", ringing = "Alarma", time = "Hora", hours = "Horas", ["repeat"] = "Repetir", note = "Nota", + notePlaceholder = "Alarma", sound = "Sonido", delete = "Eliminar alarma", never = "Nunca", + everyDay = "Cada día", weekdays = "Días de la semana", weekends = "Fin de semana", + days = { sunday = "Dom", monday = "Lun", tuesday = "Mar", wednesday = "Mié", thursday = "Jue", friday = "Vie", saturday = "Sáb" }, + daysShort = { sunday = "Dom", monday = "Lun", tuesday = "Mar", wednesday = "Mié", thursday = "Jue", friday = "Vie", saturday = "Sáb" }, + sounds = { + radar = "Radar", beacon = "Beacon", chimes = "Campanillas", apex = "Apex", aurora = "Aurora", + circuit = "Circuito", constellation = "Constelación", daybreak = "Despertar", uplift = "Impulso", + }, + }, + timer = { + time = "Duración del temporizador", hours = "Horas", hoursShort = "h", minutes = "Minutos", minutesShort = "min", + seconds = "Segundos", secondsShort = "seg", + description = "Descripción", note = "Nota", notePlaceholder = "Temporizador", sound = "Sonido", ringing = "Temporizador", + }, + }, + mail = { + name = "Correo", login = "Iniciar sesión", register = "Crear cuenta", registerLink = "Registrarse", loginTitle = "Correo iFruit", + loginBody = "Inicia sesión para usar tu buzón compartido de iFruit.", registerBody = "Elige tu nueva dirección @ifruit.com.", + localPart = "Dirección de correo electrónico", email = "Correo electrónico", password = "Contraseña", confirmPassword = "Confirmar contraseña", + accountEyebrow = "Tu cuenta Sky Cloud", emailPlaceholder = "name@ifruit.com", passwordPlaceholder = "Ingresa contraseña", + passwordWarning = "Usa una contraseña del personaje. No reutilices una contraseña del mundo real.", + mailboxes = "Buzones", editMailboxes = "Editar", newMailbox = "Nuevo buzón", + mailboxName = "Nombre", mailboxNamePlaceholder = "Nombre del buzón", mailboxLocation = "Ubicación del buzón", + deleteMailbox = "Eliminar {mailbox}", deleteMailboxTitle = "¿Borrar buzón?", + deleteMailboxBody = "Los mensajes en {mailbox} volverán a su buzón original.", + moveToMailbox = "Mover al buzón", movedToMailbox = "Movido a {mailbox}.", + inbox = "Buzón", sent = "Enviado", drafts = "Borradores", trash = "Basura", + compose = "Nuevo mensaje", recipients = "Para", recipientHint = "Separa hasta 10 direcciones con comas.", + recipientPlaceholder = "name@ifruit.com", subject = "Asunto", subjectPlaceholder = "¿De qué se trata?", + body = "Mensaje", messagePlaceholder = "Escribe un mensaje...", search = "Buscar correo", messages = "mensajes", + toolbar = "Herramientas de correo", filterTitle = "Filtrar", filteredBy = "Filtrado por", + filterActiveLabel = "Filtrado por {filter}", + filterStatus = "Estado", filterAddressed = "Destacado", filterDirection = "Dirección", filterOther = "Otro", + filterUnreadLabel = "No leído", filterReadLabel = "Leído", filterReceived = "Recibidas", + filterSent = "Enviados", filterToMe = "Para mí", filterFromMe = "De mí", + filterToday = "Hoy", filterMultiple = "{count} Filtros", + select = "Seleccionar", selectedCount = "{count} seleccionado", deleteSelected = "Eliminar seleccionado", + selectionLimit = "Puedes seleccionar hasta {count} mensajes a la vez.", + noMessageContent = "Sin contenido de mensaje", noMail = "No hay correos", + noMailBody = "Los mensajes de este buzón aparecerán aquí.", noResults = "No hay resultados", + noResultsBody = "Intenta una búsqueda diferente.", untitled = "(sin asunto)", loadMore = "Cargar más", + logout = "Cerrar sesión", from = "Desde", to = "Para", reply = "Responder", replyAll = "Responder a todos", forward = "Reenviar", + formatBold = "Negrita", formatItalic = "Cursiva", formatBulletList = "Lista de puntos", + formatNumberedList = "Lista numerada", formatQuote = "Citación", undo = "Deshacer", redo = "Volver a hacer", + markRead = "Marcar como leído", markUnread = "Marcar como no leído", delete = "Eliminar", moveToTrash = "Mover a la papelera", restore = "Restaurar", + deleteForever = "Borrar para siempre", emptyTrash = "Vaciar la papelera", emptyTrashTitle = "¿Vaciar la papelera?", + emptyTrashBody = "Todos los mensajes de la papelera se eliminarán permanentemente.", deleteDraft = "Borrar borrador", + sentSuccess = "Mensaje enviado.", newMessage = "Nuevo mensaje de {sender}", passwordsMismatch = "Las contraseñas no coinciden.", + errors = { + invalid_email = "Elige una dirección iFruit válida de 3 a 32 caracteres.", + invalid_password = "La contraseña debe tener entre 6 y 64 caracteres.", + invalid_credentials = "El correo electrónico o la contraseña es incorrecta.", email_taken = "Ese iFruit ya está registrado.", + rate_limited = "Demasiados intentos. Inténtalo de nuevo en un minuto.", + invalid_message = "Añade un destinatario válido y un asunto o mensaje.", + recipient_not_found = "Uno o más destinatarios no existen.", invalid_draft = "Este borrador contiene contenido no válido.", + not_authenticated = "Tu sesión de correo ha terminado. Inicia sesión de nuevo.", + request_failed = "El correo no está disponible temporalmente.", invalid_request = "La solicitud de correo no es válida.", + invalid_mailbox = "Introduce un nombre de buzón con hasta 50 caracteres.", + mailbox_exists = "Un buzón con ese nombre ya existe.", + mailbox_limit = "Has alcanzado el límite de buzones.", + mailbox_not_found = "Ese buzón ya no está disponible.", + message_not_found = "Ese mensaje ya no está disponible.", + invalid_filter = "Ese filtro de correo no está disponible.", + default = "La solicitud de correo falló.", + }, + }, + citymarkt = { + name = "CityMarkt", eyebrow = "Mercado de Los Santos", + tabs = { discover = "Descubre", search = "Buscar", sell = "Vender", inbox = "Buzón", profile = "Mi perfil" }, + categories = { + vehicles = "Vehículos", property = "Propiedad", electronics = "Electrónica", clothing = "Ropa", + tools = "Herramientas", leisure = "Ocio", services = "Servicios", jobs = "Trabajos", wanted = "Se busca", other = "Otro", + }, + conditions = { new = "Nuevo", very_good = "Muy buen estado", used = "Usado", defective = "Defectuoso" }, + priceTypes = { fixed = "Precio fijo", negotiable = "Negociable", free = "Gratis" }, + offerStatus = { pending = "Abierto", accepted = "Aceptado", declined = "Rechazado", countered = "Negociado" }, + districts = { + los_santos = "Los Santos", vinewood = "Vinewood", vespucci = "Vespucci", + south_los_santos = "Sur de Los Santos", sandy_shores = "Sandy Shores", + paleto_bay = "Paleto Bay", blaine_county = "Condado de Blaine", + }, + status = { active = "Activo", reserved = "Reservado", sold = "Vendido", expired = "Caducado", removed = "Eliminado" }, + reportReasons = { prohibited = "Artículo prohibido", fraud = "Presunto fraude", spam = "Spam", offensive = "Contenido ofensivo", other = "Otro" }, + searchPlaceholder = "¿Qué estás buscando?", allCategories = "Todas las categorías", allDistricts = "Todos los distritos", + sortNewest = "Nuevos primero", sortPriceAsc = "Precio más bajo", sortPriceDesc = "Precio más alto", + freshOffers = "Ofertas recientes", offers = "ofertas", compactView = "Vista compacta", largeView = "Vista grande", noListings = "No se encontraron ofertas", + noListingsBody = "Intenta otra búsqueda o categoría.", noDistrict = "No hay distrito", + free = "Gratis", negotiablePrice = "${price} negociable", money = "${price}", + hoursAgo = "hace {count} h", daysAgo = "hace {count} d", photos = "fotos", activeListings = "ofertas activas", + signInTitle = "Iniciar sesión en Sky Cloud", signInBody = "Inicia sesión en tu perfil de CityMarkt para vender, guardar o enviar mensajes.", + authEyebrow = "Cuenta de CityMarkt", authLoginTitle = "Bienvenido de nuevo", authRegisterTitle = "Crea tu perfil", + authLoginBody = "Inicia sesión con la cuenta iFruit vinculada a este teléfono.", + authRegisterBody = "Confirma tu cuenta de iFruit para crear un perfil de CityMarkt.", + login = "Iniciar sesión", register = "Crear perfil", authPassword = "Contraseña de iFruit", + authPasswordPlaceholder = "Introduce tu contraseña de iFruit", authPasswordHelp = "Usa 6–64 caracteres.", + authConfirmPassword = "Repetir contraseña", authConfirmPlaceholder = "Repite tu contraseña de iFruit", + passwordsMismatch = "Las contraseñas no coinciden.", + authErrors = { + no_ifruit_account = "Conecta primero una cuenta de Sky Cloud desde Ajustes.", + invalid_password = "La contraseña debe tener entre 6 y 64 caracteres.", + invalid_credentials = "El correo electrónico o contraseña de iFruit es incorrecta.", + invalid_profile_image = "Elige una imagen válida de este teléfono.", + profile_not_found = "No existe un perfil de CityMarkt para este correo de iFruit.", + profile_exists = "Ya existe un perfil de CityMarkt. Usa Iniciar sesión en vez de esto.", + rate_limited = "Demasiados intentos. Inténtalo de nuevo en un minuto.", + default = "Autenticación de CityMarkt fallida.", + }, + noMessages = "No hay conversaciones", noMessagesBody = "Los mensajes sobre ofertas aparecerán aquí.", + myListings = "Mis ofertas", favorites = "Favoritos", addFavorite = "Añadir a favoritos", removeFavorite = "Eliminar de favoritos", noProfileListings = "Nada aquí aún", + createProfile = "Crea tu perfil de CityMarkt", editProfile = "Editar perfil", + profileIntro = "Tu correo de iFruit permanece vinculado a este perfil.", profileEmail = "Correo de iFruit", + displayName = "Nombre para mostrar", profileBio = "Sobre ti", saveProfile = "Guardar perfil", + cancel = "Cancelar", profileSaved = "Tu perfil se ha guardado.", chooseGallery = "Fotos", + takePhoto = "Cámara", removeProfilePhoto = "Eliminar foto", + phone = "Teléfono", contactSeller = "Contactar al vendedor", messagePlaceholder = "Hola, ¿todavía está disponible?", + signInToMessage = "Inicia sesión en tu cuenta de Sky Cloud para enviar un mensaje.", + edit = "Editar", makeActive = "Activar", markSold = "Marcar como vendido", remove = "Eliminar", + createListing = "Crear anuncio", editListing = "Editar anuncio", save = "Guardar", step = "Paso {current} de {total}", next = "Siguiente", previous = "Atrás", publish = "Publicar", + addPhotos = "Añade fotos", addPhotosBody = "Elige hasta seis fotos de Fotos o toma otras nuevas. Son opcionales y la primera se usará como portada.", + chooseGalleryBody = "Usa fotos guardadas en este teléfono.", takePhotos = "Tomar fotos", takePhotosBody = "Toma varias fotos nuevas para este anuncio.", + selectedPhotos = "Fotos seleccionadas", gallery = "Fotos", camera = "Cámara", cameraHint = "Toma tantas fotos como necesites. Cada foto se agrega automáticamente a la lista.", + noPhoto = "No hay foto disponible", noPhotoBody = "El vendedor no añadió ninguna foto al anuncio.", noPhotoOptional = "Puedes publicar sin una foto o agregar una de la galería o la cámara.", + previousPhoto = "Foto anterior", nextPhoto = "Siguiente foto", photo = "Foto", removePhoto = "Eliminar foto {number}", photoLimit = "Puedes agregar hasta seis fotos.", + describeOffer = "Describe tu oferta", title = "Título", description = "Descripción", category = "Categoría", condition = "Condición", + characterCount = "{current} / {maximum} caracteres", minimumCharacters = "min. {minimum}", + priceAndPlace = "Precio y ubicación", priceType = "Tipo de precio", price = "Precio", district = "Distrito", + showPhone = "Mostrar mi número de teléfono actual", preview = "Vista previa", published = "Tu anuncio está activo.", + writeMessage = "Escribe un mensaje", reserveForBuyer = "Reservar para este comprador", statusChanged = "Anuncio actualizado.", + offer = "Oferta", counterOffer = "Oferta de contrapartida", makeOffer = "Hacer una oferta", + offeredByYou = "Has enviado esta oferta.", offeredToYou = "Recibiste esta oferta.", + acceptOffer = "Aceptar", declineOffer = "Rechazar", negotiateOffer = "Negociar oferta", + offerFor = "Tu oferta para", offerAmount = "Monto de la oferta", sendOffer = "Enviar oferta", + offerSent = "Tu oferta fue enviada.", offerAccepted = "Oferta aceptada.", offerDeclined = "Oferta rechazada.", + reportListing = "Denunciar anuncio", reportWhy = "¿Por qué denuncias este anuncio?", reportDetails = "Añadir detalles (opcional)", + sendReport = "Enviar denuncia", blockSeller = "Bloquear vendedor", reported = "Denuncia enviada.", blocked = "Vendedor bloqueado.", + newMessage = "Nuevo mensaje de CityMarkt de {sender}", + newOffer = "{sender} ofreció ${price}.", + offerAcceptedNotification = "{sender} aceptó tu oferta de ${price}", + offerRejectedNotification = "{sender} rechazó tu oferta de ${price}.", + errors = { + invalid_listing = "Revisa los detalles del anuncio.", invalid_price = "Introduce un precio válido.", + invalid_images = "Elige fotos válidas de este teléfono.", phone_unavailable = "Inserta una SIM u oculta tu número.", + listing_limit = "Has alcanzado el límite de anuncios activos.", listing_not_found = "Este anuncio ya no está disponible.", + invalid_message = "Introduce un mensaje válido.", inquiry_not_found = "Esta conversación ya no está disponible.", + invalid_offer = "Introduce una oferta válida con un número entero.", invalid_offer_response = "Esta acción de oferta es inválida.", + offer_listing_unavailable = "Este anuncio ya no está disponible para ofertas.", + offer_closed = "Esta negociación ya está completa.", offer_waiting = "Espera que la otra persona responda.", + offer_not_allowed = "No puedes hacer una oferta ahora.", offer_not_actionable = "Esta oferta ya no puede modificarse.", + offer_conflict = "La oferta cambió. Por favor, inténtalo de nuevo.", + blocked = "Los mensajes están bloqueados entre estas cuentas.", already_reported = "Ya has denunciado este anuncio.", + rate_limited = "Demasiadas solicitudes. Inténtalo de nuevo pronto.", not_authenticated = "Inicia sesión en tu cuenta de Sky Cloud primero.", + invalid_profile = "Introduce un nombre para mostrar de entre 2 y 40 caracteres.", + invalid_profile_image = "Elige una imagen válida de este teléfono.", + profile_required = "Crea tu perfil de CityMarkt primero.", + conflict = "La lista cambió, ábrela de nuevo.", request_failed = "CityMarkt no está disponible temporalmente.", + default = "La solicitud de CityMarkt falló.", + }, + }, + localPages = { + name = "Páginas locales", eyebrow = "Tu ciudad. Tus historias.", cityPulse = "En vivo desde Los Santos", + heroTitle = "¿Qué está pasando cerca?", heroBody = "Descubre lugares, personas y consejos locales.", + searchPlaceholder = "Buscar publicaciones y lugares", search = "Buscar", allCategories = "Todas las categorías", + allLosSantos = "Los Santos", hoursAgo = "hace {count} h", daysAgo = "hace {count} d", + categories = { recommendation = "Recomendado", wanted = "Se busca", service = "Servicio", event = "Evento", place = "Lugar", community = "Comunidad", citymarkt = "CityMarkt" }, + discover = "Descubre", create = "Publicar", profile = "Perfil", post = "Publicación", posts = "publicaciones", + noPosts = "Nada aquí aún", noPostsBody = "Sé el primero en compartir algo con la ciudad.", noPhoto = "No hay foto adjunta", + signInTitle = "Perfil de Local Pages", signInBody = "Inicia sesión en Sky Cloud en Ajustes para publicar y guardar publicaciones.", + authEyebrow = "Cuenta de Local Pages", authWelcome = "Bienvenido a Local Pages", + authBody = "Tu correo de iFruit está enlazado automáticamente. Usa tu nombre de usuario de Local Pages para continuar.", login = "Iniciar sesión", register = "Registrarse", + loginTitle = "Continuar con Sky Cloud", loginBody = "Tus publicaciones, elementos guardados y perfil permanecen enlazados a tu cuenta.", + registerTitle = "Crear tu perfil de Local Pages", registerBody = "Elige un nombre de usuario y una foto de perfil opcional. Tu correo de iFruit permanece enlazado.", + authEmail = "Dirección de iFruit", authEmailPlaceholder = "tu.nombre", authPassword = "Contraseña", + authPasswordPlaceholder = "Al menos 6 caracteres", authConfirmPassword = "Confirmar contraseña", + authConfirmPlaceholder = "Introduce la contraseña nuevamente", showPassword = "Mostrar contraseña", hidePassword = "Ocultar contraseña", + localCreator = "Creador local", myPosts = "Mis publicaciones", saved = "Guardados", save = "Guardar", likes = "Me gusta", + createProfile = "Crea tu perfil", editProfile = "Editar perfil", profileSetupBody = "Tu correo de iFruit está enlazado automáticamente.", + profileEmail = "Correo de iFruit", profileHandle = "Nombre de usuario", profileHandlePlaceholder = "tu.nombre", + profileHandleHint = "Usa 3-24 letras minúsculas, números, puntos o subrayados.", profileBio = "Bio", + profileBioPlaceholder = "Dile a la ciudad un poco sobre ti...", profilePhoto = "Foto de perfil", profilePhotoHint = "Elige una foto de Fotos o toma una nueva.", removeProfilePhoto = "Eliminar foto", profileSave = "Guardar perfil", profileCancel = "Cancelar", profileSaved = "Tu perfil se ha guardado.", + location = "Ubicación", sharedFrom = "Compartido desde CityMarkt", openCityMarkt = "Abrir lista de CityMarkt", + newPost = "Nueva publicación local", shareWithCity = "Compartir con la ciudad", publish = "Publicar", published = "Tu publicación ya está disponible.", deleted = "Publicación eliminada.", + title = "Título", body = "Tu historia", category = "Categoría", titlePlaceholder = "¿Qué debería saber la gente?", bodyPlaceholder = "Añade detalles, una recomendación o direcciones...", + photos = "Fotos", optional = "opcional", camera = "Cámara", gallery = "Fotos", photoLimit = "Puedes agregar hasta seis fotos.", + cityMarktShare = "Compartir en Local Pages", cityMarktShared = "Compartido en Local Pages.", cityMarktShareHint = "Una compartición en CityMarkt por día", + cityMarktAlreadyShared = "Ya publicado", cityMarktOpenSharedHint = "Abrir la publicación de Local Pages", + cityMarktAppMissing = "Local Pages no está instalado", cityMarktInstallHint = "Instalar Local Pages para compartir esta lista", + cityMarktAccountMissing = "Se requiere perfil de Local Pages", cityMarktAccountHint = "Crea un perfil de Local Pages antes de compartir", + cityMarktComposeTitle = "Compartir lista de CityMarkt", cityMarktComposeNavTitle = "Compartir anuncio", cityMarktComposeHint = "Revisa la lista y publica cuando estés listo.", cityMarktPhotosHint = "Las fotos del anuncio de CityMarkt se incluirán.", + authErrors = { + no_ifruit_account = "Inicia sesión en tu cuenta de Sky Cloud desde Ajustes.", invalid_username = "Usa 3-24 letras minúsculas, números, puntos o subrayados.", + profile_not_found = "No existe un perfil de Local Pages para este correo de iFruit.", profile_exists = "Este correo de iFruit ya tiene un perfil de Local Pages.", + invalid_profile = "Verifica tu nombre de usuario de Local Pages.", invalid_profile_image = "Elige una imagen válida de este teléfono.", + profile_handle_taken = "Este nombre de usuario para Local Pages ya está tomado.", rate_limited = "Demasiados intentos. Inténtalo de nuevo pronto.", + default = "Local Pages no pudo completar la solicitud.", + }, + errors = { profile_required = "Crea tu perfil de Local Pages primero.", invalid_profile = "Verifica tu nombre de usuario y biografía.", invalid_profile_image = "Elige una imagen válida de este teléfono.", profile_handle_taken = "Este nombre de usuario ya está tomado.", invalid_post = "Añade un título y un poco más de detalle.", invalid_images = "Elige fotos válidas de este teléfono.", invalid_request = "Esta acción no es válida.", post_not_found = "Esta publicación ya no está disponible.", citymarkt_not_found = "Este anuncio de CityMarkt no está disponible.", citymarkt_daily_limit = "Ya compartiste un anuncio de CityMarkt hoy.", citymarkt_already_shared = "Este anuncio ya se ha compartido.", not_authenticated = "Inicia sesión en Sky Cloud primero.", rate_limited = "Demasiadas solicitudes. Inténtalo de nuevo pronto.", request_failed = "El anuncio no se pudo guardar.", default = "Local Pages no está disponible temporalmente." }, + }, + citywarn = { + name = "CityWarn", navigation = "Navegación de CityWarn", loading = "Cargando alertas...", + tabs = { active = "Actuales", map = "Mapa", archive = "Historial", settings = "Ajustes" }, + hero = { safe = "No hay peligro inmediato", safeBody = "No hay alertas activas para tu ubicación.", active = "{count} peligros activos", activeBody = "Sigue las instrucciones de las autoridades responsables." }, + issuedBy = "Emisor", updated = "Actualizado", expires = "Válido hasta", affectedArea = "Área afectada", currentLocation = "Ubicación actual", + details = "Detalles del aviso", instructions = "Qué debes hacer ahora", timeline = "Actualizaciones", publishedBy = "Publicado por {name}", + radius = "Radio de {count} m", status = { active = "Activo", resolved = "Resuelto", expired = "Caducado" }, + severity = { information = "Información", warning = "Advertencia", danger = "Peligro", extreme = "Peligro extremo" }, + categories = { public_safety = "Seguridad pública", police = "Incidente policial", fire = "Incendios y rescate", medical = "Salud", infrastructure = "Infraestructura", evacuation = "Evacuación" }, + emptyArchive = "Aún no hay historial", emptyArchiveBody = "Los avisos resueltos y vencidos aparecerán aquí.", + emptyFiltered = "No hay advertencias coincidentes", emptyFilteredBody = "Tus filtros personales ocultan las alertas actuales.", + mapTitle = "Zonas de alerta", mapBody = "Las áreas resaltadas muestran el alcance aproximado de los avisos activos.", + publisher = { title = "Herramientas de la autoridad", body = "Estás en servicio como {job} ({grade}) y puedes publicar avisos.", offDuty = "Debes estar de guardia para publicar advertencias.", unavailable = "Las herramientas de autoridad no están disponibles para tu cargo actual." }, + compose = { new = "Nueva advertencia", step = "Paso {step} de 4", categoryTitle = "Tipo de peligro", categoryBody = "Elige la categoría que mejor se ajuste al incidente.", severityTitle = "Nivel de peligro", areaTitle = "Área afectada", areaBody = "Define dónde aplica este aviso.", areaTypes = { radius = "Radio", district = "Distrito", city = "Toda la ciudad" }, areaLabel = "Nombre del área", areaPlaceholder = "p. ej. Mission Row", radius = "Radio en metros", useLocation = "Usar ubicación actual", locationSet = "Zona seleccionada", contentTitle = "Contenido del aviso", title = "Título abreviado", titlePlaceholder = "¿Qué pasó?", body = "Descripción", bodyPlaceholder = "Describe la situación claramente y de forma factual...", instructions = "Medidas recomendadas", instructionsPlaceholder = "¿Qué debe hacer la población ahora?", duration = "Validez", durationMinutes = "{count} minutos", previewTitle = "Revisar y enviar", recipients = "Se puede avisar a unas {count} personas en este momento.", legal = "Tu nombre, cargo y cada cambio se registran permanentemente.", back = "Atrás", next = "Continuar", publish = "Publicar advertencia", publishing = "Publicando...", success = "El aviso fue publicado y distribuido." }, + manage = { update = "Enviar actualización", resolve = "Resolver aviso", updateTitle = "Actualizar la situación", resolveTitle = "Resolver aviso", updatePlaceholder = "¿Qué ha cambiado?", resolvePlaceholder = "¿Por qué ha terminado la advertencia?", send = "Publicar actualización", confirm = "Resolver aviso", success = "La alerta fue actualizada.", resolved = "El aviso fue resuelto." }, + settings = { locationTitle = "Alertas basadas en ubicación", locationBody = "Muestra alertas por radio o distrito. Las alertas para toda la ciudad siempre permanecen visibles.", levelTitle = "Nivel mínimo", levelBody = "Las alertas por debajo de este nivel están ocultas en la vista actual.", categoryTitle = "Tipos de alerta", categoryBody = "Elige los tipos de alertas que quieres ver.", notificationHint = "Las alertas críticas pueden omitir los modos de concentración. Gestiona los sonidos desde los ajustes del teléfono." }, + notifications = { published = "Nueva alerta de población", update = "Una alerta fue actualizada", resolved = "Un aviso fue resuelto" }, + errors = { feature_disabled = "CityWarn está desactivado en este servidor.", not_authorized = "No tienes permiso para realizar esta acción.", invalid_warning = "Revisa todos los detalles de la alerta.", invalid_update = "Introduce una actualización válida.", active_limit = "Demasiadas alertas ya están activas.", revision_conflict = "La advertencia ha cambiado. Vuelve a cargarla.", rate_limited = "Por favor espera antes de intentarlo de nuevo.", request_failed = "CityWarn no pudo completar la solicitud.", not_found = "Este aviso ya no está disponible.", device_not_open = "Abre y desbloquea este teléfono antes de intentarlo de nuevo.", device_not_owned = "Este teléfono ya no está disponible.", device_locked = "Desbloquea este teléfono antes de intentarlo de nuevo.", default = "CityWarn no está disponible temporalmente." }, + }, + map = { + name = "Mapa", controls = "Controles de mapa", currentLocation = "Ubicación actual", + locationUnavailable = "Tu ubicación actual no está disponible.", + imageError = "La imagen del mapa no se pudo cargar.", switchStyle = "Cambiar el tipo de mapa", + addMarker = "Añadir marcador", placeMarker = "Coloca un marcador", placeMarkerHint = "Mueve el mapa hasta que el punto de mira esté sobre el destino.", + addHere = "Añadir aquí", newMarker = "Nuevo marcador", newMarkerDescription = "Da un nombre y color a este lugar guardado.", + markerName = "Nombre", markerNamePlaceholder = "p. ej. Punto de encuentro", markerColor = "Color del marcador", + saveMarker = "Guardar Marcador", deleteMarker = "Eliminar marcador", setWaypoint = "Establecer punto de ruta", markerSaved = "Marcador guardado.", markerDeleted = "Marcador eliminado.", waypointSet = "Punto establecido.", + colors = { blue = "Azul", green = "Verde", orange = "Naranja", purple = "Morado", red = "Rojo" }, + errors = { + invalid_marker = "Introduce un nombre y una posición de marcador válidos.", marker_limit = "Este teléfono ha alcanzado su límite de marcadores.", + marker_not_found = "Este marcador ya no existe.", rate_limited = "Demasiados cambios. Inténtalo de nuevo pronto.", + request_failed = "El marcador no se pudo guardar.", + }, + styles = { default = "Mapa predeterminado", satellite = "Mapa satélite", atlas = "Atlas Map", roads = "Mapa de carreteras" }, + }, + weather = { + name = "Clima", now = "Ahora", today = "Hoy", refresh = "Actualizar clima", details = "Detalles del clima", + feelsLike = "Sensación térmica", wind = "Viento", humidity = "Humedad", rain = "Precipitación", + hourly = "Próximas horas", unavailable = "El clima no está disponible", + stale = "Mostrando el último clima disponible.", tryAgain = "Inténtalo de nuevo", + errors = { reload_cooldown = "Demasiadas actualizaciones. Espera un momento antes de volver a intentarlo." }, + regions = { los_santos = "Los Santos", blaine_county = "Condado de Blaine", cayo_perico = "Cayo Perico" }, + conditions = { + sunny = "Soleado", clear = "Despejado", partly_cloudy = "Parcialmente nublado", cloudy = "Nublado", + rain = "Lluvia", thunder = "Tormentas eléctricas", fog = "Niebla", snow = "Nieve", + }, + summaries = { + sunny = "Cielo claro durante el período actual.", clear = "Condiciones claras y tranquilas en toda la región.", + partly_cloudy = "Sol mezclado con nubes que pasan.", cloudy = "La nubosidad permanecerá sobre la región.", + rain = "Condiciones húmedas en el área.", thunder = "Condiciones tormentosas con lluvia intensa.", + fog = "Visibilidad reducida en zonas bajas.", snow = "Condiciones frías con nieve en toda la región.", + }, + }, + music = { + name = "Música", loading = "Cargando música...", navigation = "Navegación musical", + tabs = { library = "Biblioteca", playlists = "Listas de reproducción", search = "Buscar" }, + librarySubtitle = "Tu música, en un solo lugar.", playlistsSubtitle = "Mezcla de pistas del servidor y tus favoritos de YouTube.", + featured = "Hecho para la ciudad", recentlyAdded = "Recientemente añadido", songs = "Canciones", play = "Reproducir", + previous = "Canción anterior", next = "Canción siguiente", nowPlaying = "Reproduciendo", progress = "Posición de reproducción", volume = "Volumen de música", + addMusic = "Añadir música", addYouTube = "Agregar de YouTube", youtubeBody = "Pega un enlace público de YouTube. Deja los campos opcionales vacíos para usar automáticamente el título y el canal del video.", + youtubeUrl = "URL de YouTube", youtubePlaceholder = "https://youtube.com/watch?v=...", youtubeTitle = "Título de la canción (opcional)", + youtubeTitlePlaceholder = "Usa el título de vídeo YouTube", youtubeArtist = "Artista (opcional)", + youtubeArtistPlaceholder = "Usar el nombre del canal de YouTube", addToLibrary = "Añadir a la biblioteca", + songAdded = "Canción agregada a tu biblioteca.", songRemoved = "Canción eliminada de tu biblioteca.", + newPlaylist = "Nueva lista de reproducción", renamePlaylist = "Renombrar lista de reproducción", addSongs = "Agregar canciones", + addSongsBody = "Elige canciones de tu biblioteca para esta lista de reproducción.", allSongsAdded = "Todas las canciones agregadas", + allSongsAddedBody = "Todas las canciones de tu biblioteca ya están en esta lista.", playlistBody = "Ponle un nombre que reconozcas a esta lista de reproducción.", + playlistName = "Nombre de la lista", playlistPlaceholder = "Mi lista de reproducción", playlistCreated = "Lista creada.", + playlistCreatedWithSong = "Lista de reproducción creada y canción añadida.", + playlistRenamed = "Lista de reproducción renombrada.", playlistDeleted = "Lista de reproducción eliminada.", playlistActions = "Acciones de lista", + deletePlaylist = "Eliminar lista de reproducción", deletePlaylistTitle = "¿Borrar lista de reproducción?", deletePlaylistBody = "La lista de reproducción se eliminará. Las canciones permanecerán en tu biblioteca.", + choosePlaylist = "Elige una lista", addToPlaylist = "Añadir a la lista de reproducción", addedToPlaylist = "Añadido a la lista.", alreadyAdded = "Agregado", + removeFromPlaylist = "Eliminar de la lista de reproducción", removedFromPlaylist = "Eliminado de la lista.", createPlaylistFirst = "Crea una lista de reproducción antes de añadir esta canción.", + songActions = "Acciones de canción", removeFromLibrary = "Eliminar de la biblioteca", removeSongTitle = "¿Quitar la canción?", + removeSongBody = "Esta canción de YouTube también será eliminada de tus listas de reproducción.", songCount = "{count} canciones", + emptyLibrary = "Tu biblioteca está vacía", emptyLibraryBody = "Añade una canción de YouTube o pide al dueño del servidor que publique pistas de MP3 y OGG.", + emptyPlaylist = "Aún no hay canciones", emptyPlaylistBody = "Añade canciones de tu biblioteca a esta lista de reproducción.", + noPlaylists = "No hay listas de reproducción", noPlaylistsBody = "Crea una lista de reproducción para tus canciones favoritas.", + searchPlaceholder = "Artistas, canciones y listas de reproducción", noResults = "No hay resultados", noResultsBody = "Intenta otro título de canción o artista.", + errors = { + invalid_youtube_url = "Pega un enlace de video de YouTube público válido.", invalid_song_metadata = "Usa un título o nombre de artista más corto.", + song_exists = "Esa canción de YouTube ya está en tu biblioteca.", + song_limit = "Has alcanzado tu límite personal de canciones.", song_not_found = "Esa canción ya no está en tu biblioteca.", + invalid_playlist = "Introduce un nombre válido para la lista de reproducción.", playlist_limit = "Has alcanzado el límite de listas de reproducción.", + playlist_not_found = "Esa lista de reproducción ya no existe.", playlist_song_limit = "Esa lista de reproducción ha alcanzado su límite de canciones.", + invalid_song = "Esa canción no se puede añadir a esta lista de reproducción.", song_already_in_playlist = "Esta canción ya está en esta lista de reproducción.", rate_limited = "Demasiados cambios de música. Inténtalo de nuevo pronto.", + playback_failed = "Esta canción no se puede reproducir.", request_failed = "La música no está disponible temporalmente.", default = "La solicitud de música falló.", + }, + }, + notes = { + name = "Notas", note = "Nota", back = "Atrás", actions = "Acciones de nota", + newNote = "Nota nueva", searchPlaceholder = "Buscar notas", + title = "Título", titlePlaceholder = "Título de la nota", body = "Nota", bodyPlaceholder = "Comenzar a escribir...", + untitled = "Sin título", noText = "Sin texto adicional", emptyBadge = "EN DISPOSITIVO", emptyTitle = "Sin notas", + emptyBody = "Crea una nota para mantener los detalles importantes a mano.", noResults = "No hay resultados", + noResultsBody = "Prueba a buscar otra palabra o frase.", pin = "Fijar nota", unpin = "Desfijar nota", + deleteNote = "Eliminar nota", deleteTitle = "¿Borrar nota?", + deleteBody = "Esta nota se eliminará permanentemente.", + tools = { + bold = "Negrita", bulletList = "Lista de puntos", decreaseText = "Texto más pequeño", increaseText = "Texto más grande", + italic = "Cursiva", numberedList = "Lista numerada", quote = "Citación", redo = "Volver a hacer", + strike = "Tachar", toolbar = "Herramientas de formato", underline = "Subrayar", undo = "Deshacer", + }, + }, + memos = { + name = "Notas de voz", memo = "Memo de voz", back = "Atrás", actions = "Acciones de la nota de voz", + newMemo = "Nuevo registro", newMemoWithDate = "Nueva grabación · {date}", + searchPlaceholder = "Buscar grabaciones", emptyTitle = "Sin grabaciones", + emptyBody = "Pulsa el botón de grabación para capturar tu primer memo de voz.", noResults = "No hay resultados", + noResultsBody = "Prueba a buscar otro título o nota.", recording = "Grabación", paused = "Pausado", + preparing = "Preparando el micrófono…", saving = "Guardando grabación…", stop = "Detener", pause = "Pausar", + resume = "Continuar", cancel = "Cancelar", done = "Listo", play = "Reproducir grabación", + pausePlayback = "Pausar grabación", skipBack = "Atrás 15 segundos", skipForward = "Avanzar 15 segundos", + playbackSpeed = "Velocidad de reproducción", title = "Título", titlePlaceholder = "Título de grabación", + note = "Nota", notePlaceholder = "Añadir detalles…", delete = "Eliminar memo", deleteTitle = "¿Borrar el Memo de Voz?", + deleteBody = "Esta grabación se eliminará permanentemente.", discardTitle = "¿Descartar la grabación?", + discardBody = "La grabación actual no se guardará.", discard = "Descartar", + keepRecording = "Mantener grabación", deleted = "Memo eliminado.", + microphoneUnavailable = "El micrófono no está disponible.", + recordingTooLarge = "La grabación es demasiado grande para guardar.", + maximumDuration = "Se alcanzó el límite máximo de duración de la grabación.", + errors = { + conflict = "Esta nota cambió en otro dispositivo. Se ha recargado.", + invalid_memo = "El memo de voz contiene datos inválidos.", invalid_request = "La solicitud de nota es inválida.", + invalid_upload = "La grabación subida no pudo ser verificada.", + invalid_upload_token = "La subida de la grabación no se puede verificar.", + memo_limit = "Se ha alcanzado el límite de 100 notas de voz.", + memo_not_found = "Esta nota de voz ya no existe.", + media_provider_failed = "El servicio de subida de notas de voz no está disponible.", + media_provider_rate_limited = "El servicio de subida de recordatorios de voz está ocupado. Inténtalo de nuevo pronto.", + media_provider_unauthorized = "La clave API de FiveManage configurada fue rechazada.", + missing_config = "No está configurado el envío de notas de voz.", + operation_in_progress = "Termina la grabación actual primero.", + owner_changed = "El teléfono activo cambió mientras se guardaba la nota.", + rate_limited = "Demasiados cambios de recordatorio. Inténtalo de nuevo pronto.", + recording_failed = "No se pudo capturar la grabación.", + request_timeout = "La solicitud de la nota de voz ha caducado.", upload_failed = "No se pudo subir la grabación.", + upload_timeout = "La subida de grabación ha caducado.", request_failed = "Las notas de voz no están disponibles temporalmente.", + }, + }, + easyShare = { + name = "EasyShare", incoming = "Compartir entrante", recentChats = "Contactos y Chats", + destinations = "Destinos para compartir", newMessage = "Nuevo Mensaje", sentToChat = "Enviar a chat", + shareProfile = "Perfil para compartir", share = "Compartir", chooseConversation = "Elegir un chat", + kinds = { + contact = "Contacto", document = "Documento", link = "Enlace", location = "Ubicación", media = "Medios", + note = "Nota", photo = "Foto", playlist = "Lista de reproducción", post = "Publicación", + profile = "Perfil", text = "Mensaje", track = "Canción", video = "Vídeo", + }, + savedToNotes = "Guardado en Notas", copied = "Copiado.", copy = "Copiar", copyLink = "Copiar enlace", + nearby = "Personas cerca", history = "Historial de transferencias", noHistory = "No hay transferencias aún.", + noNearby = "No hay jugadores visibles cerca.", visibility = "Visibilidad", requestSent = "Esperando aceptación...", + incomingFrom = "{name} quiere compartir", distance = "{distance} m de distancia", cancel = "Cancelar", + visibilityOptions = { everyone = "Todos", contacts = "Solo contactos", hidden = "Recepción desactivada" }, + status = { + pending = "Esperando aceptación", transferring = "Transfiriendo", completed = "Completado", + declined = "Rechazado", cancelled = "Cancelado", expired = "Caducado", failed = "Error", + accepted = "Aceptado", + }, + errors = { + disabled = "EasyShare está desactivado.", invalid_payload = "Este elemento no se puede compartir.", + invalid_target = "Elige un destinatario válido.", target_unavailable = "Ese jugador ya no está disponible.", + transfer_not_found = "Esa transferencia ya no está disponible.", too_far = "El destinatario está demasiado lejos.", + not_owned = "Este elemento ya no pertenece a este teléfono.", unsupported_payload = "Este elemento no está disponible para EasyShare.", payload_too_large = "Este objeto es demasiado grande para compartir.", + location_unavailable = "Tu ubicación no está disponible.", rate_limited = "Demasiadas solicitudes para compartir. Inténtalo de nuevo pronto.", + copy_failed = "No se pudo copiar este elemento.", request_failed = "EasyShare no está disponible temporalmente.", + }, + }, + photos = { + name = "Fotos", library = "Biblioteca", + counts = { + all = "{count} elementos", allOne = "{count} elemento", + favorite = "{count} Favorito", favorites = "{count} Favoritos", + photo = "{count} Foto", photos = "{count} Fotos", + video = "{count} vídeo", videos = "{count} vídeos", + }, + sorting = { + action = "Ordenar fotos", title = "Ordenar por", + show = "Mostrar", allItems = "Todos los elementos", favorites = "Favoritos", + newestFirst = "Más reciente primero", oldestFirst = "Más antiguo primero", + }, + selection = { + action = "Seleccionar", selected = "{count} seleccionado", + share = "Compartir seleccionado", shareTitle = "{count} Elementos multimedia", + shareCopy = "Se han compartido {count} fotos y vídeos desde Fotos.", + delete = "Eliminar seleccionado", deleteTitle = "¿Borrar los medios seleccionados?", + deleteBody = "Las fotos y los vídeos seleccionados se eliminarán permanentemente.", + deleted = "{count} elementos multimedia eliminados.", limit = "Puedes seleccionar hasta 50 elementos de medios.", + }, + loading = "Cargando fotos...", + emptyTitle = "No hay fotos o videos", emptyBody = "Las capturas de la cámara aparecerán aquí.", + photo = "Foto", video = "Vídeo", photoAlt = "Imagen de la biblioteca de fotos", videoAlt = "Vídeo de la biblioteca de fotos", + today = "Hoy", yesterday = "Ayer", + addFavorite = "Añadir a Favoritos", removeFavorite = "Eliminar de favoritos", + delete = "Borrar medios", deleteTitle = "¿Eliminar este elemento?", + deleteBody = "Esta foto o vídeo se borrará permanentemente.", deleted = "Elementos multimedia eliminados.", + zoomIn = "Acercar", zoomOut = "Alejar", resetZoom = "Restablecer zoom", + filters = { all = "Todos", photos = "Fotos", videos = "Vídeos" }, + import = { + action = "Importar", title = "Importar", chooseSource = "Elige un sitio web", + linkTitle = "Importar desde enlace", linkBody = "Pega un enlace directo a una imagen o video de este sitio web.", + linkLabel = "Enlace de imagen o video", linkPlaceholder = "https://...", linkCompleted = "Elementos importados.", + loading = "Cargando medios...", emptyTitle = "No hay contenido multimedia", + emptyBody = "Este sitio web no tiene medios de este tipo.", loadMore = "Cargar más", + alreadyImported = "Importado", failed = "Error", completed = "Se han importado {imported} elementos.", + partial = "Se han importado {imported} de {total} elementos.", + }, + errors = { + cancelled = "La acción de medios fue cancelada.", capture_failed = "No se puede capturar la vista del juego.", + invalid_import_request = "La solicitud de importación es inválida.", invalid_import_media = "Este elemento de medios no puede importarse.", + invalid_media_type = "El tipo de medio es inválido.", invalid_upload = "La subida no se pudo verificar.", + invalid_upload_token = "La sesión de subida ya no es válida.", missing_config = "Subidas de fotos no están configuradas.", + import_media_not_allowed = "Este elemento de medio no está permitido.", import_media_too_large = "Este elemento de medios es demasiado grande.", + import_media_unavailable = "Este elemento de medio ya no está disponible.", import_provider_failed = "El sitio web no pudo cargar sus medios.", + import_provider_unauthorized = "Las credenciales del sitio web son inválidas.", import_source_not_found = "Este sitio web no está registrado.", + import_source_unavailable = "Este sitio web está temporalmente inalcanzable.", + invalid_import_url = "Introduce un enlace de medios HTTPS válido.", import_url_not_allowed = "Este enlace no proviene del sitio web seleccionado.", + import_url_unavailable = "Los medios enlazados no pudieron alcanzarse.", import_size_unavailable = "El sitio web no proporcionó el tamaño del medio.", + not_found = "El elemento de medio ya no existe.", profile_photo_required = "Esta es la última foto de tu perfil de Flare. Añade otra foto de perfil antes de eliminarla.", owner_changed = "La cuenta del teléfono activo ha cambiado.", + operation_in_progress = "Otra operación de medio está en progreso.", + rate_limited = "Demasiadas acciones de medios. Inténtalo de nuevo pronto.", request_failed = "La solicitud de Fotos falló.", + request_timeout = "El servicio de medios se agotó el tiempo.", unsupported = "Este formato multimedia no es compatible.", + upload_failed = "La subida de medios falló.", upload_timeout = "Se agotó el tiempo de espera de la subida multimedia.", + }, + }, + appStore = { + name = "App Store", get = "OBTENER", open = "ABRIR", installing = "Instalando", + player = "Perfil", profileLabel = "Perfil de {name}", + searchPlaceholder = "Juegos, aplicaciones, historias y más", appsTitle = "Aplicaciones integradas", gamesTitle = "Juegos", + selected = "Aplicaciones disponibles para tu Sky Phone", + tabs = { today = "Hoy", apps = "Aplicaciones", games = "Juegos", search = "Buscar" }, + today = { + featured = "Destacado hoy", + gameHighlight = "Destacado de juegos", appHighlight = "Destacado de la aplicación", + curatedForYou = "Seleccionado para ti", editorsChoice = "Selección del editor", + discoverTitle = "Descubre {app}", playTitle = "¡Juega algo nuevo con {app}!", + description = "{app} está en el foco hoy en Sky Phone.", + categoryDescription = "{category} · Creada para Sky Phone", + moreHighlights = "Destacados de hoy", topToday = "Lo mejor de hoy", + topTodayDescription = "Destacados de hoy", + oneMoreThing = "Una cosa más", + }, + filters = { + all = "Todos", social = "Sociales", utilities = "Herramientas", shopping = "Compras", + productivity = "Productividad", arcade = "Arcade", puzzle = "Puzzles", classic = "Clásicos", + }, + browse = { + categories = "Categorías de la tienda", availableNow = "Disponible ahora", + featureTitle = "Descubre {app}", featuredPages = "Aplicaciones destacadas", + handPicked = "Elegidos para ti", essentialApps = "Aplicaciones esenciales", + essentialGames = "Juegos esenciales", + }, + taglines = { + citywarn = "Alertas ciudadanas y actualizaciones de seguridad", + crypto = "Mercados sintéticos, cartera y transferencias", + health = "Salud, actividad e información médica", + ["weazel-news"] = "Noticias locales e historias de la ciudad", + companies = "Empresas, empleos y servicios", music = "Canciones, listas de reproducción y audio", + picstagram = "Fotos y contenido social", feather = "Publicaciones cortas y conversaciones de la ciudad", + fliptok = "Vídeos cortos y tendencias", flare = "Publicaciones sociales y momentos en vivo", + calendar = "Eventos, agendas y recordatorios", radio = "Radio en vivo y comunicación de equipo", + ["local-pages"] = "Empresas locales y páginas comunitarias", crewlink = "Tripulación, miembros y coordinación", + phone = "Llamadas, contactos y mensajes de voz", messages = "Mensajes privados y medios", + darkchat = "Mensajería privada y grupos seguros", garage = "Vehículos, aparcamiento y servicio de valet", + house = "Casas, acceso y gestión", map = "Navegación y lugares cercanos", + skyride = "Taxis urbanos y reservas de conductores", banking = "Cuentas, transferencias y pagos", + billing = "Facturas y solicitudes de pago", mail = "Correo electrónico y archivos adjuntos", + notes = "Notas, listas e ideas", memos = "Grabaciones de voz y notas", + calculator = "Cálculos diarios y científicos", camera = "Fotos y captura de video", + clock = "Hora, alarmas y temporizadores", weather = "Predicciones y condiciones actuales", + photos = "Biblioteca de fotos y videos", settings = "Preferencias y seguridad del teléfono", + snake = "Juego clásico de serpiente", memory = "Desafío de coincidencia de tarjetas", + ["number-merge"] = "Juego de números y estrategia", minesweeper = "Clásico juego de lógica", + ["tower-stack"] = "Juego de precisión para construir torres", ["sky-flappy"] = "Desafío de vuelo arcade", + citymarkt = "Mercado local y listados", ["neon-drop"] = "Rompecabezas de bloques de neón", + }, + previews = { + citywarn = { first = "Alertas en vivo", second = "Zonas de seguridad", third = "Actualizaciones de incidentes" }, + crypto = { first = "Mercados sintéticos", second = "Cartera", third = "Transferencias de billetera" }, + health = { first = "Anillos de actividad", second = "Identificador médico", third = "Registros de salud" }, + ["weazel-news"] = { first = "Noticias destacadas", second = "Reportes locales", third = "Noticias en tiempo real" }, + companies = { first = "Directorio de empresas", second = "Solicitudes de trabajo", third = "Servicios" }, + music = { first = "Reproduciendo ahora", second = "Listas de reproducción", third = "Biblioteca de música" }, + picstagram = { first = "Feed de fotos", second = "Historias", third = "Perfiles" }, + feather = { first = "Publicaciones cortas", second = "Feed de seguidos", third = "Conversaciones" }, + fliptok = { first = "Feed de video", second = "Herramientas para creadores", third = "Tendencias" }, + flare = { first = "Descubre personas", second = "Coincidencias", third = "Momentos en vivo" }, + calendar = { first = "Eventos próximos", second = "Planificador diario", third = "Recordatorios" }, + radio = { first = "Canales en vivo", second = "Radio de equipo", third = "Favoritos" }, + ["local-pages"] = { first = "Páginas locales", second = "Reseñas", third = "Descubrimiento de la ciudad" }, + crewlink = { first = "Lista de tripulación", second = "Ubicaciones compartidas", third = "Coordinación" }, + phone = { first = "Llamadas recientes", second = "Contactos", third = "Correo de voz" }, + messages = { first = "Conversaciones", second = "Compartir medios", third = "Respuestas rápidas" }, + darkchat = { first = "Chats privados", second = "Grupos seguros", third = "Invitaciones" }, + garage = { first = "Lista de vehículos", second = "Ubicaciones de estacionamiento", third = "Valet" }, + house = { first = "Acceso a la propiedad", second = "Residentes", third = "Gestión" }, + map = { first = "Navegación en vivo", second = "Lugares cercanos", third = "Guía de ruta" }, + skyride = { first = "Reserva de viajes", second = "Seguimiento del conductor", third = "Historial de viajes" }, + banking = { first = "Saldo de cuenta", second = "Transferencias", third = "Transacciones" }, + billing = { first = "Facturas abiertas", second = "Solicitudes de pago", third = "Historial de pagos" }, + mail = { first = "Buzón", second = "Adjuntos", third = "Buzones" }, + notes = { first = "Notas", second = "Listas de tareas", third = "Ideas destacadas" }, + memos = { first = "Grabaciones de voz", second = "Reproducción", third = "Favoritos" }, + calculator = { first = "Cálculo básico", second = "Herramientas científicas", third = "Historial" }, + camera = { first = "Modo foto", second = "Grabación de video", third = "Controles de zoom" }, + clock = { first = "Reloj del mundo", second = "Alarma", third = "Temporizadores" }, + weather = { first = "Clima actual", second = "Predicción horaria", third = "Perspectiva de siete días" }, + photos = { first = "Biblioteca de medios", second = "Álbumes", third = "Medios compartidos" }, + settings = { first = "Control del dispositivo", second = "Privacidad", third = "Personalización" }, + snake = { first = "Puntuación máxima", second = "Velocidad", third = "Red cuadrada clásica" }, + memory = { first = "Pares coincidentes", second = "Mejor tiempo", third = "Temas de cartas" }, + ["number-merge"] = { first = "Pieza más alta", second = "Puntuación", third = "Cuadrícula de estrategia" }, + minesweeper = { first = "Contador de minas", second = "Mejor tiempo", third = "Dificultad" }, + ["tower-stack"] = { first = "Altura de la torre", second = "Encajes perfectos", third = "Puntuación máxima" }, + ["sky-flappy"] = { first = "Puntuación de vuelo", second = "Mejor recorrido", third = "Obstáculos" }, + citymarkt = { first = "Listados", second = "Categorías", third = "Ofertas guardadas" }, + ["neon-drop"] = { first = "Líneas eliminadas", second = "Nivel", third = "Piezas de neón" }, + }, + search = { + recommended = "Recomendado", discover = "Descubre", results = "Resultados de búsqueda", + noResults = "No hay resultados", noResultsBody = "Prueba a buscar otra aplicación o juego.", ad = "Anuncio", + topApps = "Aplicaciones principales", topGames = "Juegos destacados", bestApps = "Aplicaciones más vendidas", + bestGames = "Juegos más vendidos", productivity = "Productividad", photoVideo = "Foto y vídeo", + }, + account = { + account = "Cuenta", title = "Gestión de aplicaciones", skyAccount = "Cuenta Sky Phone", + apps = "Aplicaciones instaladas", games = "Juegos", library = "Tu biblioteca", myApps = "Mis aplicaciones", + downloadedOn = "Descargado {date}", uninstall = "Desinstalar", uninstallApp = "Desinstalar {app}", + uninstallTitle = "¿Desinstalar esta aplicación?", + uninstallBody = "{app} será eliminado de este teléfono. Puedes descargarlo de nuevo de la App Store.", + }, + details = { + skyStudios = "Sky Studios", share = "Compartir aplicación", openDetails = "Ver {app}", + shareReady = "La información de la aplicación está lista para compartir.", ratings = "{count} valoraciones", + shareCopy = "Mira {app} en la App Store.", + age = "Edad", years = "Años", chart = "Gráfica", whatsNew = "Novedades", + version = "Versión {version}", updatedToday = "Hoy", + releaseNotes = "{app} ahora incluye contenido nuevo, una carga más rápida y varias mejoras de la interfaz.", + preview = "Vista previa", testData = "Datos de vista previa", previewLive = "Vista previa en vivo", + previousPreview = "Vista previa anterior", nextPreview = "Próxima vista previa", + previewOverview = "Todo lo importante de un vistazo", previewCommunity = "Comunidad", + previewInsights = "Perspectivas", today = "Hoy", progress = "Progresos", + communityTitle = "Juntos en {app}", + communityBody = "Descubre la actividad de los jugadores de Los Santos.", + featuredMoment = "Momento destacado de hoy", weeklyActivity = "Actividad semanal", + fromLastWeek = "de la semana pasada", about = "Acerca de esta aplicación", + description = "{app} es una experiencia detallada de {category} creada para Sky Phone. Explora sus funciones, conecta con la ciudad y mantén todo a mano.", + crypto = { + releaseNotes = "VaultX ofrece ahora una evolución de la cartera más clara, actualizaciones en directo de los mercados sintéticos y mejores transferencias con cotizaciones validadas por el servidor.", + previewOverview = "Cartera, saldo y rendimiento de un vistazo", previewCommunity = "Mercados", + markets = "Mercados", serverPrices = "Precios del servidor", communityTitle = "Opera en mercados sintéticos", + communityBody = "Sigue activos ficticios, revisa cotizaciones temporales y opera con la liquidez disponible del mercado.", + featuredMoment = "Movimientos del mercado en vivo", previewInsights = "Cartera", + weeklyActivity = "Rendimiento simulado", fromLastWeek = "variación semanal ficticia de la cartera", + description = "VaultX es el mercado y la cartera de criptomonedas ficticias de Sky Phone. Sigue mercados sintéticos, gestiona la cartera vinculada a tu personaje, deposita o retira fondos, opera con cotizaciones temporales del servidor y transfiere activos mediante claves públicas de VaultX. Todos los precios son ficticios y no tienen valor real.", + }, + }, + }, + settings = { + name = "Ajustes", searchPlaceholder = "Buscar", airplaneMode = "Modo avión", streamerMode = "Modo streamer", + wallpaper = "Fondo de pantalla", on = "Encendido", off = "Apagado", accountName = "Sky Cloud", + accountDetail = "Datos importantes y nube", accountLocalDetail = "Sesión no iniciada", + accountCloudDetail = "Sincronización de datos importantes a través de Sky Cloud", accountLoginBody = "Inicia sesión para proteger tus datos importantes. Sin una cuenta de Sky Cloud, se perderán con el teléfono.", + accountInformation = "Información de cuenta", accountStatus = "Estado de cuenta", accountStatusValue = "Activo", + accountStorage = "Almacenamiento en nube", accountStorageValue = "En dispositivo", accountPurchases = "Contenido y compras", + accountPurchasesValue = "Disponible", notifications = "Notificaciones", sounds = "Sonidos y vibración", + general = "Configuración general", security = "Código de acceso y seguridad", appearance = "Apariencia", allowNotifications = "Permitir notificaciones", + connectivity = "Conectividad", connections = "Conexiones", wifi = "Wi-Fi", bluetooth = "Bluetooth", cellular = "Datos móviles", + connectivityDescription = "Los ajustes de Wi-Fi, Bluetooth y datos móviles se guardan en este teléfono.", + focus = "Concentración", focusMode = "Concentración", focusDescription = "Concentración silencia las notificaciones no críticas, pero mantiene disponibles las alarmas y alertas importantes.", + notificationSounds = "Sonidos", notificationDuration = "Duración de notificación", seconds = "{seconds} segundos", + ringtoneVolume = "Volumen de tono", notificationVolume = "Volumen de notificaciones", + ringtone = "Tono de llamada", notificationSound = "Sonido de notificación", graphicsMode = "Modo gráfico", + performanceMode = "Modo de rendimiento", performanceModeDescription = "Simula el desenfoque del cristal para mejorar el rendimiento en CEF", + ultimateMode = "Modo Ultimate", ultimateModeDescription = "Efectos completos de cristal y pantalla para clientes de FiveM compatibles", + appearanceMode = "Modo de apariencia", + automatic = "Automático", light = "Claro", dark = "Oscuro", phoneScale = "Escalado del teléfono", phoneFrame = "Marco del teléfono", + screenBrightness = "Brillo de pantalla", + development = "Desarrollo", skyUiKitchenSink = "Catálogo de Sky UI", + skyUiKitchenSinkDescription = "Catálogo interactivo de componentes propios de Sky UI", + about = "Acerca de", deviceName = "Nombre del dispositivo", deviceNameValue = "Sky Phone", softwareVersion = "Versión de software", + language = "Idioma", languageValue = "Inglés", localStorage = "Almacenamiento local", localStorageValue = "En dispositivo", + back = "Ajustes", wallpaperPicker = "Fondos de Sky", deviceInformation = "Información del dispositivo", + wallpaperFromPhotos = "Elegir de fotos", wallpaperFromPhotosDescription = "Usar una de tus fotos", + wallpaperFromCamera = "Tomar foto", wallpaperFromCameraDescription = "Crea un fondo nuevo", + wallpaperCustomUpload = "Subir imagen personalizada", wallpaperCustomUploadDescription = "Usar un enlace HTTPS verificado de imagen", + wallpaperHistory = "Recientes", wallpaperCustom = "Fondo con foto", + wallpaperTarget = "Destino del fondo de pantalla", wallpaperHomeScreen = "Pantalla principal", wallpaperLockScreen = "Pantalla bloqueada", + imei = "IMEI", linkedDevices = "Dispositivos vinculados", thisDevice = "Este teléfono", removeDevice = "Eliminar dispositivo", + simCard = "Tarjeta SIM", simNumber = "Número de teléfono", simType = "Tipo de SIM", registeredSim = "Registrada", + anonymousSim = "Anónimo", noSim = "Sin SIM", ejectSim = "Expulsar SIM", ejectSimBody = "¿Devolver esta tarjeta SIM a tu inventario?", + removeDeviceBody = "Introduce tu contraseña de Sky Cloud para eliminar este dispositivo de la cuenta.", signOut = "Cerrar sesión", + reset = "Transferir o restablecer el teléfono", transferOrReset = "Transferir o restablecer el teléfono", transferOrResetDescription = "Preparar este teléfono para una configuración nueva", + resetHeroTitle = "Un nuevo comienzo sin perder lo que te acompaña", + resetHeroBody = "Borra el contenido local y los ajustes de este teléfono. La información vinculada a tu SIM o guardada en cuentas compatibles seguirá disponible.", + erasedFromPhone = "Se elimina de este teléfono", eraseDeviceSettings = "Código de acceso, preferencias y disposición de la pantalla de inicio", + eraseLocalContent = "Fotos, notas y contenido almacenado localmente", eraseLocalApps = "Aplicaciones descargadas y sesiones de aplicaciones locales", + keptSafe = "Se conserva de forma segura", keepSimData = "Tarjeta SIM y número de teléfono", keepSimDataBody = "Tu número y las comunicaciones vinculadas a la SIM permanecen en la tarjeta SIM.", + keepCloudData = "Cuenta y datos en la nube", keepCloudDataBody = "La información compatible permanece en su aplicación o en tu cuenta de Sky Cloud.", + resetSetupAssistant = "Cuando termine el borrado, el asistente de configuración se iniciará automáticamente.", + factoryReset = "Eliminar todo el contenido y ajustes", factoryResetBody = "Esta acción no se puede deshacer. Se eliminarán los ajustes locales, las aplicaciones y el contenido no sincronizado. Tu número de SIM y los datos asociados a tu cuenta seguirán disponibles.", + factoryResetProgress = "Eliminando Sky Phone", factoryResetWarning = "Mantén este teléfono abierto. Tu SIM y datos de nube están seguros.", + factoryResetSystemProcess = "Proceso de sistema seguro", factoryResetPreparing = "Preparando reinicio seguro", factoryResetPreparingDetail = "Verificando datos del dispositivo", + factoryResetRemoving = "Eliminando datos personales", factoryResetRemovingDetail = "Borrando aplicaciones y contenido local", + factoryResetSecuring = "Protegiendo servicios vinculados", factoryResetSecuringDetail = "Conservando datos de la SIM y nube", + factoryResetFinishing = "Finalizando configuración", factoryResetFinishingDetail = "Preparando la pantalla de bienvenida", + factoryResetSimSafe = "SIM protegida", factoryResetCloudSafe = "Nube protegida", + passcode = { + description = "Un código de acceso protege el contenido de este teléfono. Se mantiene con el dispositivo incluso si cambia la SIM o la cuenta de Sky Cloud.", + status = "Código de acceso", codeLength = "Longitud del código", sixDigit = "Código de 6 dígitos", fourDigit = "Código de 4 dígitos", + turnOn = "Activar código de acceso", turnOff = "Desactivar código de acceso", change = "Cambiar código de acceso", + enterNew = "Introducir nuevo código de acceso", confirmNew = "Verificar nuevo código de acceso", enterCurrent = "Introducir código de acceso actual", + screenSubtitle = "Usa 4 o 6 números.", incorrect = "Código de acceso incorrecto.", mismatch = "Los códigos de acceso no coincidieron.", + locked = "Demasiados intentos incorrectos. Inténtalo de nuevo más tarde.", rateLimited = "Demasiados intentos. Por favor, espera.", + failed = "No se pudo actualizar el código de acceso.", saved = "Código de acceso guardado.", disabled = "Código de acceso desactivado.", + }, + accountErrors = { + invalid_email = "Elige una dirección iFruit válida de 3 a 32 caracteres.", invalid_password = "La contraseña debe tener entre 6 y 64 caracteres.", + invalid_credentials = "El correo electrónico o la contraseña es incorrecta.", email_taken = "Ese iFruit ya está registrado.", + rate_limited = "Demasiados intentos. Inténtalo de nuevo en un minuto.", current_device = "Cerrar sesión en lugar de eliminar el dispositivo actual.", + device_not_found = "Ese dispositivo ya no está vinculado.", default = "La solicitud de cuenta falló.", + }, + toggle = { + airplaneMode = "Alternar modo avión", streamerMode = "Alternar modo de transmisor", focusMode = "Alternar concentración", + wifiEnabled = "Alternar Wi-Fi", bluetoothEnabled = "Alternar Bluetooth", cellularEnabled = "Alternar datos móviles", + notifications = "Alternar notificaciones para {app}", notificationSounds = "Alternar sonidos de notificación para {app}", + }, + frames = { + black = "Negro", blue = "Azul", green = "Verde", lavender = "Lavanda", red = "Rojo", white = "Blanco", + orange = "Naranja", yellow = "Amarillo", lime = "Verde", teal = "Verde azulado", cyan = "Cian", purple = "Morado", + pink = "Rosa", gold = "Oro", rgb = "RGB", + }, + ringtones = { skyline = "Skyline", horizon = "Horizonte", pulse = "Pulso" }, + notificationSoundsList = { chime = "Campanilla", signal = "Señal", soft = "Suave" }, + wallpapers = { + midnight = "Noche", aurora = "Aurora", ember = "Ember", ocean = "Océano", sunrise = "Amanecer", + violet = "Violeta", forest = "Bosque", cobalt = "Cobalto", rose = "Rosado", sand = "Arena", + graphite = "Gris", prism = "Prisma", + }, + }, + }, + }, +} + diff --git a/sky_phone/fxmanifest.lua b/sky_phone/fxmanifest.lua index a08192a..4e79860 100644 --- a/sky_phone/fxmanifest.lua +++ b/sky_phone/fxmanifest.lua @@ -32,6 +32,7 @@ client_scripts { 'config/config.lua', 'config/locales/en.lua', 'config/locales/de.lua', + 'config/locales/es.lua', 'source/bridge/client/callbacks.lua', 'source/client/phone_configurator.lua', 'source/bridge/client/framework.lua', @@ -77,6 +78,7 @@ server_scripts { 'config/media.lua', 'config/locales/en.lua', 'config/locales/de.lua', + 'config/locales/es.lua', 'source/server/nui_build_check.lua', 'source/server/update_check.lua', 'source/bridge/server/database.lua',