1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119
|
#!/usr/bin/python2
# Update various lists of available localizations.
# The primary source is table languages in this file.
import re, os, sys
files_to_update = (
'po/LINGUAS',
'gwyddion/mac_integration.c',
'data/gwyddion.nsit.in',
)
class Language:
def __init__(self, key, isofull, name):
self.key = key
self.isofull = isofull
self.name = name
def __getitem__(self, key): return self.__dict__[key]
def __contains__(self, key): return key in self.__dict__
def __lt__(self, other): return self.key < other.key
def __le__(self, other): return self.key <= other.key
def __gt__(self, other): return self.key > other.key
def __ge__(self, other): return self.key >= other.key
# The default language (English) must come first as it is treated specially
languages = (
Language('en', 'en_US.UTF-8', 'English (US)'),
Language('cs', 'cs_CZ.UTF-8', 'Czech'),
Language('de', 'de_DE.UTF-8', 'German'),
Language('en_GB', 'en_GB.UTF-8', 'English (UK)'),
Language('fr', 'fr_FR.UTF-8', 'French'),
Language('it', 'it_IT.UTF-8', 'Italian'),
Language('ja', 'ja_JP.UTF-8', 'Japanese'),
Language('ko', 'ko_KR.UTF-8', 'Korean'),
Language('pt_BR', 'pt_BR.UTF-8', 'Portuguese (Brazilian)'),
Language('ru', 'ru_RU.UTF-8', 'Russian'),
Language('es', 'es_ES.UTF-8', 'Spanish'),
)
class Template:
def __init__(self, format, default=0, separator='\n'):
self.format = format
self.default = default
self.separator = separator
def fill(self, lang):
return self.format % lang
def fill_default(self, lang):
if self.default == None:
return ''
if self.default == 0:
return self.format % lang
return self.default % lang
def fill_all(self, langs):
all = []
for i, l in enumerate(langs):
l.jNSIS = (i/8)*150
l.iNSIS = 12*((i % 8) + 1)
if not i:
if self.default != None:
all.append(self.fill_default(l))
else:
all.append(self.fill(l))
return self.separator.join(all)
templates = {
'LINGUAS': Template('%(key)s', None, ' '),
'OS X': Template(' { "%(isofull)s", "%(key)s" },'),
'NSIS-MENU': Template(' !insertmacro GWY_LOCALE_CHOOSER "%(name)s" "%(isofull)s" %(jNSIS)uu %(iNSIS)uu'),
'NSIS-MO': Template(' GwyExpandFiles "share\\locale\\%(key)s\\LC_MESSAGES\*.mo"'),
}
signature = (r'(?P<open>@@@ GENERATED LANG (?P<name>[A-Z_ -]+) BEGIN @@@[^\n]*$)'
r'(?P<body>.*?)'
r'(?P<close>^[^\n]*@@@ GENERATED LANG (?P=name) END @@@)')
sig_re = re.compile(signature, re.S | re.M)
def fill_template(m):
name = m.group('name')
if name not in templates:
sys.stderr.write('Unknown LANG template %s\n' % name)
return m.group()
repl = templates[name].fill_all(languages)
eol = ''
if repl:
eol = '\n'
return m.group('open') + '\n' + repl + eol + m.group('close')
def process_file(filename):
fh = file(filename, 'U')
oldcontent = fh.read()
newlines = fh.newlines
fh.close()
assert type(newlines) is str
newcontent = sig_re.sub(fill_template, oldcontent)
# Don't waste time running diff in the trivial case
if oldcontent == newcontent:
return
if newlines != '\n':
newcontent = newcontent.replace('\n', newlines)
xgen = '%s.xgen' % filename
file(xgen, 'wb').write(newcontent)
# FIXME: status interpretation is system-dependent
status = os.system('diff -u %s %s' % (filename, xgen)) >> 8
if status == 1:
sys.stderr.write('%s: Updating %s\n' % (sys.argv[0], filename))
file(filename, 'w').write(newcontent)
elif status > 1:
sys.stderr.write('%s: Diff failed for %s\n' % (sys.argv[0], filename))
os.unlink(xgen)
for filename in files_to_update:
process_file(filename)
# vim: sw=4 ts=4 et:
|