35 lines
2.0 KiB
Python
35 lines
2.0 KiB
Python
"""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()
|