Created
October 23, 2019 15:51
-
-
Save xcash/35be65bd2d23650536db3879ad813a5d to your computer and use it in GitHub Desktop.
Small tool to extract labels and merge json files for robisim74/angular-l10n
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import re | |
import json | |
import glob | |
import os | |
import pathlib | |
# translation.translate('ABC') | |
PATTERN_TS_1 = re.compile(r"""translation.translate\(['"]([^'"]+)['"]\)""") | |
# {{ 'ABC' | translate:lang }} | |
PATTERN_TEMPLATE_1 = re.compile(r"""\{\{\s*['"]([^'"]+)['"]\s*\|\s*translate:lang\s*\}\}""") | |
NEEDTRANSLATIONSLABEL = "TRANSLATE:{}" | |
languages = set() | |
def loadTranslations(): | |
fnames = glob.glob('./src/assets/locale-??.json') | |
# print("fnames: {}".format(fnames)) | |
translations = {} | |
for fname in fnames: | |
lang = re.findall(r"locale-(\w+).json", fname)[0] | |
languages.add(lang) | |
print("Loading language {} from {}".format(lang, fname)) | |
with open(fname) as f: | |
jsonContent = json.loads(f.read()) | |
for label, translated in jsonContent.items(): | |
# print("label {} translated as {}".format(label, translated)) | |
t = translations.get(label, {}) | |
t[lang] = translated | |
translations[label] = t | |
return translations | |
def saveTranslations(translations): | |
for lang in languages: | |
fname = "./src/assets/locale-{}.json".format(lang) | |
outdict = { label: tvalues.get(lang, NEEDTRANSLATIONSLABEL.format(label)) for label, tvalues in translations.items() } | |
with open(fname, 'w') as f: | |
f.write(json.dumps(outdict, indent=2, sort_keys=True)) | |
def mergeTranslations(translations, extractedLabels): | |
for label in extractedLabels: | |
if label not in translations: | |
translations[label] = { lang: NEEDTRANSLATIONSLABEL.format(label) for lang in languages } | |
return translations | |
def scanTSFile(fname): | |
with open(fname) as f: | |
contents = f.read() | |
extractedLabels = {} | |
results = PATTERN_TS_1.findall(contents) | |
if results: | |
for label in results: | |
print("Found label {} in file {}".format(repr(label), fname)) | |
extractedLabels[label] = NEEDTRANSLATIONSLABEL.format(label) | |
return extractedLabels | |
def scanTemplateFile(fname): | |
with open(fname) as f: | |
contents = f.read() | |
extractedLabels = {} | |
results = PATTERN_TEMPLATE_1.findall(contents) | |
if results: | |
for label in results: | |
print("Found label {} in file {}".format(repr(label), fname)) | |
extractedLabels[label] = NEEDTRANSLATIONSLABEL.format(label) | |
return extractedLabels | |
def scanPath(srcPath, translations): | |
path_iter = list(pathlib.Path('src/').glob('**/*.ts')) + \ | |
list(pathlib.Path('src/').glob('**/*.html')) | |
for fname in path_iter: | |
fext = os.path.splitext(fname)[1] | |
# print(fext) | |
extractedLabels = {} | |
if fext == '.ts': | |
extractedLabels = scanTSFile(fname) | |
elif fext == '.html': | |
extractedLabels = scanTemplateFile(fname) | |
translations = mergeTranslations(translations, extractedLabels) | |
return translations | |
if __name__ == "__main__": | |
print("Extract and Merge translations") | |
print("Loading translations") | |
translations = loadTranslations() | |
print("Scanning...") | |
translations = scanPath('src/', translations) | |
print("Saving translations") | |
saveTranslations(translations) | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment