diff options
| author | Brad Payne (Vir Linden) <vir@lindenlab.com> | 2020-09-10 18:58:41 +0100 | 
|---|---|---|
| committer | Brad Payne (Vir Linden) <vir@lindenlab.com> | 2020-09-10 18:58:41 +0100 | 
| commit | 932f66929db5e7a5afae1f547408388cdc680709 (patch) | |
| tree | bbfc91e5127d6a6aac4c38f23e2bc731c7c8de1a | |
| parent | 8d1aa99e80f7354af4810e563649ca1ee31f2e1a (diff) | |
SL-13705 - support multiple or all languages. more logic for excluding irrelevant fields
| -rw-r--r-- | scripts/code_tools/modified_strings.py | 130 | 
1 files changed, 88 insertions, 42 deletions
| diff --git a/scripts/code_tools/modified_strings.py b/scripts/code_tools/modified_strings.py index 77954637a4..eee20cf83b 100644 --- a/scripts/code_tools/modified_strings.py +++ b/scripts/code_tools/modified_strings.py @@ -33,6 +33,7 @@ import os  import sys  from git import Repo, Git # requires the gitpython package  import pandas as pd +import re  translate_attribs = [      "title", @@ -75,14 +76,23 @@ def failure(*msg):      print(*msg)      sys.exit(1) -def can_translate(val): +def should_translate(filename, val):      if val is None:          return False +    if "floater_test" in filename: +        return False +    if "TestString PleaseIgnore" in val: +        return False +    if len(val) == 0: +        return False      if val.isspace():          return False      val = val.strip()      if val.isdigit():          return False +    if re.match(r"^\s*\d*\s*x\s*\d*\s*$", val): +        print(val, "matches resolution string, will ignore") +        return False      return True  usage_msg="""%(prog)s [options] @@ -105,36 +115,7 @@ project.  """ -if __name__ == "__main__": - -    parser = argparse.ArgumentParser(description="analyze viewer xui files for needed translations", usage=usage_msg) -    parser.add_argument("-v","--verbose", action="store_true", help="verbose flag") -    parser.add_argument("--rev", help="revision with modified strings, default HEAD", default="HEAD") -    parser.add_argument("--rev_base", help="previous revision to compare against, default master", default="master") -    parser.add_argument("--base_lang", help="base language, default en (useful only for testing)", default="en") -    parser.add_argument("--lang", help="target language") -    args = parser.parse_args() - -    cwd = os.getcwd() -    rootdir = Git(cwd).rev_parse("--show-toplevel") -    repo = Repo(rootdir) -    try: -        mod_commit = repo.commit(args.rev) -    except: -        failure(args.rev,"is not a valid commit") -    try: -        base_commit = repo.commit(args.rev_base) -    except: -        failure(args.rev_base,"is not a valid commit") - -    mod_tree = mod_commit.tree -    base_tree = base_commit.tree - -    xui_base = "indra/newview/skins/default/xui" -    xui_base_tree = mod_tree[xui_base] -    valid_langs = [tree.name.lower() for tree in xui_base_tree if tree.name.lower() != args.base_lang.lower()] -    if not args.lang or not args.lang.lower() in valid_langs: -        failure("Please specify a target language using --lang. Valid values are", ",".join(sorted(valid_langs))) +def make_translation_spreadsheet(mod_tree, base_tree, lang, args):      xui_path = "{}/{}".format(xui_base, args.base_lang)      try: @@ -145,11 +126,10 @@ if __name__ == "__main__":      if args.rev == args.rev_base:          failure("Revs are the same, nothing to compare") -    print("Finding changes in", args.rev, "not present in", args.rev_base) -    sys.stdout.flush()      data = []      # For all files to be checked for translations +    all_en_strings = set()      for mod_blob in mod_xui_tree.traverse():          filename = mod_blob.path          if mod_blob.type == "tree": # directory, skip @@ -166,7 +146,7 @@ if __name__ == "__main__":              base_blob = None          try: -            transl_filename = filename.replace("/xui/{}/".format(args.base_lang), "/xui/{}/".format(args.lang)) +            transl_filename = filename.replace("/xui/{}/".format(args.base_lang), "/xui/{}/".format(lang))              transl_blob = mod_tree[transl_filename]          except:              if args.verbose: @@ -179,29 +159,43 @@ if __name__ == "__main__":          rows = 0          for name in mod_dict.keys(): -            if not name in base_dict or mod_dict[name].text != base_dict[name].text: +            if not name in base_dict or mod_dict[name].text != base_dict[name].text or (args.missing and not name in transl_dict):                  val = mod_dict[name].text -                if can_translate(val): +                if should_translate(filename, val):                      transl_val = "--"                      if name in transl_dict:                          transl_val = transl_dict[name].text -                    data.append([filename, name, "text", val, transl_val, ""]) +                    if val in all_en_strings: +                        new_val = "(DUPLICATE)" +                    else: +                        new_val = "" +                    data.append([filename, name, "text", val, transl_val, new_val]) +                    all_en_strings.add(val)                      rows += 1              for attr in translate_attribs:                  if attr in mod_dict[name].attrib: -                    if name not in base_dict or attr not in base_dict[name].attrib or mod_dict[name].attrib[attr] != base_dict[name].attrib[attr]: +                    if name not in base_dict \ +                    or attr not in base_dict[name].attrib \ +                    or mod_dict[name].attrib[attr] != base_dict[name].attrib[attr] \ +                    or (args.missing and (not name in transl_dict or not attr in transl_dict[name].attrib)):                          val = mod_dict[name].attrib[attr] -                        if can_translate(val): +                        if should_translate(filename, val): +                            show_val = val                              transl_val = "--"                              if name in transl_dict and attr in transl_dict[name].attrib:                                  transl_val = transl_dict[name].attrib[attr] -                            data.append([filename, name, attr, val, transl_val, ""]) +                            if val in all_en_strings: +                                new_val = "(DUPLICATE)" +                            else: +                                new_val = "" +                            data.append([filename, name, attr, show_val, transl_val, new_val]) +                            all_en_strings.add(val)                              rows += 1          if args.verbose and rows>0:              print("    ",rows,"rows added") -    outfile = "SL_Translations_{}.xlsx".format(args.lang.upper()) -    cols = ["File", "Element", "Field", "EN", "Previous Translation ({})".format(args.lang.upper()), "ENTER NEW TRANSLATION ({})".format(args.lang.upper())] +    outfile = "SL_Translations_{}.xlsx".format(lang.upper()) +    cols = ["File", "Element", "Field", "EN", "Previous Translation ({})".format(lang.upper()), "ENTER NEW TRANSLATION ({})".format(lang.upper())]      num_translations = len(data)      df = pd.DataFrame(data, columns=cols)      df.to_excel(outfile, index=False) @@ -209,3 +203,55 @@ if __name__ == "__main__":          print("Wrote", num_translations, "rows to file", outfile)      else:          print("Nothing to translate,", outfile, "is empty") +     +if __name__ == "__main__": + +    parser = argparse.ArgumentParser(description="analyze viewer xui files for needed translations", usage=usage_msg) +    parser.add_argument("-v","--verbose", action="store_true", help="verbose flag") +    parser.add_argument("--missing", action="store_true", default = False, help="include all fields for which a translation does not exist") +    parser.add_argument("--rev", help="revision with modified strings, default HEAD", default="HEAD") +    parser.add_argument("--rev_base", help="previous revision to compare against, default master", default="master") +    parser.add_argument("--base_lang", help="base language, default en (normally leave unchanged - other values are only useful for testing)", default="en") +    parser.add_argument("--lang", help="target languages, or all", nargs="+") +    args = parser.parse_args() + +    cwd = os.getcwd() +    rootdir = Git(cwd).rev_parse("--show-toplevel") +    repo = Repo(rootdir) +    try: +        mod_commit = repo.commit(args.rev) +    except: +        failure(args.rev,"is not a valid commit") +    try: +        base_commit = repo.commit(args.rev_base) +    except: +        failure(args.rev_base,"is not a valid commit") + +    print("Will identify changes in", args.rev, "not present in", args.rev_base) +    if args.missing: +        print("Will also include any text for which no corresponding translation exists, regardless of when it was added") +    sys.stdout.flush() + +    mod_tree = mod_commit.tree +    base_tree = base_commit.tree + +    xui_base = "indra/newview/skins/default/xui" +    xui_base_tree = mod_tree[xui_base] +    valid_langs = [tree.name.lower() for tree in xui_base_tree if tree.name.lower() != args.base_lang.lower()] +    langs = [l.lower() for l in args.lang] +    if "all" in args.lang: +        langs = valid_langs + +    for lang in langs: +          if not lang in valid_langs: +              failure("Unknown target language {}. Valid values are {} or all".format(lang,",".join(sorted(valid_langs)))) +           +    print("Target language(s) are", ",".join(sorted(langs))) +    sys.stdout.flush() + +    for lang in langs: +        print("Creating spreadsheet for language", lang) +        sys.stdout.flush() +     +        make_translation_spreadsheet(mod_tree, base_tree, lang, args) + | 
