Skip to content

Traducir todo el texto traducible: datos, scripts, informe de cobertura y mod de apoyo - #1

Open
Consterna wants to merge 24 commits into
mainfrom
claude/modpack-farming-crossing-messages-214123
Open

Consterna wants to merge 24 commits into
mainfrom
claude/modpack-farming-crossing-messages-214123

Conversation

@Consterna

@Consterna Consterna commented Nov 6, 2026 •

Copy link
Copy Markdown
Owner

Qué cambia

Tras traducir Farming Crossing 4, parte del chat seguía en inglés: diálogos de NPC, avisos de colección, mensajes de antojos, logros y tips. La app solo buscaba texto en sitios fijos. Este PR hace que traduzca todo lo traducible en cualquier modpack, y que avise de lo que no puede.

  • Datos de texto por estructura: funciones .mcfunction, logros, tips y el mercado de Farming for Blockheads, en kubejs/data, global_packs, datapacks, mundos y zips. Componentes en JSON y SNBT (1.21.5+).
  • KubeJS: texto de tellraw/title/say en runCommand, mensajes armados por partes, métodos de texto según la versión (comprobados en el código de KubeJS 1.12 a 26.x) y funciones propias del script que solo muestran texto (solo en la posición de ese parámetro; si el parámetro se compara, se guarda, va en un id o comando, no se toca nada).
  • Modo exhaustivo opcional para scripts (--exhaustivo y casilla).
  • Informe «Qué queda en inglés» (menú Más y modpackes cobertura): frases de scripts, comandos de otros mods con texto en inglés (p. ej. emberstextapi queue), formatos desconocidos y texto escrito en el código de los mods. Solo lee.
  • Mod de apoyo ModpackES Runtime (solo cliente, mod-runtime/): muestra en español el texto del código Java de los mods (chat, barra de acción, tooltips de objetos y texto de los botones de una pantalla al abrirla) si es idéntico a uno de la tabla que genera la app; reconoce plantillas con %s y %d. Opcional, apagado por defecto; se instala y quita desde la ventana o con modpackes instalar-runtime. Hay 17 proyectos que cubren:
    • Forge 1.16.5, 1.18.2, 1.19.2 y 1.20.1;
    • NeoForge 1.21 a 1.21.11, y 1.20.1 con el jar de Forge;
    • Fabric 1.19.4, de 1.20 a 1.21.11 sin huecos y 26.1 a 26.3;
    • Quilt, con los jars de Fabric hasta 1.21.1.
      Fabric 1.16.5, 1.18.2 y 1.19.2 no pueden tener mod (su Fabric API no trae evento de chat del cliente) y la app lo dice. La lógica común está en mod-runtime/comun/. Un mismo jar sirve para versiones vecinas cuando el mismo código compila y pasa las pruebas contra cada una (scripts/construir_mod.py --propiedad). El CI compila los jars con Java 8, 17, 21 y 25 y el .exe los incluye.
  • Endurecimiento tras revisar toda la app por secciones, con 6 errores corregidos: memoria dañada, gzip truncado en NBT, lectura fuera de carpeta en recursos, espacios de nombres imposibles que cancelaban la traducción, y bytes no UTF-8 en options.txt. Además, el kit de servidor incluye los datapacks comprimidos con logros o funciones.

Cómo se probó

  • scripts/verificar.py completo: ruff, pyright estricto, compilación y 717 pruebas pasadas (3 saltadas: modpacks del corpus sin texto para el jugador).
  • Corpus: 16 modpacks públicos de Modrinth (1.16.5 a 26.x; Forge, NeoForge, Fabric y Quilt) más Farming Crossing 4, incluidos los datapacks de resources/, de config/paxi y de los mundos (saves/), siempre sobre copias: JSON, zips y JS (node --check) siguen siendo válidos, repetir no cambia nada y restaurar devuelve los bytes originales.
  • Mod de apoyo: los 17 proyectos compilan y pasan 389 pruebas JUnit en total (el de 1.16.5 con bytecode de Java 8, comprobado). Una prueba de Python comprueba que la tabla de versiones, los proyectos y los rangos que declaran coinciden, y otras tres que construir_mod.py reintenta solo los fallos de red. El .exe se construye y su prueba de arranque pasa.
  • No probado: ninguno de los mods de apoyo dentro del juego (no hay cliente gráfico disponible), y Quilt y NeoForge 1.20.1 dependen además de que carguen jars de otro loader. Con el mod instalado y el juego en español, /tellraw @s "TPA request expired!" debe salir en español. Las pruebas usan el simulador de traducción, no la API real.

