Autor Tema: Martian Memorandum (Traducción) [Testeando]  (Leído 4893 veces)

0 Usuarios y 3 Visitantes están viendo este tema.

Desconectado pakolmo

  • Webmasters
  • John Henry Eden
  • *****
  • Mensajes: 4986
  • País: es
  • Sexo: Masculino
  • Fecha de registro: Enero 16, 2015, 02:57:33 am
    • Ver Perfil
    • Parches Amateurs Aventuras Gráficas
Re: Martian Memorandum (Traducción) [En proceso]
« Respuesta #30 en: Noviembre 18, 2025, 14:41:54 pm »
Retocados los fallos que se hicieron en un primer testeo inicial.

Ahora dispongo de un script para exportar y reimportar los textos de los archivos dec a csv. Ahora solo tengo que modificar la 2a columna del csv y volver a importar, codificar y pasarlo al AP correspondiente moviendo punteros y verificarlo en el juego.

Imagino que esto está al 25%.


Desconectado walas74

  • Moderador Global
  • AMD Athlon
  • *****
  • Mensajes: 799
  • País: co
  • Fecha de registro: Septiembre 22, 2007, 14:58:22 pm
    • Ver Perfil
    • Email
Re: Martian Memorandum (Traducción) [En proceso]
« Respuesta #31 en: Noviembre 19, 2025, 22:11:29 pm »
No sé si somos conscientes de la hercúlea tarea que está haciendo pakolmo para traducir este juego y lo que le cuesta cada vez que hay que cambiar y corregir algún texto.

¡Así que animemos todos a pakolmo!



Desconectado pakolmo

  • Webmasters
  • John Henry Eden
  • *****
  • Mensajes: 4986
  • País: es
  • Sexo: Masculino
  • Fecha de registro: Enero 16, 2015, 02:57:33 am
    • Ver Perfil
    • Parches Amateurs Aventuras Gráficas
Re: Martian Memorandum (Traducción) [En proceso]
« Respuesta #32 en: Noviembre 20, 2025, 02:08:18 am »
Es muy problemático tener que retocar los archivos ya traducidos porque hay que descompactarlos, descomprimirlos, retocar, comprimir, compactar, sustituirlos y mover punteros en los archivos AP y verificarlo.

Es muy útil el script en python que me pasa los textos a un csv para exportar e importar.

