feat(i18n): complete message parity across all 25 locales
Gitea Actions Runner Test / test-job (push) Successful in 1s
CI / check (push) Successful in 37s
CI / tests-unit (push) Successful in 1m49s
CI / tests-integration (push) Successful in 1m50s
CI / tests-ui (push) Successful in 2m29s
CI / preflight (push) Skipped
CI / deploy (push) Failing after 1m37s
Gitea Actions Runner Test / test-job (push) Successful in 1s
CI / check (push) Successful in 37s
CI / tests-unit (push) Successful in 1m49s
CI / tests-integration (push) Successful in 1m50s
CI / tests-ui (push) Successful in 2m29s
CI / preflight (push) Skipped
CI / deploy (push) Failing after 1m37s
The admin.studio.nitroCleanup section (102 keys) only existed in en and nl, so 23 locales fell back to English for the entire Nitro Cleanup panel. The referrals and dailyRewards keys were missing from the same 23 locales, and en itself was missing 6 keys that nl had. Add the missing keys to every locale with translations, so all 25 locales now carry the same 6063 keys.
This commit is contained in:
1 parent
944527e078
commit
bc00ecf08c
24 files changed
+4483
-182
No files matched your search
+194
-7
@@ -787,9 +787,9 @@
|
||||
"enable": "Activar 2FA",
|
||||
"rateLimit": "Too many attempts. Please wait before trying again."
|
||||
},
|
||||
"title": "Cuentas conectadas",
|
||||
"title": "Cuentas vinculadas",
|
||||
"subtitle": "Vincula una cuenta social para iniciar sesión con un clic",
|
||||
"connected": "Conectado",
|
||||
"connected": "Vinculado",
|
||||
"unavailable": "No disponible",
|
||||
"login": {
|
||||
"title": "Iniciar sesión",
|
||||
@@ -852,7 +852,9 @@
|
||||
"hidePassword": "Hide",
|
||||
"accountDetails": "Account details",
|
||||
"credentials": "Credentials & security",
|
||||
"newestCitizens": "Newest citizens"
|
||||
"newestCitizens": "Newest citizens",
|
||||
"ageVerified": "Tengo 18+ y acepto el requisito de edad.",
|
||||
"invitedBy": "Invitado por {username}"
|
||||
},
|
||||
"forgot": {
|
||||
"title": "Restablecer contraseña",
|
||||
@@ -1018,7 +1020,9 @@
|
||||
"cmsErrors": "CMS errors",
|
||||
"themeBuilder": "Theme builder",
|
||||
"openSidebar": "Open menu",
|
||||
"closeSidebar": "Close menu"
|
||||
"closeSidebar": "Close menu",
|
||||
"referrals": "Recomendaciones",
|
||||
"dailyRewards": "Recompensas diarias"
|
||||
},
|
||||
"dashboard": {
|
||||
"title": "Panel",
|
||||
@@ -4306,7 +4310,9 @@
|
||||
"importAudit": "Audit",
|
||||
"themeBuilder": "Theme Builder",
|
||||
"studio": "Studio",
|
||||
"cmsErrors": "CMS errors"
|
||||
"cmsErrors": "CMS errors",
|
||||
"referrals": "Recomendaciones",
|
||||
"dailyRewards": "Recompensas diarias"
|
||||
},
|
||||
"events": "Events",
|
||||
"eventsSubtitle": "Hotel events and event types",
|
||||
@@ -5813,6 +5819,64 @@
|
||||
"NoscopescreatedyetAddonebelow": "No scopes created yet. Add one below.",
|
||||
"Rename": "Rename"
|
||||
}
|
||||
},
|
||||
"referrals": {
|
||||
"title": "Recomendaciones",
|
||||
"subtitle": "Sistema de invitaciones",
|
||||
"referralsToday": "Recomendaciones hoy",
|
||||
"referralsTotal": "Recomendaciones totales",
|
||||
"invitedTotal": "Invitaciones contadas",
|
||||
"claims": "Recompensas reclamadas",
|
||||
"settings": "Configuración de recompensas",
|
||||
"needed": "Recomendaciones necesarias",
|
||||
"rewardAmount": "Cantidad de recompensa",
|
||||
"rewardCurrency": "Moneda de recompensa",
|
||||
"blockSameIp": "Rechazar recomendaciones que comparten la IP actual del invitador",
|
||||
"save": "Guardar configuración",
|
||||
"saving": "Guardando…",
|
||||
"saved": "Configuración de recomendaciones guardada.",
|
||||
"saveError": "No se pudo guardar la configuración de recomendaciones.",
|
||||
"recent": "Recomendaciones recientes",
|
||||
"unavailable": "Los datos de recomendaciones no están disponibles temporalmente.",
|
||||
"empty": "Aún no hay recomendaciones.",
|
||||
"inviter": "Invitador",
|
||||
"invitee": "Usuario invitado",
|
||||
"ip": "IP",
|
||||
"date": "Fecha"
|
||||
},
|
||||
"dailyRewards": {
|
||||
"title": "Recompensas diarias de inicio de sesión",
|
||||
"subtitle": "Programa de recompensas diarias de inicio de sesión",
|
||||
"enabled": "Estado de la función",
|
||||
"yes": "Activado",
|
||||
"no": "Desactivado",
|
||||
"scheduleDays": "Días del programa",
|
||||
"claimsToday": "Reclamaciones hoy",
|
||||
"claimsTotal": "Reclamaciones totales",
|
||||
"status": "Estado de la función",
|
||||
"statusHint": "Cuando está desactivado, la tarjeta de recompensa se oculta y las nuevas reclamaciones se rechazan.",
|
||||
"disable": "Desactivar",
|
||||
"enable": "Activar",
|
||||
"schedule": "Programa de recompensas",
|
||||
"day": "Día {day}",
|
||||
"reward": "Recompensa",
|
||||
"amount": "Cantidad",
|
||||
"actions": "Acciones",
|
||||
"addDay": "Día",
|
||||
"add": "Añadir día",
|
||||
"save": "Guardar",
|
||||
"saving": "Guardando…",
|
||||
"saved": "Programa de recompensas guardado.",
|
||||
"cancel": "Cancelar",
|
||||
"edit": "Editar",
|
||||
"delete": "Eliminar",
|
||||
"created": "Día de recompensa añadido.",
|
||||
"updated": "Día de recompensa actualizado.",
|
||||
"deleted": "Día de recompensa eliminado.",
|
||||
"saveError": "No se pudo guardar el día de recompensa.",
|
||||
"deleteError": "No se pudo eliminar el día de recompensa.",
|
||||
"confirmDeleteTitle": "Eliminar día de recompensa",
|
||||
"confirmDeleteBody": "Este día de recompensa ya no se otorgará. Las reclamaciones pasadas permanecen registradas."
|
||||
}
|
||||
},
|
||||
"radioRequests": {
|
||||
@@ -6223,8 +6287,27 @@
|
||||
"empty": "You're all caught up. No actions waiting.",
|
||||
"unavailable": "Some actions could not be checked. Available actions are shown above.",
|
||||
"retry": "Try again",
|
||||
"rewardUnavailable": "Referral progress is temporarily unavailable. Please try again."
|
||||
}
|
||||
"rewardUnavailable": "Referral progress is temporarily unavailable. Please try again.",
|
||||
"dailyReward": "Tu recompensa diaria está lista para reclamar"
|
||||
},
|
||||
"dailyClaimed": "Recompensa diaria reclamada — ¡hasta mañana!",
|
||||
"dailyErrors": {
|
||||
"already_claimed": "Ya reclamaste la recompensa diaria de hoy.",
|
||||
"disabled": "Las recompensas diarias están desactivadas actualmente.",
|
||||
"bad_config": "El programa de recompensas diarias no está configurado correctamente. Contacta con el personal.",
|
||||
"ratelimit": "Demasiados intentos. Espera un momento y vuelve a intentarlo.",
|
||||
"error": "No se pudo reclamar la recompensa diaria. Inténtalo de nuevo."
|
||||
},
|
||||
"dailyRewardTitle": "Recompensas diarias",
|
||||
"dailyRewardHint": "Inicia sesión cada día y reclama tu recompensa — las rachas crecen hasta los días grandes.",
|
||||
"dailyRewardDay": "Día {day}",
|
||||
"dailyRewardStreak": "{count, plural, one {Racha: # día} other {Racha: # días}}",
|
||||
"dailyRewardNextClaim": "Próxima reclamación: {amount} {currency}",
|
||||
"dailyRewardTomorrow": "Mañana: {amount} {currency}",
|
||||
"dailyRewardClaim": "Reclamar recompensa diaria",
|
||||
"dailyRewardClaimedToday": "Reclamado hoy — vuelve mañana para la próxima recompensa.",
|
||||
"dailyRewardDisabled": "Las recompensas diarias están desactivadas actualmente. Puedes explorar el hotel.",
|
||||
"dailyRewardUnavailable": "No se pudo cargar el programa de recompensas diarias. Inténtalo de nuevo."
|
||||
},
|
||||
"housekeeping": {
|
||||
"preview": {
|
||||
@@ -6502,6 +6585,110 @@
|
||||
},
|
||||
"admin": {
|
||||
"studio": {
|
||||
"nitroCleanup": {
|
||||
"alreadyRunning": "Ya hay un escaneo en curso — conectado a él.",
|
||||
"ageUnknown": "edad desconocida",
|
||||
"ageBelow": "< 1d",
|
||||
"scanButton": "Escanear activos de muebles",
|
||||
"scanningAssets": "Escaneando activos…",
|
||||
"cancelButton": "Cancelar",
|
||||
"deleteSelected": "Eliminar seleccionados ({count})",
|
||||
"deleting": "Eliminando…",
|
||||
"redownloadBroken": "Descargar de nuevo los dañados",
|
||||
"redownloading": "Descargando de nuevo…",
|
||||
"autoClean": "Limpiar automáticamente los falsos antiguos",
|
||||
"cleaning": "Limpiando…",
|
||||
"exportManifest": "Exportar manifiesto",
|
||||
"exporting": "Exportando…",
|
||||
"phaseStems": "Cargando tallos de muebles…",
|
||||
"phaseReaddir": "Leyendo directorios de activos…",
|
||||
"phaseValidate": "Validando paquetes .nitro…",
|
||||
"phaseScanning": "Escaneando…",
|
||||
"scanProgressFiles": "{count} archivos",
|
||||
"repairProgress": "ok {ok}, fallidos {failed}",
|
||||
"attachedNotice": "El escaneo continúa en segundo plano — los resultados aparecerán cuando termine.",
|
||||
"sessionCancelled": "Escaneo cancelado.",
|
||||
"onlyOldLabel": "Mostrar solo archivos más antiguos que",
|
||||
"onlyOldAgeLabel": "Edad mínima en días para mostrar",
|
||||
"onlyOldToggle": "Ocultar archivos recientes",
|
||||
"daysLabel": "días",
|
||||
"autoAgeLabel": "Edad mínima en días para limpieza automática",
|
||||
"loadingResult": "Cargando resultado del escaneo…",
|
||||
"scannedStat": "archivos de activos escaneados",
|
||||
"cachedNotice": "(en caché — los directorios no cambiaron)",
|
||||
"fakeStat": "Nitros falsos (sin elemento coincidente)",
|
||||
"brokenStat": "Nitros dañados (no legibles)",
|
||||
"groupEmpty": "No se encontró nada",
|
||||
"selectedCount": "{count} seleccionados",
|
||||
"copiesBadge": "{count} copias",
|
||||
"groupFakeLabel": "Nitros falsos",
|
||||
"groupFakeDescription": "Estos archivos no coinciden con ningún elemento en items_base — restos de muebles eliminados o renombrados.",
|
||||
"groupBrokenLabel": "Nitros dañados",
|
||||
"groupBrokenDescription": "Estos archivos pertenecen a un elemento pero no se pueden leer como un paquete Nitro válido.",
|
||||
"groupSwfLabel": "SWFs huérfanos",
|
||||
"groupSwfDescription": "Archivos .swf que no coinciden con ningún elemento en items_base.",
|
||||
"groupIconLabel": "Iconos huérfanos",
|
||||
"groupIconDescription": "Archivos de iconos que no coinciden con ningún elemento en items_base.",
|
||||
"warningText": "Eliminar un .nitro dañado deja su elemento en la base de datos sin paquete — prefiera descargarlo de nuevo o deje que la auditoría del catálogo lo obtenga más tarde. Las filas de la base de datos nunca se eliminan con esta herramienta.",
|
||||
"onlyAssetsTouched": "Solo se tocan los archivos de activos — FurnitureData.json y las filas de la base de datos permanecen intactas.",
|
||||
"emptyHint": "Escanee cada directorio de activos de muebles para encontrar paquetes nitro falsos y dañados además de SWFs e iconos huérfanos. Elimínelos, descargue de nuevo los dañados o limpie automáticamente los restos antiguos.",
|
||||
"noResult": "Aún no hay resultado de escaneo — ejecute primero un escaneo de activos de muebles.",
|
||||
"scanFailed": "El escaneo falló.",
|
||||
"confirmDeleteTitle": "¿Eliminar {count} archivo(s)?",
|
||||
"confirmDeleteDescription": "Los archivos se eliminarán de todos los directorios (public + gamedata reflejada). Las filas de la base de datos nunca se tocan.",
|
||||
"confirmDeleteLabel": "Eliminar",
|
||||
"confirmRepairTitle": "¿Descargar de nuevo {count} paquete(s) .nitro dañado(s)?",
|
||||
"confirmRepairDescription": "Los paquetes se obtendrán de nuevo de las fuentes nitro configuradas y se escribirán sobre todos los directorios (public + gamedata reflejada).",
|
||||
"confirmRepairLabel": "Descargar de nuevo",
|
||||
"confirmAutoCleanTitle": "¿Limpiar automáticamente nitros falsos más antiguos que {days} día(s)?",
|
||||
"confirmAutoCleanDescription": "Solo se eliminan archivos .nitro falsos (sin elemento coincidente) más antiguos que el umbral. Los paquetes dañados y los archivos recientes nunca se tocan.",
|
||||
"confirmAutoCleanLabel": "Limpiar automáticamente",
|
||||
"toastDeletePartial": "Eliminadas {copies} copias, pero algunos archivos no se pudieron eliminar",
|
||||
"toastDeleteDone": "Eliminadas {copies} copias de archivos ({deleted} archivos)",
|
||||
"toastRepairDone": "Reparados {count} paquetes .nitro",
|
||||
"toastRepairFailed": "No se pudo obtener ningún paquete ({failed} fallidos)",
|
||||
"toastRepairCancelled": "Reparación cancelada",
|
||||
"toastAutoCleanDone": "Limpiados {deleted} archivos .nitro falsos antiguos ({copies} copias). Omitidos {recent} recientes + {broken} dañados.",
|
||||
"toastAutoCleanNothing": "Nada lo suficientemente antiguo para eliminar (omitidos {recent} recientes, {broken} dañados)",
|
||||
"toastManifestDownload": "Manifiesto de escaneo descargado",
|
||||
"gamedataTitle": "Limpiar datos del juego",
|
||||
"gamedataHint": "Vista previa primero: esto reescribe FurnitureData.json, FigureMap.json y FigureData.json. A diferencia de las herramientas de activos anteriores, elimina filas que no hacen referencia a nada — revise los recuentos antes de ejecutarlo.",
|
||||
"gamedataScan": "Vista previa de datos del juego",
|
||||
"gamedataScanning": "Escaneando…",
|
||||
"gamedataRun": "Ejecutar seleccionados",
|
||||
"gamedataRunning": "Limpiando…",
|
||||
"gamedataNoResult": "Aún no hay vista previa — escanee primero los archivos JSON de datos del juego.",
|
||||
"gamedataCount_duplicates": "Duplicados de FurnitureData",
|
||||
"gamedataCount_orphans": "Huérfanos de FurnitureData",
|
||||
"gamedataCount_figureMap": "Problemas de FigureMap",
|
||||
"gamedataCount_figureData": "FigureData sin usar",
|
||||
"gamedataPass_dedupeFurnitureData": "Deduplicar FurnitureData",
|
||||
"gamedataPassDesc_dedupeFurnitureData": "Elimina classnames repetidos dentro de una sección, conservando la entrada con la revisión más alta.",
|
||||
"gamedataPass_cleanFurnitureData": "Limpiar FurnitureData",
|
||||
"gamedataPassDesc_cleanFurnitureData": "Elimina las entradas cuyo paquete .nitro falta en todos los directorios.",
|
||||
"gamedataPass_cleanFigureMap": "Limpiar FigureMap",
|
||||
"gamedataPassDesc_cleanFigureMap": "Elimina las partes que apuntan a un conjunto que falta en FigureData, además de duplicados exactos.",
|
||||
"gamedataPass_cleanFigureData": "Limpiar FigureData",
|
||||
"gamedataPassDesc_cleanFigureData": "Elimina los conjuntos a los que ninguna parte de FigureMap hace referencia, luego las paletas que ningún tipo de conjunto usa. Debe ejecutarse después de Limpiar FigureMap.",
|
||||
"gamedataNothingSelected": "Seleccione al menos un paso de limpieza",
|
||||
"gamedataConfirmTitle": "¿Reescribir los archivos JSON de datos del juego?",
|
||||
"gamedataConfirmDescription": "{passes} paso(s) se ejecutarán contra {duplicates} grupo(s) duplicado(s), {orphans} fila(s) huérfana(s), {figureMap} problema(s) de FigureMap y {figureData} entrada(s) FigureData sin usar. Las filas se eliminan sin copia de seguridad — esto no se puede deshacer.",
|
||||
"gamedataConfirmLabel": "Reescribir archivos",
|
||||
"gamedataDifferingWarning": "Al menos un duplicado no es una copia exacta de la entrada que se conserva, por lo que la fila eliminada contenía datos que el superviviente no tiene.",
|
||||
"gamedataCrossSectionNote": "{count} classname(s) existen tanto en roomitemtypes como en wallitemtypes. Estos solo se informan — eliminar uno cambiaría el tipo de un elemento.",
|
||||
"gamedataToastDone": "La limpieza de datos del juego eliminó {removed} fila(s)",
|
||||
"gamedataToastNothing": "Los datos del juego ya estaban limpios",
|
||||
"gamedataMaxRemovalsLabel": "Máx. filas por paso",
|
||||
"gamedataMaxRemovalsHint": "0 usa el valor predeterminado de 500. Un paso que eliminaría más se detiene y pregunta en lugar de escribir.",
|
||||
"gamedataLimitTitle": "{pass} eliminaría {wouldRemove} fila(s), por encima del límite de {maxRemovals}.",
|
||||
"gamedataLimitDescription": "Ese paso no escribió nada, por lo que los archivos no cambiaron. Revise primero las rutas de los activos — un directorio incorrecto hace que cada fila parezca huérfana. Aumentar el límite es una ejecución separada y deliberada.",
|
||||
"gamedataLimitOverride": "Eliminar {wouldRemove} fila(s) de todos modos",
|
||||
"historyTitle": "Historial de limpieza automática",
|
||||
"historyScheduled": "programado",
|
||||
"historyManual": "manual",
|
||||
"historyEntry": "Eliminados {deleted} ({copies} copias); omitidos {recent} recientes y {broken} dañados",
|
||||
"historyErrors": "{count} errores"
|
||||
},
|
||||
"importDiagnostics": {
|
||||
"attempts": "Diagnóstico de archivos",
|
||||
"preliminary": "Comprobación preliminar de direcciones; el contenido se valida al importar.",
|
||||
|
||||
Reference in new issue
Block a user