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.
		
		
		
		
		
			
		
			
				
	
	
		
			217 lines
		
	
	
		
			7.5 KiB
		
	
	
	
		
			Python
		
	
			
		
		
	
	
			217 lines
		
	
	
		
			7.5 KiB
		
	
	
	
		
			Python
		
	
| import json
 | |
| import os
 | |
| import re
 | |
| import sys
 | |
| 
 | |
| # This allows for importing from the localization and util directories NOTE: Auto importing tools will also prepend the import paths with "tools." this will not work and needs to be removed from import paths
 | |
| sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), "..")))
 | |
| from util.listUtils import missingFromList
 | |
| from util.logger import console
 | |
| 
 | |
| 
 | |
| def extractDynamicVariables(input_string, pattern):
 | |
|     """
 | |
|     Extracts dynamic variables from the input string.
 | |
| 
 | |
|     Args:
 | |
|       input_string (str): The string to extract dynamic variables from.
 | |
| 
 | |
|     Returns:
 | |
|       list: A list of dynamic variables found in the input string.
 | |
|     """
 | |
|     matches = re.findall(pattern, input_string)
 | |
|     console.debug(f"matches: {matches}")
 | |
|     return matches
 | |
| 
 | |
| 
 | |
| def extractOldDynamicVariables(input_string):
 | |
|     """
 | |
|     Extracts dynamic variables from the input string.
 | |
| 
 | |
|     Args:
 | |
|       input_string (str): The string to extract dynamic variables from.
 | |
| 
 | |
|     Returns:
 | |
|       list: A list of dynamic variables found in the input string.
 | |
|     """
 | |
|     pattern = r"\$(\w+)\$"
 | |
|     matches = re.findall(pattern, input_string)
 | |
|     return matches
 | |
| 
 | |
| 
 | |
| def extractVariablesFromDict(input_dict):
 | |
|     """
 | |
|     Reads through a dictionary of key-value pairs and creates a new dictionary
 | |
|     where the value is just a list of dynamic variables found in the original value.
 | |
| 
 | |
|     Args:
 | |
|       input_dict (dict): The dictionary to extract dynamic variables from.
 | |
| 
 | |
|     Returns:
 | |
|       dict: A dictionary with the same keys as input_dict, but the values are lists of dynamic variables.
 | |
|     """
 | |
|     output_dict_new = {}
 | |
|     output_dict_old = {}
 | |
|     for key, value in input_dict.items():
 | |
|         console.debug(f"key: {key}, value: {value}")
 | |
|         output_dict_new[key] = extractDynamicVariables(value, r"\{(\w+)\}")
 | |
|         output_dict_old[key] = extractDynamicVariables(value, r"\$(\w+)\$")
 | |
|     return output_dict_new, output_dict_old
 | |
| 
 | |
| 
 | |
| def identifyLocaleDyanmicVariableDifferences(locales):
 | |
|     """
 | |
|     Identifies the differences between each locale's dynamic variables.
 | |
| 
 | |
|     Args:
 | |
|       locales (dict): A dictionary with keys being a locale name and values being a dictionary of locales.
 | |
| 
 | |
|     Returns:
 | |
|       dict: A dictionary with the same keys as locales, but the values are dictionaries of issues.
 | |
|     """
 | |
|     master_locale = locales["en"]
 | |
|     issues = {}
 | |
| 
 | |
|     for locale_name, locale in locales.items():
 | |
|         if locale_name == "en":
 | |
|             continue
 | |
| 
 | |
|         locale_issues = {
 | |
|             "missing_keys": [],
 | |
|             "additional_keys": [],
 | |
|             "missing_variables": {},
 | |
|             "additional_variables": {},
 | |
|         }
 | |
| 
 | |
|         for key, value in master_locale.items():
 | |
|             # If a key is missing from the locale, add it to the missing_keys list
 | |
|             if key not in locale:
 | |
|                 locale_issues["missing_keys"].append(key)
 | |
|             else:
 | |
| 
 | |
|                 locale_value = locale[key]
 | |
| 
 | |
|                 # Find the dynamic variables that are missing from the locale. If there are none this will set the value to an empty list.
 | |
|                 locale_issues["missing_variables"][key] = missingFromList(
 | |
|                     value, locale_value
 | |
|                 )
 | |
| 
 | |
|                 # Find the dynamic variables that are additional to the locale. If there are none this will set the value to an empty list.
 | |
|                 locale_issues["additional_variables"][key] = missingFromList(
 | |
|                     locale_value, value
 | |
|                 )
 | |
| 
 | |
|         for key in locale:
 | |
|             if key not in master_locale:
 | |
|                 locale_issues["additional_keys"].append(key)
 | |
| 
 | |
|         # Only add the locale to the issues if there are any issues
 | |
|         if (
 | |
|             locale_issues["missing_keys"]
 | |
|             or locale_issues["additional_keys"]
 | |
|             or locale_issues["missing_variables"]
 | |
|             or locale_issues["additional_variables"]
 | |
|         ):
 | |
