Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
24 commits
Select commit Hold shift + click to select a range
737a7a8
feat(scripts): traducir mensajes de chat de KubeJS, logros y funciones
Consterna Nov 6, 2026
f629204
feat(datos): traducir datapacks, logros y tips en cualquier modpack e…
Consterna Nov 6, 2026
3f4d271
fix: endurecer lectura, escritura y errores tras la verificación por …
Consterna Nov 6, 2026
e86c883
feat(runtime): mod de apoyo para el texto escrito en el código de los…
Consterna Nov 6, 2026
3915312
feat: métodos de KubeJS por versión, formatos desconocidos, modo exha…
Consterna Nov 6, 2026
b93c013
feat(scripts): traducir lo que se pasa a funciones propias que solo m…
Consterna Nov 6, 2026
4fde5f1
feat: plantillas en el mod de apoyo, informe en cuadro y guardable, c…
Consterna Nov 8, 2026
f893d9c
feat(runtime): mod de apoyo para NeoForge 1.21.1
Consterna Nov 8, 2026
1c52543
feat(runtime): mod de apoyo para Fabric 1.20.1
Consterna Nov 8, 2026
3e32b5d
feat(runtime): el mod de apoyo también traduce botones de pantallas y…
Consterna Nov 8, 2026
1d638ea
feat(cobertura): avisar de los comandos de otros mods con texto en in…
Consterna Nov 8, 2026
039e5de
fix(exportar): el kit de servidor incluye los datapacks comprimidos c…
Consterna Nov 8, 2026
898ed6a
feat(runtime): mods de apoyo para Forge 1.19.2 y Fabric 1.19.4, 1.21.…
Consterna Nov 8, 2026
9de5f0a
feat(runtime): mods de apoyo para Fabric de 1.21.5 a 1.21.11 y rangos…
Consterna Nov 8, 2026
e45d595
feat(runtime): mod de apoyo para Fabric de 26.1 a 26.3
Consterna Nov 8, 2026
0ff3a9c
feat(runtime): mod de apoyo para Fabric de 1.20.3 a 1.20.6
Consterna Nov 8, 2026
589e494
feat(runtime): Quilt usa los mods de apoyo de Fabric
Consterna Nov 9, 2026
5f31438
feat(runtime): mods de apoyo para NeoForge de 1.21 a 1.21.11 y NeoFor…
Consterna Nov 9, 2026
1e669a3
feat(runtime): mod de apoyo para Forge 1.18.2
Consterna Nov 9, 2026
3220902
feat(runtime): mod de apoyo para Forge 1.16.5
Consterna Nov 9, 2026
a63ef5a
fix(runtime): registrar la recarga de 1.16.5 a tiempo y cuidar la ins…
Consterna Nov 9, 2026
bbb5c27
fix(ci): dar más tiempo a la descarga de Gradle en los proyectos de mod
Consterna Nov 9, 2026
d82b5da
fix(ci): reintentar la compilación de los mods cuando falla la red
Consterna Nov 9, 2026
cec841b
test(corpus): bajar y probar los datapacks de resources/ y de los mundos
Consterna Nov 9, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 21 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,27 @@ jobs:
- name: Puerta de calidad (ruff, pyright y pytest con el validador Java)
run: uv run python scripts/verificar.py

- uses: actions/setup-java@b843ebf9b913146b38da2eaa7aeddf76074ae1ad # v6.1.0
with:
distribution: temurin
java-version: "25" # Minecraft 26.x (Fabric 26.1) pide Java 25

- uses: actions/setup-java@b843ebf9b913146b38da2eaa7aeddf76074ae1ad # v6.1.0
with:
distribution: temurin
java-version: "8" # Minecraft 1.16.5 (Forge 1.16.5) se compila con Java 8

- uses: actions/setup-java@b843ebf9b913146b38da2eaa7aeddf76074ae1ad # v6.1.0
with:
distribution: temurin
java-version: "17" # ForgeGradle 6 (Forge 1.18.2, 1.19.2 y 1.20.1) pide Java 17

# Con las cuatro versiones instaladas (25, 8 y 17 aquí, 21 más arriba; la última, 17, es la predeterminada), el script elige la que pide cada mod
# (Forge 1.18.2, 1.19.2 y 1.20.1: Java 17; NeoForge 1.21.1 y Fabric hasta 1.21.11: Java 21; Fabric 26.1: Java 25; Forge 1.16.5 compila su código con Java 8)
# por las variables JAVA_HOME_8_X64, JAVA_HOME_17_X64, JAVA_HOME_21_X64 y JAVA_HOME_25_X64.
- name: Compilar los mods de apoyo (ModpackES Runtime) con sus pruebas
run: uv run python scripts/construir_mod.py

- name: Construir ModpackES.exe
run: uv run python scripts/construir_exe.py

Expand Down
4 changes: 4 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -31,3 +31,7 @@ build_exe.log
# Prototipo antiguo que quedó en la carpeta del proyecto (no forma parte de la app)
/traducir_mods.py
/TraductorModpacks/

# Herramientas de compilación del mod de apoyo (JDK, Gradle, caché de Forge) y su jar compilado
.herramientas/
src/traductor_es/recursos/mods/*.jar
35 changes: 35 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,41 @@ Todos los cambios importantes de ModpackES quedan en este archivo. El formato si

## [Sin publicar]

### Agregado

- **Texto escrito en el código de los mods** (opcional, apagado por defecto): la app traduce las frases que encuentra en el código Java de los
mods y las guarda en una tabla del resource pack; el nuevo mod de apoyo **ModpackES Runtime** (solo cliente, para Forge 1.16.5, 1.18.2, 1.19.2 y 1.20.1, NeoForge 1.20.1 y de 1.21 a 1.21.11, y Fabric 1.19.4, de 1.20 a 1.20.6, de 1.21 a 1.21.11 y de 26.1 a 26.3, y Quilt con los mods de Fabric hasta 1.21.1) las muestra en
español en el chat, la barra de acción, los tooltips y el texto de los botones de una pantalla al abrirla (en Forge y NeoForge también los tooltips que no son de objetos). No cambia el texto que una pantalla dibuja directamente. Solo cambia textos idénticos a los de la tabla. «Más ▸ Instalar el mod de apoyo» y
«Quitar el mod de apoyo», `modpackes instalar-runtime` y `--java` en `analizar` y `traducir`. El CI compila el mod con sus pruebas.

- **Mensajes de chat y datos de texto**, que antes quedaban en inglés:
- El texto de `tellraw`, `title`, `say`, `msg`, `tell` y `w` en las funciones (`.mcfunction`) y en lo que un script de
KubeJS manda con `runCommand` o `runCommandSilent`.
- Títulos y descripciones de logros, y los consejos de las pantallas de carga (mod Tips, en sus dos formatos).
- Mensajes que un script arma por partes (`mensaje += efecto.name; player.tell(mensaje)`), con sus tablas de nombres.
- `notify`, `kick`, `openChestGUI` y `openInventoryGUI` de KubeJS (métodos tomados del código de KubeJS 1.20 y 1.21).
- **Plantillas en el mod de apoyo:** una frase con datos variables escrita con `%s` o `%d` (p. ej. «Hello %s, welcome back!») se traduce y el mod la reconoce con cualquier dato («Hello Steve, welcome back!»). Se descartan las traducciones que cambian el orden de los datos o pierden alguno, y las plantillas con casi nada de texto fijo.
- **Informe «Qué queda en inglés»:** ahora se ve en un cuadro con las categorías separadas y se puede guardar (`Más ▸ Guardar el informe…`); `modpackes cobertura --json` lo escribe como JSON para otros programas. `Más ▸ Comprobar el mod de apoyo` dice si el mod está en `mods/`, si esta copia lo trae y si ya hay tabla de textos.
- **Modo exhaustivo** para los scripts de KubeJS (opcional, apagado por defecto; `--exhaustivo` y una casilla en «Opciones avanzadas»): traduce también toda frase que parezca texto aunque no se sepa dónde se muestra. Puede tocar lógica; todo queda con copia de seguridad. Nunca toca `console.log` ni comparaciones.
- **Funciones propias de un script que solo muestran texto** (`CreateStringTooltip(evento, objeto, texto)`, `crear(id, nombre)`…): se traduce lo que se les pasa en la posición de ese parámetro. Es conservador: si el parámetro se compara, se busca, se guarda, se devuelve, va en un id o en un comando, o la función se usa como valor o está repetida, no se toca nada. Un `id` junto a un `nombre` queda intacto. En un modpack real (TaidumCraft) pasó de 101 a 35 frases sin elegir.
- Los métodos de texto de KubeJS ahora dependen de la versión (`notify`, `openChestGUI`… solo donde existen), comprobados en el código de KubeJS de 1.12 a 26.x (`formatos/kubejs_api.py`).
- Mercado de Farming for Blockheads (`farmingforblockheads_compat`): se traducen los nombres de las pestañas.
- El informe «Qué queda en inglés» también avisa de carpetas de datos con frases en inglés cuyo formato la app no conoce.
- El informe también avisa de los comandos de otros mods (como `emberstextapi queue` o `/eta queue`) que llevan una frase en inglés dentro de un script: la app no conoce su formato y no los toca, pero ya no pasan en silencio.
- Estos datos se buscan por su estructura y no por la carpeta de un modpack: `kubejs/data`, `global_packs`, `datapacks`,
`config/openloader`, los datapacks de un mundo y cualquier otra con `data/<espacio>/functions/…`, sueltos o dentro de un `.zip`
(se reescribe el zip y se guarda el original). Los componentes de texto valen en JSON y en SNBT (1.21.5 y posteriores).
- **Más ▸ Qué queda en inglés** y `modpackes cobertura`: lista lo que no se puede traducir y por qué (frases de scripts cuyo uso
no se entiende y texto escrito en el código de los mods, leído de la tabla de constantes de cada clase). Solo lee.
El análisis avisa de las frases de scripts que parecen texto.
- Pruebas con modpacks públicos de Modrinth (16 más en `scripts/descargar_corpus.py`, de 1.16.5 a 26.x con Forge, NeoForge, Fabric y Quilt) y con la instancia propia: lo traducido
sigue siendo válido, repetir no cambia nada y restaurar devuelve los bytes originales.

### Cambiado

- El kit para servidores incluye las funciones y los logros traducidos dondequiera que estén, también los de un datapack comprimido (`.zip`); los `.zip` que solo traen tips siguen fuera porque son de cliente.
- «Instalar el mod de apoyo» copia el mod nuevo antes de borrar los viejos, para no dejarte sin mod si la copia falla, y «Estado del mod de apoyo» avisa cuando el jar instalado es de otra versión de Minecraft en lugar de decir que todo está listo.

## [2.2.0] - 2026-11-04

Interfaz nueva: una ventana guiada en pasos, con tarjetas y un solo botón principal, y un tema propio
Expand Down
28 changes: 27 additions & 1 deletion CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -78,12 +78,38 @@ referencia también baja el puntaje, así que revisa los ejemplos que lista el s
| `src/traductor_es/nucleo` | Marcadores de códigos, memoria y correcciones, glosario, variantes de español y el orquestador de traducción |
| `src/traductor_es/formatos` | Lectura y escritura sin pérdidas: SNBT, JSON, NBT, `.lang`, JavaScript y markdown |
| `src/traductor_es/fuentes` | Lanzadores, versión, loader, jars y prioridad de los resource packs |
| `src/traductor_es/modulos` | Misiones, libros, scripts y mods: qué se traduce y dónde se escribe |
| `src/traductor_es/modulos` | Misiones, libros, scripts, datos (funciones, logros, tips) y mods: qué se traduce y dónde se escribe; `cobertura.py` dice qué queda en inglés |
| `src/traductor_es/motores` | Gemini, el motor compatible con OpenAI, las instrucciones comunes a todos, la fábrica de motores y el simulador para pruebas |
| `src/traductor_es/salida` | Resource pack, `options.txt`, copias de seguridad y exportación |
| `src/traductor_es/validacion` | Reglas de calidad, revisión automática, medición con el banco de referencia y el validador con los parsers del juego (Java) |
| `src/traductor_es/ui` | La ventana y el editor de correcciones (PySide6) |

## Agregar un formato de texto nuevo

Los archivos de texto de datapacks y packs de recursos (funciones, logros, tips…) se reconocen por su ruta y su formato,
no por el modpack. Para agregar uno, escribe un `Formato` en `src/traductor_es/modulos/datos.py` (qué ruta lo reconoce,
cómo saca los textos y cómo los reescribe), cita su documentación en un comentario y agrega a `tests/` una prueba que
traduzca un caso real recortado, otra con algo que **no** debe tocarse y la de ida y vuelta (restaurar devuelve los bytes
originales). `uv run python scripts/descargar_corpus.py` baja partes de modpacks públicos de Modrinth a `.descargas/`
(Git lo ignora); `uv run pytest -m corpus` los usa para comprobar que lo traducido sigue siendo válido.
Solo se baja lo que lleva texto (misiones, scripts, `kubejs/data`, `global_packs`, `datapacks`, `config/openloader`, `config/paxi`,
la parte `data/` de `resources/` y los datapacks de cada mundo en `saves/`): si añades una carpeta nueva a `descargar_corpus.py`,
añádela también a `CARPETAS` en `tests/test_corpus_datos.py` y vuelve a bajar los modpacks que ya tenías, que no la traen.
Las 3 pruebas del corpus que se saltan son modpacks sin texto para el jugador (`technical-electrical`, `supernova-empires-2` y
los datapacks de `better-mc-neoforge-bmc5`).

## El mod de apoyo (Java)

Cada carpeta de `mod-runtime/` (`forge-1.16.5`, `forge-1.18.2`, `forge-1.19.2`, `forge-1.20.1`, `neoforge-1.21.1`, `neoforge-1.21.4`, `neoforge-1.21.5`, `neoforge-1.21.11`, `fabric-1.19.4`, `fabric-1.20.1`, `fabric-1.20.4`, `fabric-1.20.6`, `fabric-1.21.1`, `fabric-1.21.4`, `fabric-1.21.5`, `fabric-1.21.11`, `fabric-26.1`) es un mod solo de cliente que cambia, al mostrarlos, los textos que otros mods tienen en su código y que están en la tabla de la app. Todos comparten la lógica de tabla y plantillas, que vive en `mod-runtime/comun/` (la tabla es de todos; el reescritor tiene una variante por forma de guardar el texto: `reescritor-literal`, `reescritor-plano` para 1.20.3 en adelante, con `reescritor-plano-1215` solo para sus pruebas desde 1.21.5, donde cambió `ClickEvent`, y `reescritor-sin-reserva` para 1.19.2 `reescritor-texto` para 1.18.2, donde el texto aún es `TextComponent`, y `reescritor-1165` para 1.16.5, con los nombres antiguos de las clases, sin tooltips por elementos y en Java 8; por eso `Tabla` evita todo lo posterior a Java 8), y cada proyecto solo trae su gancho con el loader. Forge 1.16.5, 1.18.2, 1.19.2 y 1.20.1 se compilan con ForgeGradle 6 y Java 17 (el de 1.16.5 compila su código con un JDK 8, que `construir_mod.py` le pasa a Gradle como toolchain); NeoForge 1.21.1, con ModDevGradle, Gradle 9 y Java 21; Fabric, con Loom 1.17, Gradle 9 y Java 21 (los de 1.19.4, 1.20.1 y 1.20.4 quedan compilados para Java 17; los de 1.20.6 en adelante, para Java 21); Fabric 26.1, con Loom 1.19 sin remapeo (Minecraft 26.x ya no está ofuscado) y Java 25:

```
uv run python scripts/construir_mod.py [forge-1.16.5 | forge-1.18.2 | forge-1.19.2 | forge-1.20.1 | neoforge-1.21.1 | neoforge-1.21.4 | neoforge-1.21.5 | neoforge-1.21.11 | fabric-1.19.4 | fabric-1.20.1 | fabric-1.20.4 | fabric-1.20.6 | fabric-1.21.1 | fabric-1.21.4 | fabric-1.21.5 | fabric-1.21.11 | fabric-26.1]
```

Si Gradle falla por la red (por ejemplo, un «Read timed out» o un HTTP 5xx al bajar su distribución o Minecraft), el script lo reintenta hasta 3 veces; un error del código o de una prueba no se reintenta. El wrapper de cada proyecto espera hasta 120 s en esas descargas (`networkTimeout`). `tests/test_mod_apoyo_coherencia.py` comprueba que la tabla `SOPORTADOS`, los proyectos de `mod-runtime/` y los rangos de versiones que declaran coincidan, sin compilar nada.

Corre las pruebas de Java (JUnit) y deja el jar en `src/traductor_es/recursos/mods/` (Git lo ignora; el CI lo construye y `construir_exe.py` lo incluye). Un loader o versión nuevo es un proyecto nuevo en `mod-runtime/` (copia el más cercano y lee el código real de esa versión: los nombres de las clases y los eventos cambian), una entrada en `PROYECTOS` de `scripts/construir_mod.py` y otra en `SOPORTADOS` de `salida/mod_apoyo.py`. Un mismo jar puede servir para varias versiones vecinas si el mismo código compila y pasa las pruebas contra cada una: `uv run python scripts/construir_mod.py fabric-1.21.5 --propiedad minecraft_version=1.21.8 --propiedad fabric_api_version=0.136.1+1.21.8 --propiedad loader_version=0.16.13` lo comprueba sin generar jar, y el rango comprobado va en `minecraft_range` del proyecto y en `SOPORTADOS`. Quilt no tiene proyectos propios: carga los mods de Fabric con Quilted Fabric API, y `_VERSIONES_DE_QUILT` lista las versiones donde esa API existe. Si una versión no puede tener mod, se anota en `IMPOSIBLES` con el motivo (Fabric 1.16.5, 1.18.2 y 1.19.2 no tienen evento de chat del cliente).

## Licencia de las contribuciones

ModpackES usa la licencia [GPL-3.0-or-later](LICENSE). Al mandar un cambio aceptas que se publique bajo esa
Expand Down
11 changes: 10 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,9 @@ y **cualquier lanzador**, y escribe a la vez las siete variantes de español del
| Textos de mods (objetos, bloques, menús, tooltips) | `lang/*.json` (1.13+) y `.lang` (1.12 y antes), incluidos los jars anidados, KubeJS y los resource packs del modpack | Resource pack `Traduccion_ES` |
| Misiones | FTB Quests (texto en los capítulos, carpeta `lang/` de 1.21+ y NBT de 1.12), BetterQuesting, HQM, Heracles | En su sitio, con copia de seguridad |
| Libros guía | Patchouli, Mantle (Tinkers), Citadel (Alex's Mobs), GuideME (AE2), Lavender. Modonomicon va por claves de idioma | Resource pack (o en su sitio, si es un libro propio del modpack) |
| Scripts de KubeJS | Lo que ve el jugador: `tell`, `displayName`, `Text.of`, tooltips, información de JEI/REI/EMI | En su sitio, con copia de seguridad |
| Scripts de KubeJS | Lo que ve el jugador: `tell`, `notify`, `displayName`, `Text.of`, tooltips, información de JEI/REI/EMI, los mensajes armados por partes antes de un `tell`, y el texto de `tellraw`, `title` y `say` en `runCommand` | En su sitio, con copia de seguridad |
| Datapacks y tips | Funciones (`.mcfunction`: `tellraw`, `title`, `say`), títulos y descripciones de logros, y consejos de pantalla de carga (mod Tips). Se buscan por su estructura (`data/<espacio>/functions/…`), estén en `kubejs/data`, `global_packs`, `datapacks`, `config/openloader` o en los datapacks de un mundo, sueltos o dentro de un `.zip`. Los componentes de texto valen en JSON (hasta 1.21.4) y en SNBT (desde 1.21.5) | En su sitio, con copia de seguridad |
| Texto escrito en el código de los mods | Mensajes de chat, de la barra de acción, tooltips y texto de botones que un mod tiene en su código Java. Un resource pack no los alcanza: la app los traduce a una tabla que lee el mod de apoyo **ModpackES Runtime** (solo cliente, Forge 1.16.5, 1.18.2, 1.19.2 y 1.20.1, NeoForge 1.20.1 y de 1.21 a 1.21.11, y Fabric 1.19.4, de 1.20 a 1.20.6, de 1.21 a 1.21.11 y de 26.1 a 26.3) | Tabla en el resource pack; el mod se instala solo si lo pides |

Lo que el mod ya trae en español no se toca, y si existe una variante (por ejemplo `es_es`) se copia a las
demás sin gastar. Los libros antiguos de Patchouli que guardan el texto dentro del jar no se pueden traducir
Expand Down Expand Up @@ -84,6 +86,12 @@ traducir indicando el error. La nueva traducción tiene que pasar las mismas reg
Tus correcciones nunca se revisan. Sube el costo de esos textos (el análisis lo incluye) y sus marcas no son
infalibles: sirven para decidir qué rehacer, no como nota de calidad.

**Texto del código de los mods** (opcional): activa «Incluir texto escrito en el código de los mods» en «Opciones avanzadas» y pulsa **Más ▸ Instalar el mod de apoyo**. La app traduce las frases que encuentra en el código de los mods y el mod de apoyo las muestra en español en el chat, la barra de acción y los tooltips. Solo cambia un texto si es **idéntico** al de la tabla (no hay traducción en vivo ni en internet), reconoce frases con datos escritos con `%s` o `%d` como plantillas, cambia también el texto de los botones de una pantalla al abrirla y, en Forge y NeoForge, los tooltips que no son de objetos; el texto que una pantalla dibuja directamente no se puede cambiar sin Mixin y no se toca; por ahora existe para Forge 1.16.5, 1.18.2, 1.19.2 y 1.20.1, NeoForge 1.20.1 y de 1.21 a 1.21.11, y Fabric 1.19.4, de 1.20 a 1.20.6, de 1.21 a 1.21.11 y de 26.1 a 26.3. Quilt usa los mods de Fabric con Quilted Fabric API (hasta 1.21.1) y no se ha probado en Quilt. Para Fabric 1.16.5, 1.18.2 y 1.19.2 no puede existir: Fabric API no tiene un evento de chat del cliente en esas versiones, y la app lo dice. **Más ▸ Quitar el mod de apoyo** lo retira de la carpeta mods; en la línea de comandos: `modpackes instalar-runtime RUTA [--quitar]` y `--java` en `analizar` y `traducir`. Para comprobarlo en el juego, con el mod instalado y el juego en español, escribe `/tellraw @s "TPA request expired!"` (o cualquier frase de la tabla).

**Modo exhaustivo de scripts** (opcional, en «Opciones avanzadas» o con `--exhaustivo`): traduce también las frases de los scripts de KubeJS cuyo uso no se entiende (por ejemplo textos que pasan por una función propia del pack). Puede tocar lógica del script, por eso viene apagado; todo queda con copia de seguridad y se restaura con «Restaurar el original».

**Más ▸ Qué queda en inglés** (o `modpackes cobertura RUTA [--java]`) lista lo que no se traduce y por qué, sin cambiar nada: frases de scripts cuyo uso no se entiende, frases dentro de comandos de otros mods (p. ej. `emberstextapi queue`), cuyo formato la app no conoce y por eso no toca, y texto escrito en el código de los mods, que un resource pack no puede alcanzar. El análisis ya avisa de las frases de scripts.

**Más ▸ Restaurar el original** devuelve misiones, scripts y libros propios al texto del modpack. Para quitar
la traducción de los mods basta con desactivar el resource pack.

Expand Down Expand Up @@ -182,6 +190,7 @@ uv run modpackes instancias
uv run modpackes analizar "RUTA DE LA INSTANCIA"
uv run modpackes traducir "RUTA" [--dialecto es_es] [--solo misiones,libros] [--lotes] [--modelo gemini-3.5-flash-lite] [--contexto "granja acogedora"] [--revisar]
uv run modpackes restaurar "RUTA"
uv run modpackes cobertura "RUTA" [--java] # qué queda en inglés y por qué (solo lee)
uv run modpackes clave guardar [--motor openrouter]
uv run modpackes modelos [--motor ollama]
```
Expand Down
Loading
Loading