"""Build offline catalogs from AI-authored translations. No network access.""" import csv import json import re from pathlib import Path ROOT = Path(__file__).resolve().parents[1] OUT = ROOT / 'resources/localization' def main(): sources = json.loads((OUT/'source_strings.json').read_text(encoding='utf-8')) languages = ['de','es','en','fr'] catalogs = {code:{} for code in languages} for line in (OUT/'authored.tsv').read_text(encoding='utf-8').splitlines(): row=line.split('\t') if len(row)!=5: continue source=sources[int(row[0])] for code,value in zip(languages,row[1:]): catalogs[code][source]=value.replace('\\n','\n') for line in (OUT/'supplemental.tsv').read_text(encoding='utf-8').splitlines(): row=line.split('\t') if len(row)!=5: raise ValueError('Invalid supplemental row: '+line) for code,value in zip(languages,row[1:]): catalogs[code][row[0].replace('\\n','\n')]=value.replace('\\n','\n') with (OUT/'interface.csv').open(encoding='utf-8',newline='') as file: for row in list(csv.reader(file))[1:]: if len(row)!=6: continue for code in languages: catalogs[code][row[0]]=row[['pl','de','es','en','fr'].index(code)+1] for code in languages: token = re.compile(r'%(?:[0-9]*(?:\.[0-9]+)?[sdif]|%)') for source, target in catalogs[code].items(): if token.findall(source) != token.findall(target): raise ValueError('Format placeholders differ: '+code+' / '+source) (OUT/f'{code}_catalog.gd').write_text('# Generated by tools/build_localization.py; AI-authored, offline.\nextends RefCounted\nconst MESSAGES := '+json.dumps(catalogs[code],ensure_ascii=False,indent=2)+'\n',encoding='utf-8') missing=[(i,s) for i,s in enumerate(sources) if s not in catalogs['en'] and (i<659 or i>679)] print('Catalog:',len(catalogs['en']),'Missing:',len(missing)) for i,s in missing: print(str(i)+': '+s[:140].replace('\n',' / ')) if __name__=='__main__': main()