#!/usr/bin/env python3 # Sync Language Packs # Script to synchronize each language pack's items against Wowchemy's master pack (English). # https://wowchemy.com # # Prerequisites: pip3 install PyYAML # # TODO: Switch from PyYAML to Ruamel in order to load/dump comments - # see https://stackoverflow.com/questions/47382227/python-yaml-update-preserving-order-and-comments import copy from pathlib import Path import yaml I18N_PATH = Path(__file__).resolve().parent.parent.joinpath('wowchemy').joinpath('i18n') MASTER_PACK = I18N_PATH.joinpath('en.yaml') # Load master language pack (English). with open(MASTER_PACK) as f: master_map = yaml.safe_load(f) # if (DEBUG) # print(master_map) # Iterate over each child language pack. cnt = 0 for filename in Path(I18N_PATH).glob("*.yaml"): if filename.stem != 'en': i18n_file = I18N_PATH.joinpath(filename) print(f"Processing {i18n_file} ...") # Load a child language pack. with open(i18n_file) as f: child_map = yaml.safe_load(f) # Synchronize the language pack's structure against the master language pack. tmp_map = copy.deepcopy(master_map) # Make a temporary deep copy of the master map (list of objects). master_index = 0 for master_item in master_map: translation = next((item['translation'] for item in child_map if item['id'] == master_item['id']), master_item['translation']) tmp_map[master_index]['translation'] = translation master_index += 1 # Write the synced language pack to file. with open(i18n_file, 'w') as f: # PyYAML will break lines unless a large column `width` is set. # To standardise with single quotes, add: `, default_style='\''`. # No option to only enforce single quotes when YAML string wrapped in quotes? yaml.dump(tmp_map, f, allow_unicode=True, width=float("inf")) cnt += 1 # Print results. print(f"{cnt} child language packs successfully synchronized!")