dec_text_tool.py
Código: [Seleccionar]
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
dec_text_tool.py — extractor/importer de textos para binarios (.dec, etc.)
"""
import re, os, sys, csv, argparse, unicodedata
from typing import List, Tuple

BANNER = "dec_text_tool.py — extractor/importer de textos para binarios (.dec, etc.)"

def find_strings(data: bytes, minlen: int = 4) -> List[str]:
    pattern = rb"[ -~]{%d,}" % minlen
    return [m.decode("latin-1", errors="ignore") for m in re.findall(pattern, data)]

def strip_accents(s: str) -> str:
    nfkd = unicodedata.normalize("NFD", s)
    return "".join(ch for ch in nfkd if unicodedata.category(ch) != "Mn")

def apply_format(s: str, all_caps: bool=False, no_accents: bool=False, tilde_ny_to_star: bool=False, strip_inverted: bool=False) -> str:
    out = s
    if no_accents:
        out = strip_accents(out)
    if all_caps:
        out = out.upper()
    if strip_inverted:
        out = out.replace("¿", "").replace("¡", "")
    if tilde_ny_to_star:
        out = out.replace("Ñ", "*").replace("ñ", "*")
    return out

def unique_in_order(strings: List[str]) -> List[str]:
    seen = set()
    ordered = []
    for s in strings:
        if s not in seen:
            seen.add(s)
            ordered.append(s)
    return ordered

def write_txt(path: str, rows: List[str]) -> None:
    with open(path, "w", encoding="utf-8") as f:
        for r in rows:
            f.write(r + "\n")

def write_csv_pairs(path: str, pairs: List[Tuple[str, str]]) -> None:
    with open(path, "w", encoding="utf-8", newline="") as f:
        w = csv.writer(f)
        w.writerow(["ORIGINAL", "TRANSLATED"])
        for a, b in pairs:
            w.writerow([a, b])

def extract_cmd(args: argparse.Namespace) -> None:
    with open(args.input, "rb") as f:
        data = f.read()
    strings = find_strings(data, args.min_len)
    ordered = unique_in_order(strings)
    translated = [apply_format(s, args.all_caps, args.no_accents, args.tilde_ny_to_star, args.strip_inverted) for s in ordered] if args.prepare_formatted else [""] * len(ordered)
    base, _ = os.path.splitext(args.output)
    txt_path = base + ".txt"
    csv_path = base + ".csv"
    write_txt(txt_path, ordered)
    write_csv_pairs(csv_path, list(zip(ordered, translated)))
    print(f"[extract] Extraidas {len(ordered)} cadenas.")
    print(f"[extract] TXT:  {txt_path}")
    print(f"[extract] CSV:  {csv_path}")

def import_cmd(args: argparse.Namespace) -> None:
    with open(args.input, "rb") as f:
        data = f.read()
    pairs: List[Tuple[str, str]] = []
    with open(args.csv, "r", encoding="utf-8") as f:
        r = csv.DictReader(f)
        col_orig = None
        col_tran = None
        headers = [h.strip() for h in r.fieldnames] if r.fieldnames else []
        for h in headers:
            if h.lower() in ("original", "orig", "source", "english"):
                col_orig = h
            if h.lower() in ("translated", "traducido", "spanish", "es"):
                col_tran = h
        f.seek(0)
        r = csv.DictReader(f)
        for row in r:
            o = row.get(col_orig or "ORIGINAL", "")
            t = row.get(col_tran or "TRANSLATED", "")
            if o is None or t is None:
                continue
            o = o.strip("\r\n")
            t = t.strip("\r\n")
            if o == "":
                continue
            t_fmt = apply_format(t, args.all_caps, args.no_accents, args.tilde_ny_to_star, args.strip_inverted)
            if t_fmt == "" or t_fmt == o:
                continue
            pairs.append((o, t_fmt))
    pairs.sort(key=lambda p: len(p[0]), reverse=True)

    def replace_all(buf: bytes, orig: bytes, repl: bytes) -> bytes:
        i = 0
        out = bytearray()
        while True:
            idx = buf.find(orig, i)
            if idx == -1:
                out += buf[i:]
                break
            out += buf[i:idx]
            if args.mode == "expand":
                out += repl
            elif args.mode == "pad":
                if len(repl) < len(orig):
                    repl_p = repl + b" " * (len(orig) - len(repl))
                    out += repl_p
                else:
                    out += repl[: len(orig)]
            elif args.mode == "truncate":
                out += repl[: len(orig)]
            i = idx + len(orig)
        return bytes(out)

    buf = data
    total_replacements = 0
    deltas = []
    for o, t in pairs:
        ob = o.encode(args.encoding, errors="ignore")
        tb = t.encode(args.encoding, errors="ignore")
        buf2 = replace_all(buf, ob, tb)
        if buf2 != buf:
            total_replacements += 1
            deltas.append((o, len(tb) - len(ob)))
            buf = buf2

    out_path = args.output
    with open(out_path, "wb") as f:
        f.write(buf)
    rep_path = out_path + ".report.txt"
    with open(rep_path, "w", encoding="utf-8") as f:
        f.write(BANNER + "\n")
        f.write(f"Reemplazos aplicados: {total_replacements}\n")
        for o, d in deltas[:200]:
            f.write(f"- '{o[:80]}...'  delta_bytes={d}\n")
        if len(deltas) > 200:
            f.write(f"... ({len(deltas)-200} mas)\n")
    print(f"[import] Reemplazos aplicados: {total_replacements}")
    print(f"[import] SALIDA: {out_path}")
    print(f"[import] REPORTE: {rep_path}")

def build_arg_parser() -> argparse.ArgumentParser:
    p = argparse.ArgumentParser(description=BANNER)
    sub = p.add_subparsers(dest="cmd", required=True)

    p_ext = sub.add_parser("extract", help="Extrae cadenas a TXT/CSV")
    p_ext.add_argument("-i", "--input", required=True, help="Ruta del binario (.dec, etc.)")
    p_ext.add_argument("-o", "--output", required=True, help="Ruta base de salida (sin extension)")
    p_ext.add_argument("--min-len", type=int, default=4, help="Longitud minima de cadena (default=4)")
    p_ext.add_argument("--prepare-formatted", action="store_true", help="Rellena TRANSLATED con el texto formateado segun flags")
    p_ext.add_argument("--all-caps", action="store_true", help="Poner las cadenas en MAYUSCULA")
    p_ext.add_argument("--no-accents", action="store_true", help="Quitar acentos/diacriticos")
    p_ext.add_argument("--tilde-ny-to-star", action="store_true", help="Convertir Ñ/ñ en *")
    p_ext.add_argument("--strip-inverted", action="store_true", help="Quitar signos ¿ y ¡")
    p_ext.set_defaults(func=extract_cmd)

    p_imp = sub.add_parser("import", help="Importa traducciones desde CSV al binario")
    p_imp.add_argument("-i", "--input", required=True, help="Ruta del binario original")
    p_imp.add_argument("-c", "--csv", required=True, help="CSV con ORIGINAL y TRANSLATED")
    p_imp.add_argument("-o", "--output", required=True, help="Ruta del binario de salida")
    p_imp.add_argument("--encoding", default="latin-1", help="Codificacion para escribir (default=latin-1)")
    p_imp.add_argument("--mode", choices=["expand", "pad", "truncate"], default="expand",
                       help="expand cambia tamano; pad rellena/trunca a largo original; truncate trunca")
    p_imp.add_argument("--all-caps", action="store_true", help="Forzar MAYUSCULA en traducciones")
    p_imp.add_argument("--no-accents", action="store_true", help="Quitar acentos en traducciones")
    p_imp.add_argument("--tilde-ny-to-star", action="store_true", help="Ñ/ñ -> * en traducciones")
    p_imp.add_argument("--strip-inverted", action="store_true", help="Quitar ¿ y ¡ en traducciones")
    p_imp.set_defaults(func=import_cmd)

    return p

def main(argv: List[str]) -> None:
    parser = build_arg_parser()
    args = parser.parse_args(argv)
    args.func(args)

if __name__ == "__main__":
    main(sys.argv[1:])

USO extraer: dec_text_tool.py extract -i "block_002 - copia.dec" -o block2
USO importar: dec_text_tool.py import -i "block_002 - copia.dec" -c block2.csv -o salida


Traducción al 45%
« Última modificación: Noviembre 20, 2025, 02:10:14 am por pakolmo »

Conectado Pijin Pastrana

  • IBM PC
  • *
  • Mensajes: 117
  • País: cu
  • Fecha de registro: Enero 06, 2018, 08:39:33 am
    • Ver Perfil
    • Email
Re: Martian Memorandum (Traducción) [En proceso]
« Respuesta #33 en: Noviembre 21, 2025, 05:32:13 am »
Hay que quitarse el sombrero ante usted Maestro!!!!
Gracias por el esfuerzo y la creatividad!!

Desconectado ristatas

  • Deep Blue
  • ****
  • Mensajes: 963
  • País: es
  • Fecha de registro: Agosto 09, 2019, 19:00:53 pm
  • Chosen One Ready
    • Ver Perfil
    • Email
Re: Martian Memorandum (Traducción) [En proceso]
« Respuesta #34 en: Noviembre 21, 2025, 09:43:27 am »
Rediez, no hay quien te pare. Todo un estoico.  :huh:



Desconectado pakolmo

  • Webmasters
  • John Henry Eden
  • *****
  • Mensajes: 4986
  • País: es
  • Sexo: Masculino
  • Fecha de registro: Enero 16, 2015, 02:57:33 am
    • Ver Perfil
    • Parches Amateurs Aventuras Gráficas
Re: Martian Memorandum (Traducción) [TESTEANDO]
« Respuesta #35 en: Noviembre 21, 2025, 11:29:50 am »
Muchas gracias walas, pijin y ristatas!

Acabo de acabar de traducir todos los textos.
Empieza el testeo! Busco voluntarios que me indiquen fallos.

Desconectado JimRaynor

  • Apple II
  • *
  • Mensajes: 79
  • País: 00
  • Fecha de registro: Agosto 21, 2025, 15:41:27 pm
    • Ver Perfil
    • Email
Re: Martian Memorandum (Traducción) [Testeando]
« Respuesta #36 en: Noviembre 22, 2025, 01:31:02 am »
Menudo Artista estás hecho,

Felicidades y gracias por conseguirlo !

Desconectado pakolmo

  • Webmasters
  • John Henry Eden
  • *****
  • Mensajes: 4986
  • País: es
  • Sexo: Masculino
  • Fecha de registro: Enero 16, 2015, 02:57:33 am
    • Ver Perfil
    • Parches Amateurs Aventuras Gráficas
Re: Martian Memorandum (Traducción) [Testeando]
« Respuesta #37 en: Noviembre 22, 2025, 05:44:01 am »
Resulta que todo lo que hay en el exe, es intraducible. Porque el juego se hace un lío.

Así que tengo que dejar en inglés los destinos, los personajes y los objetos del inventario.

Desconectado pakolmo

  • Webmasters
  • John Henry Eden
  • *****
  • Mensajes: 4986
  • País: es
  • Sexo: Masculino
  • Fecha de registro: Enero 16, 2015, 02:57:33 am
    • Ver Perfil
    • Parches Amateurs Aventuras Gráficas
Re: Martian Memorandum (Traducción) [Testeando]
« Respuesta #38 en: Noviembre 22, 2025, 10:46:45 am »
Además del problemilla anterior hay que añadirle algunas imágenes intraducibles como un bocadillo de textos que ha aparecido en el café.

Desconectado pakolmo

  • Webmasters
  • John Henry Eden
  • *****
  • Mensajes: 4986
  • País: es
  • Sexo: Masculino
  • Fecha de registro: Enero 16, 2015, 02:57:33 am
    • Ver Perfil
    • Parches Amateurs Aventuras Gráficas
Re: Martian Memorandum (Traducción) [Testeando]
« Respuesta #39 en: Noviembre 22, 2025, 23:39:41 pm »
He tenido que repetir la traducción del EXE porque había algún fallo que yo no detectaba.
De nuevo el inventario y demás, están en su sitio traducidos.

PD: Como ya dije, han aparecido un par de bocadillos con textos en el juego. Éstos son intraducibles al ser imágenes o animaciones.

Desconectado walas74

  • Moderador Global
  • AMD Athlon
  • *****
  • Mensajes: 799
  • País: co
  • Fecha de registro: Septiembre 22, 2007, 14:58:22 pm
    • Ver Perfil
    • Email
Re: Martian Memorandum (Traducción) [Testeando]
« Respuesta #40 en: Noviembre 25, 2025, 08:19:57 am »
Termina tu testeo tranquilamente, yo puedo testearlo completo después del Willy Beamish.



Desconectado pakolmo

  • Webmasters
  • John Henry Eden
  • *****
  • Mensajes: 4986
  • País: es
  • Sexo: Masculino
  • Fecha de registro: Enero 16, 2015, 02:57:33 am
    • Ver Perfil
    • Parches Amateurs Aventuras Gráficas
Re: Martian Memorandum (Traducción) [Testeando]
« Respuesta #41 en: Noviembre 26, 2025, 03:31:23 am »
El juego dura unas 2 horas largas, yo ya he testeado y corregido los primeros 30 minutos de juego.

Desconectado walas74

  • Moderador Global
  • AMD Athlon
  • *****
  • Mensajes: 799
  • País: co
  • Fecha de registro: Septiembre 22, 2007, 14:58:22 pm
    • Ver Perfil
    • Email
Re: Martian Memorandum (Traducción) [Testeando]
« Respuesta #42 en: Noviembre 26, 2025, 16:37:21 pm »
Creo que eres muy optimista, yo he mirado y la duración media es de unas seis horas.



Desconectado pakolmo

  • Webmasters
  • John Henry Eden
  • *****
  • Mensajes: 4986
  • País: es
  • Sexo: Masculino
  • Fecha de registro: Enero 16, 2015, 02:57:33 am
    • Ver Perfil
    • Parches Amateurs Aventuras Gráficas
Re: Martian Memorandum (Traducción) [Testeando]
« Respuesta #43 en: Noviembre 26, 2025, 21:28:01 pm »
Da igual, tú y yo nos vamos a chupar el testeo durante más de esas 6 horas porque tenemos que revisarlo todo, hasta los fallos/muertes.

Estoy revisando una solución que dura 4 horas y voy por hora y media.
También reviso una solución que dura unas 2 horas y voy por 40 minutos segun esa.

Es muy posible que mi testeo no acabe durante este mes.

Desconectado pakolmo

  • Webmasters
  • John Henry Eden
  • *****
  • Mensajes: 4986
  • País: es
  • Sexo: Masculino
  • Fecha de registro: Enero 16, 2015, 02:57:33 am
    • Ver Perfil
    • Parches Amateurs Aventuras Gráficas
Re: Martian Memorandum (Traducción) [Testeando]
« Respuesta #44 en: Noviembre 29, 2025, 14:09:12 pm »
Retoqué el archivo mm.cfg para mejorar el sonido y no me acordaba. El resultado es que el "comlink" se queda pillado estés donde estés.

He estado retocando el EXE, el archivo W02.AP (comlink), intentandolo rejugar desde el principio pero el error al usar el comlink seguía sucediendo, incluso en otras pantallas anteriores.

Al final el error vino del mm.cfg, que vuelve a estar como al principio.

Seguimos con el testeo, que aún queda mucho.