katashi Posted November 18, 2023 Share Posted November 18, 2023 (edited) Hello, I want to translate the game monster tale into my language The text structure is quite simple header 8 bytes, - filesize-(something) 4byte, - pointers counter, 4byte - pointers table, 4byte * counter But editing manually will be very difficult and I'm not good at programming to write a program for it Someone please help me, thank you very much Note: i found the tool on this site: https://gbatemp.net/threads/trying-to-enable-hidden-unavailable-language-modes-in-nds-games.558533/page-2 but it only supports cp-1252, but i need utf 16 LE because cp-1252 won't be enough loctext_IntroCutscene_ENG_US.zip Edited November 18, 2023 by katashi Link to comment Share on other sites More sharing options...
Engineer Solution LinkOFF Posted November 18, 2023 Engineer Solution Share Posted November 18, 2023 Spoiler import os import sys import struct def writeInt32(f, val): f.write((val).to_bytes(4, byteorder='little')) def readInt32(f): return struct.unpack('<i', f.read(4))[0] def writeString(f, string): f.write(string.encode('utf-16le')) f.write(b'\x00\x00') def readString(f, pos): cur = f.tell() f.seek(pos) cstr = bytearray() while True: ch = f.read(2) if(ch == b'\x00\x00'): f.seek(cur) return str(cstr, "utf-16") cstr.extend(ch) def extract(file): f = open(file, 'rb') magic, start, length, num = struct.unpack('<4I', f.read(16)) text = '' for i in range(0, num): text += '%s\n' % readString(f, readInt32(f)).replace('\n', '<lf>') f.close() f = open('%s.txt' % file, 'w', encoding='utf-8') f.write(text) f.close() def build(file): f = open(file, 'r', encoding='utf-8') lines = f.readlines() f.close() f = open(os.path.splitext(file)[0], 'wb') f.seek(16 + (len(lines) * 4)) # calculate string table start offset and slice to it offsets = [] for line in lines: # store offsets and write lines itself offsets.append(f.tell()) writeString(f, line.strip('\n').replace('<lf>', '\n')) length = f.tell() - 0xC # for header # write header + offsets f.seek(0) writeInt32(f, 0x54434C) writeInt32(f, 0xC) writeInt32(f, length) writeInt32(f, len(lines)) for offset in offsets: writeInt32(f, offset) f.close() #extract('loctext_IntroCutscene_ENG_US.bin_') #build('loctext_IntroCutscene_ENG_US.bin.txt') 1 1 Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now