| 
 | |
|             # Remove empty lists from missing_variables
 | |
|             locale_issues["missing_variables"] = {
 | |
|                 k: v for k, v in locale_issues["missing_variables"].items() if v
 | |
|             }
 | |
| 
 | |
|             # Remove empty lists from additional_variables
 | |
|             locale_issues["additional_variables"] = {
 | |
|                 k: v for k, v in locale_issues["additional_variables"].items() if v
 | |
|             }
 | |
| 
 | |
|             # remove missing_keys if it's empty
 | |
|             if not locale_issues["missing_keys"]:
 | |
|                 del locale_issues["missing_keys"]
 | |
| 
 | |
|             # remove additional_keys if it's empty
 | |
|             if not locale_issues["additional_keys"]:
 | |
|                 del locale_issues["additional_keys"]
 | |
| 
 | |
|             # Remove missing_variables if it's empty
 | |
|             if not locale_issues["missing_variables"]:
 | |
|                 del locale_issues["missing_variables"]
 | |
| 
 | |
|             # Remove additional_variables if it's empty
 | |
|             if not locale_issues["additional_variables"]:
 | |
|                 del locale_issues["additional_variables"]
 | |
| 
 | |
|             console.debug_json(f"locale_issues:", locale_issues)
 | |
|             issues[locale_name] = locale_issues
 | |
| 
 | |
|     return issues
 | |
| 
 | |
| 
 | |
| def prettyPrintIssuesTable(issues):
 | |
|     """
 | |
|     Pretty prints a table from the return of identifyLocaleDyanmicVariableDifferences
 | |
|     where the rows are locale name and the columns are the issue types.
 | |
|     Values will be number of occurrences of each issues.
 | |
| 
 | |
|     Args:
 | |
|       issues (dict): The issues dictionary returned from identifyLocaleDyanmicVariableDifferences.
 | |
| 
 | |
|     """
 | |
| 
 | |
|     PADDING = 10
 | |
| 
 | |
|     # Print the header key
 | |
|     print(
 | |
|         f"\n{'-'*5*PADDING:<{PADDING}}\n\n"
 | |
|         f"+ Keys: Keys present in the master locale but missing in the locale\n"
 | |
|         f"- Keys: Keys present in the locale but missing in the master locale\n"
 | |
|         f"- Vars: Dynamic variables present in the master locale but missing in the locale\n"
 | |
|         f"+ Vars: Dynamic variables present in the locale but missing in the master locale\n"
 | |
|     )
 | |
| 
 | |
|     # Print the header
 | |
|     print(
 | |
|         f"{'Locale':<{PADDING}}{'+ Keys':<{PADDING}}{'- Keys':<{PADDING}}{'- Vars':<{PADDING}}{'+ Vars':<{PADDING}}\n"
 | |
|         f"{'-'*5*PADDING:<{PADDING}}"
 | |
|     )
 | |
| 
 | |
|     for locale_name, locale_issues in issues.items():
 | |
|         if locale_name == "en":
 | |
|             continue
 | |
| 
 | |
|         missing_keys = len(locale_issues.get("missing_keys", []))
 | |
|         additional_keys = len(locale_issues.get("additional_keys", []))
 | |
|         missing_variables = sum(
 | |
|             len(v) for v in locale_issues.get("missing_variables", {}).values()
 | |
|         )
 | |
|         additional_variables = sum(
 | |
|             len(v) for v in locale_issues.get("additional_variables", {}).values()
 | |
|         )
 | |
| 
 | |
|         print(
 | |
|             f"{locale_name:<{PADDING}}{missing_keys:<{PADDING}}{additional_keys:<{PADDING}}{missing_variables:<{PADDING}}{additional_variables:<{PADDING}}"
 | |
|         )
 | |
| 
 | |
| 
 | |
| def identifyAndPrintOldDynamicVariables(
 | |
|     localeWithOldVariables, printOldVariables=False
 | |
| ):
 | |
|     """
 | |
|     Prints the keys that contain dynamic variables for each locale.
 | |
| 
 | |
|     Args:
 | |
|       localeWithOldVariables (dict): A dictionary with keys being a locale name and values being a dictionary of locales.
 | |
|     """
 | |
|     found_problems = False
 | |
|     for locale_name, locale in localeWithOldVariables.items():
 | |
|         invalid_strings = dict()
 | |
|         for key, value in locale.items():
 | |
|             if value:
 | |
|                 invalid_strings[key] = value
 | |
|                 found_problems = True
 | |
|         if invalid_strings:
 | |
| 
 | |
|             console.warn(
 | |
|                 f"{json.dumps(invalid_strings, indent=2, sort_keys=True) if printOldVariables else ''}"
 | |
|                 f"\nLocale {locale_name} contains {len(invalid_strings)} strings with old dynamic variables. (see above)"
 | |
|             )
 | |
|     return found_problems
 |