Para quien revise

  • Queda fuera, y se avisa en el informe: el texto que una pantalla dibuja directamente (solo se alcanzaría con Mixin, que no se usa), los comandos de otros mods (su formato mezcla etiquetas propias), funciones de script usadas entre archivos (no apareció ningún caso en los 21 modpacks medidos) y los tooltips que no son de objetos en Fabric.
  • scripts/descargar_corpus.py suma modpacks al corpus (se baja a .descargas/, ignorado por Git).
  • Los jars de Forge 1.16.5 y de Fabric 26.x se compilan con JDK 8 y JDK 25 respectivamente; construir_mod.py los busca en JAVA_HOME_<versión>_X64 o en .herramientas/.
  • El CI compila 17 proyectos de Gradle y varias descargas pueden fallar por la red (ya pasó con Gradle y GitHub); por eso el wrapper espera hasta 120 s y construir_mod.py reintenta hasta 3 veces, pero solo si el fallo es de red.

Lista

  • uv run python scripts/verificar.py pasa completo.
  • Agregué o actualicé las pruebas.
  • Anoté el cambio en CHANGELOG.md si el usuario lo nota.

- runCommand/runCommandSilent: traduce el texto de tellraw, title, say, msg, tell y w.
- Mensajes armados por partes (variable que acaba en tell), sus miembros name y
  sus tablas de nombres, incluso si la tabla está en otro archivo.
- Logros y funciones .mcfunction de kubejs/data, con copia de seguridad y en el
  kit para servidores.
… informar de lo que queda

- Funciones, logros y tips se buscan por su estructura (data/<espacio>/function(s)...)
  en cualquier carpeta, sueltos o dentro de .zip, con copia de seguridad.
- Componentes de texto en JSON y en SNBT (1.21.5+).
- notify, kick y los títulos de menús de KubeJS, tomados de su código.
- Más ▸ Qué queda en inglés y `modpackes cobertura`: frases de scripts sin elegir y texto
  escrito en el código de los mods (tabla de constantes de cada clase). Solo lee.
- Pruebas con modpacks públicos de Modrinth y con la instancia propia: validez, idempotencia
  y restauración byte a byte.
…secciones

- Memoria: cierra la conexión si el archivo está dañado y el proceso dice cuál es.
- NBT: un gzip dañado o truncado se convierte siempre en ValueError.
- Carpeta de recursos: rechaza rutas que salen de su raíz.
- Resource pack: un espacio de nombres imposible o reservado de Windows se salta
  y se avisa, en vez de cancelar toda la traducción (mods y libros).
- options.txt: conserva los bytes que no son UTF-8.
- Pruebas de casos límite por sección, línea de comandos real y ventana.
… mods

- Módulo TextoDeJava: traduce las frases del código Java a una tabla del resource pack.
- Mod de cliente ModpackES Runtime (Forge 1.20.1) que cambia chat, barra de acción y
  tooltips cuyo texto es idéntico al de la tabla; con pruebas JUnit.
- Instalar y quitar el mod desde la ventana y con `instalar-runtime`; opción --java.
- scripts/construir_mod.py y paso de CI para compilarlo; el .exe lo incluye.
…ustivo y más corpus

