Shiraga escribió:Una pena lo del Fate Samurai Remnant, poco más que decir.



#!/usr/bin/env python3
"""
FATE/SAMURAI REMNANT - SISTEMA COMPLETO DE TRADUCCIÓN - Si usais esto, podeis acreditar el trabajo a la atención de: Misweb0hM0ren0s
Extrae, traduce y reimporta textos con soporte UTF-8 para español
No se debe exceder el tamaño del texto por linea. Romperia el offset, aquí se complica la cosa, habria que ver el espacio libre en el fichero, y con un debugger anotar direccion y luego parchear en hex..., un rollo.
Quedaria pendiente la fuente, para quien quiera abordar el proyecto. Tampoco se si hay más texto en otros archivos, no he buscado.
Uso:
- Pega el script en la carpeta del juego \ebc8c781\fate_translate.py
- Ejecuta: python fate_translate.py 170b1e1e.bin extract
- Se generaran los ficheros: 170b1e1e.translation.json - 170b1e1e.translation.csv - 170b1e1e.translation.txt - 170b1e1e.edit.json
- Abre 170b1e1e.translation.csv en LibreOffice
- Traduce la columna "Traducción"
- Guarda el fichero como traducciones.csv con codificación UTF-8
- Ejecuta: python fate_translate.py 170b1e1e.bin import traducciones.csv
- Para verificar longitudes:
- python fate_translate.py 170b1e1e.bin verify
- python fate_translate.py 170b1e1e.bin preview
- Reimportar texto traducido al fichero 170b1e1e.bin
- python fate_translate.py 170b1e1e.bin reimport
"""
import os
import sys
import json
import csv
import shutil
from dataclasses import dataclass, asdict
from typing import List, Optional
from pathlib import Path
@dataclass
class TextEntry:
"""Representa un texto en el archivo"""
offset: int
original: str
translated: str = ""
length: int = 0
is_ui: bool = False
def get_bytes(self, use_translation=True):
"""Obtiene bytes del texto (original o traducido)"""
text = self.translated if use_translation and self.translated else self.original
# Siempre usar UTF-8 para soportar caracteres españoles
return text.encode('utf-8') + b'\x00'
@property
def translated_bytes(self):
"""Bytes de la traducción"""
if not self.translated:
return None
return self.translated.encode('utf-8') + b'\x00'
class FateTranslationSystem:
"""Sistema completo de gestión de traducciones"""
def __init__(self, bin_file: str):
self.bin_file = Path(bin_file)
self.backup_file = self.bin_file.with_suffix('.bin.backup')
self.project_file = self.bin_file.with_suffix('.translation.json')
self.entries: List[TextEntry] = []
if not self.bin_file.exists():
raise FileNotFoundError(f"Archivo no encontrado: {self.bin_file}")
# ==================== EXTRACCIÓN ====================
def extract_texts(self, min_length=3, max_length=500):
"""Extrae todos los textos del archivo .bin"""
print(f"🔍 Extrayendo textos de {self.bin_file.name}...")
with open(self.bin_file, 'rb') as f:
data = f.read()
self.entries.clear()
i = 0
total_size = len(data)
while i < total_size:
# Buscar inicio de texto (ASCII imprimible)
if 32 <= data[i] <= 126:
start = i
text_bytes = bytearray()
# Leer hasta encontrar byte 00
while i < total_size and data[i] != 0:
if 32 <= data[i] <= 126:
text_bytes.append(data[i])
i += 1
else:
# Carácter no-ASCII, terminar este texto
break
# Procesar si es un texto válido
if min_length <= len(text_bytes) <= max_length:
try:
# Intentar decodificar como UTF-8 (puede ser ASCII también)
text = text_bytes.decode('utf-8')
# Filtrar textos válidos
if self._is_valid_game_text(text):
is_ui = self._is_ui_text(text)
self.entries.append(TextEntry(
offset=start,
original=text,
length=len(text_bytes),
is_ui=is_ui
))
except UnicodeDecodeError:
# Si falla UTF-8, intentar ASCII
try:
text = text_bytes.decode('ascii')
if self._is_valid_game_text(text):
is_ui = self._is_ui_text(text)
self.entries.append(TextEntry(
offset=start,
original=text,
length=len(text_bytes),
is_ui=is_ui
))
except:
pass
# Buscar próximo byte 00
while i < total_size and data[i] != 0:
i += 1
else:
i += 1
# Ordenar por offset
self.entries.sort(key=lambda x: x.offset)
print(f"✅ Extraídos {len(self.entries)} textos")
print(f"📊 Estadísticas:")
print(f" - Textos de UI: {sum(1 for e in self.entries if e.is_ui)}")
print(f" - Diálogos: {sum(1 for e in self.entries if not e.is_ui)}")
# Guardar proyecto
self.save_project()
# Crear archivos para traducción
self.create_translation_files()
return self.entries
def _is_valid_game_text(self, text: str) -> bool:
"""Determina si el texto es válido para el juego"""
if len(text) < 2:
return False
# Debe contener letras
if not any(c.isalpha() for c in text):
return False
# Filtrar basura binaria común
garbage_patterns = [
r'^[A-Z]{4,}$', # ARCH, ALGB, etc.
r'^[a-z][A-Z].*[A-Z][a-z]', # aBcD
r'.*[0-9][A-Z][0-9][A-Z].*', # 1A2B
r'^[^aeiouAEIOU]{6,}$', # Sin vocales
]
import re
for pattern in garbage_patterns:
if re.match(pattern, text):
return False
# Demasiados símbolos raros
allowed_symbols = set(' .,!?;\':\"-()[]¿¡')
symbol_count = sum(1 for c in text if not c.isalnum() and c not in allowed_symbols)
if symbol_count > len(text) * 0.3: # Más del 30% símbolos raros
return False
return True
def _is_ui_text(self, text: str) -> bool:
"""Determina si es texto de interfaz de usuario"""
ui_keywords = [
'Press', 'Button', 'Key', 'Start', 'Menu', 'Option',
'Save', 'Load', 'Continue', 'Exit', 'Back', 'Yes', 'No',
'OK', 'Cancel', 'HP', 'MP', 'EXP', 'Level', 'Attack',
'Defense', 'Item', 'Skill', 'Map', 'Inventory'
]
text_upper = text.upper()
return any(keyword.upper() in text_upper for keyword in ui_keywords)
# ==================== GESTIÓN DE PROYECTO ====================
def save_project(self):
"""Guarda el proyecto de traducción en JSON"""
project_data = {
'source_file': str(self.bin_file),
'total_texts': len(self.entries),
'entries': [asdict(e) for e in self.entries]
}
with open(self.project_file, 'w', encoding='utf-8') as f:
json.dump(project_data, f, ensure_ascii=False, indent=2)
print(f"💾 Proyecto guardado: {self.project_file}")
def load_project(self):
"""Carga el proyecto desde JSON"""
if not self.project_file.exists():
print(f"❌ Proyecto no encontrado: {self.project_file}")
return False
with open(self.project_file, 'r', encoding='utf-8') as f:
project_data = json.load(f)
self.entries = [TextEntry(**e) for e in project_data['entries']]
print(f"✅ Proyecto cargado: {len(self.entries)} textos")
return True
# ==================== ARCHIVOS DE TRADUCCIÓN ====================
def create_translation_files(self):
"""Crea archivos para facilitar la traducción"""
# 1. Archivo CSV para Excel/Google Sheets
csv_file = self.bin_file.with_suffix('.translation.csv')
with open(csv_file, 'w', encoding='utf-8-sig', newline='') as f:
writer = csv.writer(f)
writer.writerow(['ID', 'Offset', 'Tipo', 'Original', 'Traducción', 'Notas', 'Longitud_Original'])
for i, entry in enumerate(self.entries, 1):
writer.writerow([
i,
f"0x{entry.offset:08X}",
'UI' if entry.is_ui else 'Dialogo',
entry.original,
entry.translated if entry.translated else '',
'',
entry.length
])
print(f"📊 CSV creado: {csv_file}")
# 2. Archivo TXT simple
txt_file = self.bin_file.with_suffix('.translation.txt')
with open(txt_file, 'w', encoding='utf-8') as f:
f.write(f"TRADUCCIÓN - {self.bin_file.name}\n")
f.write("=" * 80 + "\n\n")
for i, entry in enumerate(self.entries, 1):
f.write(f"[{i:04d}] {'[UI]' if entry.is_ui else '[DLG]'} ")
f.write(f"(0x{entry.offset:08X}, {entry.length} chars)\n")
f.write(f"ORIGINAL: {entry.original}\n")
f.write(f"TRADUCIR: {entry.translated if entry.translated else ''}\n")
f.write("-" * 60 + "\n\n")
print(f"📝 TXT creado: {txt_file}")
# 3. Archivo JSON para editores avanzados
json_edit_file = self.bin_file.with_suffix('.edit.json')
with open(json_edit_file, 'w', encoding='utf-8') as f:
json.dump([{
'id': i,
'offset': f"0x{e.offset:08X}",
'type': 'ui' if e.is_ui else 'dialogue',
'original': e.original,
'translation': e.translated,
'max_length': e.length
} for i, e in enumerate(self.entries, 1)], f, ensure_ascii=False, indent=2)
print(f"⚙️ JSON editable: {json_edit_file}")
def import_translation_csv(self, csv_file: str):
"""Importa traducciones desde un archivo CSV"""
csv_path = Path(csv_file)
if not csv_path.exists():
print(f"❌ Archivo CSV no encontrado: {csv_file}")
return False
print(f"📥 Importando traducciones desde {csv_path.name}...")
# Cargar proyecto si no está cargado
if not self.entries:
if not self.load_project():
return False
translations_imported = 0
try:
with open(csv_path, 'r', encoding='utf-8-sig') as f:
reader = csv.DictReader(f)
for row in reader:
try:
text_id = int(row['ID']) - 1 # Convertir a índice 0-based
if 0 <= text_id < len(self.entries):
translation = row['Traducción'].strip()
if translation:
self.entries[text_id].translated = translation
translations_imported += 1
except (ValueError, KeyError):
continue
print(f"✅ Importadas {translations_imported} traducciones")
# Guardar proyecto actualizado
self.save_project()
return True
except Exception as e:
print(f"❌ Error importando CSV: {e}")
return False
def import_translation_json(self, json_file: str):
"""Importa traducciones desde JSON editado"""
json_path = Path(json_file)
if not json_path.exists():
print(f"❌ Archivo JSON no encontrado: {json_file}")
return False
print(f"📥 Importando desde JSON...")
try:
with open(json_path, 'r', encoding='utf-8') as f:
imported_data = json.load(f)
translations_imported = 0
for item in imported_data:
try:
text_id = item['id'] - 1 # Convertir a índice 0-based
if 0 <= text_id < len(self.entries):
translation = item.get('translation', '').strip()
if translation:
self.entries[text_id].translated = translation
translations_imported += 1
except (KeyError, ValueError):
continue
print(f"✅ Importadas {translations_imported} traducciones")
self.save_project()
return True
except Exception as e:
print(f"❌ Error importando JSON: {e}")
return False
# ==================== REIMPORTACIÓN ====================
def create_backup(self):
"""Crea una copia de seguridad del archivo original"""
if self.backup_file.exists():
print(f"⚠️ Backup ya existe: {self.backup_file.name}")
return True
try:
shutil.copy2(self.bin_file, self.backup_file)
print(f"💾 Backup creado: {self.backup_file.name}")
return True
except Exception as e:
print(f"❌ Error creando backup: {e}")
return False
def restore_backup(self):
"""Restaura desde la copia de seguridad"""
if not self.backup_file.exists():
print(f"❌ Backup no encontrado: {self.backup_file.name}")
return False
try:
shutil.copy2(self.backup_file, self.bin_file)
print(f"↩️ Backup restaurado: {self.bin_file.name}")
return True
except Exception as e:
print(f"❌ Error restaurando backup: {e}")
return False
def reimport_texts(self, output_file: Optional[str] = None):
"""
Reimporta los textos traducidos al archivo .bin
¡ADVERTENCIA! Modifica el archivo original. Haz backup primero.
"""
# Verificar que hay traducciones
translated_entries = [e for e in self.entries if e.translated]
if not translated_entries:
print("⚠️ No hay textos traducidos para reimportar")
print(" Usa import_translation_csv() o edita el JSON primero")
return False
print(f"🚀 Reimportando {len(translated_entries)} textos traducidos...")
# Crear backup si no existe
if not self.backup_file.exists():
if not self.create_backup():
print("❌ No se pudo crear backup, abortando")
return False
# Determinar archivo de salida
output_path = Path(output_file) if output_file else self.bin_file
try:
# Leer el archivo original
with open(self.bin_file, 'rb') as f:
file_data = bytearray(f.read())
cambios_exitosos = 0
errores = []
for entry in translated_entries:
# Obtener bytes de la traducción (UTF-8)
try:
translated_bytes = entry.translated.encode('utf-8') + b'\x00'
except UnicodeEncodeError as e:
errores.append(f"0x{entry.offset:08X}: Error UTF-8: {e}")
continue
# Obtener bytes originales (para comparar espacio)
original_bytes = entry.original.encode('utf-8') + b'\x00'
# Calcular espacio disponible
espacio_disponible = self._calculate_available_space(file_data, entry.offset)
# Verificar que la traducción quepa
if len(translated_bytes) <= espacio_disponible:
# Reemplazar en el archivo
file_data[entry.offset:entry.offset + len(translated_bytes)] = translated_bytes
cambios_exitosos += 1
print(f" ✓ [{cambios_exitosos:04d}] 0x{entry.offset:08X}: "
f"'{entry.original[:30]}...' → '{entry.translated[:30]}...'")
else:
# Traducción demasiado larga
espacio_necesario = len(translated_bytes)
errores.append(
f"0x{entry.offset:08X}: "
f"Traducción muy larga ({espacio_necesario} > {espacio_disponible} bytes)"
)
# Mostrar resumen de errores
if errores:
print(f"\n⚠️ Errores encontrados ({len(errores)}):")
for error in errores[:5]:
print(f" {error}")
if len(errores) > 5:
print(f" ... y {len(errores)-5} más")
# Guardar archivo modificado
with open(output_path, 'wb') as f:
f.write(file_data)
print(f"\n✅ REIMPORTACIÓN COMPLETADA:")
print(f" Archivo modificado: {output_path.name}")
print(f" Textos reimportados: {cambios_exitosos}/{len(translated_entries)}")
print(f" Errores: {len(errores)}")
print(f" Backup disponible: {self.backup_file.name}")
if errores:
print(f"\n💡 Para textos demasiado largos:")
print(f" 1. Acorta la traducción")
print(f" 2. Usa abreviaturas")
print(f" 3. Mantén similar longitud al original")
return True
except Exception as e:
print(f"❌ Error crítico durante reimportación: {e}")
import traceback
traceback.print_exc()
# Intentar restaurar desde backup
print("\n⚠️ Intentando restaurar desde backup...")
self.restore_backup()
return False
def _calculate_available_space(self, data: bytearray, offset: int) -> int:
"""Calcula cuántos bytes hay disponibles hasta el próximo terminador (00)"""
i = offset
while i < len(data) and data[i] != 0:
i += 1
# Espacio desde offset hasta el byte 00 (inclusive)
if i < len(data):
return (i - offset) + 1
return 0
# ==================== HERRAMIENTAS ADICIONALES ====================
def preview_changes(self):
"""Muestra una vista previa de los cambios que se realizarán"""
if not self.entries:
if not self.load_project():
return
translated = [e for e in self.entries if e.translated]
if not translated:
print("⚠️ No hay textos traducidos")
return
print("👁️ VISTA PREVIA DE CAMBIOS")
print("=" * 100)
for entry in translated[:10]: # Mostrar solo primeros 10
original_len = len(entry.original.encode('utf-8'))
translated_len = len(entry.translated.encode('utf-8'))
print(f"\n📍 Offset: 0x{entry.offset:08X}")
print(f" Original ({original_len} bytes): {entry.original}")
print(f" Traducido ({translated_len} bytes): {entry.translated}")
print(f" Diferencia: {translated_len - original_len:+d} bytes")
if len(translated) > 10:
print(f"\n... y {len(translated) - 10} textos más")
print("\n" + "=" * 100)
def find_text(self, search_term: str):
"""Busca texto por contenido"""
if not self.entries:
if not self.load_project():
return []
results = []
search_lower = search_term.lower()
for entry in self.entries:
if search_lower in entry.original.lower():
results.append(entry)
if results:
print(f"🔍 Encontrados {len(results)} resultados para '{search_term}':")
for i, entry in enumerate(results[:5], 1):
print(f" {i}. [0x{entry.offset:08X}] {entry.original[:80]}...")
if len(results) > 5:
print(f" ... y {len(results) - 5} más")
else:
print(f"❌ No se encontró '{search_term}'")
return results
def verify_translation_lengths(self):
"""Verifica que las traducciones no sean demasiado largas"""
if not self.entries:
if not self.load_project():
return
print("📏 Verificando longitudes de traducciones...")
with open(self.bin_file, 'rb') as f:
data = f.read()
problemas = []
for entry in self.entries:
if entry.translated:
espacio_disponible = self._calculate_available_space(bytearray(data), entry.offset)
espacio_necesario = len(entry.translated.encode('utf-8')) + 1 # +1 para el byte 00
if espacio_necesario > espacio_disponible:
problemas.append({
'offset': entry.offset,
'original': entry.original,
'translated': entry.translated,
'needed': espacio_necesario,
'available': espacio_disponible
})
if problemas:
print(f"⚠️ {len(problemas)} traducciones son demasiado largas:")
for p in problemas[:5]:
print(f"\n Offset: 0x{p['offset']:08X}")
print(f" Original ({len(p['original'].encode('utf-8'))} bytes): {p['original']}")
print(f" Traducción ({p['needed']-1} bytes): {p['translated']}")
print(f" Necesita: {p['needed']} bytes, Disponible: {p['available']} bytes")
if len(problemas) > 5:
print(f"\n ... y {len(problemas)-5} más")
else:
print("✅ Todas las traducciones caben en el espacio disponible")
# ==================== INTERFAZ DE LÍNEA DE COMANDOS ====================
def main():
"""Interfaz principal de línea de comandos"""
print("=" * 70)
print(" FATE/SAMURAI REMNANT - SISTEMA CUASICOMPLETO DE TRADUCCIÓN. Por MisWeb0hM0renoh")
print("=" * 70)
if len(sys.argv) < 2:
print_help()
return
bin_file = sys.argv[1]
try:
system = FateTranslationSystem(bin_file)
if len(sys.argv) == 2:
# Modo por defecto: extraer
system.extract_texts()
elif len(sys.argv) >= 3:
command = sys.argv[2].lower()
if command == "extract":
system.extract_texts()
elif command == "import":
if len(sys.argv) < 4:
print("❌ Especifica archivo a importar")
print(" Ejemplo: python fate_translate.py archivo.bin import traducciones.csv")
return
import_file = sys.argv[3]
system.load_project()
if import_file.endswith('.csv'):
system.import_translation_csv(import_file)
elif import_file.endswith('.json'):
system.import_translation_json(import_file)
else:
print("❌ Formato no soportado. Usa .csv o .json")
elif command == "reimport":
system.load_project()
system.preview_changes()
print("\n⚠️ ¿Continuar con la reimportación? (s/n): ", end='')
if input().lower() == 's':
system.reimport_texts()
else:
print("❌ Reimportación cancelada")
elif command == "preview":
system.load_project()
system.preview_changes()
elif command == "find":
if len(sys.argv) < 4:
print("❌ Especifica texto a buscar")
print(" Ejemplo: python fate_translate.py archivo.bin find 'Press Any'")
return
search_term = ' '.join(sys.argv[3:])
system.find_text(search_term)
elif command == "verify":
system.load_project()
system.verify_translation_lengths()
elif command == "backup":
system.create_backup()
elif command == "restore":
print("⚠️ ¿Restaurar desde backup? Se perderán cambios. (s/n): ", end='')
if input().lower() == 's':
system.restore_backup()
else:
print("❌ Restauración cancelada")
elif command == "help":
print_help()
else:
print(f"❌ Comando desconocido: {command}")
print_help()
except FileNotFoundError as e:
print(f"❌ {e}")
except Exception as e:
print(f"❌ Error inesperado: {e}")
import traceback
traceback.print_exc()
def print_help():
"""Muestra ayuda de uso"""
print("\n📚 USO:")
print(" python fate_translate.py ARCHIVO.BIN [COMANDO] [ARGUMENTOS]\n")
print("📋 COMANDOS DISPONIBLES:")
print(" extract - Extrae todos los textos (comando por defecto)")
print(" import ARCHIVO - Importa traducciones desde CSV o JSON")
print(" reimport - Reimporta textos traducidos al .bin")
print(" preview - Muestra vista previa de cambios")
print(" find TEXTO - Busca texto por contenido")
print(" verify - Verifica longitudes de traducciones")
print(" backup - Crea copia de seguridad")
print(" restore - Restaura desde copia de seguridad")
print(" help - Muestra esta ayuda\n")
print("🚀 EJEMPLOS:")
print(" python fate_translate.py 170b1e1e.bin")
print(" python fate_translate.py 170b1e1e.bin extract")
print(" python fate_translate.py 170b1e1e.bin import traducciones.csv")
print(" python fate_translate.py 170b1e1e.bin reimport")
print(" python fate_translate.py 170b1e1e.bin find 'Press Any Button'\n")
print("💡 CONSEJOS:")
print(" 1. Siempre haz BACKUP antes de reimportar")
print(" 2. Las traducciones NO deben ser más largas que el original")
print(" 3. Usa UTF-8 para caracteres españoles (á, é, í, ó, ú, ñ)")
print(" 4. Edita el archivo CSV con Excel o Google Sheets")
if __name__ == "__main__":
main()
Shiraga escribió:@MetakWAR
Hostias. Pues @locoroco96 creo que consiguió extraer textos y se quedó ahí si no leí mal. Esto sería top. Eres miswebosmorenos??? xDDD
Edit: desde la completa ignorancia y completo desconocimiento escribo. Sin tener ni idea del proceso de traducir, ni de los programas... si alguien tradujese el texto...¿se podría localizar automaticamente las lineas que exceden el limite y editarlas manualmente para que quepan? Si es asi a mi no me importaria hacer ese trabajo sucio, intentaria una traducción manual más corta de esa línea o me comería letras omitibles por tal de que el texto quepa. No se si es a eso a lo que te refieres, si no es eso recojo cable xD
locoroco96 escribió:Shiraga escribió:@MetakWAR
Hostias. Pues @locoroco96 creo que consiguió extraer textos y se quedó ahí si no leí mal. Esto sería top. Eres miswebosmorenos??? xDDD
Edit: desde la completa ignorancia y completo desconocimiento escribo. Sin tener ni idea del proceso de traducir, ni de los programas... si alguien tradujese el texto...¿se podría localizar automaticamente las lineas que exceden el limite y editarlas manualmente para que quepan? Si es asi a mi no me importaria hacer ese trabajo sucio, intentaria una traducción manual más corta de esa línea o me comería letras omitibles por tal de que el texto quepa. No se si es a eso a lo que te refieres, si no es eso recojo cable xD
Nono, al final no lo intenté porque parecia complicado a la hora de volver a empaquetarlo.
Ahora al menos hay una herramienta, aunque lo de respetar el espacio debe ser jodido, ya que en inglés suele ser mas corta la frase que en español e igual es mucho lio.
Voy a pegar un vistazo.
Edito: He probado solo con dos lineas y ya se pasaba de longitud
Shiraga escribió:Una pena lo del Fate Samurai Remnant, poco más que decir.
nicolasotto escribió:Una consulta: he probado la traduccion del Trails in the Sky SC en formato de gog, la misma funciona de maravilla. Lo unico que queria comentar es que no aparece la letra ñ; por ej en vez de decir sueño - dice sueyno. Tal vez eso quizas se pueda corregir, sino de todas maneras es lo de menos. Y por ultimo queria preguntar si se pueden traducir los menues, items...
Muchas gracias y felicitaciones por la traduccion.
shadowman1 escribió:¿No quedaría mejor solo la n?
Tengo sueno.
nicolasotto escribió:Una consulta: he probado la traduccion del Trails in the Sky SC en formato de gog, la misma funciona de maravilla. Lo unico que queria comentar es que no aparece la letra ñ; por ej en vez de decir sueño - dice sueyno. Tal vez eso quizas se pueda corregir, sino de todas maneras es lo de menos. Y por ultimo queria preguntar si se pueden traducir los menues, items...
Muchas gracias y felicitaciones por la traduccion.
![brindis [beer]](/images/smilies/nuevos2/brindando.gif)
shadowman1 escribió:@Aion
Para eso hace falta alguien que controle de fuentes, imagino que tendrá una copia del texto con acentos, etc.
Tampoco vendría mal alguien que añada las fuentes latinas al Kingdom of the Dump, y el OPUS: Echo of Starsong para poder meter una versión con acentos y ñ.
Pero para eso hace falta gente que controle y este dispuesta a ayudar.
Por cierto el Journey of Realm Dawn Dew imagino que ya se podrá jugar, ya que la traducción IA está muy bien y bien consolidada, aunque eso no quita que haya que revisarlo y cambiar lo que no esta bien, aunque por suerte no hay mucho que cambiar, eso sí, el peor texto a revisar que me he encontrado con diferencia.

