コード例 #1
0
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
コード例 #2
0
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)
コード例 #3
0
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