From 0432e0998ebfdacc5a87eb0325539b94ca6ad9b7 Mon Sep 17 00:00:00 2001 From: Don Allingham Date: Tue, 22 May 2001 22:30:13 +0000 Subject: [PATCH] Internationalization fixes, support for PDF generation svn: r45 --- src/Date.py | 3 +- src/EditPerson.glade | 2 +- src/EditPerson.py | 7 +-- src/HtmlDoc.py | 14 +++-- src/Plugins.py | 46 ++++++++++++--- src/ReadXML.py | 11 ++-- src/build_po | 5 +- src/gramps.py | 23 ++++++-- src/gramps_main.py | 49 +++++++--------- src/plugins/AncestorChart.py | 17 +++++- src/plugins/AncestorReport.py | 13 ++++- src/plugins/Desbrowser.py | 15 ++++- src/plugins/DescendReport.py | 27 +++++++-- src/plugins/EventCmp.py | 11 ++-- src/plugins/FamilyGroup.py | 57 +++++++++++++------ src/plugins/GraphViz.py | 18 +++--- src/plugins/HtmlReport.py | 96 +++++++++++++++++--------------- src/plugins/IndivSummary.py | 41 +++++++++----- src/plugins/Merge.py | 13 +++-- src/plugins/PatchNames.py | 18 +++--- src/plugins/ReadGedcom.py | 16 ++++-- src/plugins/ReadNative.py | 12 +++- src/plugins/RelCalc.py | 8 ++- src/plugins/Summary.py | 7 ++- src/plugins/WriteGedcom.py | 18 +++--- src/plugins/ancestorchart.glade | 15 +++++ src/plugins/ancestorreport.glade | 15 +++++ src/plugins/desreport.glade | 27 ++++++++- src/plugins/familygroup.glade | 29 +++++++++- src/plugins/indsum.glade | 20 +++++++ 30 files changed, 454 insertions(+), 199 deletions(-) diff --git a/src/Date.py b/src/Date.py index 7883a1775..10ee944dd 100644 --- a/src/Date.py +++ b/src/Date.py @@ -35,7 +35,6 @@ class Date: formatCode = 0 entryCode = 0 - BadFormat = _("Unknown Format") Error = _("Illegal Date") range = 1 @@ -231,7 +230,7 @@ class SingleDate: _("before") + '|' + \ _("after") + '|' + \ _("aft") + '|' + \ - _("bef") + ")" + _("bef") + ')' start = "^\s*" + modifiers + "?\s*" diff --git a/src/EditPerson.glade b/src/EditPerson.glade index de00afad4..2d1d7bdc9 100644 --- a/src/EditPerson.glade +++ b/src/EditPerson.glade @@ -1905,7 +1905,7 @@ GtkLabel label142 - + GTK_JUSTIFY_CENTER False 1 diff --git a/src/EditPerson.py b/src/EditPerson.py index a56da524d..1698db82f 100644 --- a/src/EditPerson.py +++ b/src/EditPerson.py @@ -734,12 +734,7 @@ def on_event_add_clicked(obj): desc = edit_person_obj.event_descr_field.get_text() event = Event() - try: - event.set(name,date,place,desc) - except Date.BadFormat,msg: - msg1 = _(" is not a valid date format, and has been\n") - msg2 = _("ignored as the date of the event.") - GnomeWarningDialog(str(msg) + msg1) + event.set(name,date,place,desc) if name not in const.personalEvents: const.personalEvents.append(name) diff --git a/src/HtmlDoc.py b/src/HtmlDoc.py index 0304970ef..63e93d3a4 100644 --- a/src/HtmlDoc.py +++ b/src/HtmlDoc.py @@ -87,20 +87,22 @@ class HtmlDoc(TextDoc): self.bottom.append(line) templateFile.close() if top_add == 1: - mymsg = "Did not file '' marker in the template" + mymsg = _("The marker '' was not in the template") gnome.ui.GnomeErrorDialog(mymsg) except IOError,msg: import gnome.ui - mymsg = "Could not open the template file\n" + str(msg) + "\n" +\ - "Using default template" + mymsg = _("Could not open %s\nUsing the default template") % \ + self.template + mymsg = "%s\n%s" % (mymsg,msg) gnome.ui.GnomeWarningDialog(mymsg) self.bottom = _bottom self.top = _top except: import gnome.ui - mymsg = "Could not open the template file\n" + "Using default template" + mymsg = _("Could not open %s\nUsing the default template") % \ + self.template gnome.ui.GnomeWarningDialog(mymsg) self.bottom = _bottom self.top = _top @@ -196,7 +198,7 @@ class HtmlDoc(TextDoc): def start_cell(self,style_name,span=1): self.empty = 1 - self.f.write(' 1: self.f.write(' colspan="' + str(span) + '"') else: @@ -223,6 +225,6 @@ class HtmlDoc(TextDoc): def write_text(self,text): if text != "": self.empty = 0 - text = string.replace(text,'\n','
>') + text = string.replace(text,'\n','
') self.f.write(text) diff --git a/src/Plugins.py b/src/Plugins.py index bf7ba37f2..be0f28542 100644 --- a/src/Plugins.py +++ b/src/Plugins.py @@ -34,6 +34,8 @@ import intl _ = intl.gettext +names = {} + #------------------------------------------------------------------------- # # @@ -87,9 +89,14 @@ class ReportPlugins: item_hash = {} for report in reports: - info = string.split(report.__doc__,"/") + if report.__dict__.has_key("get_name"): + doc = report.get_name() + else: + doc = report.__doc__ + + info = string.split(doc,"/") if len(info) == 1: - category = "Uncategorized" + category = _("Uncategorized") name = info[0] else: category = info[0] @@ -105,7 +112,7 @@ class ReportPlugins: item.set_data("i",report.get_xpm_image) else: item.set_data("i",no_image) - item.set_data("t",report.__doc__) + item.set_data("t",doc) item.connect("select",on_report_node_selected) if item_hash.has_key(category): item_hash[category].append(item) @@ -151,12 +158,17 @@ class ToolPlugins: item_hash = {} for report in tools: - info = string.split(report.__doc__,"/") + if report.__dict__.has_key("get_name"): + doc = report.get_name() + else: + doc = report.__doc__ + + info = string.split(doc,"/") item = GtkTreeItem(info[1]) item.set_data("o",self) item.set_data("c",report.runTool) item.set_data("d",report.get_description) - item.set_data("t",report.__doc__) + item.set_data("t",doc) item.connect("select",on_node_selected) if item_hash.has_key(info[0]): item_hash[info[0]].append(item) @@ -221,7 +233,7 @@ def on_report_node_selected(obj): # #------------------------------------------------------------------------- def by_doc(a,b): - return cmp(a.__doc__,b.__doc__) + return cmp(names[a],names[b]) #------------------------------------------------------------------------- # @@ -281,8 +293,14 @@ def load_plugins(dir): groups = match.groups() try: plugin = __import__(groups[0]) + try: + names[plugin] = plugin.get_name() + except: + names[plugin] = plugin.__doc__ except: - print groups[0] + print _("Failed to load the module: %s") % groups[0] + import traceback + traceback.print_exc() continue for task in plugin.__dict__.keys(): if task == "report": @@ -308,7 +326,12 @@ def export_menu(callback): myMenu = GtkMenu() for report in exports: - item = GtkMenuItem(report.__doc__) + try: + text = report.get_name() + except: + text = report.__doc__ + item = GtkMenuItem(text) + item.show() item.connect("activate", callback ,report.writeData) myMenu.append(item) @@ -323,7 +346,12 @@ def import_menu(callback): myMenu = GtkMenu() for report in imports: - item = GtkMenuItem(report.__doc__) + try: + text = report.get_name() + except: + text = report.__doc__ + item = GtkMenuItem(text) + item.show() item.connect("activate", callback ,report.readData) myMenu.append(item) diff --git a/src/ReadXML.py b/src/ReadXML.py index 3cb8e08b3..2fd37b509 100644 --- a/src/ReadXML.py +++ b/src/ReadXML.py @@ -101,10 +101,10 @@ def loadData(database, filename, callback): else: xml_file = EncodedFile(gzip.open(filename,"rb"),'utf-8','latin-1') except IOError,msg: - GnomeErrorDialog(filename + _(" could not be opened\n") + str(msg)) + GnomeErrorDialog(_("%s could not be opened\n") % filename + str(msg)) return 0 except: - GnomeErrorDialog(filename + _(" could not be opened\n")) + GnomeErrorDialog(_("%s could not be opened\n") % filename) return 0 try: @@ -113,14 +113,13 @@ def loadData(database, filename, callback): else: parser.parse(xml_file) except xml.sax.SAXParseException: - GnomeErrorDialog(filename + _(" is a corrupt file")) + GnomeErrorDialog(_("%s is a corrupt file") % filename) return 0 except IOError,msg: - GnomeErrorDialog(filename + _(" is not a valid gramps file\n") + \ - str(msg)) + GnomeErrorDialog(_("Error reading %s") % filename + "\n" + str(msg)) return 0 except: - GnomeErrorDialog(_("Could not read ") + filename) + GnomeErrorDialog(_("Error reading %s") % filename) return 0 diff --git a/src/build_po b/src/build_po index 2aaddfb56..713d59271 100755 --- a/src/build_po +++ b/src/build_po @@ -1,9 +1,10 @@ #! /bin/sh +rm -f glade.c mv template.po template.po.bak echo "Working on the glade files" -libglade-xgettext -c -o glade.c *.glade +libglade-xgettext -c -o glade.c *.glade plugins/*.glade echo "Working on python files" -./get_strings *.py filters/*.py >> glade.c +./get_strings *.py plugins/*.py filters/*.py >> glade.c echo "Building template.po" xgettext -C -s -a -o template.po glade.c diff --git a/src/gramps.py b/src/gramps.py index ba2d6344c..13ba70dcc 100755 --- a/src/gramps.py +++ b/src/gramps.py @@ -1,9 +1,11 @@ #! /usr/bin/python -O +import traceback import intl import os intl.textdomain("gramps") +_ = intl.gettext if os.environ.has_key("GRAMPSI18N"): locale = os.environ["GRAMPSI18N"] @@ -15,7 +17,20 @@ intl.bindtextdomain("gramps",locale) import gramps_main import sys -if len(sys.argv) > 1: - gramps_main.main(sys.argv[1]) -else: - gramps_main.main(None) +try: + if len(sys.argv) > 1: + gramps_main.main(sys.argv[1]) + else: + gramps_main.main(None) +except: + + fname = os.path.expanduser("~/gramps.err") + errfile = open(fname,"w") + traceback.print_exc(file=errfile) + errfile.close() + + import gnome.ui + + msg1 = _("gramps has encountered an internal error.") + msg2 = _("The error log has been saved to %s.") % fname + gnome.ui.GnomeWarningDialog("%s\n%s" % (msg1,msg2)) diff --git a/src/gramps_main.py b/src/gramps_main.py index 5138603e8..0f24b7ea6 100755 --- a/src/gramps_main.py +++ b/src/gramps_main.py @@ -640,26 +640,19 @@ def read_file(filename): if base == const.indexFile: filename = os.path.dirname(filename) elif not os.path.isdir(filename): - displayError(filename + _(" is not a directory")) + displayError(_("%s is not a directory") % filename) return - statusbar.set_status(_("Loading ") +\ - filename + "...") + statusbar.set_status(_("Loading %s ...") % filename) - if load_database(filename) == 1: - topWindow.set_title("Gramps - " + filename) - else: - statusbar.set_status("") - Config.save_last_file("") - -# try: -# if load_database(filename) == 1: -# topWindow.set_title("Gramps - " + filename) -# else: -# statusbar.set_status("") -# Config.save_last_file("") -# except: -# displayError(_("Failure reading ") + filename) + try: + if load_database(filename) == 1: + topWindow.set_title("%s - %s" % (_("Gramps"),filename)) + else: + statusbar.set_status("") + Config.save_last_file("") + except: + displayError(_("Failure reading %s") % filename) statusbar.set_progress(0.0) @@ -683,31 +676,27 @@ def on_ok_button2_clicked(obj): #------------------------------------------------------------------------- def save_file(filename): import WriteXML + + filename = os.path.normpath(filename) if sbar_active: - statusbar.set_status(_("Saving ") \ - + filename + "...") + statusbar.set_status(_("Saving %s ...") % filename) if os.path.exists(filename): if os.path.isdir(filename) == 0: - displayError(filename + _(" is not a directory")) + displayError(_("%s is not a directory") % filename) return else: try: os.mkdir(filename) except IOError, msg: - GnomeErrorDialog(_("Could not create ") + \ - os.path.normpath(filename) +\ - "\n" + str(msg)) + GnomeErrorDialog(_("Could not create %s") % filename + "\n" + str(msg)) return except OSError, msg: - GnomeErrorDialog(_("Could not create ") + \ - os.path.normpath(filename) +\ - "\n" + str(msg)) + GnomeErrorDialog(_("Could not create %s") % filename + "\n" + str(msg)) return except: - GnomeErrorDialog(_("Could not create ") + \ - os.path.normpath(filename)) + GnomeErrorDialog(_("Could not create %s") % filename) return old_file = filename @@ -1906,8 +1895,8 @@ def on_edit_bookmarks_activate(obj): def on_default_person_activate(obj): if active_person: name = active_person.getPrimaryName().getRegularName() - topWindow.question(_("Do you wish to set ") + name + \ - _(" as the home person?"), set_person) + topWindow.question(_("Do you wish to set %s as the home person") % name, \ + set_person) #------------------------------------------------------------------------- # diff --git a/src/plugins/AncestorChart.py b/src/plugins/AncestorChart.py index 0d27f9315..9daef11de 100644 --- a/src/plugins/AncestorChart.py +++ b/src/plugins/AncestorChart.py @@ -31,6 +31,11 @@ import utils from TextDoc import * from DrawDoc import * from OpenDrawDoc import * +try: + from PdfDrawDoc import * + no_pdf = 0 +except: + no_pdf = 1 from gtk import * from gnome.ui import * @@ -162,6 +167,7 @@ class AncestorChart: name = name + "\nd. " + death.getDate() self.doc.draw_box("box",name,self.x[level],self.y[index-1]) + if index > 1: old_index = int(index/2)-1 x1 = self.x[level-1]+(self.width/2.0) @@ -170,6 +176,7 @@ class AncestorChart: y1 = self.y[old_index]+self.height else: y1 = self.y[old_index] + y2 = self.y[index-1]+(self.height/2.0) self.doc.draw_line("line",x1,y1,x1,y2) self.doc.draw_line("line",x1,y2,x2,y2) @@ -201,6 +208,9 @@ def report(database,person): PaperMenu.make_paper_menu(topDialog.get_widget("papersize")) PaperMenu.make_orientation_menu(topDialog.get_widget("orientation")) + if no_pdf == 1: + topDialog.get_widget("pdf").set_sensitive(0) + title = _("Ancestor chart for %s") % name topDialog.get_widget("labelTitle").set_text(title) topDialog.signal_autoconnect({ @@ -228,9 +238,12 @@ def on_save_clicked(obj): max_gen = topDialog.get_widget("generations").get_value_as_int() - document = OpenDrawDoc(paper,orien) + if topDialog.get_widget("openoffice").get_active(): + document = OpenDrawDoc(paper,orien) + else: + document = PdfDrawDoc(paper,orien) - MyReport = AncestorChart(db,active_person,outputName,document, max_gen) + MyReport = AncestorChart(db,active_person,outputName,document,max_gen) MyReport.setup() MyReport.write_report() diff --git a/src/plugins/AncestorReport.py b/src/plugins/AncestorReport.py index 68e9a50ac..0b1d8e11b 100644 --- a/src/plugins/AncestorReport.py +++ b/src/plugins/AncestorReport.py @@ -36,6 +36,12 @@ from OpenOfficeDoc import * from HtmlDoc import * from AbiWordDoc import * +try: + from PdfDoc import * + no_pdf = 0 +except: + no_pdf = 1 + from gtk import * from gnome.ui import * from libglade import * @@ -129,7 +135,7 @@ class AncestorReport: try: self.doc.open(output) except IOError,msg: - GnomeErrorDialog(_("Could not open %s\n%s"),msg) + GnomeErrorDialog(_("Could not open %s") % output + "\n" + msg) #-------------------------------------------------------------------- # @@ -320,6 +326,9 @@ def report(database,person): PaperMenu.make_paper_menu(topDialog.get_widget("papersize")) PaperMenu.make_orientation_menu(topDialog.get_widget("orientation")) + if no_pdf: + topDialog.get_widget("pdf").set_sensitive(0) + topDialog.get_widget("labelTitle").set_text("Ahnentafel Report for " + name) topDialog.signal_autoconnect({ "destroy_passed_object" : utils.destroy_passed_object, @@ -368,6 +377,8 @@ def on_save_clicked(obj): document = OpenOfficeDoc(paper,orien) elif topDialog.get_widget("abiword").get_active(): document = AbiWordDoc(paper,orien) + elif topDialog.get_widget("pdf").get_active(): + document = PdfDoc(paper,orien) else: document = HtmlDoc(template) diff --git a/src/plugins/Desbrowser.py b/src/plugins/Desbrowser.py index e32235401..a7c4462ff 100644 --- a/src/plugins/Desbrowser.py +++ b/src/plugins/Desbrowser.py @@ -25,6 +25,9 @@ import re import string import os import utils +import intl + +_ = intl.gettext from gtk import * from gnome.ui import * @@ -75,12 +78,20 @@ def add_to_tree(tree,person): subtree.show() item.set_subtree(subtree) add_to_tree(subtree,child) - + +#------------------------------------------------------------------------- +# +# +# +#------------------------------------------------------------------------- +def get_name(): + return _("Analysis and Exploration/Interactive descendant browser") + #------------------------------------------------------------------------- # # # #------------------------------------------------------------------------- def get_description(): - return "Provides a browsable hierarchy of the active person" + return _("Provides a browsable hierarchy of the active person") diff --git a/src/plugins/DescendReport.py b/src/plugins/DescendReport.py index f8739f620..f4e4026a5 100644 --- a/src/plugins/DescendReport.py +++ b/src/plugins/DescendReport.py @@ -24,6 +24,9 @@ import os import re import sort import string +import intl + +_ = intl.gettext import RelLib import const @@ -33,6 +36,12 @@ from TextDoc import * from OpenOfficeDoc import * from AbiWordDoc import * from HtmlDoc import * +try: + import reportlab.platypus.tables + from PdfDoc import * + no_pdf = 0 +except: + no_pdf = 1 from gtk import * from gnome.ui import * @@ -96,8 +105,9 @@ class DescendantReport: #-------------------------------------------------------------------- def report(self): self.doc.start_paragraph("Title") - self.doc.write_text('Descendants of ') - self.doc.write_text(self.person.getPrimaryName().getRegularName()) + name = self.person.getPrimaryName().getRegularName() + self.doc.write_text(_("Descendants of %s") % name) + self.doc.write_text() self.doc.end_paragraph() self.dump(1,self.person) @@ -151,6 +161,10 @@ class DesReportWindow: PaperMenu.make_orientation_menu(self.top.get_widget("orientation")) mytop = self.top.get_widget("dialog1") + + if no_pdf: + self.top.get_widget("pdf").set_sensitive(0) + mytop.set_data("o",self) mytop.set_data("d",db) mytop.show() @@ -187,7 +201,7 @@ def on_save_clicked(obj): elif myobj.top.get_widget("abiword").get_active(): document = AbiWordDoc(paper,orien) else: - return + document = PdfDoc(paper,orien) report = DescendantReport(file,myobj.person,db,document) report.setup() @@ -218,8 +232,11 @@ def on_html_toggled(obj): # #------------------------------------------------------------------------ def get_description(): - return "Generates a list of descendants of the active person" - + return _("Generates a list of descendants of the active person") + +def get_name(): + return _("Generate files/Descendant Report") + #------------------------------------------------------------------------ # # diff --git a/src/plugins/EventCmp.py b/src/plugins/EventCmp.py index ec7ca8cb1..a4a20a9e4 100644 --- a/src/plugins/EventCmp.py +++ b/src/plugins/EventCmp.py @@ -30,6 +30,9 @@ import re import sort import utils import string +import intl + +_ = intl.gettext #------------------------------------------------------------------------ # @@ -450,10 +453,10 @@ def runTool(database,person,callback): # #------------------------------------------------------------------------- def get_description(): - return "Genealogical Research Event Analysis Tool\n\n" \ - "Aids in the analysis of data by allowing the development "\ - "of custom filters that can be applied to the database to "\ - "find similar events" + return _("Aids in the analysis of data by allowing the development of custom filters that can be applied to the database to find similar events") + +def get_name(): + return _("Analysis and Exploration/Compare individual events") #------------------------------------------------------------------------- # diff --git a/src/plugins/FamilyGroup.py b/src/plugins/FamilyGroup.py index b88eef1f6..228b4cc19 100644 --- a/src/plugins/FamilyGroup.py +++ b/src/plugins/FamilyGroup.py @@ -27,10 +27,19 @@ import re import sort import string import utils +import intl + +_ = intl.gettext from TextDoc import * from OpenOfficeDoc import * from HtmlDoc import * +try: + import reportlab.platypus.tables + from PdfDoc import * + no_pdf = 0 +except: + no_pdf = 1 from gtk import * from gnome.ui import * @@ -157,7 +166,7 @@ class FamilyGroup: def setup(self): self.doc.open(self.output) self.doc.start_paragraph('Title') - self.doc.write_text("Family Group Record") + self.doc.write_text(_("Family Group Record")) self.doc.end_paragraph() def end(self): @@ -186,7 +195,7 @@ class FamilyGroup: self.doc.start_row() self.doc.start_cell("TextContents") self.doc.start_paragraph('Normal') - self.doc.write_text("Birth") + self.doc.write_text(_("Birth")) self.doc.end_paragraph() self.doc.end_cell() self.doc.start_cell("TextContents") @@ -204,7 +213,7 @@ class FamilyGroup: self.doc.start_row() self.doc.start_cell("TextContents") self.doc.start_paragraph('Normal') - self.doc.write_text("Death") + self.doc.write_text(_("Death")) self.doc.end_paragraph() self.doc.end_cell() self.doc.start_cell("TextContents") @@ -232,7 +241,7 @@ class FamilyGroup: self.doc.start_row() self.doc.start_cell("TextContents") self.doc.start_paragraph('Normal') - self.doc.write_text("Father") + self.doc.write_text(_("Father")) self.doc.end_paragraph() self.doc.end_cell() self.doc.start_cell("TextContentsEnd",2) @@ -245,7 +254,7 @@ class FamilyGroup: self.doc.start_row() self.doc.start_cell("TextContents") self.doc.start_paragraph('Normal') - self.doc.write_text("Mother") + self.doc.write_text(_("Mother")) self.doc.end_paragraph() self.doc.end_cell() self.doc.start_cell("TextContentsEnd",2) @@ -258,6 +267,12 @@ class FamilyGroup: self.doc.end_table() def dump_child_event(self,text,name,event): + if event: + date = event.getDate() + place = event.getPlace() + else: + date = "" + place = "" self.doc.start_row() self.doc.start_cell(text) self.doc.start_paragraph('Normal') @@ -270,12 +285,12 @@ class FamilyGroup: self.doc.end_cell() self.doc.start_cell('TextContents') self.doc.start_paragraph('Normal') - self.doc.write_text(event.getDate()) + self.doc.write_text(date) self.doc.end_paragraph() self.doc.end_cell() self.doc.start_cell('TextContentsEnd') self.doc.start_paragraph('Normal') - self.doc.write_text(event.getPlace()) + self.doc.write_text(place) self.doc.end_paragraph() self.doc.end_cell() self.doc.end_row() @@ -307,6 +322,7 @@ class FamilyGroup: index = 1 for family in person.getFamilyList(): + m = family.getMarriage() if person == family.getFather(): spouse =family.getMother() else: @@ -318,7 +334,7 @@ class FamilyGroup: self.doc.end_cell() self.doc.start_cell('TextContents') self.doc.start_paragraph('Normal') - self.doc.write_text("Spouse") + self.doc.write_text(_("Spouse")) self.doc.end_paragraph() self.doc.end_cell() self.doc.start_cell('TextContentsEnd',2) @@ -328,11 +344,10 @@ class FamilyGroup: self.doc.end_cell() self.doc.end_row() - m = family.getMarriage() if index == families: - self.dump_child_event('TextChild2','Married',m) + self.dump_child_event('TextChild2',_("Married"),m) else: - self.dump_child_event('TextChild1','Death',m) + self.dump_child_event('TextChild1',_("Married"),m) #-------------------------------------------------------------------- # @@ -353,7 +368,7 @@ class FamilyGroup: self.doc.start_row() self.doc.start_cell('ParentHead',4) self.doc.start_paragraph('ParentName') - self.doc.write_text('Children') + self.doc.write_text(_("Children")) self.doc.end_paragraph() self.doc.end_cell() self.doc.end_row() @@ -388,7 +403,10 @@ def report(database,person): family_list = person.getFamilyList() label = topDialog.get_widget("labelTitle") - label.set_text("Family Group chart for " + name) + if no_pdf == 1: + topDialog.get_widget("pdf").set_sensitive(0) + + label.set_text(_("Family Group chart for %s") % name) topDialog.signal_autoconnect({ "destroy_passed_object" : utils.destroy_passed_object, "on_save_clicked" : on_save_clicked, @@ -400,7 +418,7 @@ def report(database,person): frame = topDialog.get_widget("spouse") option_menu = topDialog.get_widget("spouse_menu") - + if len(family_list) > 1: frame.show() else: @@ -449,8 +467,10 @@ def on_save_clicked(obj): if topDialog.get_widget("html").get_active(): template = topDialog.get_widget("htmlfile").get_text() doc = HtmlDoc(template) - else: + elif topDialog.get_widget("openoffice").get_active(): doc = OpenOfficeDoc(paper,orien) + else: + doc = PdfDoc(paper,orien) MyReport = FamilyGroup(db,family,outputName,doc) @@ -465,9 +485,10 @@ def on_save_clicked(obj): # #------------------------------------------------------------------------ def get_description(): - return "Creates a family group report, showing information on "\ - "a set of parents and their children." - + return _("Creates a family group report, showing information on a set of parents and their children.") + +def get_name(): + return _("Generate files/Family Group Report") diff --git a/src/plugins/GraphViz.py b/src/plugins/GraphViz.py index 9beb34a4d..a5e0afc44 100644 --- a/src/plugins/GraphViz.py +++ b/src/plugins/GraphViz.py @@ -26,6 +26,9 @@ import re import sort import string import utils +import intl + +_ = intl.gettext from gtk import * from gnome.ui import * @@ -238,10 +241,11 @@ def dump_index(person_list,file): # #------------------------------------------------------------------------ def get_description(): - return "Generates relationship graphs, currently only in GraphVis " \ - "format. GraphViz (dot) will transform the graph into "\ - "postscript, jpeg, png, vrml, svg, and many other formats. "\ - "GraphViz is a research project from former AT&T Research Labs. "\ - "For more information or to get a copy of GraphViz, goto "\ - "http://www.graphviz.org" - + return _("Generates relationship graphs, currently only in GraphVis format.") + \ + " " + \ + _("GraphViz (dot) will transform the graph into postscript, jpeg, png, vrml, svg, and many other formats.") + \ + " " + \ + _("For more information or to get a copy of GraphViz, goto http://www.graphviz.org") + +def get_name(): + return _("Generate files/Relationship graph") diff --git a/src/plugins/HtmlReport.py b/src/plugins/HtmlReport.py index 1fd0b1ead..ab5d4cac9 100644 --- a/src/plugins/HtmlReport.py +++ b/src/plugins/HtmlReport.py @@ -23,6 +23,8 @@ from RelLib import * import const import utils +import intl +_ = intl.gettext import os import re @@ -144,12 +146,12 @@ def an_des_of_gparents_filter(database,person,list): #------------------------------------------------------------------------ filter_map = { - "Individual" : individual_filter, - "Ancestors" : ancestor_filter, - "Descendants" : descendant_filter, - "Ancestors and descendants" : an_des_filter, - "Grandparent's ancestors and descendants" : an_des_of_gparents_filter, - "Entire database" : entire_db_filter + _("Individual") : individual_filter, + _("Ancestors") : ancestor_filter, + _("Descendants") : descendant_filter, + _("Ancestors and descendants") : an_des_filter, + _("Grandparent's ancestors and descendants") : an_des_of_gparents_filter, + _("Entire database") : entire_db_filter } #------------------------------------------------------------------------- @@ -261,19 +263,19 @@ def on_ok_clicked(obj): elif not os.path.isdir(directoryName): parent_dir = os.path.dirname(directoryName) if not os.path.isdir(parent_dir): - GnomeErrorDialog("Neither " + directoryName + " nor " + \ - parent_dir + " are directories") + GnomeErrorDialog(_("Neither %s nor %s are directories") % \ + (directoryName,parent_dir)) return else: try: - print "trying to make",directoryName os.mkdir(directoryName) except IOError, value: - GnomeErrorDialog("Could not create the directory " + directoryName + "\n" + \ - value[1]) + GnomeErrorDialog(_("Could not create the directory : %s") % \ + directoryName + "\n" + value[1]) return except: - GnomeErrorDialog("Could not create the directory " + directoryName) + GnomeErrorDialog(_("Could not create the directory : %s") % \ + directoryName) return if templateName == None: @@ -282,11 +284,11 @@ def on_ok_clicked(obj): try: templateFile = open(templateName,"r") except IOError, value: - GnomeErrorDialog("Could not open the template file (" + templateName + ")\n" + \ - value[1]) + GnomeErrorDialog(_("Could not open the template file (%s)") % templateName + \ + "\n" + value[1]) return except: - GnomeErrorDialog("Could not open the template file (" + templateName + ")") + GnomeErrorDialog(_("Could not open the template file (%s)") % templateName) return top_add = 1 @@ -351,9 +353,9 @@ def print_event(html,name,event): html.write("

%s

\n" % name) html.write("
    \n") if date != "": - html.write("
  • Date : %s
  • \n" % date) + html.write("
  • %s : %s
  • \n" % (_("Date"),date)) if place != "": - html.write("
  • Place : %s
  • \n" % place) + html.write("
  • %s : %s
  • \n" % (_("Place"),place)) html.write("
\n") #------------------------------------------------------------------------ @@ -401,7 +403,8 @@ def dump_person(person,prefix,templateTop,templateBottom,targetDir): regex_match = titleRe.search(line) if regex_match != None: - html.write("Family Tree - %s\n" % name ) + txt = _("Family Tree") + html.write("%s - %s\n" % (txt,name) ) html.write("

%s

\n" % person.getPrimaryName().getRegularName()) @@ -424,12 +427,12 @@ def dump_person(person,prefix,templateTop,templateBottom,targetDir): html.write('" WIDTH="' + str(width) + '" HEIGHT="200">\n') if not alive: - print_event(html,"Birth",person.getBirth()) - print_event(html,"Death",person.getDeath()) + print_event(html,_("Birth"),person.getBirth()) + print_event(html,_("Death"),person.getDeath()) family = person.getMainFamily() if family != None: - html.write("

Parents

\n") + html.write("

%s

\n" % _("Parents")) html.write("
    \n") write_reference(html,family.getFather(), prefix) write_reference(html,family.getMother(), prefix) @@ -438,7 +441,7 @@ def dump_person(person,prefix,templateTop,templateBottom,targetDir): for family in person.getFamilyList(): - html.write("

    Spouse

    \n") + html.write("

    %s

    \n" % _("Spouse")) html.write("
      \n") if person.getGender() == Person.male: spouse = family.getMother() @@ -453,7 +456,8 @@ def dump_person(person,prefix,templateTop,templateBottom,targetDir): spouse_alive = probably_alive(spouse) if name == None or name.getRegularName() == "": - html.write("
    • Spouse's name is not known
    • \n") + txt = _("Spouse's name is not known") + html.write("
    • %s
    • \n" % txt) else: write_reference(html,spouse,prefix) @@ -461,12 +465,12 @@ def dump_person(person,prefix,templateTop,templateBottom,targetDir): if marriage and not alive and not spouse_alive: place = marriage.getPlace() date = marriage.getDate() - if place != "" and date != "": - html.write("
    • Married %s, %s
    • \n" % (date, place)) - elif place == "": - html.write("
    • Marriage place :%s
    • \n" % place) - else: - html.write("
    • Marriage date :%s
    • \n" % date) + if place: + txt = _("Marriage place") + html.write("
    • %s :%s
    • \n" % (txt,place)) + if date: + txt = _("Marriage date") + html.write("
    • %s :%s
    • \n" % (txt,date)) if spouse: sp_family = spouse.getMainFamily() @@ -474,23 +478,24 @@ def dump_person(person,prefix,templateTop,templateBottom,targetDir): sp_father = sp_family.getFather() sp_mother = sp_family.getMother() if sp_father and sp_mother: - html.write("
    • Spouse's parents: ") - html.write(name_or_link(sp_father,prefix)) - html.write(" and ") - html.write(name_or_link(sp_mother,prefix)) - html.write("
    • \n") + txt = _("Spouse's parents: %s and %s") % \ + (name_or_link(sp_father,prefix),\ + name_or_link(sp_mother,prefix)) + html.write("
    • %s
    • \n" % txt) elif sp_father: - html.write("
    • Spouse's father: %s
    • \n" % - name_or_link(sp_father,prefix)) + txt = _("Spouse's father: %s and %s") % \ + name_or_link(sp_father,prefix) + html.write("
    • %s
    • \n" % txt) elif sp_mother: - html.write("
    • Spouse's mother: %s
    • \n" % - name_or_link(sp_mother,prefix)) + txt = _("Spouse's father: %s and %s") % \ + name_or_link(sp_mother,prefix) + html.write("
    • %s
    • \n" % txt) html.write("
    \n") childList = family.getChildList() if len(childList) > 0: - html.write("

    Children

    \n") + html.write("

    %s

    \n" % _("Children")) html.write("
      \n") for child in childList: write_reference(html,child,prefix) @@ -499,7 +504,7 @@ def dump_person(person,prefix,templateTop,templateBottom,targetDir): note = person.getNote() if note != "": - html.write("

      Notes

      \n") + html.write("

      %s

      \n" % _("Notes")) noteList = string.split(note,"\n") for text in noteList: html.write("

      " + text + "

      \n") @@ -524,9 +529,9 @@ def dump_index(person_list,filename,prefix,templateTop,templateBottom,targetDir) regex_match = titleRe.search(line) if regex_match != None: - html.write("Family Tree - Index\n") + html.write("%s\n" % _("Family Tree - Index")) - html.write("

      Family Tree Index

      \n") + html.write("

      %s

      \n" % _("Family Tree Index")) person_list.sort(sort.by_last_name) for person in person_list: @@ -544,6 +549,7 @@ def dump_index(person_list,filename,prefix,templateTop,templateBottom,targetDir) # #------------------------------------------------------------------------ def get_description(): - return "Generates web (HTML) pages for individuals, or a set of " \ - "individuals." - + return _("Generates web (HTML) pages for individuals, or a set of individuals.") + +def get_name(): + return _("Generate files/Individual web pages") diff --git a/src/plugins/IndivSummary.py b/src/plugins/IndivSummary.py index 085789f1e..cf822681f 100644 --- a/src/plugins/IndivSummary.py +++ b/src/plugins/IndivSummary.py @@ -35,6 +35,12 @@ from TextDoc import * from OpenOfficeDoc import * from HtmlDoc import * from AbiWordDoc import * +try: + import reportlab.platypus.tables + from PdfDoc import * + no_pdf = 0 +except: + no_pdf = 1 from gtk import * from gnome.ui import * @@ -183,7 +189,7 @@ class IndivSummary: self.d.start_row() self.d.start_cell("TableHead",2) self.d.start_paragraph("TableTitle") - self.d.write_text("Marriages/Children") + self.d.write_text(_("Marriages/Children")) self.d.end_paragraph() self.d.end_cell() self.d.end_row() @@ -211,7 +217,7 @@ class IndivSummary: self.d.start_row() self.d.start_cell("NormalCell") self.d.start_paragraph("Normal") - self.d.write_text("Children") + self.d.write_text(_("Children")) self.d.end_paragraph() self.d.end_cell() @@ -237,10 +243,10 @@ class IndivSummary: #-------------------------------------------------------------------- def write_report(self): photo_list = self.person.getPhotoList() - + + name = self.person.getPrimaryName().getRegularName() self.d.start_paragraph("Title") - self.d.write_text('Summary of ') - self.d.write_text(self.person.getPrimaryName().getRegularName()) + self.d.write_text(_("Summary of %s") % name) self.d.end_paragraph() self.d.start_paragraph("Normal") @@ -257,7 +263,7 @@ class IndivSummary: self.d.start_row() self.d.start_cell("NormalCell") self.d.start_paragraph("Normal") - self.d.write_text("Name:") + self.d.write_text("%s:" % _("Name")) self.d.end_paragraph() self.d.end_cell() @@ -271,16 +277,16 @@ class IndivSummary: self.d.start_row() self.d.start_cell("NormalCell") self.d.start_paragraph("Normal") - self.d.write_text("Gender:") + self.d.write_text("%s:" % _("Gender")) self.d.end_paragraph() self.d.end_cell() self.d.start_cell("NormalCell") self.d.start_paragraph("Normal") if self.person.getGender() == RelLib.Person.male: - self.d.write_text("Male") + self.d.write_text(_("Male")) else: - self.d.write_text("Female") + self.d.write_text(_("Female")) self.d.end_paragraph() self.d.end_cell() self.d.end_row() @@ -296,7 +302,7 @@ class IndivSummary: self.d.start_row() self.d.start_cell("NormalCell") self.d.start_paragraph("Normal") - self.d.write_text("Father:") + self.d.write_text("%s:" % _("Father")) self.d.end_paragraph() self.d.end_cell() @@ -310,7 +316,7 @@ class IndivSummary: self.d.start_row() self.d.start_cell("NormalCell") self.d.start_paragraph("Normal") - self.d.write_text("Mother:") + self.d.write_text("%s:" % _("Mother")) self.d.end_paragraph() self.d.end_cell() @@ -329,7 +335,7 @@ class IndivSummary: self.d.start_row() self.d.start_cell("TableHead",2) self.d.start_paragraph("TableTitle") - self.d.write_text("Individual Facts") + self.d.write_text(_("Individual Facts")) self.d.end_paragraph() self.d.end_cell() self.d.end_row() @@ -367,6 +373,8 @@ def report(database,person): label = topDialog.get_widget("labelTitle") label.set_text("Individual Summary for " + name) + if no_pdf: + topDialog.get_widget("pdf").set_sensitive(0) PaperMenu.make_paper_menu(topDialog.get_widget("papersize")) PaperMenu.make_orientation_menu(topDialog.get_widget("orientation")) @@ -406,6 +414,8 @@ def on_save_clicked(obj): if topDialog.get_widget("html").get_active(): template = topDialog.get_widget("htmlfile").get_text() doc = HtmlDoc(template) + elif topDialog.get_widget("pdf").get_active(): + doc = PdfDoc(paper,orien) else: doc = OpenOfficeDoc(paper,orien) @@ -422,9 +432,10 @@ def on_save_clicked(obj): # #------------------------------------------------------------------------ def get_description(): - return _("Creates a family group report, showing information on ") +\ - _("a set of parents and their children.") - + return _("Creates a family group report, showing information on a set of parents and their children.") + +def get_name(): + return _("Generate files/Individual Summary") diff --git a/src/plugins/Merge.py b/src/plugins/Merge.py index 8bf9fc4a4..30b02afbc 100644 --- a/src/plugins/Merge.py +++ b/src/plugins/Merge.py @@ -24,6 +24,8 @@ import RelLib import utils import soundex import Check +import intl +_ = intl.gettext import string import os @@ -537,8 +539,9 @@ class Merge: else: mother2 = "" - label1 = "First Person (" + str(person1.getId()) + ")" - label2 = "Second Person (" + str(person2.getId()) + ")" + label1 = "%s (%s)" % (_("First Person"),str(person1.getId())) + label2 = "%s (%s)" % (_("Second Person"),str(person2.getId())) + self.topDialog.get_widget("PersonFrame1").set_label(label1) self.topDialog.get_widget("PersonFrame2").set_label(label2) self.topDialog.get_widget("name1_text").set_text(name1) @@ -933,8 +936,10 @@ def runTool(database,active_person,callback): # #------------------------------------------------------------------------- def get_description(): - return "Searches the entire database, looking for individual "\ - "entries that may represent the same person" + return _("Searches the entire database, looking for individual entries that may represent the same person") + +def get_name(): + return _("Database Processing/Merge people") #------------------------------------------------------------------------- # diff --git a/src/plugins/PatchNames.py b/src/plugins/PatchNames.py index cb4591b68..d9e6c46fe 100644 --- a/src/plugins/PatchNames.py +++ b/src/plugins/PatchNames.py @@ -22,6 +22,8 @@ import os import re +import intl +_ = intl.gettext from gnome.ui import * @@ -62,15 +64,14 @@ def runTool(database,active_person,callback): nick_count = nick_count + 1 if nick_count == 1: - msg = "1 nickname was extracted\n" + msg = _("1 nickname was extracted") else: - msg = "%d nicknames were extracted\n" % nick_count + msg = _("%d nicknames were extracted\n") % nick_count if title_count == 1: - msg = msg + "1 title was extracted" + msg = msg + "\n" + _("1 title was extracted") else: - msg = msg + "%d titles were extracted" % title_count - + msg = msg + "\n" + _("%d titles were extracted") % title_count if nick_count > 0 or title_count > 0: utils.modified() @@ -85,9 +86,10 @@ def runTool(database,active_person,callback): # #------------------------------------------------------------------------- def get_description(): - return "Searches the entire database and attempts to extract titles "\ - "and nicknames that may be embedded in a person's given name field." - + return _("Searches the entire database and attempts to extract titles and nicknames that may be embedded in a person's given name field.") + +def get_name(): + return _("Database Processing/Extract information from names") diff --git a/src/plugins/ReadGedcom.py b/src/plugins/ReadGedcom.py index cb04fc26e..758e41f3f 100644 --- a/src/plugins/ReadGedcom.py +++ b/src/plugins/ReadGedcom.py @@ -23,6 +23,8 @@ from RelLib import * import latin_ansel import latin_utf8 +import intl +_ = intl.gettext import os import re @@ -641,13 +643,12 @@ def on_ok_clicked(obj): try: importData(db,name) except InvalidGedcom: - GnomeErrorDialog(name + " is not a valid GEDCOM file") + GnomeErrorDialog(_("%s is not a valid GEDCOM file") % name) statusWindow.destroy() except IOError, val: - GnomeErrorDialog("Could not load " + name + "\n" + val[1]) + GnomeErrorDialog(_("Could not load %s") % name + "\n" + val[1]) except: - GnomeErrorDialog("Could not load " + name + \ - "\n due to an unexpected internal error") + GnomeErrorDialog(_("Could not load %s") % name) statusWindow.destroy() #------------------------------------------------------------------------- @@ -676,3 +677,10 @@ def readData(database,active_person,cb): topDialog.signal_autoconnect(dic) topDialog.get_widget("gedcomImport").show() +#------------------------------------------------------------------------- +# +# +# +#------------------------------------------------------------------------- +def get_name(): + return _("Import from GEDCOM") diff --git a/src/plugins/ReadNative.py b/src/plugins/ReadNative.py index 63f2d9629..4424d0919 100644 --- a/src/plugins/ReadNative.py +++ b/src/plugins/ReadNative.py @@ -23,6 +23,9 @@ import libglade from ReadXML import * import utils +import intl + +_ = intl.gettext #------------------------------------------------------------------------- # @@ -78,4 +81,11 @@ def on_ok_clicked(obj): utils.destroy_passed_object(obj) importData(db,name,progress) callback(1) - + +#------------------------------------------------------------------------- +# +# +# +#------------------------------------------------------------------------- +def get_name(): + return _("Import from Gramps") diff --git a/src/plugins/RelCalc.py b/src/plugins/RelCalc.py index 91e6a5f09..933601287 100644 --- a/src/plugins/RelCalc.py +++ b/src/plugins/RelCalc.py @@ -28,6 +28,9 @@ from libglade import * import RelLib import sort +import intl + +_ = intl.gettext topDialog = None other_person = None @@ -257,6 +260,7 @@ def runTool(database,person,callback): # #------------------------------------------------------------------------- def get_description(): - return "Calculates the relationship between two people" + return _("Calculates the relationship between two people") - +def get_name(): + return _("Utilities/Relationship calculator") diff --git a/src/plugins/Summary.py b/src/plugins/Summary.py index e45bf709e..c70d7a7b8 100644 --- a/src/plugins/Summary.py +++ b/src/plugins/Summary.py @@ -27,6 +27,8 @@ import re import sort import string import utils +import intl +_ = intl.gettext from gtk import * from gnome.ui import * @@ -113,5 +115,8 @@ def report(database,person): # #------------------------------------------------------------------------- def get_description(): - return "Provides a summary of the current database" + return _("Provides a summary of the current database") + +def get_name(): + return _("View/Summary of the database") diff --git a/src/plugins/WriteGedcom.py b/src/plugins/WriteGedcom.py index 7a9787218..6e68c38f5 100644 --- a/src/plugins/WriteGedcom.py +++ b/src/plugins/WriteGedcom.py @@ -590,30 +590,30 @@ def writeData(database,person): filter_obj = topDialog.get_widget("filter") myMenu = GtkMenu() - menuitem = GtkMenuItem("Entire Database") + menuitem = GtkMenuItem(_("Entire Database")) myMenu.append(menuitem) menuitem.set_data("filter",entire_database) menuitem.show() - menuitem = GtkMenuItem("Ancestors of " + \ - active_person.getPrimaryName().getRegularName()) + name = active_person.getPrimaryName().getRegularName() + menuitem = GtkMenuItem(_("Ancestors of %s") % name) myMenu.append(menuitem) menuitem.set_data("filter",active_person_ancestors) menuitem.show() - menuitem = GtkMenuItem("Descendants of " + \ - active_person.getPrimaryName().getRegularName()) + menuitem = GtkMenuItem(_("Descendants of %s") % name) myMenu.append(menuitem) menuitem.set_data("filter",active_person_descendants) menuitem.show() - menuitem = GtkMenuItem("Ancestors and Descendants of " + \ - active_person.getPrimaryName().getRegularName()) + menuitem = GtkMenuItem(_("Ancestors and Descendants of %s") % name) myMenu.append(menuitem) menuitem.set_data("filter",active_person_ancestors_and_descendants) menuitem.show() - menuitem = GtkMenuItem("People somehow connected to " + \ - active_person.getPrimaryName().getRegularName()) + menuitem = GtkMenuItem(_("People somehow connected to %s") % name) myMenu.append(menuitem) menuitem.set_data("filter",interconnected) menuitem.show() filter_obj.set_menu(myMenu) topDialog.get_widget("gedcomExport").show() + +def get_name(): + return _("Export to GEDCOM") diff --git a/src/plugins/ancestorchart.glade b/src/plugins/ancestorchart.glade index 639e40443..576fdb1d6 100644 --- a/src/plugins/ancestorchart.glade +++ b/src/plugins/ancestorchart.glade @@ -209,6 +209,21 @@ False + + + GtkRadioButton + pdf + True + + False + True + format + + 0 + False + False + + diff --git a/src/plugins/ancestorreport.glade b/src/plugins/ancestorreport.glade index 702e33ac1..34058a7e6 100644 --- a/src/plugins/ancestorreport.glade +++ b/src/plugins/ancestorreport.glade @@ -226,6 +226,21 @@ + + GtkRadioButton + pdf + True + + False + True + format + + 0 + False + False + + + GtkHBox hbox5 diff --git a/src/plugins/desreport.glade b/src/plugins/desreport.glade index 654cc48b1..46229b2f9 100644 --- a/src/plugins/desreport.glade +++ b/src/plugins/desreport.glade @@ -224,6 +224,27 @@ + + GtkRadioButton + pdf + True + + toggled + on_html_toggled + dialog1 + Tue, 20 Mar 2001 17:02:37 GMT + + + False + True + format + + 0 + False + False + + + GtkRadioButton html @@ -384,7 +405,8 @@ GtkOptionMenu papersize True - + + 0 1 @@ -406,7 +428,8 @@ GtkOptionMenu orientation True - + + 0 1 diff --git a/src/plugins/familygroup.glade b/src/plugins/familygroup.glade index 657985d7f..6ad12fb8a 100644 --- a/src/plugins/familygroup.glade +++ b/src/plugins/familygroup.glade @@ -194,7 +194,8 @@ spouse_menu 10 True - + + 0 @@ -232,6 +233,26 @@ + + GtkRadioButton + pdf + True + + toggled + on_html_toggled + Tue, 20 Mar 2001 17:02:37 GMT + + + False + True + format + + 0 + False + False + + + GtkRadioButton html @@ -391,7 +412,8 @@ GtkOptionMenu orientation True - + + 0 1 @@ -413,7 +435,8 @@ GtkOptionMenu papersize True - + + 0 1 diff --git a/src/plugins/indsum.glade b/src/plugins/indsum.glade index dc7fa9a2e..850667463 100644 --- a/src/plugins/indsum.glade +++ b/src/plugins/indsum.glade @@ -209,6 +209,26 @@ + + GtkRadioButton + pdf + True + + toggled + on_html_toggled + Tue, 20 Mar 2001 17:02:37 GMT + + + False + True + format + + 0 + False + False + + + GtkRadioButton html