- Métodos de texto de KubeJS según la versión de Minecraft (formatos/kubejs_api.py).
- El informe de cobertura avisa de carpetas con frases cuyo formato no se conoce.
- Formato del mercado de Farming for Blockheads.
- Modo exhaustivo opcional para los scripts (--exhaustivo y casilla).
- Siete modpacks más en el corpus, de 1.16.5 a 26.x con Quilt incluido.
…uestran texto

- Analiza las funciones del script cuyo parámetro solo se muestra (directo, partido en
  líneas o dentro de una plantilla que se muestra) y traduce lo que se les pasa en esa posición.
- Conservador: si el parámetro se compara, busca, guarda, devuelve o va en un id o comando,
  o la función se usa como valor o está repetida, no se toca nada.
- Las cadenas del escáner de JavaScript guardan la posición de su argumento.
@chatgpt-codex-connector

chatgpt-codex-connector Bot commented Nov 6, 2026 •

Copy link
Copy Markdown

Codex Review Summary

This comment shows the latest Codex review activity on this pull request.

Review Status Commit Review trigger
📝 Code Review ✅ Completed 2026-11-06T07:56:13.149854Z b93c013 PR opened
ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review" or "@codex security review".

Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings.

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: b93c013adb

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread src/traductor_es/salida/exportar.py Resolved
…omprobar el mod

- El mod reconoce frases con datos (%s, %d) como plantillas; se descartan las traducciones
  que cambian el orden de los datos o pierden alguno.
- El informe de lo que queda en inglés se ve por categorías, se guarda en un archivo y
  se escribe como JSON con `cobertura --json`.
- Más ▸ Comprobar el mod de apoyo informa de su estado sin abrir el juego.
- Nuevo proyecto mod-runtime/neoforge-1.21.1 (ModDevGradle, Java 21) con la misma tabla y
  plantillas que el de Forge; comprobado en el código de NeoForge el evento de chat
  (ClientChatReceivedEvent, System y overlay) y el de tooltips.
- La app lo reconoce como compatible con NeoForge 1.21.1 y lo instala o quita de mods/.
- scripts/construir_mod.py compila cada proyecto con su Java y su Gradle, y puede usar un
  archivo de hosts solo para Java si el DNS del equipo falla con algunos servidores.
- El CI instala Java 17 y 21 y compila los dos mods con sus pruebas.
Tercer loader del mod de apoyo (client-only): mensajes del juego con
ClientReceiveMessageEvents.MODIFY_GAME, tooltips con ItemTooltipCallback y
la tabla se recarga con un SimpleSynchronousResourceReloadListener. Misma
lógica de tabla y plantillas que Forge y NeoForge, con sus 21 pruebas JUnit.

Se compila con Loom 1.17 y Java 21 (la 1.19 pide Java 25), a bytecode de
Java 17. La app lo instala en instancias Fabric 1.20.1; el script de
construcción, el CI y la documentación lo incluyen.
… tooltips sin objeto

Al abrir una pantalla cambia el texto de sus botones, casillas y etiquetas
(ScreenEvent.Init.Post en Forge y NeoForge, ScreenEvents.AFTER_INIT en Fabric).
En Forge y NeoForge también cambia los tooltips que no son de objetos con
RenderTooltipEvent.GatherComponents. Fabric API no tiene evento para eso.

El texto que una pantalla dibuja directamente no pasa por ningún evento y no
se toca sin Mixin; la documentación lo dice. Las funciones nuevas de Reescritor
llevan pruebas JUnit en los tres mods (23 en cada uno).
…glés

Un script que le pasa a runCommand un comando de otro mod (p. ej.
`emberstextapi queue` o `/eta queue`) con una frase en inglés ya no pasa en
silencio: el informe «Qué queda en inglés» lo lista en una categoría nueva,
«comando». La app no conoce el formato de esos comandos y no los toca, porque
su texto va mezclado con etiquetas propias del mod.

Se detecta por comandos que no son de chat con cinco o más palabras y dos o
más palabras de enlace del inglés. Con los 20 modpacks del corpus y FC4 solo
salta en stormforge, que usa ese mod; no hay falsos positivos.
…on datos del servidor

