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: |