def main(): if len(sys.argv) < 3: print 'You have to specify the product and the new text for projectid.' sys.exit(1) product = getLongProductName(sys.argv[1]) projectid = sys.argv[2] os.chdir('..') os.chdir('i18n') poFiles = getPoFiles(product, all=True) if poFiles == []: print 'No po-files were found for the given product.' sys.exit(2) for poFile in poFiles: try: po_ctl = catalog.MessageCatalog(filename=poFile) except IOError, e: print >> sys.stderr, 'I/O Error: %s' % e po_ctl.mime_header['Project-Id-Version'] = projectid file = open(poFile, 'w') writer = catalog.POWriter(file, po_ctl) writer.write(sort=False)
def merge(arguments): # Determine final argument values. pot_fn = arguments.pot_fn merge_fn = arguments.merge_fn merge2_fn = arguments.merge2_fn if merge2_fn == merge_fn: merge2_fn = False if not pot_fn: short_usage(1, u"No pot file specified as target with --pot.") if not merge_fn: short_usage(1, u"No potfile specified as source with --merge.") try: orig_ctl = catalog.MessageCatalog(filename=pot_fn) merge_ctl = catalog.MessageCatalog(filename=merge_fn) if merge2_fn: merge2_ctl = catalog.MessageCatalog(filename=merge2_fn) except IOError as e: short_usage(0, 'I/O Error: %s' % e) # merge orig_ctl.add_missing(merge_ctl, '', 1) if merge2_fn: orig_ctl.add_missing(merge2_ctl, '', 1) orig_ctl.mime_header['POT-Creation-Date'] = catalog.now() file = open(pot_fn, 'w') writer = catalog.POWriter(file, orig_ctl) writer.write(msgstrToComment=True)
def main(): if len(sys.argv) < 3: print('You have to specify the product and the new text for domain.') sys.exit(1) product = getLongProductName(sys.argv[1]) domain = sys.argv[2] os.chdir('..') os.chdir('i18n') poFiles = getPoFiles(product, all=True) if poFiles == []: print('No po-files were found for the given product.') sys.exit(2) for poFile in poFiles: try: po_ctl = catalog.MessageCatalog(filename=poFile) except IOError as e: print('I/O Error: %s' % e, file=sys.stderr) po_ctl.mime_header['Domain'] = domain file = open(poFile, 'w') writer = catalog.POWriter(file, po_ctl) writer.write(sort=False)
def test_write(self): # Explicitly enable wrapping here, as that is what we did in # the test po file. orig_wrap = utils.WRAP utils.WRAP = True fd = open(self.output, 'w') pow = catalog.POWriter(fd, self.catalog) pow.write(sort=True) fd.close() # Restore original value. utils.WRAP = orig_wrap input = open(self.input, 'r') output = open(self.output, 'r') # compare line by line inlines = input.readlines() outlines = enumerate(output.readlines()) input.close() output.close() for i, result in outlines: orig = inlines[i] self.assertEqual( orig, result, 'difference in line %s, \'%s\' != \'%s\'' % (i, orig, result))
def main(): if len(sys.argv) < 2: print('You have to specify the product.') sys.exit(1) product = getLongProductName(sys.argv[1]) os.chdir('..') os.chdir('i18n') poFiles = getPoFiles(product, all=True) if poFiles == []: print('No po-files were found for the given product.') sys.exit(2) for poFile in poFiles: try: po_ctl = catalog.MessageCatalog(filename=poFile) except IOError as e: print('I/O Error: %s' % e, file=sys.stderr) try: language = po_ctl.commentary_header[0].split('to ')[1:][0] po_ctl.commentary_header[ 0] = 'Translation of ' + product + '.pot to ' + language except IndexError: print(poFile) file = open(poFile + '-new', 'w') writer = catalog.POWriter(file, po_ctl) writer.write(sort=False)
def filter(arguments): f1_ctl = catalog.MessageCatalog(filename=arguments.file1) f2_ctl = catalog.MessageCatalog(filename=arguments.file2) for msgid in f1_ctl.keys(): if msgid in f2_ctl: del f1_ctl[msgid] writer = catalog.POWriter(sys.stdout, f1_ctl) writer.write(sort=False, msgstrToComment=True)
def admix(arguments): base_ctl = catalog.MessageCatalog(filename=arguments.file1) mixin_ctl = catalog.MessageCatalog(filename=arguments.file2) for msgid in mixin_ctl: mixin_msgstr = mixin_ctl[msgid].msgstr if mixin_msgstr and msgid in base_ctl and not base_ctl[msgid].msgstr: entry = base_ctl[msgid] entry.msgstr = mixin_ctl[msgid].msgstr base_ctl[msgid] = entry writer = catalog.POWriter(sys.stdout, base_ctl) writer.write(sort=False)
def filter(arguments): f1_ctl = catalog.MessageCatalog(filename=arguments.file1) f2_ctl = catalog.MessageCatalog(filename=arguments.file2) # On Python 3.7 we can get an error if we delete immediately: # RuntimeError: OrderedDict mutated during iteration # So first gather items in a list. That is better anyway. to_delete = [] for msgid in f1_ctl.keys(): if msgid in f2_ctl: to_delete.append(msgid) for msgid in to_delete: del f1_ctl[msgid] writer = catalog.POWriter(sys.stdout, f1_ctl) writer.write(sort=False, msgstrToComment=True)
def filter(): if len(sys.argv[2:]) != 2: usage(1) file1 = sys.argv[2] file2 = sys.argv[3] f1_ctl = catalog.MessageCatalog(filename=file1) f2_ctl = catalog.MessageCatalog(filename=file2) for msgid in f1_ctl.keys(): if msgid in f2_ctl: del f1_ctl[msgid] writer = catalog.POWriter(sys.stdout, f1_ctl) writer.write(sort=False, msgstrToComment=True)
def admix(): if len(sys.argv) != 4: usage(1) fn = sys.argv[2] base_ctl = catalog.MessageCatalog(filename=fn) fn = sys.argv[3] mixin_ctl = catalog.MessageCatalog(filename=fn) for msgid in mixin_ctl: mixin_msgstr = mixin_ctl[msgid].msgstr if mixin_msgstr and msgid in base_ctl and not base_ctl[msgid].msgstr: entry = base_ctl[msgid] entry.msgstr = mixin_ctl[msgid].msgstr base_ctl[msgid] = entry writer = catalog.POWriter(sys.stdout, base_ctl) writer.write(sort=False)
def test_write(self): fd = open(self.output, 'wb') pow = catalog.POWriter(fd, self.catalog) pow.write(sort=True) fd.close() input = open(self.input, 'r') output = open(self.output, 'r') # compare line by line inlines = input.readlines() outlines = enumerate(output.readlines()) input.close() output.close() for i, result in outlines: orig = inlines[i] self.failUnlessEqual( orig, result, 'difference in line %s, \'%s\' != \'%s\'' % (i, orig, result))
def trmerge(): if len(sys.argv) != 4: usage(1) fn = sys.argv[2] base_ctl = catalog.MessageCatalog(filename=fn) fn = sys.argv[3] mixin_ctl = catalog.MessageCatalog(filename=fn) for msgid in mixin_ctl: mixin_msgstr = mixin_ctl[msgid].msgstr if mixin_msgstr: entry = base_ctl.get(msgid, mixin_ctl[msgid]) entry.msgstr = mixin_msgstr if ', fuzzy' in entry.comments: entry.comments.remove(', fuzzy') base_ctl[msgid] = entry writer = catalog.POWriter(sys.stdout, base_ctl) writer.write(sort=False)
def test_writeSpecialComments(self): fd = open(self.output2, 'w') pow = catalog.POWriter(fd, self.catalog2) pow.write(sort=True) fd.close() output = open(self.output2, 'r') expected = open(self.expectedOutput2, 'r') # compare line by line outlines = output.readlines() explines = enumerate(expected.readlines()) output.close() expected.close() for i, result in explines: orig = outlines[i] self.assertEqual( orig, result, 'difference in line %s, Got: \'%s\' != Expected: \'%s\'' % (i, orig, result))
def sync(arguments): pot_fn = arguments.pot_fn if not pot_fn: short_usage(1, u"No pot file specified as target with --pot.") files = filter_isfile(arguments.files) try: pot_ctl = catalog.MessageCatalog(filename=pot_fn) po_ctls = [catalog.MessageCatalog(filename=fn) for fn in files] except IOError as e: short_usage(1, 'I/O Error: %s' % e) for po in po_ctls: added_msgids, removed_msgids = po.sync(pot_ctl) file = open(po.filename, 'w') writer = catalog.POWriter(file, po) writer.write(msgstrToComment=False, sync=True) print('%s: %s added, %s removed' % (po.filename, len(added_msgids), len(removed_msgids))) file.close()
def trmerge(arguments): base_ctl = catalog.MessageCatalog(filename=arguments.file1) mixin_ctl = catalog.MessageCatalog(filename=arguments.file2) for msgid in mixin_ctl: base_entry = base_ctl.get(msgid) if base_entry is None and arguments.ignore_extra: # This msgid is not in the original po-file and the user # has chosen to ignore it. continue mixin_entry = mixin_ctl[msgid] mixin_msgstr = mixin_entry.msgstr if not mixin_msgstr: # The mixin translation is empty. continue if ', fuzzy' in mixin_entry.comments: # The mixin translation is fuzzy. continue if (arguments.no_override and base_entry is not None and base_entry.msgstr and ', fuzzy' not in base_entry.comments): # The user does not want to override and we have an # existing, non-fuzzy translation. continue # Okay, we have a fine new translation. entry = base_entry or mixin_entry entry.msgstr = mixin_msgstr if ', fuzzy' in entry.comments: # The base entry was fuzzy, but the mixin has a different # or non-fuzzy translation. entry.comments.remove(', fuzzy') # Finally store the new entry base_ctl[msgid] = entry writer = catalog.POWriter(sys.stdout, base_ctl) writer.write(sort=False)
def main(): os.chdir('..') os.chdir('i18n') poFilesPlone = getPoFiles('plone') if not poFilesPlone: print('No po-files were found for Plone.') sys.exit(2) poFilesATCT = getPoFiles('atcontenttypes') if not poFilesATCT: print('No po-files were found for ATContentTypes.') sys.exit(3) # format: 'old-domain' : ['msgid1', 'msgid2', ...] relocated = {'plone' : ['Changes saved.', 'Please correct the indicated errors.', 'Rotate 180', 'help_boolean_criteria_bool', 'help_criteria_field_name', 'help_custom_view', 'help_custom_view_fields', 'help_date_range_criteria_end', 'help_date_range_criteria_start', 'help_exclude_from_nav', 'help_limit_number', 'help_news_image', 'help_shortname', 'help_path_criteria_value', 'help_string_criteria_value', 'help_portal_type_criteria_value', 'help_url', 'label_body_text', 'label_boolean_criteria_bool', 'label_contact_email', 'label_contact_name', 'label_contact_phone', 'label_criteria_field_name', 'label_custom_view', 'label_custom_view_fields', 'label_date_range_criteria_end', 'label_event_announcement', 'label_date_range_criteria_start', 'label_event_attendees', 'label_event_end', 'label_event_location', 'label_event_start', 'label_event_type', 'label_exclude_from_nav', 'label_file', 'label_image', 'label_image_caption', 'label_inherit_criteria', 'label_item_count', 'label_limit_number', 'label_news_image', 'label_path_criteria_recurse', 'label_path_criteria_value', 'label_related_items', 'label_short_name', 'label_string_criteria_value', 'label_url', ] } # make sure we only try on languages for which both po files exist ploneLanguages = [getLanguage('plone', p) for p in poFilesPlone] atctLanguages = [getLanguage('atcontenttypes', p) for p in poFilesATCT] languages = [l for l in ploneLanguages if l in atctLanguages and l != 'en'] changes = {'plone' : False, 'atcontenttypes' : False} for lang in languages: po_ctl = {} try: po_ctl['plone'] = catalog.MessageCatalog(filename='plone-%s.po' % lang) except IOError as e: print('I/O Error: %s' % e, file=sys.stderr) try: po_ctl['atcontenttypes'] = catalog.MessageCatalog(filename='atcontenttypes-%s.po' % lang) except IOError as e: print('I/O Error: %s' % e, file=sys.stderr) changes = {'plone' : False, 'atcontenttypes' : False} relocate_domain = {'plone' : 'atcontenttypes', 'atcontenttypes' : 'plone'} msgids = {} msgids['plone'] = list(po_ctl['plone'].keys()) msgids['atcontenttypes'] = list(po_ctl['atcontenttypes'].keys()) for old_domain in relocated: relocate_msgids = relocated.get(old_domain) for relocate_msgid in relocate_msgids: if relocate_msgid in msgids[old_domain]: msgstr = po_ctl[old_domain].get(relocate_msgid) # We copy over messages for now # del po_ctl[old_domain][relocate_msgid] changes[old_domain] = True new_domain = relocate_domain.get(old_domain) if relocate_msgid in msgids[new_domain]: old_msgstr = po_ctl[new_domain].get(relocate_msgid) if old_msgstr.msgstr == '' and msgstr: po_ctl[new_domain][relocate_msgid] = msgstr changes[new_domain] = True print('copied msgstr for %s' % relocate_msgid) #else: # print '%s was already there' % relocate_msgid else: po_ctl[new_domain][relocate_msgid] = msgstr changes[new_domain] = True print('copied %s to %s-%s.po' % (relocate_msgid, new_domain, lang)) #else: # print '%s was not found anymore' % relocate_msgid for domain in changes: if changes[domain]: file = open('%s-%s.po' % (domain, lang), 'w') writer = catalog.POWriter(file, po_ctl[domain]) writer.write(sort=True)
def rebuild_pot(arguments): merge_ctl = None # Determine final argument values. create_domain = arguments.create_domain exclude = arguments.exclude and tuple(arguments.exclude.split()) or () pot_fn = arguments.pot_fn merge_fn = arguments.merge_fn merge2_fn = arguments.merge2_fn if merge2_fn == merge_fn: merge2_fn = False path = arguments.path try: if create_domain is not None: orig_ctl = catalog.MessageCatalog(domain=create_domain) else: orig_ctl = catalog.MessageCatalog(filename=pot_fn) create_domain = orig_ctl.domain if merge_fn: merge_ctl = catalog.MessageCatalog(filename=merge_fn) if merge2_fn: merge2_ctl = catalog.MessageCatalog(filename=merge2_fn) ptreader = catalog.PTReader(path, create_domain, exclude=exclude) pyreader = catalog.PYReader(path, create_domain, exclude=exclude) gsreader = catalog.GSReader(path, create_domain, exclude=exclude) zcmlreader = catalog.ZCMLReader(path, create_domain, exclude=exclude) except IOError as e: short_usage(0, 'I/O Error: %s' % e) # Read the data. ptreader.read() pyreader.read() gsreader.read() zcmlreader.read() domain = orig_ctl.domain ptctl = pyctl = gsctl = zcmlctl = {} if domain in ptreader.catalogs: ptctl = ptreader.catalogs[domain] for key in orig_ctl.keys(): if key in ptctl: # preserve comments ptctl[key].comments = ptctl[ key].comments + orig_ctl.getComments(key) if domain in pyreader.catalogs: pyctl = pyreader.catalogs[domain] for key in orig_ctl.keys(): if key in pyctl: # preserve comments pyctl[key].comments = pyctl[ key].comments + orig_ctl.getComments(key) if domain in gsreader.catalogs: gsctl = gsreader.catalogs[domain] # XXX Preserve comments? if domain in zcmlreader.catalogs: zcmlctl = zcmlreader.catalogs[domain] # XXX Preserve comments? if not (ptctl or pyctl or gsctl or zcmlctl): short_usage(0, 'No entries for domain "%s".' % domain) ctl = ptctl or pyctl or gsctl or zcmlctl if pyctl and pyctl is not ctl: ctl.merge(pyctl) if gsctl and gsctl is not ctl: ctl.merge(gsctl) if zcmlctl and zcmlctl is not ctl: ctl.merge(zcmlctl) if merge_ctl is not None: # use headers from merge-catalog ctl.commentary_header = merge_ctl.commentary_header ctl.mime_header = merge_ctl.mime_header # merge ctl.add_missing(merge_ctl, mergewarn=True) else: # use headers from orig-catalog ctl.commentary_header = orig_ctl.commentary_header ctl.mime_header = orig_ctl.mime_header if merge2_fn: ctl.add_missing(merge2_ctl, mergewarn=True) ctl.mime_header['POT-Creation-Date'] = catalog.now() file = open(pot_fn, 'w') writer = catalog.POWriter(file, ctl) writer.write(msgstrToComment=True)
# We copy over messages for now # del po_ctl[old_domain][relocate_msgid] changes[old_domain] = True new_domain = relocate_domain.get(old_domain) if relocate_msgid in msgids[new_domain]: old_msgstr = po_ctl[new_domain].get(relocate_msgid) if old_msgstr.msgstr == '' and msgstr: po_ctl[new_domain][relocate_msgid] = msgstr changes[new_domain] = True print 'copied msgstr for %s' % relocate_msgid #else: # print '%s was already there' % relocate_msgid else: po_ctl[new_domain][relocate_msgid] = msgstr changes[new_domain] = True print 'copied %s to %s-%s.po' % (relocate_msgid, new_domain, lang) #else: # print '%s was not found anymore' % relocate_msgid for domain in changes: if changes[domain]: file = open('%s-%s.po' % (domain, lang), 'w') writer = catalog.POWriter(file, po_ctl[domain]) writer.write(sort=True) if __name__ == '__main__': main()
# use headers from merge-catalog ctl.commentary_header = merge_ctl.commentary_header ctl.mime_header = merge_ctl.mime_header # merge ctl.add_missing(merge_ctl, mergewarn=True) else: # use headers from orig-catalog ctl.commentary_header = orig_ctl.commentary_header ctl.mime_header = orig_ctl.mime_header if merge2_fn: ctl.add_missing(merge2_ctl, mergewarn=True) ctl.mime_header['POT-Creation-Date'] = catalog.now() file = open(pot_fn, 'w') writer = catalog.POWriter(file, ctl) writer.write(msgstrToComment=True) def merge(): try: opts, files = getopt.getopt(sys.argv[2:], 'sm:p:', ('pot=', 'merge=', 'merge2=')) except: usage(1) pot_fn = None merge_fn = None for opt, arg in opts: if opt in ('-p', '--pot'): pot_fn = arg