#!/bin/python3
import argparse
import json
import os
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 . time import ExecutionTimer ;
timer = ExecutionTimer ( )
from dynamicVariables import (
extractVariablesFromDict ,
identifyLocaleDyanmicVariableDifferences ,
prettyPrintIssuesTable ,
identifyAndPrintOldDynamicVariables ,
)
from localization . localeTypes import generateLocalesType
from util . logger import console
from util . fileUtils import createMappedJsonFileDictionary , writeFile
# If the --throw-error-on-missing flag is passed, the script will exit with an error if there are any missing keys or dynamic variables
# This is useful for CI/CD pipelines to ensure that all translations are consistent
parser = argparse . ArgumentParser ( description = " Generate locale files " )
parser . add_argument (
" --error-on-problems " ,
action = " store_true " ,
help = " Exit with an error if there are any missing keys or dynamic variables " ,
)
parser . add_argument (
" --error-old-dynamic-variables " ,
action = " store_true " ,
help = " Exit with an error if there are any old dynamic variables " ,
)
parser . add_argument (
" --print-problems " ,
action = " store_true " ,
help = " Print the problems table " ,
)
parser . add_argument (
" --write-problems " , action = " store_true " , help = " Write the problems to a file "
)
parser . add_argument (
" --problems-file " ,
default = " ./tools/localization/output/problems.json " ,
help = " The file to write the problems to " ,
)
parser . add_argument (
" --print-old-dynamic-variables " ,
action = " store_true " ,
help = " The file to write the problems to " ,
)
parser . add_argument ( " --en-only " , action = " store_true " , help = " Only check the en locale " )
parser . add_argument ( " --debug " , action = " store_true " , help = " Enable debug mode " )
parser . add_argument (
" --dict-dir " ,
type = str ,
default = " ./_locales "
)
parser . add_argument (
" --dict-file-name " ,
type = str ,
default = " messages.json " ,
)
parser . add_argument (
" --en-file-path " ,
type = str ,
default = " ./_locales/en/messages.json " ,
)
parser . add_argument (
" --generate-types " ,
action = " store_true " ,
help = " Generate the types file " ,
)
args = parser . parse_args ( )
if args . debug :
console . enableDebug ( )
GENERATE_TYPES = args . generate_types
OUTPUT_DIR = " ./ts/localization "
EN_FILE = args . en_file_path
INPUT_DIR = args . dict_dir
# Create a dictionary that maps locale names to their corresponding JSON file data
locales , localeFiles = createMappedJsonFileDictionary ( INPUT_DIR , args . dict_file_name )
if args . en_only :
locales = { " en " : locales [ " en " ] }
# Generate the locales type and write it to a file
if GENERATE_TYPES :
generateTypesOutputMessage = generateLocalesType ( locales [ " en " ] )
console . info ( generateTypesOutputMessage )
localeVariables = dict ( )
localeVariablesOld = dict ( )
# Extract the dynamic variables from each locale and store them in a dictionary
for locale , data in locales . items ( ) :
console . debug ( f " Extracting dynamic variables for { locale } " )
(
localeVariables [ locale ] ,
localeVariablesOld [ locale ] ,
) = extractVariablesFromDict ( data )
problems = identifyLocaleDyanmicVariableDifferences ( localeVariables )
found_old_dynamic_variables = identifyAndPrintOldDynamicVariables (
localeVariablesOld , args . print_old_dynamic_variables
)
# Wrapping up the script and printing out the results
if problems :
message = " There are issues with the locales. "
if args . print_problems :
prettyPrintIssuesTable ( problems )
message + = " See above for details. "
if args . write_problems :
writeFile ( args . problems_file , json . dumps ( problems , indent = 2 ) )
console . info ( f " Problems written to { args . problems_file } " )
message + = f " Problems written to { args . problems_file } "
if not args . print_problems and not args . write_problems :
message + = " Run the script with --print-problems or --write-problems to see the problems. "
console . warn ( message )
if found_old_dynamic_variables :
warning_message = (
" Old dynamic variables were found in the locales. Please update the locales to use the new dynamic variables. "
)
if args . print_old_dynamic_variables :
if args . print_problems :
warning_message + = " See above for details (before the problems table). "
else :
warning_message + = " See above for details. "
else :
warning_message + = " Run the script with --print-old-dynamic-variables to see the old dynamic variables. "
console . warn ( warning_message )
console . debug ( " Locales generation complete " )
timer . stop ( )
if ( args . error_on_problems and problems ) or (
args . error_old_dynamic_variables and found_old_dynamic_variables
) :
sys . exit ( 1 )