El filtro miraba la ruta del .zip y no lo que lleva dentro, así que un datapack
comprimido en global_packs con logros o funciones traducidos no entraba en el
kit. Ahora un .zip cuenta por sus entradas (los que solo traen tips siguen
fuera, porque son de cliente).
…1 y 1.21.4

Cuatro combinaciones más de las más jugadas (por modpacks y descargas en
Modrinth): Forge 1.19.2, Fabric 1.19.4, Fabric 1.21.1 y Fabric 1.21.4. Cada
una con su gancho de chat, tooltips y botones leído del código real de su
versión, y 23 pruebas JUnit.

La lógica común sale de las copias: `mod-runtime/comun/` guarda la tabla y
tres variantes del reescritor según cómo guarda el texto cada versión
(literal, plano desde 1.20.3 y sin texto de reserva en 1.19.2).

Fabric 1.19.2 no puede tener mod: Fabric API no trae un evento de chat del
cliente en esa versión. La app lo dice con ese motivo en vez de «todavía no».
… de versiones vecinas

Fabric 1.21.5 (válido de 1.21.5 a 1.21.10) y Fabric 1.21.11, que renombra
ResourceLocation a Identifier. Con esto Fabric queda cubierto sin huecos de
1.21 a 1.21.11, más 1.19.4 y de 1.20 a 1.20.2.

Un mismo jar sirve para varias versiones cuando el mismo código compila y pasa
sus pruebas contra cada una: `construir_mod.py --propiedad` lo comprueba sin
generar jar, y el rango comprobado queda en `minecraft_range` de cada proyecto
y en `SOPORTADOS`. El código compilado sigue sin probarse dentro del juego.
Minecraft 26.x ya no está ofuscado: el proyecto usa Loom 1.19 sin remapeo,
Java 25 y `Screens.getWidgets` (antes `getButtons`). El mismo código compila y
pasa las pruebas contra 26.1, 26.1.1, 26.1.2, 26.2 y 26.3, y ese rango queda
declarado en el jar y en `SOPORTADOS`. 26.4 no se incluye: aún solo tiene
snapshots.

El CI instala también Java 25 para compilarlo. Las pruebas del reescritor para
1.21.5 en adelante ya no usan `ChatFormatting.getColor()`, que desaparece en
26.2. El código compilado sigue sin probarse dentro del juego.
Dos proyectos más: Fabric 1.20.4 (válido para 1.20.3 y 1.20.4, con el reescritor
de contenidos planos y el tooltip de tres parámetros) y Fabric 1.20.6 (válido
para 1.20.5 y 1.20.6, con el tooltip de cuatro parámetros). Con esto Fabric
queda cubierto sin huecos de 1.20 a 1.21.11.

Cada rango se comprobó compilando el mismo código y pasando sus pruebas contra
la versión vecina. El código compilado sigue sin probarse dentro del juego.
Quilt carga los mods de Fabric con Quilted Fabric API, que porta los cuatro
módulos que usa el mod (mensajes, pantallas, objetos y recarga de recursos).
La app instala el jar de Fabric en instancias de Quilt de 1.19.4, 1.20 a 1.20.2,
1.20.4, 1.20.6, 1.21 y 1.21.1, y el estado avisa de que no se ha probado en Quilt.

Para que Quilt pueda cargarlo, los mods de Fabric piden ahora esos cuatro módulos
en lugar de «fabric-api» y ya no exigen un fabricloader alto, porque el mod no usa
su API.
…ge 1.20.1

Tres proyectos nuevos de NeoForge: 1.21.4 (que cambió el evento para registrar la
recarga de recursos), 1.21.5 (válido también para 1.21.8 y 1.21.10) y 1.21.11
(que renombra ResourceLocation a Identifier). El de 1.21.1 ahora vale también
para 1.21 y 1.21.3, comprobado compilando y pasando las pruebas contra esas
versiones. NeoForge solo publicó esas versiones en la serie 1.21.

