Skip to content

Instantly share code, notes, and snippets.

@xcash
Created October 23, 2019 15:51
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save xcash/35be65bd2d23650536db3879ad813a5d to your computer and use it in GitHub Desktop.
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
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