svghmi/i18n.py
branchsvghmi
changeset 3144 2af6afaccaf2
parent 3133 450cd01324ad
child 3157 279e08f238ca
equal deleted inserted replaced
3143:8388e6d4aa61 3144:2af6afaccaf2
    62 
    62 
    63     with open(fname, 'w') as POT_file:
    63     with open(fname, 'w') as POT_file:
    64         w.write(POT_file)
    64         w.write(POT_file)
    65 
    65 
    66 def ReadTranslations(dirpath):
    66 def ReadTranslations(dirpath):
    67     """ Read all PO files from a directory and return a list of (lang, translation_dict) tuples """
    67     """ Read all PO files from a directory and return a list of (langcode, translation_dict) tuples """
    68 
    68 
    69     po_files = [fname for fname in os.listdir(dirpath) if fname.endswith(".po")]
    69     po_files = [fname for fname in os.listdir(dirpath) if fname.endswith(".po")]
       
    70     po_files.sort()
    70 
    71 
    71     translations = []
    72     translations = []
    72     for po_fname in po_files:
    73     for po_fname in po_files:
    73         r = POReader()
    74         r = POReader()
    74         with open(os.path.join(dirpath, po_fname), 'r') as PO_file:
    75         with open(os.path.join(dirpath, po_fname), 'r') as PO_file:
    84     """
    85     """
    85     translated_messages = []
    86     translated_messages = []
    86     broken_lang = set()
    87     broken_lang = set()
    87     for msgid,label,svgid in messages:
    88     for msgid,label,svgid in messages:
    88         translated_message = []
    89         translated_message = []
    89         for lang,translation in translations:
    90         for langcode,translation in translations:
    90             msg = translation.pop(msgid, None)
    91             msg = translation.pop(msgid, None)
    91             if msg is None:
    92             if msg is None:
    92                 broken_lang.add(lang)
    93                 broken_lang.add(langcode)
    93                 errcallback(_('{}: Missing translation for "{}" (label:{}, id:{})\n').format(lang,msgid,label,svgid))
    94                 errcallback(_('{}: Missing translation for "{}" (label:{}, id:{})\n').format(lang,msgid,label,svgid))
    94                 translated_message.append(msgid)
    95                 translated_message.append(msgid)
    95             else:
    96             else:
    96                 translated_message.append(msg)
    97                 translated_message.append(msg)
    97         translated_messages.append((msgid,translated_message))
    98         translated_messages.append((msgid,translated_message))
    98     langs = []
    99     langs = []
    99     for lang,translation in translations:
   100     for langcode,translation in translations:
   100         try:
   101         try:
   101             l,c = lang.split("_")
   102             l,c = langcode.split("_")
   102             language_name = pycountry.languages.get(alpha_2 = l).name
   103             language_name = pycountry.languages.get(alpha_2 = l).name
   103             country_name = pycountry.countries.get(alpha_2 = c).name
   104             country_name = pycountry.countries.get(alpha_2 = c).name
   104             langs.append("{} ({})".format(language_name, country_name))
   105             langname = "{} ({})".format(language_name, country_name)
   105         except:
   106         except:
   106             try:
   107             try:
   107                 language_name = pycountry.languages.get(alpha_2 = lang).name
   108                 langname = pycountry.languages.get(alpha_2 = langcode).name
   108                 langs.append(language_name)
       
   109             except:
   109             except:
   110                 langs.append(lang)
   110                 langname = langcode
       
   111 
       
   112         langs.append((langname,langcode))
   111 
   113 
   112         broken = False
   114         broken = False
   113         for msgid, msg in translation.iteritems():
   115         for msgid, msg in translation.iteritems():
   114             broken = True
   116             broken = True
   115             errcallback(_('{}: Unused translation "{}":"{}"\n').format(lang,msgid,msg))
   117             errcallback(_('{}: Unused translation "{}":"{}"\n').format(langcode,msgid,msg))
   116         if broken or lang in broken_lang:
   118         if broken or langcode in broken_lang:
   117             errcallback(_('Translation for {} is outdated, please edit {}.po, click "Catalog -> Update from POT File..." and select messages.pot.\n').format(lang,lang))
   119             errcallback(_('Translation for {} is outdated, please edit {}.po, click "Catalog -> Update from POT File..." and select messages.pot.\n').format(lang,lang))
   118 
   120 
   119 
   121 
   120     return langs,translated_messages
   122     return langs,translated_messages
   121 
   123 
   123 def TranslationToEtree(langs,translated_messages):
   125 def TranslationToEtree(langs,translated_messages):
   124 
   126 
   125     result = etree.Element("translations")
   127     result = etree.Element("translations")
   126 
   128 
   127     langsroot = etree.SubElement(result, "langs")
   129     langsroot = etree.SubElement(result, "langs")
   128     for lang in langs:
   130     for name, code in langs:
   129         langel = etree.SubElement(langsroot, "lang")
   131         langel = etree.SubElement(langsroot, "lang", {"code":code})
   130         langel.text = lang
   132         langel.text = name
   131 
   133 
   132     msgsroot = etree.SubElement(result, "messages")
   134     msgsroot = etree.SubElement(result, "messages")
   133     for msgid, msgs in translated_messages:
   135     for msgid, msgs in translated_messages:
   134         msgidel = etree.SubElement(msgsroot, "msgid")
   136         msgidel = etree.SubElement(msgsroot, "msgid")
   135         for msg in msgs:
   137         for msg in msgs: