Changeset 5096


Ignore:
Timestamp:
Jun 6, 2017, 3:00:24 PM (22 months ago)
Author:
Juanma
Message:

exports to a po and imports from a po

File:
1 edited

Legend:

Unmodified
Added
Removed
  • devtools/metadata_extract_locale2po/metadata_xml2po.py

    r5082 r5096  
    11#!/usr/bin/env python3
     2#metadata_xml2po.py
    23#This shell scans an svn repo and generates a .po file with all the descriptions, summarys..etc.. founded
    34#
    45import os
     6import sys
    57import xml.etree.ElementTree as ET
     8import polib as PO
     9
     10def usage_help():
     11        print ("Usage:")
     12        print (sys.argv[0]+" --export|-e path_to_dirs" )
     13        print (sys.argv[0]+" --import|-i path_to_dirs path_to_po\n" )
     14        exit(1)
     15#def usage_help
     16
     17def parse_arguments():
     18        global mode
     19        global wrkDir
     20        global poFile
     21        argList={"--export":"export","-e":"export","--import":"import","-i":"import"}
     22        args=sys.argv[1:]
     23        for arg in args:
     24                if arg in argList.keys():
     25                        mode=argList[arg]
     26                elif os.path.isdir(arg):
     27                        wrkDir=arg
     28                elif os.path.isfile(arg):
     29                        poFile=arg
     30        if ((not mode or not wrkDir) or (mode=="import" and not poFile)):
     31                usage_help()
     32#def parse_arguments
     33
    634def get_package_dirs(path):
    735        candidatePaths=[]
     
    1240                                candidatePaths.append(basedir+"/"+subdir)
    1341        return candidatePaths
     42
     43#def get_package_dirs
    1444
    1545def generate_tmp_po(candidatePaths,outputFile):
     
    2858                                                        for xmlDesc in element:
    2959                                                                if not (xmlDesc.attrib):
    30                                                                         msgid=xmlDesc.text
     60                                                                        msgid=str(xmlDesc.text).replace("\"","\'")
     61                                                                        msgid=str(msgid).replace("\n"," ")
    3162                                                                        msgIdList.append(msgid)
    3263                                                                else:
     
    3465                                                else:
    3566                                                        if not (element.attrib):
    36                                                                 msgid=element.text
     67                                                                msgid=str(element.text).replace("\"","\'")
     68                                                                msgid=str(msgid).replace("\n"," ")
    3769                                                                msgIdList.append(msgid)
    3870                                                        else:
     
    4274                                print (xmlFile)
    4375                                pass
     76#def generate_tmp_po
    4477
    4578def save_locale(locale,msgid,msgstr=None):
    46         poString="msgstr \""+str(msgstr)+"\""
     79        poString=str(msgstr).replace("\"","\'")
     80        poString=poString.replace("\n"," ")
    4781        if "valencia" in locale or "qcv" in locale:
    4882                locale="ca_ES.UTF-8@valencia"
     
    5286                poDict[locale]={msgid:poString}
    5387        localeSet.append(locale)
    54 #       print(localeDict)
     88#def save_locale
    5589
    5690def print_locale():
     
    6397                        f.write("msgid \""+     msgId+"\"\n")
    6498                        if msgId in poDict[localization]:
    65                                 f.write(poDict[localization][msgId])
     99                                f.write("msgstr \""+poDict[localization][msgId]+"\"\n")
    66100                        else:
    67                                 f.write("msgstr \"\"")
    68                         f.write("\n")
     101                                f.write("msgstr \"\"\n")
    69102                        f.close
    70 
    71 def read_po(poFile):
    72         f=open(poFile,'r')
    73         lines=f.readlines()
    74         f.close
    75         for line in lines:
    76                 if line.startswith("msgid")
    77                         msgID=line.replace('msgid ','')
    78                         msgID=msgID.replace('"','')
    79                         poDict{msgID]=''
    80                 else
    81                         msgText=line.replace("msgstr ",'')
    82                         msgText=msgText.replace('"','')
    83                         poDict[msgID]=msgText
    84 
     103#def print_locale
     104
     105def get_locale_from_po(poFile):
     106        locale=poFile.replace('catalogue_','')
     107        locale=locale.replace('.po','')
     108        if "valencia" in locale or "qcv" in locale:
     109                locale="ca_ES.UTF-8@valencia"
     110        return(locale)
     111#def get_locale_from_po
     112
     113def load_po(poFile,locale):
     114        global poDict
     115        global fileEncoding
     116        fileEncoding=PO.detect_encoding(poFile)
     117        poDict={}
     118        po = PO.pofile(poFile,encoding=fileEncoding)
     119        for entry in po:
     120                if entry.msgid in poDict.keys():
     121                        poDict[entry.msgid].update({locale:entry.msgstr})
     122                else:
     123                        poDict[entry.msgid]={locale:entry.msgstr}
     124#def load_po
     125
     126def get_translations(msgid):
     127        translationDict={}
     128        print("Searching translations for " + msgid)
     129        if msgid in poDict.keys():
     130                translationDict=poDict[msgid].copy()
     131        print("Get "+str(translationDict))
     132        return translationDict
     133#def get_translations
     134
     135def merge_translations(candidatePaths,locale):
     136        for path in candidatePaths:
     137                dirContent = os.listdir(path)
     138                for xmlFile in dirContent:
     139                        if not xmlFile.endswith(".xml"):
     140                                continue
     141                        xml = ET.parse(path+'/'+xmlFile)
     142                        xmlRoot=xml.getroot()
     143                        tagList=['name','summary','description']
     144                        for tag in tagList:
     145                                for element in xmlRoot.iter(tag):
     146                                        if tag=='description':
     147                                                #1st loop, get the msgid
     148                                                for xmlDesc in element:
     149                                                        if not (xmlDesc.attrib):
     150                                                                translationDict=get_translated_msgid(xmlDesc)
     151                                                                break
     152                                                #2dn loop, modify or add translations
     153                                                for xmlDesc in element:
     154                                                        if not (xmlDesc.attrib):
     155                                                                continue
     156                                                        #Modify translation
     157                                                        localeTrans=xmlDesc.attrib['{http://www.w3.org/XML/1998/namespace}lang']
     158                                                        if localeTrans in translationDict.keys():
     159                                                                translation=translationDict[localeTrans]
     160                                                                if translation:
     161                                                                        xmlDesc.text=translation
     162                                                                del translationDict[localeTrans]
     163                                                #Generate new translations
     164                                                for locale,translation in translationDict.items():
     165                                                        add_new_translation(element,'p',translation)
     166                                        else:
     167                                                if not (element.attrib):
     168                                                        translationDict=get_translated_msgid(element)
     169                                                else:
     170                                                        #Modify translation
     171                                                        localeTrans=element.attrib['{http://www.w3.org/XML/1998/namespace}lang']
     172                                                        if localeTrans in translationDict.keys():
     173                                                                translation=translationDict[localeTrans]
     174                                                                if translation:
     175                                                                        element.text=translation
     176                                                                del translationDict[localeTrans]
     177                                #Generate new translations
     178                                for locale,translation in translationDict.items():
     179                                        if tag=='description':
     180                                                continue
     181                                        add_new_translation(xmlRoot,tag,translation)
     182                                xml.write('output.xml',encoding=fileEncoding)
     183
     184def get_translated_msgid(element):
     185        msgid=str(element.text).replace("\"","\'")
     186        msgid=str(msgid).replace("\n"," ")
     187        translationDict=get_translations(msgid)
     188        return translationDict
     189
     190def add_new_translation(element,tag,text):
     191        if text!='':
     192                newDesc=ET.SubElement(element, tag)
     193                newDesc.set('xml:lang',locale)
     194                newDesc.text=text
     195
     196#### MAIN PROGRAM ####
     197fileEncoding=''
     198mode=''
     199wrkDir=''
     200poFile=''
     201parse_arguments()
     202print(("Analyzing %s for action %s") % (wrkDir,mode))
    85203localeSet=[]
    86204msgIdList=[]
    87205poDict={}
    88 outputFile="catalogue"
    89 pathList=get_package_dirs("/home/juanma/svn/xenial")
    90 generate_tmp_po(pathList,outputFile)
    91 localeSet=set(localeSet)
    92 print_locale()
    93 print("Info generated for "+str(localeSet))
    94 
     206pathList=get_package_dirs(wrkDir)
     207if mode=='export':
     208        outputFile="catalogue"
     209        generate_tmp_po(pathList,outputFile)
     210        localeSet=set(localeSet)
     211        print_locale()
     212        print("Info generated for "+str(localeSet))
     213else:
     214        locale=get_locale_from_po(poFile)
     215        load_po(poFile,locale)
     216        merge_translations(pathList,locale)
     217        print("Po file imported in dirs "+str(pathList))
Note: See TracChangeset for help on using the changeset viewer.