import sys, json, struct, os sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) from locres import parse, build def main(): src_path = sys.argv[1] # en locres (struktura nagusia) translations_path = sys.argv[2] # json [{ns,key,en,eu}] out_path = sys.argv[3] # output locres extra_path = sys.argv[4] if len(sys.argv) > 4 else None # bigarren iturburua (kate zaharrentzat) r = parse(open(src_path, 'rb').read()) src_lut = r['lut'] tr = {} for item in json.load(open(translations_path, encoding='utf-8')): tr[(item['ns'], item['key'])] = item['eu'] # Kultura/bertsio zaharreko kateak ere erantsi (union) extra_keys = {} # (ns, key) -> (key_hash, src_hash, en) if extra_path and os.path.exists(extra_path): rextra = parse(open(extra_path, 'rb').read()) elut = rextra['lut'] existing = {(ns, k) for _, ns, ks in r['namespaces'] for k, _, _, _ in ks} for _, ns, keys in rextra['namespaces']: for key, key_hash, src_hash, li in keys: if (ns, key) not in existing: en = elut[li] if 0 <= li < len(elut) else '' extra_keys[(ns, key)] = (key_hash, src_hash, en) new_ns = [] lut2 = [] lutmap = {} ns_hashes = [] for ns_hash, ns, keys in r['namespaces']: nk = [] for key, key_hash, src_hash, lut_index in keys: en = src_lut[lut_index] if 0 <= lut_index < len(src_lut) else '' eu = tr.get((ns, key), '') or en if eu not in lutmap: lutmap[eu] = len(lut2) lut2.append(eu) nk.append((key, key_hash, src_hash, lutmap[eu])) new_ns.append((ns, nk)) ns_hashes.append(ns_hash) # Extra kateak egokia den namespace-ari erantsi (edo sortu) extra_by_ns = {} for (ns, key), (kh, sh, en) in extra_keys.items(): extra_by_ns.setdefault(ns, []).append((key, kh, sh, en)) for ns, items in extra_by_ns.items(): nk = [] for key, kh, sh, en in items: eu = tr.get((ns, key), '') or en if eu not in lutmap: lutmap[eu] = len(lut2) lut2.append(eu) nk.append((key, kh, sh, lutmap[eu])) # lehendik badago namespace-a, gehitu; bestela sortu placed = False for i, (n, ks) in enumerate(new_ns): if n == ns: new_ns[i] = (n, ks + nk) placed = True break if not placed: new_ns.append((ns, nk)) ns_hashes.append(0) out = build(new_ns, lut2, ns_hashes) with open(out_path, 'wb') as f: f.write(out) print(f'wrote {out_path} ({len(out)} bytes, {len(lut2)} lut entries, {len(extra_keys)} extra keys)') if __name__ == '__main__': main()