#!/bin/python # usage : ./tools/unusedLocalizedString.py |grep False import re import os from glob import glob # get all files matching .js, .ts and .tsx in ./ dir_path = './' files = [y for x in os.walk(dir_path) for y in glob(os.path.join(x[0], '*.js'))] files += [y for x in os.walk(dir_path) for y in glob(os.path.join(x[0], '*.ts'))] files += [y for x in os.walk(dir_path) for y in glob(os.path.join(x[0], '*.tsx'))] # exclude node_modules directories filtered_files = [f for f in files if "node_modules" not in f] # search for this pattern in _locales/en/messages.json: it is a defined localized string patternLocalizedString = re.compile("^ \".*\"\: {") localizedStringToSearch = 0 localizedStringNotFound = 0 for i, line in enumerate(open('_locales/en/messages.json')): for match in re.finditer(patternLocalizedString, line): localizedStringToSearch = localizedStringToSearch + 1 found = match.group() # extract the key only from the line foundAline = found[3:-4] # print 'Found on line %s: \'%s\'' % (i + 1, foundAline) # generate a new regex to be searched for to find its usage in the code # currently, it matches # * i18n('key') with or without line return # * messages.key (used in some places) # * and also 'key'. (some false positive might be present here) searchedLine = "i18n\([\r\n]?\s*'{0}'|messages.{0}|'{0}'".format(foundAline) found = False # skip timerOptions string constructed dynamically if 'timerOption_' in foundAline: found = True else: for file_path in filtered_files: fileContent = open(file_path, 'r').read() if len(re.findall(searchedLine,fileContent,re.MULTILINE)) > 0: found = True break if not found: localizedStringNotFound = localizedStringNotFound + 1 print "i18n for '{0}': found:{1}:".format(foundAline, found) print "number of localized string found in messages.json:{0}".format(localizedStringToSearch) print "number of localized string NOT found:{0}".format(localizedStringNotFound)