294 lines
10 KiB
Python
294 lines
10 KiB
Python
#!/usr/bin/env python3
|
|
|
|
"""
|
|
Paramecio2fm is a series of wrappers for Flask, mako and others and construct a simple headless cms.
|
|
|
|
Copyright (C) 2023 Antonio de la Rosa Caballero
|
|
|
|
This program is free software: you can redistribute it and/or modify
|
|
it under the terms of the GNU Affero General Public License as published by
|
|
the Free Software Foundation, either version 3 of the License, or
|
|
(at your option) any later version.
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
GNU Affero General Public License for more details.
|
|
|
|
You should have received a copy of the GNU Affero General Public License
|
|
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
"""
|
|
|
|
import argparse
|
|
import os, sys
|
|
|
|
sys.path.insert(0, os.path.realpath('.'))
|
|
|
|
import re
|
|
from pathlib import Path
|
|
from importlib import import_module
|
|
from paramecio2.libraries.i18n import I18n
|
|
from paramecio2.libraries.slugify import slugify
|
|
try:
|
|
from settings import config
|
|
except:
|
|
#print('You need a settings directory with a paramecio2 configuration')
|
|
#sys.exit(1)
|
|
pass
|
|
|
|
"""Command line utility for extract I18n.lang strings from html templates and .py files
|
|
"""
|
|
|
|
pattern=re.compile(r'^\w+\.(py|html|phtml|js)$')
|
|
|
|
ignored=re.compile(r'^[__|\.].*$')
|
|
|
|
lang_p=re.compile(r"I18n\.lang\('(.*?)',\s+'(.*?)',\s+'(.*?)'\)")
|
|
lang_t=re.compile(r"\${lang\('(.*?)',\s+'(.*?)',\s+'(.*?)'\)\}")
|
|
|
|
lang_s=re.compile(r"i18n\.slang\('(.*?)',\s+'(.*?)'\)")
|
|
lang_ts=re.compile(r"\${slang\('(.*?)',\s+'(.*?)'\)\}")
|
|
|
|
lang_tl=re.compile(r"i18n\.tlang\('(.*?)'\)")
|
|
lang_ttl=re.compile(r"\${tlang\('(.*?)'\)\}")
|
|
|
|
tmp_lang={}
|
|
|
|
def start():
|
|
"""Function for extract I18n.lang strings from html templates and .py files using regular expressions
|
|
"""
|
|
|
|
global lang_p
|
|
global lang_t
|
|
global lang_s
|
|
global lang_tl
|
|
global lang_ts
|
|
global lang_ttl
|
|
|
|
# Module to search a file where save the file.
|
|
|
|
parser = argparse.ArgumentParser(description='A tool for create python language files')
|
|
|
|
parser.add_argument('--module', help='The module where search lang files', required=True)
|
|
|
|
args = parser.parse_args()
|
|
|
|
#Without arguments, search in paramecio directory all language files
|
|
|
|
path_save='paramecio/i18n'
|
|
|
|
path='paramecio'
|
|
|
|
if args.module!=None:
|
|
|
|
path=args.module
|
|
|
|
path_save=args.module+'/i18n'
|
|
|
|
module_base=os.path.basename(args.module)
|
|
|
|
lang_p=re.compile(r"I18n\.lang\('("+module_base+r"?)',\s+'(.*?)',\s+'(.*?)'\)")
|
|
#lang_t=re.compile("\${lang\('("+module_base+"?)',\s+'(.*?)',\s+'(.*?)'\)\}")
|
|
lang_t=re.compile(r"lang\('("+module_base+r"?)',\s+'(.*?)',\s+'(.*?)'\)")
|
|
|
|
if not os.path.isdir(path):
|
|
|
|
print("Error: directory to scan doesn't exists")
|
|
|
|
exit(1)
|
|
|
|
scandir(path, path_save, module_base)
|
|
|
|
#Save the files
|
|
|
|
file_lang=''
|
|
|
|
for module in tmp_lang.keys():
|
|
|
|
# Save in a file
|
|
real_path=path_save
|
|
|
|
if not os.path.isdir(real_path):
|
|
|
|
p=Path(real_path)
|
|
p.mkdir(0o755, True)
|
|
|
|
try:
|
|
path_module=path_save.replace('/', '.')+'.'+module
|
|
|
|
import_module(path_module)
|
|
|
|
#Add values to tmp lang
|
|
|
|
#for real_key, real_text in I18n.l[lang][module].items():
|
|
#tmp_lang[module][real_key]=real_text
|
|
|
|
except:
|
|
pass
|
|
|
|
|
|
|
|
i=Path(real_path+'/__init__py')
|
|
|
|
i.touch(0o644)
|
|
|
|
file_lang="#!/usr/bin/env python3\n\n"
|
|
|
|
file_lang+="from paramecio2.libraries.i18n import I18n\n\n"
|
|
|
|
for lang in I18n.dict_i18n:
|
|
|
|
#I18n.l['en-US']['admin']=I18n.l['en-US'].get('admin', {})
|
|
|
|
file_lang+="I18n.l['%s']=I18n.l.get('%s', {})\n\n" % (lang, lang)
|
|
|
|
file_lang+="I18n.l['"+lang+"']['"+module+"']=I18n.l['"+lang+"'].get('"+module+"', {})\n\n"
|
|
|
|
I18n.l[lang]=I18n.l.get(lang, {})
|
|
|
|
I18n.l[lang][module]=I18n.l[lang].get(module, {})
|
|
|
|
for key, text in tmp_lang[module].items():
|
|
|
|
if not key in I18n.l[lang][module]:
|
|
|
|
I18n.l[lang][module][key]=text
|
|
|
|
file_lang+="I18n.l['"+lang+"']['"+module+"']['"+key+"']='"+I18n.l[lang][module][key].replace("'", "\\'")+"'\n\n"
|
|
|
|
final_file=real_path+'/'+module+'.py'
|
|
|
|
f=open(final_file, 'w')
|
|
|
|
f.write(file_lang)
|
|
|
|
f.close()
|
|
|
|
pass
|
|
|
|
def scandir(path, module_search='', module_base=None):
|
|
|
|
list=os.listdir(path)
|
|
|
|
for name in list:
|
|
|
|
new_path=path+'/'+name
|
|
|
|
if os.path.isdir(new_path):
|
|
if ignored.match(name)==None:
|
|
scandir(new_path)
|
|
elif pattern.match(name)!=None and ignored.match(name)==None:
|
|
|
|
f=open(new_path)
|
|
|
|
for line in f:
|
|
|
|
#[('pokermind', 'performance_questions_default', 'Performance questions default'), ('pokermind', 'performance_questions_defasult', 'Performance questions defaufflt')]
|
|
|
|
match_p=lang_p.findall(line)
|
|
match_t=lang_t.findall(line)
|
|
|
|
match_s=lang_s.findall(line)
|
|
match_ts=lang_ts.findall(line)
|
|
|
|
match_tl=lang_tl.findall(line)
|
|
match_ttl=lang_ttl.findall(line)
|
|
|
|
"""
|
|
global lang_s
|
|
global lang_tl
|
|
global lang_ts
|
|
global lang_ttl
|
|
"""
|
|
|
|
if match_p!=None:
|
|
|
|
for m in match_p:
|
|
module=m[0]
|
|
symbol=m[1]
|
|
text_default=m[2]
|
|
|
|
tmp_lang[module]=tmp_lang.get(module, {})
|
|
|
|
tmp_lang[module][symbol]=tmp_lang[module].get(symbol, text_default)
|
|
|
|
if match_t!=None:
|
|
"""
|
|
module=match_t.group(1)
|
|
symbol=match_t.group(2)
|
|
text_default=match_t.group(3)
|
|
|
|
tmp_lang[module]=tmp_lang.get(module, {})
|
|
|
|
tmp_lang[module][symbol]=tmp_lang[module].get(symbol, text_default)
|
|
"""
|
|
|
|
for m in match_t:
|
|
module=m[0]
|
|
symbol=m[1]
|
|
text_default=m[2]
|
|
|
|
tmp_lang[module]=tmp_lang.get(module, {})
|
|
|
|
tmp_lang[module][symbol]=tmp_lang[module].get(symbol, text_default)
|
|
|
|
if module_base:
|
|
|
|
if match_s!=None:
|
|
|
|
for m in match_s:
|
|
module=base_module
|
|
symbol=m[0]
|
|
text_default=m[1]
|
|
|
|
tmp_lang[module]=tmp_lang.get(module, {})
|
|
tmp_lang[module][symbol]=tmp_lang[module].get(symbol, text_default)
|
|
|
|
for m in match_ts:
|
|
module=base_module
|
|
symbol=m[0]
|
|
text_default=m[1]
|
|
|
|
tmp_lang[module]=tmp_lang.get(module, {})
|
|
tmp_lang[module][symbol]=tmp_lang[module].get(symbol, text_default)
|
|
|
|
|
|
for m in match_tl:
|
|
module=base_module
|
|
symbol=slugify(m[0])
|
|
text_default=m[0]
|
|
|
|
tmp_lang[module]=tmp_lang.get(module, {})
|
|
tmp_lang[module][symbol]=tmp_lang[module].get(symbol, text_default)
|
|
|
|
for m in match_ttl:
|
|
module=base_module
|
|
symbol=slugify(m[0][:40])
|
|
text_default=m[0]
|
|
|
|
tmp_lang[module]=tmp_lang.get(module, {})
|
|
tmp_lang[module][symbol]=tmp_lang[module].get(symbol, text_default)
|
|
|
|
|
|
|
|
f.close()
|
|
|
|
#print('archivo->'+path+'/'+name)
|
|
# Open file
|
|
# obtain modules, keys, and default text
|
|
|
|
#Open all files in path specified. If not specified, see in all files recursively in path.
|
|
|
|
#Extract lang and I18n.lang and fill i18n property that save the values of language texts, only extracs key specified in option key, if not specified, extract last member of path key.
|
|
|
|
# Open all language files in a loop with modules from dictionary created from open files, if module path is not specified, the file is in paramecio.i18n. With module path the language files are saved in i18n directory into the path, for example if path is modules/panel, the files are saved in modules/panel/i18n/example.py. If key option is saved then only saved lang with keys selected. Normally you only need a file by module and by default. key option is the last member of path. For example, you can create a language file for a module and use in other module, but don't extract key used in the other module language file used.
|
|
|
|
# THe array i18n is overwrited loading the lang files.
|
|
|
|
# Save the files in specified path.
|
|
|
|
if __name__=='__main__':
|
|
|
|
start()
|
|
|
|
|