locoroco96 escribió:Yo probé esa herramienta (o otra muy parecida) pero nada..Había un paso de donde no conseguia pasar porque el .bat no hacia nada.
Ya se puede ver la primera línea de diálogo en el azure despues de traducir 82.000 líneas![]()
https://ibb.co/yc66447D
Ya sé que es la segunda parte, pero cuando me di cuenta ya la había empezado a traducir y ya no quería volver atrás
86.000/140.000
, anda que no me he comido la cabeza para intentar ayudaros con esto.. es la versión de NISA? malanior escribió:locoroco96 escribió:Yo probé esa herramienta (o otra muy parecida) pero nada..Había un paso de donde no conseguia pasar porque el .bat no hacia nada.
Ya se puede ver la primera línea de diálogo en el azure despues de traducir 82.000 líneas![]()
https://ibb.co/yc66447D
Ya sé que es la segunda parte, pero cuando me di cuenta ya la había empezado a traducir y ya no quería volver atrás
86.000/140.000
Con qué herramienta lo lograste?, anda que no me he comido la cabeza para intentar ayudaros con esto.. es la versión de NISA?

locoroco96 escribió:malanior escribió:locoroco96 escribió:Yo probé esa herramienta (o otra muy parecida) pero nada..Había un paso de donde no conseguia pasar porque el .bat no hacia nada.
Ya se puede ver la primera línea de diálogo en el azure despues de traducir 82.000 líneas![]()
https://ibb.co/yc66447D
Ya sé que es la segunda parte, pero cuando me di cuenta ya la había empezado a traducir y ya no quería volver atrás
86.000/140.000
Con qué herramienta lo lograste?, anda que no me he comido la cabeza para intentar ayudaros con esto.. es la versión de NISA?
Con el eddcompiler, la que llevo usando de momento
Lo de la versión no tengo ni idea de cual es
locoroco96 escribió:Yo probé esa herramienta (o otra muy parecida) pero nada..Había un paso de donde no conseguia pasar porque el .bat no hacia nada.
Ya se puede ver la primera línea de diálogo en el azure despues de traducir 82.000 líneas![]()
https://ibb.co/yc66447D
Ya sé que es la segunda parte, pero cuando me di cuenta ya había empezado a traducir y ya no quería volver atrás
86.000/140.000
locoroco96 escribió:Perdonad, en el azure no es eddcompiler, es con el calmare. Hacia dias que extraje los scripts de los juegos que tengo de trails y ya pensaba que era el eddcompiler. [jaja
https://github.com/Kyuuhachi/Aureole
locoroco96 escribió:Perdonad, en el azure no es eddcompiler, es con el calmare. Hacia dias que extraje los scripts de los juegos que tengo de trails y ya pensaba que era el eddcompiler. [jaja
https://github.com/Kyuuhachi/Aureole
Vli escribió:locoroco96 escribió:Perdonad, en el azure no es eddcompiler, es con el calmare. Hacia dias que extraje los scripts de los juegos que tengo de trails y ya pensaba que era el eddcompiler. [jaja
https://github.com/Kyuuhachi/Aureole
Me viene hasta bien que traduzcas primero el Azure, que es al que voy ahora y así puedo testearlo bien.
¿Puedo ir corrigiéndolo por mi cuenta o prefieres que vaya apuntando erratas?
Por cierto, como has encontrado la herramienta? Por más que hemos buscado varios no hemos dado nunca con ella.
Por cierto, si tienes pensado ponerte con el Cold Steel, había un proyecto iniciado por un equipo, creo que de Tradusquare, que se anunció en 2017 o así y nunca llegó a lanzarse, pero creo que la tradu si no se acabó quedó muy cerca. @kjavi me parece que estuvo en ese proyecto.
![más risas [+risas]](/images/smilies/nuevos/risa_ani3.gif)
PHANTASIA escribió:El Cold Steel lo tiene entre manos @Ancalagon el negro, la última vez que le pregunté me dijo que lo tenía casi acabado, así que si alguien se pone con algun Cold Steel que sea a partir del 2.
PeronchoCraft escribió:Buenas, podrian revisar la traduccion del Ai the somnium files nirvanA initiative, el texto del juego no avanza cada que hay una trivia, lo que en resumen hace el juego injugable, tambien se crashea al abrir el log.
Aion escribió:nicolasotto escribió:Una consulta: he probado la traduccion del Trails in the Sky SC en formato de gog, la misma funciona de maravilla. Lo unico que queria comentar es que no aparece la letra ñ; por ej en vez de decir sueño - dice sueyno. Tal vez eso quizas se pueda corregir, sino de todas maneras es lo de menos. Y por ultimo queria preguntar si se pueden traducir los menues, items...
Muchas gracias y felicitaciones por la traduccion.
Ese error es típico de los juegos Falcom "antiguos". Usan la codificación japonesa de caracteres (Shift-JIS) y no pillan ni la ñ ni las vocales acentuadas. Si es como el Ys VI el problema es solo con las minúsculas y debería poder arreglarse, aunque implica tocar la fuente del juego y la traducción.
. El nuevo esta más actualizado a los actuales estándares, es 'algo' mejor visualmente, y auto detecta rutas de steam y epic para aplicar las tradus automaticamente. Sigue teniendo el problema de no ser una aplicación firmada con certificado, pero para proyectos fanmade no voy a gastar pastuki.
.
locoroco96 escribió:Yo probé esa herramienta (o otra muy parecida) pero nada..Había un paso de donde no conseguia pasar porque el .bat no hacia nada.
Ya se puede ver la primera línea de diálogo en el azure despues de traducir 82.000 líneas![]()
https://ibb.co/yc66447D
Ya sé que es la segunda parte, pero cuando me di cuenta ya había empezado a traducir y ya no quería volver atrás
86.000/140.000
ocyrus escribió:locoroco96 escribió:Yo probé esa herramienta (o otra muy parecida) pero nada..Había un paso de donde no conseguia pasar porque el .bat no hacia nada.
Ya se puede ver la primera línea de diálogo en el azure despues de traducir 82.000 líneas![]()
https://ibb.co/yc66447D
Ya sé que es la segunda parte, pero cuando me di cuenta ya había empezado a traducir y ya no quería volver atrás
86.000/140.000
Dios mío … eres el amo de los amos ! Vas a ser legendario ! Esos juegos llevan en inglés 20 años y tú en unos días los has dejado en español !
Todos mis respetos
![más risas [+risas]](/images/smilies/nuevos/risa_ani3.gif)
Vli escribió:@locoroco96
Malakito consiguió traducir casi todo en el FC, pero era con ayuda de un dev que hizo las herramientas, no sé si se dignaría a facilitarlas para Zero/Azure y servirán las mismas
locoroco96 escribió:Vli escribió:@locoroco96
Malakito consiguió traducir casi todo en el FC, pero era con ayuda de un dev que hizo las herramientas, no sé si se dignaría a facilitarlas para Zero/Azure y servirán las mismas
La herramienta es translation framework2, pero solo funciona con el trails 1.



malanior escribió:locoroco96 escribió:Vli escribió:@locoroco96
Malakito consiguió traducir casi todo en el FC, pero era con ayuda de un dev que hizo las herramientas, no sé si se dignaría a facilitarlas para Zero/Azure y servirán las mismas
La herramienta es translation framework2, pero solo funciona con el trails 1.
Por si te sirve
Estoy usando falcom tools, y he podido extraer DT. Los archivos de magia están el el dt22
Con T magic converter puedes extraer el archivo t_magic._DT en un json, y supongo que habrá una vuelta de hacer lo inverso.
En la foto se puede ver Petrify Breath etc etc
Espero que os ayude!
locoroco96 escribió:malanior escribió:locoroco96 escribió:La herramienta es translation framework2, pero solo funciona con el trails 1.
Por si te sirve
Estoy usando falcom tools, y he podido extraer DT. Los archivos de magia están el el dt22
Con T magic converter puedes extraer el archivo t_magic._DT en un json, y supongo que habrá una vuelta de hacer lo inverso.
En la foto se puede ver Petrify Breath etc etc
Espero que os ayude!
Ostras!!
Voy a echarle un vistazo a esa herramienta. Ahora os cuento!
Gracias @malanior
locoroco96 escribió:ocyrus escribió:locoroco96 escribió:Yo probé esa herramienta (o otra muy parecida) pero nada..Había un paso de donde no conseguia pasar porque el .bat no hacia nada.
Ya se puede ver la primera línea de diálogo en el azure despues de traducir 82.000 líneas![]()
https://ibb.co/yc66447D
Ya sé que es la segunda parte, pero cuando me di cuenta ya había empezado a traducir y ya no quería volver atrás
86.000/140.000
Dios mío … eres el amo de los amos ! Vas a ser legendario ! Esos juegos llevan en inglés 20 años y tú en unos días los has dejado en español !
Todos mis respetos
No nos vegamos arriba que solo se puede traducir los diálogos
Los objetos, armas etc no encuentro forma de traducirlo.
malanior escribió:locoroco96 escribió:malanior escribió:
Por si te sirve
Estoy usando falcom tools, y he podido extraer DT. Los archivos de magia están el el dt22
Con T magic converter puedes extraer el archivo t_magic._DT en un json, y supongo que habrá una vuelta de hacer lo inverso.
En la foto se puede ver Petrify Breath etc etc
Espero que os ayude!
Ostras!!
Voy a echarle un vistazo a esa herramienta. Ahora os cuento!
Gracias @malanior
Es una maravilla la herramienta de extracción de falcom
PD: Creo que con esta maravilla podríamos tener voces también
, os echaría una mano pero ahora mismo estoy tirando de colirio gracias al último juego.
)![brindis [beer]](/images/smilies/nuevos2/brindando.gif)
kenyonmartin escribió:Enhorabuena por todo, sois el no va más, la pena es que el nuevo no se puede ,el TLOH: Trails Beyond the Horizon, pk llevo 5 horas de juego y hablan muchísimo en el y traducir de cabeza jajaja. Pero todo genial lo que haceis

locoroco96 escribió:Bueno. Os traigo novedades.
Los nombres de las artes ya se pueden traducir, al menos en el sc y 3rd. En el azure se extrae bien pero al empaquetarlo da fallo. Tengo que ver si tiene solución.
https://ibb.co/VpxB0RWt
(El "tear" se la a colado al traductor)
Gracias a @malanior por descubrir la herramienta, y ahora esta intentando hacer una para poder traducir los objetos. Mucha suerte
@shadowman1, ánimo.
elokillo escribió:Hola
Sabeis si se puede traducir el Deathbulge: Battle of the Bands
Gracias!