Skip to content

Instantly share code, notes, and snippets.

@lidaobing
Created September 8, 2010 12:20
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save lidaobing/570044 to your computer and use it in GitHub Desktop.
Save lidaobing/570044 to your computer and use it in GitHub Desktop.
iso-codes-merge.py
#!/usr/bin/env python
import sys
import os
import logging
import tempfile
import urllib
import subprocess
lang2Name = {'af': 'Afrikaans',
'am': 'Amharic',
'ar': 'Arabic',
'ast': 'Asturian',
'az': 'Azerbaijani',
'be': 'Belarusian',
'be@latin': 'Belarusian (Latin script)',
'bg': 'Bulgarian',
'bn': 'Bengali',
'bn_IN': 'Bengali (India)',
'bs': 'Bosnian',
'ca': 'Catalan',
'crh': 'Crimean Tatar (Crimean Turkish)',
'cs': 'Czech',
'da': 'Danish',
'de': 'German',
'el': 'Greek',
'en_GB': 'English (British)',
'en_ZA': 'English (South African)',
'eo': 'Esperanto',
'es': 'Spanish',
'et': 'Estonian',
'eu': 'Basque',
'fa': 'Persian',
'fi': 'Finnish',
'fr': 'French',
'ga': 'Irish',
'gl': 'Galician',
'gu': 'Gujarati',
'he': 'Hebrew',
'hi': 'Hindi',
'hr': 'Croatian',
'hu': 'Hungarian',
'hy': 'Armenian',
'id': 'Indonesian',
'is': 'Icelandic',
'it': 'Italian',
'ja': 'Japanese',
'ka': 'Georgian',
'kk': 'Kazakh',
'kn': 'Kannada',
'ko': 'Korean',
'ku': 'Kurdish',
'ky': 'Kirghiz',
'lg': 'Luganda',
'lo': 'Lao',
'lt': 'Lithuanian',
'lv': 'Latvian',
'mk': 'Macedonian',
'ml': 'Malayalam',
'mn': 'Mongolian',
'mr': 'Marathi',
'ms': 'Malay',
'mt': 'Maltese',
'nb': 'Norwegian Bokmaal',
'nds': 'Low German',
'ne': 'Nepali',
'nl': 'Dutch',
'nn': 'Norwegian Nynorsk',
'pa': 'Punjabi',
'pl': 'Polish',
'ps': 'Pashto',
'pt': 'Portuguese',
'pt_BR': 'Brazilian Portuguese',
'ro': 'Romanian',
'ru': 'Russian',
'rw': 'Kinyarwanda',
'sk': 'Slovak',
'sl': 'Slovenian',
'sq': 'Albanian',
'sr': 'Serbian',
'sv': 'Swedish',
'sw': 'Swahili',
'ta': 'Tamil',
'te': 'Telugu',
'tg': 'Tajik',
'th': 'Thai',
'tr': 'Turkish',
'uk': 'Ukrainian',
'vi': 'Vietnamese',
'wa': 'Walloon',
'zh_CN': 'Chinese (simplified)',
'zh_HK': 'Chinese (Hong Kong)',
'zh_TW': 'Chinese (traditional)'}
class Isocodes(object):
def __init__(self, home=None):
self.home = home or "."
self.tmpfiles = []
def _getUrl(self, domain, lang):
return "http://translationproject.org/latest/%s/%s.po" % (domain, lang)
def _msgfmt(self, fname):
logging.info(fname)
subprocess.check_call(['msgfmt', '-v', fname])
def _getOldFname(self, domain, lang):
return os.path.join(self.home, domain, lang+".po")
def merge(self, domain, lang):
url = self._getUrl(domain, lang)
logging.info(url)
oldfname = self._getOldFname(domain, lang)
newfname = self._downloadFile(url)
self._diff(oldfname, newfname)
self._msgfmt(oldfname)
self._msgfmt(newfname)
res = raw_input('merge this (Y/n): ')
if res == '' or res == 'y' or res == 'Y':
self._doMerge(domain, lang, oldfname, newfname)
def _doMerge(self, domain, lang, oldfname, newfname):
logging.info("_doMerge: %s, %s" % (oldfname, newfname))
os.rename(newfname, oldfname)
subprocess.check_call(['git', 'add', oldfname])
translator = self._findLastTranslator(oldfname)
changelogFname = self._updateChangeLog(domain, lang, translator)
subprocess.check_call(['git', 'add', changelogFname])
subprocess.check_call(['git', 'diff', 'HEAD'])
res = raw_input('commit this (Y/n): ')
if res == '' or res == 'y' or res == 'Y':
commitMessage = '%s: %s by %s from TP' % (domain, lang2Name[lang], translator)
subprocess.check_call(['git', 'commit', '-m', commitMessage])
def _downloadFile(self, url):
fd, ofname = tempfile.mkstemp(dir=self.home)
ofile = os.fdopen(fd, 'wb')
ofile.write(urllib.urlopen(url).read())
ofile.close()
self.tmpfiles.append(ofname)
return ofname
def _diff(self, fname1, fname2):
subprocess.call(['diff', '-u', fname1, fname2])
def __del__(self):
for fname in self.tmpfiles:
logging.info(fname)
if os.path.exists(fname):
os.unlink(fname)
def _findLastTranslator(self, fname):
prefix ='"Last-Translator: '
for line in file(fname):
if line.startswith(prefix):
line = line[len(prefix):]
return line[:line.index('<')].strip()
return None
def _updateChangeLog(self, domain, lang, translator):
changelogFname = os.path.join(self.home, 'ChangeLog')
lines = file(changelogFname).readlines()
section, rest = self._findFirstSection(lines)
before, middle, after = self._findDomainLines(section, domain)
self._updateChangeLog2(middle, domain, lang, translator)
file(changelogFname, 'w').writelines(before + middle + after + rest)
return changelogFname
def _updateChangeLog2(self, lines, domain, lang, translator):
if not lines:
line = ' [ ISO %s translations ]\n' % domain[4:].replace('_', '-')
lines[:] = [line, '\n']
line = ' * %s by %s (TP)\n' % (lang2Name[lang], translator)
lines[-1:-1] = [line]
def _findFirstSection(self, lines):
for i in range(1, len(lines)):
if lines[i].startswith('iso-codes'):
return lines[:i], lines[i:]
def _findDomainLines(self, lines, domain):
keyword = '[ ISO %s translations ]' % domain[4:].replace('_', '-')
i1 = None
i2 = None
for i in range(len(lines)):
line = lines[i]
if keyword in line:
i1 = i
break
if i1 is not None:
for i in range(i1, len(lines)):
line = lines[i]
if not line.strip():
i2 = i
break
if i1 is None:
return lines[:-1], [], lines[-1:]
else:
return lines[:i1], lines[i1:i2+1], lines[i2+1:]
def main():
if len(sys.argv) != 3:
sys.stderr.write('Usage: %s <domain> <lang>\n' % os.path.basename(sys.argv[0]))
sys.exit(2)
isocodes = Isocodes()
isocodes.merge(sys.argv[1], sys.argv[2])
if __name__ == '__main__':
logging.basicConfig(level=logging.INFO)
main()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment