def translate_struct(ref_lang, target_lang, ref_struct, target_struct, db, token, parent_key=None): for k, v in ref_struct.items(): kp = k.split("|") kr = kp[0] full_key = kr if parent_key is None else f'{parent_key}.{kr}' if isinstance(v, str): kh = hash(v) rh = db.get(target_lang, full_key) if rh == kh: continue # translation is still up-to-date print( f"Translating {full_key} from {ref_lang} to {target_lang}...") try: if target_lang == ref_lang: translation = deserialize_text(serialize_text(v)) else: translation = deserialize_text( translate(serialize_text(v), ref_lang, target_lang, token)) except: print("Cannot translate, skipping...") continue target_struct[k] = translation db.set(target_lang, full_key, kh) else: if not isinstance(target_struct.get(k), dict): target_struct[k] = {} translate_struct(ref_lang, target_lang, v, target_struct[k], db, token, parent_key=full_key) return target_struct
def deserialize_struct(struct, translated=False): for k, v in struct.items(): if isinstance(v, str): if not translated: # we make a roundtrip to remove translation markup... struct[k] = deserialize_text(serialize_text(v)) # if there are <tr-snip> tags, we only return the text within them. if re.match(r".*<tr-snip>", v): snippets = [] for m in re.finditer(r"<tr-snip>([^<]+?)</tr-snip>", v): snippets.append(m.group(1).strip()) struct[k] = " ".join(snippets) else: deserialize_struct(v, translated=translated) return process_filters(struct)
def translate_struct(ref_lang, target_lang, translations, db, token): if not target_lang in translations: translations[target_lang] = {} for k, v in translations.get('$' + ref_lang, {}).items(): kp = k.split("|") kr = kp[0] kh = hash(v) rh = db.get(target_lang, kr) if rh == kh: continue #translation is still good print(f"Translating {kr} from {ref_lang} to {target_lang}...") try: if target_lang == ref_lang: translation = deserialize_text(serialize_text(v)) else: translation = deserialize_text( translate(serialize_text(v), ref_lang, target_lang, token)) except KeyboardInterrupt: raise except: continue translations[target_lang][kr] = translation db.set(target_lang, kr, kh) return translations