#!/usr/bin/env python # -*- coding: utf-8 -*- import errno, glob, polib, re, os, getopt, sys from time import strftime def usage(): print '\nUsage: python %s [OPTION]' %os.path.basename(sys.argv[0]) print ' generates po file for existing lang translations' print 'Options: -h, --help : usage' print ' -l lang_code, --language lang_code : code of the translation language' sys.exit(2) try: opts, args = getopt.getopt(sys.argv[1:], "hl:", ["help", "language="]) except getopt.GetoptError: usage() # print help information and exit language='' for o,a in opts: if o in ("-h", "--help"): usage() if o in ("-l", "--language"): lang_code=a if lang_code == '': sys.exit('Empty language code') file_extension = '.' + lang_code + '.lang' file_mask = '*' + file_extension for langfile in glob.glob(file_mask): langfilename = langfile.replace(file_extension, '') # Create localization directories if needed podir = langfilename + '/po' try: os.makedirs(podir) except OSError, e: if e.errno != errno.EEXIST: raise #open lang file text = open(langfile,"r").read() #Remove trailing spaces from lines spaces=' {1,}\n' spattern=re.compile(spaces,re.DOTALL) for emptyline in spattern.findall(text): text = text.replace(emptyline,'\n') text = text.replace('\n\n','\n\n\n\n')+'\n' # Write PO file po = polib.POFile() pocreationtime = strftime('%Y-%m-%d %H:%M%z') po.metadata = { 'Project-Id-Version': langfile, 'Report-Msgid-Bugs-To': 'mageia-i18n@mageia.org', 'POT-Creation-Date': pocreationtime, 'PO-Revision-Date': pocreationtime, 'Last-Translator': 'Duffy Duck ', 'Language-Team': lang_code + ' ', 'MIME-Version': '1.0', 'Content-Type': 'text/plain; charset=UTF-8', 'Content-Transfer-Encoding': '8bit', } # Parse contents and add them to PO messagetemplate='\n\n#\ .*?\n\n' mpattern=re.compile(messagetemplate,re.DOTALL) for mblock in mpattern.findall(text): mblock_stripped = mblock.strip('\n') message_comment, message_text = mblock.strip('\n').split('\n;',1) # Strip '# ' from comments message_comment = message_comment.lstrip('# ') message_id, message_str = message_text.split('\n',1) # Strip ';' from msgid message_id = message_id.lstrip(';') potentry = polib.POEntry( msgctxt = message_comment, msgid = message_id.decode('utf-8'), msgstr = message_str.decode('utf-8'), occurrences=[(langfile,'')] ) po.append(potentry) messagetemplate='\n\n;.*?\n\n' mpattern=re.compile(messagetemplate,re.DOTALL) for mblock in mpattern.findall(text): message_id, message_str = mblock.strip('\n').split('\n',1) # Strip ';' from msgid message_id = message_id.lstrip(';') potentry = polib.POEntry( msgid = message_id.decode('utf-8'), msgstr = message_str.decode('utf-8'), occurrences=[(langfile,'')] ) po.append(potentry) if text[0] == ';': message_id, message_str = text.partition('\n\n')[0].strip('\n').split('\n',1) # Strip ';' from msgid message_id = message_id.lstrip(';') potentry = polib.POEntry( msgid = message_id.decode('utf-8'), msgstr = message_str.decode('utf-8'), occurrences=[(langfile,'')] ) po.append(potentry) pofilename = langfilename + '/po/' + lang_code + '.po' po.save(pofilename)