mirror of https://github.com/stenzek/duckstation
				
				
				
			
			You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
	
	
		
			69 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			Python
		
	
			
		
		
	
	
			69 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			Python
		
	
#!/usr/bin/env python3
 | 
						|
 | 
						|
import os
 | 
						|
import re
 | 
						|
import xml.etree.ElementTree as ET
 | 
						|
 | 
						|
languages_to_update = [
 | 
						|
    "ja",
 | 
						|
    "ko",
 | 
						|
    "zh-cn",
 | 
						|
]
 | 
						|
 | 
						|
src_path = os.path.join(os.path.dirname(__file__), "..", "src", "duckstation-qt", "qttranslations.cpp")
 | 
						|
ts_dir = os.path.join(os.path.dirname(__file__), "..", "src", "duckstation-qt", "translations")
 | 
						|
 | 
						|
def parse_xml(path):
 | 
						|
    tree = ET.parse(path)
 | 
						|
    root = tree.getroot()
 | 
						|
    translations = ""
 | 
						|
    for node in root.findall("context/message/translation"):
 | 
						|
        if node.text:
 | 
						|
            translations += node.text
 | 
						|
 | 
						|
    ords = list(set([ord(ch) for ch in translations if ord(ch) >= 0x2000]))
 | 
						|
    if len(ords) == 0:
 | 
						|
        return ""
 | 
						|
 | 
						|
    # Try to organize it into ranges
 | 
						|
    ords.sort()
 | 
						|
    ord_pairs = []
 | 
						|
    start_ord = None
 | 
						|
    last_ord = None
 | 
						|
    for nord in ords:
 | 
						|
        if start_ord is not None and nord == (last_ord + 1):
 | 
						|
            last_ord = nord
 | 
						|
            continue
 | 
						|
        if start_ord is not None:
 | 
						|
            ord_pairs.append(start_ord)
 | 
						|
            ord_pairs.append(last_ord)
 | 
						|
        start_ord = nord
 | 
						|
        last_ord = nord
 | 
						|
 | 
						|
    if start_ord is not None:
 | 
						|
        ord_pairs.append(start_ord)
 | 
						|
        ord_pairs.append(last_ord)
 | 
						|
 | 
						|
    chars = "".join([chr(ch) for ch in ord_pairs])
 | 
						|
    return chars
 | 
						|
 | 
						|
def update_src_file(ts_file, chars):
 | 
						|
    ts_name = os.path.basename(ts_file)
 | 
						|
    pattern = re.compile('(// auto update.*' + ts_name + '.*\n[^"]+")[^"]*(".*)')
 | 
						|
    with open(src_path, "r", encoding="utf-8") as f:
 | 
						|
        original = f.read()
 | 
						|
        update = pattern.sub("\\1" + chars + "\\2", original)
 | 
						|
    if original != update:
 | 
						|
        with open(src_path, "w", encoding="utf-8") as f:
 | 
						|
            f.write(update)
 | 
						|
        print(f"Updated character list for {ts_file}.")
 | 
						|
    else:
 | 
						|
        print(f"Character list is unchanged for {ts_file}.")
 | 
						|
 | 
						|
if __name__ == "__main__":
 | 
						|
    for language in languages_to_update:
 | 
						|
        ts_file = os.path.join(ts_dir, f"duckstation-qt_{language}.ts")
 | 
						|
        chars = parse_xml(ts_file)
 | 
						|
        print(f"{language}: {len(chars)} character(s) detected.")
 | 
						|
        update_src_file(ts_file, chars)
 |