[eluser]Unknown[/eluser]
Hi people!
I just needed something to check if my language files are OK, with no entry missing, so i coded it in Python. It's very VERY quick'n'dirty, but just in case any of you needed it.
Code:
#!/usr/bin/python
# coding=utf-8
# CodeIgniter language file checker
# Author: FX <[email protected]>
import os
import os.path
import re
import sys
class Colors:
ERROR = '\033[31m'
INFO = '\033[33m'
OK = '\033[32m'
BOLD_ON = '\033[1m'
BOLD_OFF = '\033[22m'
END = '\033[0m'
class LanguageField:
def __init__ (self, name):
self.languages = set()
self.name = name
def has (self, lang):
return lang in self.languages
class LanguageFile:
def __init__ (self, root, path, name):
self.languages = set()
self.path = path
self.name = name
self.root = root
def check (self, langset):
fields = dict()
for lang in self.languages:
f = open (os.path.join (self.root, lang, self.path, self.name))
for l in f:
ma = re.match (r'^\$lang\[(\"|')(?P<key>.*?)(\"|')\] *= *(\"|')(?P<value>.*)(\"|');$', l) #'
if not ma is None:
val = ma.group('value')
key = ma.group('key')
if not key in fields:
fields[key] = LanguageField (key)
fields[key].languages.add (lang)
f.close()
return fields
def listfiles (d):
entries = dict()
for root,dirs,files in os.walk(d):
# First subdir under base directory is the language dir, then normal path
ma = re.match (re.escape (d) + "/?(?P<lang>[^/]*)/?(?P<path>.*)", root)
if not ma is None:
lang = ma.group('lang')
path = ma.group('path')
for f in files:
if re.match (r"^.*_lang\.php$", f) != None:
if not entries.has_key (f):
lf = LanguageFile(d, path, f)
entries[f] = lf
else:
lf = entries[f]
lf.languages.add(lang)
return entries
def main ():
# Path is current path if no path is provided
if len(sys.argv) < 2:
path = '.'
else:
path = sys.argv[1]
# List language files
files = listfiles (sys.argv[1])
# Language set
langset = set(['en', 'fr'])
# Read each language file, and test if the arrays are the same
for l in files.values():
print ""
print (Colors.BOLD_ON + Colors.INFO + "Checking file %s..." + Colors.END) % l.name
result = l.check(langset)
passed = True
for fld in result.values():
if fld.languages != langset:
print (" " + Colors.BOLD_ON + "%s" + Colors.BOLD_OFF +": %s missing!" + Colors.END) % (fld.name, str(list(langset.difference (fld.languages))))
passed = False
if passed:
print Colors.OK + " PASSED" + Colors.END
else:
print Colors.ERROR + " FAILED" + Colors.END
if __name__ == '__main__':
main()
Just put it somewhere and run it like that :
Code:
./check.py language/path/
In case you need more languages than "en" and "fr", just add them inside the "langset" variable (line 85).
Code:
#Language set
langset = set(['en', 'fr', 'zh', 'de'])