NeoForge 1.20.1 es un fork de Forge 1.20.1 y usa el jar de Forge; el estado
de la app avisa de que no se ha probado. El mínimo de NeoForge de cada jar
sale ahora de `neo_version_minimo` para poder declarar rangos.
Forge 1.18.2 tiene su propio proyecto: el texto aún es TextComponent y
TranslatableComponent (variante `reescritor-texto` del reescritor, con sus pruebas),
la recarga de recursos usa la API antigua y el evento de pantalla se llama
`ScreenEvent.InitScreenEvent`.

Fabric 1.18.2 no puede tener mod: Fabric API no trae un evento de chat del
cliente en esa versión, igual que en 1.19.2. La app lo dice con ese motivo.
Forge 1.16.5 corre con Java 8 y tiene su propio proyecto: usa los nombres antiguos
de las clases (ITextComponent, StringTextComponent, IResourceManager…), no tiene
evento para registrar recargas del cliente (se hace con el gestor de recursos en
FMLClientSetupEvent), no tiene tooltips por elementos y separa el código de
cliente con DistExecutor para no molestar a un servidor.

Para poder compartir `Tabla`, se reescribió sin nada posterior a Java 8 (Map.of,
String.strip, copyOf, patrones de instanceof, JsonParser.parseReader) con el mismo
comportamiento y las mismas pruebas. `construir_mod.py` compila este proyecto con
un JDK 8 que le pasa a Gradle como toolchain, y el CI instala Java 8.

Fabric 1.16.5 no puede tener mod: su Fabric API no trae evento de chat del cliente.
…talación del mod

En Forge 1.16.5 FMLClientSetupEvent se dispara durante la primera recarga de
recursos, así que un listener registrado ahí quedaba fuera de ella y la tabla no
se cargaba hasta recargar los recursos. Ahora se registra al construir el mod.

Instalar el mod de apoyo copia el nuevo antes de borrar los viejos, para no dejar
al jugador sin mod si la copia falla, y el estado avisa cuando el jar instalado es
de otra versión de Minecraft en vez de decir que todo está listo. En el CI Java 17
vuelve a ser el predeterminado tras instalar Java 8 y 25.

Una prueba nueva comprueba que cada versión de la tabla cae dentro del rango que
declara su proyecto, que ningún proyecto queda sin usar y que construir_mod.py
los conoce todos.
El wrapper de cada proyecto de mod-runtime descarga su propia distribución de
Gradle con un tiempo máximo de lectura de 10 segundos, y en el CI
`services.gradle.org` tardó más dos veces seguidas («Read timed out») al empezar
el primer proyecto. Se sube a 120 segundos en los 17 proyectos.
El CI falló tres veces seguidas al bajar la distribución de Gradle (dos «Read timed
out» y un HTTP 504 de GitHub), sin que el código tuviera nada que ver. Subir el
tiempo de espera del wrapper arregló el primer caso; esto cubre el resto:
`construir_mod.py` repite Gradle hasta 3 veces, pero solo si lo que falló es la red.
Un error de compilación o de una prueba se devuelve a la primera, sin reintento.

Se anotan en el CHANGELOG el kit de servidor con datapacks comprimidos y los
cambios de instalación del mod, y en CONTRIBUTING los reintentos y la prueba de
coherencia de versiones.
Al revisar las 6 pruebas del corpus que se saltaban, 3 tenían datos de texto reales
que la descarga no guardaba: logros de datapacks en la carpeta `resources/` de
Legacies, los datapacks de cada mundo en `saves/` y los de `config/paxi` de dos
modpacks que se bajaron antes de que esa carpeta entrara en la descarga.

`descargar_corpus.py` ahora baja la parte `data/` de `resources/` y los datapacks de
`saves/`, y la prueba del corpus copia esas dos carpetas. Con los cuatro modpacks
vueltos a bajar, las pruebas pasan sobre ellos (JSON y zips válidos, repetir no
cambia nada, restaurar devuelve los bytes originales) y quedan 3 saltadas, todas
justificadas: modpacks sin texto para el jugador.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant