#!/usr/bin/env bash # ============================================================================ # translate_gap.sh — Traduce el "gap" marzo→ahora de feadulta a EN/FR/IT/PT. # # Hace TODO de una vez: comprobaciones previas, traduce las 15 cartas semanales # (marzo a junio) + sus artículos con Gemma local, remapea categorías y enseña # el recuento final. Idempotente y REANUDABLE: re-ejecutar es seguro (salta lo # ya traducido). NO publica nada (todo queda en borrador / draft). # # USO (un solo comando, en segundo plano): # nohup bash scripts/translate_gap.sh > /tmp/feadulta-gap.out 2>&1 & # Y para ver el progreso: # tail -f /tmp/feadulta-gap.log # # Ver issue rafa/feadulta#75. # ============================================================================ set -u cd "$(dirname "$0")/.." || { echo "No puedo entrar en el repo"; exit 1; } LOG=/tmp/feadulta-gap.log LANGS="en,fr,it,pt" # Cartas del gap (de más reciente a más antigua). Override opcional: CARTAS="45018" bash ... CARTAS="${CARTAS:-45018 44997 44975 44230 44229 44228 44090 44089 44088 44087 44086 44085 44084 44083 42590}" ts() { date '+%Y-%m-%d %H:%M:%S'; } say() { echo "[$(ts)] $*" | tee -a "$LOG"; } say "================ INICIO batch del gap (draft) ================" # 1) LM Studio + Gemma cargado say "Preflight 1/2: LM Studio / Gemma..." if ! curl -s --max-time 10 http://172.19.128.1:1234/v1/models 2>/dev/null | grep -q 'gemma-4-e4b'; then say "ERROR: LM Studio no responde o 'google/gemma-4-e4b' no está cargado." say " -> En Windows: abre LM Studio, carga 'google/gemma-4-e4b', server en 0.0.0.0:1234." exit 1 fi say " OK: Gemma disponible." # 2) Contenedores docker arriba say "Preflight 2/2: contenedores docker..." for cnt in wordpress-web wordpress-mysql; do if ! docker ps --format '{{.Names}}' | grep -qx "$cnt"; then say "ERROR: el contenedor '$cnt' no está arriba. Arranca el stack (docker compose up -d) y reintenta." exit 1 fi done say " OK: wordpress-web y wordpress-mysql arriba." # 3) Traducir cada carta + sus artículos N=$(echo $CARTAS | wc -w) i=0 for c in $CARTAS; do i=$((i+1)) say "=== Carta $c ($i/$N) -> $LANGS (draft) ===" python3 scripts/translate_post.py --carta "$c" --langs "$LANGS" --status draft 2>&1 | tee -a "$LOG" done # 4) Remap de categorías (idempotente, sin Gemma): mete cada traducción en la # categoría de su idioma (arregla el archivo de carta por idioma). say "Remapeando categorías de todas las traducciones..." docker cp scripts/remap_translation_cats.php wordpress-web:/tmp/remap_translation_cats.php >/dev/null 2>&1 docker exec wordpress-web php /tmp/remap_translation_cats.php 2>&1 | tee -a "$LOG" # 5) Recuento final por idioma say "Recuento final de traducciones por idioma (meta traduccion_origen):" docker exec wordpress-mysql mysql -uwordpress_user -pwordpress_pass wordpress_db -N -e " SELECT t.slug, COUNT(*) FROM wp_postmeta m JOIN wp_term_relationships tr ON m.post_id=tr.object_id JOIN wp_term_taxonomy tt ON tr.term_taxonomy_id=tt.term_taxonomy_id AND tt.taxonomy='language' JOIN wp_terms t ON tt.term_id=t.term_id WHERE m.meta_key='traduccion_origen' GROUP BY t.slug;" 2>/dev/null | tee -a "$LOG" say "================ FIN batch del gap ================" say "Todo en DRAFT. No se ha publicado nada. Avisa a Rafa para revisar antes de publicar." say "Log completo: $LOG"