Reports handle file extensions and check for existing file.

svn: r1462
This commit is contained in:
Don Allingham 2003-04-18 04:15:42 +00:00
parent d502310c3c
commit a67cd53b35
19 changed files with 288 additions and 129 deletions

11
NEWS
View File

@ -2,8 +2,17 @@ Version 0.9.1
* Custom paper sizes may be set for reports
* Witnesses may be added to an event. The witnesses do not have to be in
the database, in which case only a string for a name is kept.
* Improved Dialogs to be compliant with GNOME Human Interface Guidelines.
* Improved Dialogs to be more compliant with GNOME Human Interface Guidelines.
* Added Romanian translation (Radu Bogdan Mare)
* Displaying of tabbed person list is significantly faster, since the lists
are only drawn with they are selected.
* GRAMPS manual has been updated for the GNOME 2 interface.
* Patch Names utility allows you to select which names should be modified.
* Find dialog is now working again.
* Example database can be installed and loaded from the help menu.
* The status bar can now optionally show the active person's relationship
to the home person (works for English only, since the relationship
calculation is region/culture dependent).
Version 0.9.0
* GNOME 2.0 support. Requires pygtk2 and gnome-python2.

View File

@ -58,6 +58,7 @@ import GrampsCfg
import Errors
import intl
_ = intl.gettext
#-------------------------------------------------------------------------
@ -438,19 +439,19 @@ def register_tool(task, name,
_tools.append((task, category, name, description, xpm, status, author_name, author_name))
def register_text_doc(name,classref, table, paper, style):
def register_text_doc(name,classref, table, paper, style, ext):
"""Register a text document generator"""
for n in _textdoc:
if n[0] == name:
return
_textdoc.append((name,classref,table,paper,style))
_textdoc.append((name,classref,table,paper,style,ext))
def register_draw_doc(name,classref):
def register_draw_doc(name,classref,paper,style, ext):
"""Register a drawing document generator"""
for n in _drawdoc:
if n[0] == name:
return
_drawdoc.append((name,classref))
_drawdoc.append((name,classref,paper,style,ext))
#-------------------------------------------------------------------------
#
@ -563,6 +564,7 @@ def get_text_doc_menu(main_menu,tables,callback,obj=None):
menuitem.set_data("name",item[1])
menuitem.set_data("styles",item[4])
menuitem.set_data("paper",item[3])
menuitem.set_data("ext",item[5])
menuitem.set_data("obj",obj)
if callback:
menuitem.connect("activate",callback)
@ -608,9 +610,12 @@ def get_draw_doc_menu(main_menu,callback=None,obj=None):
index = 0
myMenu = gtk.Menu()
for (name,classref) in _drawdoc:
for (name,classref,paper,styles,ext) in _drawdoc:
menuitem = gtk.MenuItem(name)
menuitem.set_data("name",classref)
menuitem.set_data("styles",styles)
menuitem.set_data("paper",paper)
menuitem.set_data("ext",ext)
menuitem.set_data("obj",obj)
if callback:
menuitem.connect("activate",callback)

View File

@ -86,14 +86,18 @@ class OptionDialog:
self.xml.get_widget('option1').set_label(btnmsg1)
self.xml.get_widget('option2').set_label(btnmsg2)
self.top.show()
response = self.top.run()
if response == gtk.RESPONSE_NO:
self.response = self.top.run()
if self.response == gtk.RESPONSE_NO:
if task1:
task1()
else:
task2()
if task2:
task2()
self.top.destroy()
def get_response(self):
return self.response
class ErrorDialog:
def __init__(self,msg1,msg2=""):

View File

@ -55,7 +55,7 @@ import GrampsCfg
import PaperMenu
from intl import gettext as _
from QuestionDialog import ErrorDialog
from QuestionDialog import ErrorDialog, OptionDialog
#-------------------------------------------------------------------------
#
@ -184,6 +184,7 @@ class ReportDialog:
self.frame_names = []
self.frames = {}
self.format_menu = None
self.style_button = None
self.window = gtk.Dialog('GRAMPS')
self.window.set_has_separator(gtk.FALSE)
@ -274,6 +275,12 @@ class ReportDialog:
this function."""
return "basic_report.xml"
def get_default_basename(self):
"""What should the default name be?
"""
path = self.get_stylesheet_savefile()
return path.split('.')[0]
def get_print_pagecount_map(self):
"""Return the data used to fill out the 'pagecount' option
menu in the print options box. The first value is a mapping
@ -445,8 +452,9 @@ class ReportDialog:
self.output_notebook.set_current_page(self.notebook_page)
# Does this report format use styles?
self.style_button.set_sensitive(obj.get_data("styles"))
self.style_menu.set_sensitive(obj.get_data("styles"))
if self.style_button:
self.style_button.set_sensitive(obj.get_data("styles"))
self.style_menu.set_sensitive(obj.get_data("styles"))
#------------------------------------------------------------------------
#
@ -504,11 +512,8 @@ class ReportDialog:
self.tbl.attach(self.target_fileentry,2,4,self.col,self.col+1)
self.col += 1
self.target_fileentry.set_default_path(self.get_default_directory())
if self.get_target_is_directory():
self.target_fileentry.set_directory_entry(1)
self.target_fileentry.set_filename(self.get_default_directory())
path = self.get_default_directory()
self.target_fileentry.set_default_path(path)
def setup_format_frame(self):
"""Set up the format frame of the dialog. This function
@ -523,6 +528,20 @@ class ReportDialog:
self.tbl.attach(self.format_menu,2,4,self.col,self.col+1)
self.col += 1
type = self.format_menu.get_menu().get_active()
ext = type.get_data('ext')
if ext == None:
ext = ""
if type:
path = self.get_default_directory()
if self.get_target_is_directory():
self.target_fileentry.set_filename(path)
else:
base = self.get_default_basename()
path = os.path.normpath("%s/%s%s" % (path,base,ext))
self.target_fileentry.set_filename(path)
def setup_style_frame(self):
"""Set up the style frame of the dialog. This function relies
on other routines create the default style for this report,
@ -873,6 +892,16 @@ class ReportDialog:
"You need to provide a valid filename."))
return None
if os.path.isfile(self.target_path):
a = OptionDialog(_('File already exists'),
_('You can choose to either overwrite the file, or change '
'the selected filename.'),
_('_Overwrite'),None,
_('_Change filename'),None)
if a.get_response() == gtk.RESPONSE_YES:
return
self.set_default_directory(os.path.dirname(self.target_path) + os.sep)
return 1
@ -1112,7 +1141,7 @@ class DrawReportDialog(ReportDialog):
def make_doc_menu(self):
"""Build a menu of document types that are appropriate for
this drawing report."""
Plugins.get_draw_doc_menu(self.format_menu)
Plugins.get_draw_doc_menu(self.format_menu,self.doc_type_changed)
def make_document(self):
"""Create a document of the type requested by the user."""

View File

@ -318,4 +318,4 @@ class AbiWordDoc(TextDoc.TextDoc):
self.cdata = self.cdata + "</c>"
self.cdatalist.append(self.cdata)
Plugins.register_text_doc(_("AbiWord"),AbiWordDoc,1,1,1)
Plugins.register_text_doc(_("AbiWord"),AbiWordDoc,1,1,1,".abw")

View File

@ -412,4 +412,4 @@ class HtmlDoc(TextDoc.TextDoc):
self.empty = 0
self.f.write(text)
Plugins.register_text_doc(_("HTML"),HtmlDoc,1,0,1)
Plugins.register_text_doc(_("HTML"),HtmlDoc,1,0,1,".html")

View File

@ -24,6 +24,8 @@ from latin_utf8 import latin_to_utf8
import time
import StringIO
import gzip
import Errors
from TarFile import TarFile
import Plugins
import ImgManip
@ -435,4 +437,4 @@ class KwordDoc(TextDoc.TextDoc):
def write_text(self,text):
self.text = self.text + text
Plugins.register_text_doc(_("KWord"),KwordDoc,1,1,1)
Plugins.register_text_doc(_("KWord"),KwordDoc,1,1,1,".kwd")

View File

@ -394,5 +394,6 @@ Plugins.register_text_doc(
classref=LaTeXDoc,
table=1,
paper=1,
style=0
style=0,
ext=".tex"
)

View File

@ -557,4 +557,4 @@ class OpenDrawDoc(DrawDoc.DrawDoc):
# Register document generator
#
#-------------------------------------------------------------------------
Plugins.register_draw_doc(_("OpenOffice/StarOffice 6"),OpenDrawDoc);
Plugins.register_draw_doc(_("OpenOffice/StarOffice 6"),OpenDrawDoc,1,1,".sxd");

View File

@ -569,4 +569,4 @@ class OpenOfficeDoc(TextDoc.TextDoc):
self.f.write('</office:document-meta>\n')
self.f.close()
Plugins.register_text_doc(_("OpenOffice/StarOffice 6"),OpenOfficeDoc,1,1,1)
Plugins.register_text_doc(_("OpenOffice/StarOffice 6"),OpenOfficeDoc,1,1,1,".sxw")

View File

@ -249,4 +249,4 @@ def rgb_color(color):
b = float(color[2])/255.0
return (r,g,b)
Plugins.register_draw_doc(_("PostScript"),PSDrawDoc);
Plugins.register_draw_doc(_("PostScript"),PSDrawDoc,1,1,".ps");

View File

@ -42,7 +42,7 @@ try:
from reportlab.lib.colors import Color
from reportlab.lib.enums import TA_LEFT, TA_RIGHT, TA_CENTER, TA_JUSTIFY
import reportlab.lib.styles
except:
except ImportError:
raise Errors.PluginError( _("The ReportLab modules are not installed"))
#------------------------------------------------------------------------
@ -99,7 +99,7 @@ class PdfDoc(TextDoc.TextDoc):
pdf_style.fontSize = font.get_size()
pdf_style.bulletFontSize = font.get_size()
if font.get_type_face() == FONT_SERIF:
if font.get_type_face() == TextDoc.FONT_SERIF:
if font.get_bold():
if font.get_italic():
pdf_style.fontName = "Times-BoldItalic"
@ -123,7 +123,6 @@ class PdfDoc(TextDoc.TextDoc):
pdf_style.fontName = "Helvetica"
pdf_style.bulletFontName = pdf_style.fontName
right = style.get_right_margin()*cm
left = style.get_left_margin()*cm
first = left + style.get_first_indent()*cm
@ -278,19 +277,17 @@ class PdfDoc(TextDoc.TextDoc):
self.image = 1
def write_text(self,text):
text = string.replace(text,'&','&amp;'); # Must be first
text = string.replace(text,'<','&lt;');
text = string.replace(text,'>','&gt;');
self.text = self.text + text
text = text.replace('&','&amp;'); # Must be first
text = text.replace('<','&lt;');
self.text = self.text + text.replace('>','&gt;');
#------------------------------------------------------------------------
#
# Convert an RGB color tulple to a Color instance
#
#------------------------------------------------------------------------
def make_color(color):
return Color(float(color[0])/255.0, float(color[1])/255.0,
float(color[2])/255.0)
def make_color(c):
return Color(float(c[0])/255.0, float(c[1])/255.0, float(c[2])/255.0)
#------------------------------------------------------------------------
#
@ -303,5 +300,6 @@ Plugins.register_text_doc(
classref=PdfDoc,
table=1,
paper=1,
style=1
style=1,
ext="pdf"
)

View File

@ -18,9 +18,18 @@
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
#
import os
#-------------------------------------------------------------------------
#
# Standard python libraries
#
#-------------------------------------------------------------------------
import string
#-------------------------------------------------------------------------
#
# GRAMPS libraries
#
#-------------------------------------------------------------------------
import Plugins
import Errors
@ -28,18 +37,27 @@ import TextDoc
import DrawDoc
from intl import gettext as _
#-------------------------------------------------------------------------
#
# ReportLab PDF detection, PIL detection
#
#-------------------------------------------------------------------------
try:
from reportlab.pdfgen import canvas
from reportlab.lib.units import cm
from reportlab.lib.colors import Color
except:
except ImportError:
raise Errors.PluginError( _("The ReportLab modules are not installed"))
def make_color(color):
return Color(float(color[0])/255.0, float(color[1])/255.0,
float(color[2])/255.0)
#-------------------------------------------------------------------------
#
# PdfDrawDoc
#
#-------------------------------------------------------------------------
class PdfDrawDoc(DrawDoc.DrawDoc):
"""
PDF drawing class. Uses the ReportLab libraries to build the PDF files
"""
def __init__(self,styles,type,orientation):
DrawDoc.DrawDoc.__init__(self,styles,type,orientation)
@ -139,7 +157,7 @@ class PdfDrawDoc(DrawDoc.DrawDoc):
w = box_style.get_width()*cm
h = box_style.get_height()*cm
self.f.setLineWidth(stype.get_line_width())
self.f.setLineWidth(box_style.get_line_width())
if box_style.get_shadow():
self.f.setFillColorRGB(0.5,0.5,0.5)
@ -148,12 +166,12 @@ class PdfDrawDoc(DrawDoc.DrawDoc):
font = p.get_font()
self.f.setStrokeColor(make_color(font.get_color()))
self.f.setFillColor(make_color(box_style.get_color()))
self.f.setFillColor(make_color(box_style.get_fill_color()))
self.f.rect(x*cm,y*cm,w,h,fill=1)
if text != "":
lines = string.split(text,'\n')
lines = text.split('\n')
self.center_print(lines,font,x*cm,y*cm,w,h)
def draw_text(self,style,text,x,y):
@ -214,4 +232,14 @@ class PdfDrawDoc(DrawDoc.DrawDoc):
self.f.drawString(start_x,start_y,text)
self.f.restoreState()
Plugins.register_draw_doc(_("PDF"),PdfDrawDoc);
def make_color(c):
return Color(float(c[0])/255.0, float(c[1])/255.0, float(c[2])/255.0)
#-------------------------------------------------------------------------
#
# Register the document class
#
#-------------------------------------------------------------------------
Plugins.register_draw_doc(_("PDF"),PdfDrawDoc,1,1,".pdf");

View File

@ -363,4 +363,4 @@ class RTFDoc(TextDoc.TextDoc):
else:
self.text = self.text + i
Plugins.register_text_doc(_("Rich Text Format (RTF)"),RTFDoc,1,1,1)
Plugins.register_text_doc(_("Rich Text Format (RTF)"),RTFDoc,1,1,1,".rtf")

View File

@ -153,7 +153,7 @@ class SvgDrawDoc(DrawDoc.DrawDoc):
self.f.write('y="%4.2fcm" ' % y)
self.f.write('width="%4.2fcm" ' % bw)
self.f.write('height="%4.2fcm" ' % bh)
self.f.write('style="fill:#%02x%02x%02x; stroke:#000000; stroke-width:1;"/>\n' % box_style.get_color())
self.f.write('style="fill:#%02x%02x%02x; stroke:#000000; stroke-width:1;"/>\n' % box_style.get_fill_color())
if text != "":
font = p.get_font()
font_size = font.get_size()
@ -218,4 +218,4 @@ def units(val):
# Register document generator
#
#-------------------------------------------------------------------------
Plugins.register_draw_doc(_("SVG (Scalable Vector Graphics)"),SvgDrawDoc);
Plugins.register_draw_doc(_("SVG (Scalable Vector Graphics)"),SvgDrawDoc,1,1,".svg");

View File

@ -163,6 +163,7 @@ class AncestorChart:
g.set_width(self.box_width)
g.set_paragraph_style("Normal")
g.set_shadow(1)
g.set_fill_color((255,255,255))
self.doc.add_draw_style("box",g)
g = DrawDoc.GraphicsStyle()

View File

@ -315,6 +315,10 @@ class TimeLineDialog(Report.DrawReportDialog):
return "%s - %s - GRAMPS" % (_("Timeline"),
_("Graphical Reports"))
def get_stylesheet_savefile(self):
"""Where to save user defined styles for this report."""
return "timeline.xml"
def get_target_browser_title(self):
"""The title of the window created when the 'browse' button is
clicked in the 'Save As' frame."""

View File

@ -36,7 +36,6 @@ import re
#
#-------------------------------------------------------------------------
import gtk
import gnome.ui
import gtk.glade
#-------------------------------------------------------------------------

View File

@ -5,7 +5,7 @@
msgid ""
msgstr ""
"Project-Id-Version: GRAMPS VERSION\n"
"POT-Creation-Date: Wed Apr 16 12:06:31 2003\n"
"POT-Creation-Date: Thu Apr 17 22:12:29 2003\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@ -26,7 +26,7 @@ msgstr ""
#: AddSpouse.py:85 ChooseParents.py:55 EditPerson.py:206 FamilyView.py:138
#: SelectChild.py:105 gramps_main.py:103 plugins/FilterEditor.py:130
#: plugins/IndivComplete.py:370 plugins/IndivSummary.py:211
#: plugins/PatchNames.py:145 plugins/RelCalc.py:326 plugins/TimeLine.py:336
#: plugins/PatchNames.py:145 plugins/RelCalc.py:326 plugins/TimeLine.py:340
#: plugins/WebPage.py:274
msgid "Name"
msgstr ""
@ -498,8 +498,8 @@ msgstr ""
msgid "%s: unknown"
msgstr ""
#: FamilyView.py:423 Plugins.py:417 Plugins.py:418 Plugins.py:419
#: Plugins.py:431 Plugins.py:432 Plugins.py:433 Witness.py:71 const.py:149
#: FamilyView.py:423 Plugins.py:418 Plugins.py:419 Plugins.py:420
#: Plugins.py:432 Plugins.py:433 Plugins.py:434 Witness.py:71 const.py:149
#: const.py:424 const.py:432 gramps.glade:3657 gramps.glade:3850
#: gramps.glade:4272 gramps.glade:4452 gramps.glade:5928 gramps.glade:6174
#: gramps_main.py:1272 plugins/WebPage.py:288
@ -933,7 +933,7 @@ msgid "The GRAMPS ID that you chose for this relationship is already being used.
msgstr ""
#: MediaView.py:75 SourceView.py:68 Sources.py:77 Sources.py:160
#: plugins/PatchNames.py:168 plugins/TimeLine.py:347
#: plugins/PatchNames.py:168 plugins/TimeLine.py:351
msgid "Title"
msgstr ""
@ -1033,31 +1033,31 @@ msgstr ""
msgid "_Delete Place"
msgstr ""
#: Plugins.py:81
#: Plugins.py:82
msgid "No description was provided"
msgstr ""
#: Plugins.py:242
#: Plugins.py:243
msgid "Report Selection"
msgstr ""
#: Plugins.py:258
#: Plugins.py:259
msgid "Tool Selection"
msgstr ""
#: Plugins.py:274
#: Plugins.py:275
msgid "Plugin status"
msgstr ""
#: Plugins.py:286
#: Plugins.py:287
msgid "All modules were successfully loaded."
msgstr ""
#: Plugins.py:288
#: Plugins.py:289
msgid "The following modules could not be loaded:"
msgstr ""
#: Plugins.py:414 Plugins.py:428
#: Plugins.py:415 Plugins.py:429
msgid "Uncategorized"
msgstr ""
@ -1100,8 +1100,8 @@ msgstr ""
#: RelImage.py:71 RelImage.py:74 RelImage.py:139 RelImage.py:142
#: gramps_main.py:813 gramps_main.py:818 gramps_main.py:827
#: plugins/AncestorChart.py:113 plugins/DesGraph.py:210
#: plugins/DesGraph.py:219 plugins/WriteGedcom.py:495
#: plugins/WriteGedcom.py:500
#: plugins/DesGraph.py:219 plugins/WriteGedcom.py:494
#: plugins/WriteGedcom.py:499
msgid "Could not create %s"
msgstr ""
@ -1265,109 +1265,125 @@ msgstr ""
msgid "Working"
msgstr ""
#: Report.py:259
#: Report.py:260
msgid "Save Report As"
msgstr ""
#: Report.py:484
#: Report.py:492
msgid "Document Options"
msgstr ""
#: Report.py:494
#: Report.py:502
msgid "Save As"
msgstr ""
#: Report.py:498
#: Report.py:506
msgid "Directory"
msgstr ""
#: Report.py:500
#: Report.py:508
msgid "Filename"
msgstr ""
#: Report.py:520
#: Report.py:525
msgid "Output Format"
msgstr ""
#: Report.py:534
#: Report.py:553
msgid "Styles"
msgstr ""
#: Report.py:538 StyleEditor.py:80
#: Report.py:557 StyleEditor.py:80
msgid "Style Editor"
msgstr ""
#: Report.py:597 Report.py:599
#: Report.py:616 Report.py:618
msgid "Paper Options"
msgstr ""
#: Report.py:608
#: Report.py:627
msgid "Size"
msgstr ""
#: Report.py:613
#: Report.py:632
msgid "Height"
msgstr ""
#: Report.py:621 Report.py:637 styles.glade:903 styles.glade:927
#: Report.py:640 Report.py:656 styles.glade:903 styles.glade:927
#: styles.glade:951
msgid "cm"
msgstr ""
#: Report.py:625
#: Report.py:644
msgid "Orientation"
msgstr ""
#: Report.py:629
#: Report.py:648
msgid "Width"
msgstr ""
#: Report.py:649
#: Report.py:668
msgid "Page Count"
msgstr ""
#: Report.py:673 Report.py:678
#: Report.py:692 Report.py:697
msgid "HTML Options"
msgstr ""
#: Report.py:680 plugins/eventcmp.glade:192
#: Report.py:699 plugins/eventcmp.glade:192
msgid "Template"
msgstr ""
#: Report.py:699
#: Report.py:718
msgid "User Template"
msgstr ""
#: Report.py:702
#: Report.py:721
msgid "Choose File"
msgstr ""
#: Report.py:741
#: Report.py:760
msgid "Report Options"
msgstr ""
#: Report.py:759 plugins/FilterEditor.py:70 plugins/pafexport.glade:127
#: Report.py:778 plugins/FilterEditor.py:70 plugins/pafexport.glade:127
msgid "Filter"
msgstr ""
#: Report.py:776
#: Report.py:795
msgid "Generations"
msgstr ""
#: Report.py:783
#: Report.py:802
msgid "Page break between generations"
msgstr ""
#: Report.py:871
#: Report.py:890
msgid "Invalid file name"
msgstr ""
#: Report.py:872
#: Report.py:891
msgid ""
"The filename that you gave is a directory.\n"
"You need to provide a valid filename."
msgstr ""
#: Report.py:896
msgid "File already exists"
msgstr ""
#: Report.py:897
msgid "You can choose to either overwrite the file, or change the selected filename."
msgstr ""
#: Report.py:899
msgid "_Overwrite"
msgstr ""
#: Report.py:900
msgid "_Change filename"
msgstr ""
#: SelectChild.py:71
msgid "Add Children"
msgstr ""
@ -2134,12 +2150,12 @@ msgstr ""
msgid "HTML"
msgstr ""
#: docgen/KwordDoc.py:239 docgen/KwordDoc.py:243
#: docgen/KwordDoc.py:241 docgen/KwordDoc.py:245
#: plugins/DetAncestralReport.py:62 plugins/DetDescendantReport.py:62
msgid "Could not open %s"
msgstr ""
#: docgen/KwordDoc.py:438
#: docgen/KwordDoc.py:440
msgid "KWord"
msgstr ""
@ -2155,11 +2171,11 @@ msgstr ""
msgid "PostScript"
msgstr ""
#: docgen/PdfDoc.py:46 docgen/PdfDrawDoc.py:36
#: docgen/PdfDoc.py:46 docgen/PdfDrawDoc.py:50
msgid "The ReportLab modules are not installed"
msgstr ""
#: docgen/PdfDoc.py:302 docgen/PdfDrawDoc.py:217
#: docgen/PdfDoc.py:299 docgen/PdfDrawDoc.py:245
msgid "PDF"
msgstr ""
@ -2171,6 +2187,10 @@ msgstr ""
msgid "SVG (Scalable Vector Graphics)"
msgstr ""
#: docgen/TextBufDoc.py:169
msgid "Text Buffer Preview"
msgstr ""
#: edit_person.glade:33
msgid "Abandon changes and close window"
msgstr ""
@ -3359,52 +3379,58 @@ msgstr ""
msgid "Author's email:"
msgstr ""
#: plugins/AncestorChart.py:217 plugins/AncestorChart.py:425
#: plugins/AncestorChart.py:218 plugins/AncestorChart.py:426
msgid "Ancestor Chart"
msgstr ""
#: plugins/AncestorChart.py:217 plugins/AncestorChart.py:426
#: plugins/DesGraph.py:308 plugins/DesGraph.py:460 plugins/GraphViz.py:78
#: plugins/GraphViz.py:448 plugins/TimeLine.py:316 plugins/TimeLine.py:457
#: plugins/AncestorChart.py:218 plugins/AncestorChart.py:427
#: plugins/DesGraph.py:308 plugins/DesGraph.py:460 plugins/FullFamily.py:105
#: plugins/FullFamily.py:170 plugins/GraphViz.py:78 plugins/GraphViz.py:448
#: plugins/TimeLine.py:316 plugins/TimeLine.py:461
msgid "Graphical Reports"
msgstr ""
#: plugins/AncestorChart.py:221
#: plugins/AncestorChart.py:222
msgid "Ancestor Chart for %s"
msgstr ""
#: plugins/AncestorChart.py:226
#: plugins/AncestorChart.py:227
msgid "Save Ancestor Chart"
msgstr ""
#: plugins/AncestorChart.py:238 plugins/DesGraph.py:325
#: plugins/AncestorChart.py:239 plugins/DesGraph.py:325
#: plugins/FullFamily.py:126
msgid "Display Format"
msgstr ""
#: plugins/AncestorChart.py:239 plugins/DesGraph.py:326
#: plugins/AncestorChart.py:240 plugins/DesGraph.py:326
#: plugins/FullFamily.py:127
msgid "Allows you to customize the data in the boxes in the report"
msgstr ""
#: plugins/AncestorChart.py:248 plugins/AncestorReport.py:262
#: plugins/AncestorChart.py:249 plugins/AncestorReport.py:262
#: plugins/DesGraph.py:335 plugins/FamilyGroup.py:417
#: plugins/IndivComplete.py:528 plugins/IndivSummary.py:371
#: plugins/FtmStyleAncestors.py:231 plugins/IndivComplete.py:528
#: plugins/IndivSummary.py:371
msgid "The basic style used for the text display."
msgstr ""
#: plugins/AncestorChart.py:427 plugins/AncestorReport.py:389
#: plugins/AncestorChart.py:428 plugins/AncestorReport.py:389
#: plugins/DescendReport.py:284 plugins/DetAncestralReport.py:972
#: plugins/DetDescendantReport.py:850 plugins/FamilyGroup.py:566
#: plugins/FtmStyleAncestors.py:358 plugins/FullFamily.py:171
#: plugins/GraphViz.py:447 plugins/IndivComplete.py:667
#: plugins/IndivSummary.py:500 plugins/Summary.py:150 plugins/TimeLine.py:456
#: plugins/IndivSummary.py:500 plugins/Summary.py:150 plugins/TimeLine.py:460
#: plugins/WebPage.py:1267
msgid "Beta"
msgstr ""
#: plugins/AncestorChart.py:428
#: plugins/AncestorChart.py:429 plugins/FullFamily.py:172
msgid "Produces a graphical ancestral tree graph"
msgstr ""
#: plugins/AncestorReport.py:75 plugins/AncestorReport.py:229
#: plugins/FtmStyleAncestors.py:196
msgid "Ahnentafel Report for %s"
msgstr ""
@ -3482,6 +3508,7 @@ msgid " and was buried in %s."
msgstr ""
#: plugins/AncestorReport.py:225 plugins/AncestorReport.py:387
#: plugins/FtmStyleAncestors.py:192
msgid "Ahnentafel Report"
msgstr ""
@ -3489,22 +3516,25 @@ msgstr ""
#: plugins/DescendReport.py:124 plugins/DescendReport.py:283
#: plugins/DetAncestralReport.py:973 plugins/DetDescendantReport.py:851
#: plugins/FamilyGroup.py:344 plugins/FamilyGroup.py:565
#: plugins/FtmStyleAncestors.py:192 plugins/FtmStyleAncestors.py:357
#: plugins/IndivComplete.py:446 plugins/IndivComplete.py:668
#: plugins/IndivSummary.py:317 plugins/IndivSummary.py:501
msgid "Text Reports"
msgstr ""
#: plugins/AncestorReport.py:234 plugins/DetAncestralReport.py:677
#: plugins/FtmStyleAncestors.py:201
msgid "Save Ancestor Report"
msgstr ""
#: plugins/AncestorReport.py:248 plugins/DescendReport.py:148
#: plugins/FamilyGroup.py:408 plugins/IndivComplete.py:502
#: plugins/IndivSummary.py:345 plugins/TimeLine.py:395 plugins/WebPage.py:960
#: plugins/FamilyGroup.py:408 plugins/FtmStyleAncestors.py:216
#: plugins/IndivComplete.py:502 plugins/IndivSummary.py:345
#: plugins/TimeLine.py:399 plugins/WebPage.py:960
msgid "The style used for the title of the page."
msgstr ""
#: plugins/AncestorReport.py:257
#: plugins/AncestorReport.py:257 plugins/FtmStyleAncestors.py:226
msgid "The style used for the generation header."
msgstr ""
@ -3653,8 +3683,8 @@ msgid "Provides a browsable hierarchy based on the active person"
msgstr ""
#: plugins/DescendReport.py:87 plugins/GraphViz.py:103
#: plugins/IndivComplete.py:475 plugins/TimeLine.py:359
#: plugins/WriteGedcom.py:378
#: plugins/IndivComplete.py:475 plugins/TimeLine.py:363
#: plugins/WriteGedcom.py:377
msgid "Descendants of %s"
msgstr ""
@ -3960,7 +3990,7 @@ msgid "Event comparison filter selection"
msgstr ""
#: plugins/EventCmp.py:147 plugins/GraphViz.py:99 plugins/IndivComplete.py:483
#: plugins/TimeLine.py:355 plugins/WebPage.py:921 plugins/WriteGedcom.py:374
#: plugins/TimeLine.py:359 plugins/WebPage.py:921 plugins/WriteGedcom.py:373
msgid "Entire Database"
msgstr ""
@ -4067,6 +4097,60 @@ msgstr ""
msgid "The System Filter Editor builds custom filters that can be used by anyone on the system to select people included in reports, exports, and other utilities."
msgstr ""
#: plugins/FtmStyleAncestors.py:73 plugins/GraphViz.py:107
#: plugins/IndivComplete.py:479 plugins/TimeLine.py:367 plugins/WebPage.py:933
#: plugins/WriteGedcom.py:381
msgid "Ancestors of %s"
msgstr ""
#: plugins/FtmStyleAncestors.py:86
msgid "Generation No. %d"
msgstr ""
#: plugins/FtmStyleAncestors.py:120
msgid "born %(date)s in %(place)s"
msgstr ""
#: plugins/FtmStyleAncestors.py:125
msgid "born on %(date)s"
msgstr ""
#: plugins/FtmStyleAncestors.py:130
msgid "born in %(place)s"
msgstr ""
#: plugins/FtmStyleAncestors.py:150
msgid "died %(date)s in %(place)s. "
msgstr ""
#: plugins/FtmStyleAncestors.py:155
msgid "died on %(date)s. "
msgstr ""
#: plugins/FtmStyleAncestors.py:160
msgid "died in %(place)s. "
msgstr ""
#: plugins/FtmStyleAncestors.py:356
msgid "FTM Style Ancestor Report"
msgstr ""
#: plugins/FtmStyleAncestors.py:359
msgid "Produces a textual ancestral report similar to Family Tree Maker."
msgstr ""
#: plugins/FullFamily.py:105 plugins/FullFamily.py:169
msgid "Full Family Chart"
msgstr ""
#: plugins/FullFamily.py:109
msgid "Full Family Chart for %s"
msgstr ""
#: plugins/FullFamily.py:114
msgid "Save Full Family Chart"
msgstr ""
#: plugins/GraphViz.py:60 plugins/GraphViz.py:87
msgid "Single (scaled)"
msgstr ""
@ -4087,12 +4171,7 @@ msgstr ""
msgid "Graphviz File"
msgstr ""
#: plugins/GraphViz.py:107 plugins/IndivComplete.py:479
#: plugins/TimeLine.py:363 plugins/WebPage.py:933 plugins/WriteGedcom.py:382
msgid "Ancestors of %s"
msgstr ""
#: plugins/GraphViz.py:111 plugins/TimeLine.py:367 plugins/WriteGedcom.py:386
#: plugins/GraphViz.py:111 plugins/TimeLine.py:371 plugins/WriteGedcom.py:385
msgid "People with common ancestor with %s"
msgstr ""
@ -4675,7 +4754,7 @@ msgstr ""
msgid "Relationship calculator"
msgstr ""
#: plugins/RelCalc.py:327 plugins/TimeLine.py:336
#: plugins/RelCalc.py:327 plugins/TimeLine.py:340
msgid "Birth Date"
msgstr ""
@ -4783,27 +4862,27 @@ msgstr ""
msgid "Timeline"
msgstr ""
#: plugins/TimeLine.py:321
#: plugins/TimeLine.py:325
msgid "Timeline File"
msgstr ""
#: plugins/TimeLine.py:343
#: plugins/TimeLine.py:347
msgid "Sort by"
msgstr ""
#: plugins/TimeLine.py:379
#: plugins/TimeLine.py:383
msgid "The style used for the person's name."
msgstr ""
#: plugins/TimeLine.py:387
#: plugins/TimeLine.py:391
msgid "The style used for the year labels."
msgstr ""
#: plugins/TimeLine.py:451
#: plugins/TimeLine.py:455
msgid "Generates a timeline graph."
msgstr ""
#: plugins/TimeLine.py:455
#: plugins/TimeLine.py:459
msgid "Timeline Graph"
msgstr ""
@ -5253,11 +5332,11 @@ msgstr ""
msgid "Generates web (HTML) pages for individuals, or a set of individuals."
msgstr ""
#: plugins/WriteGedcom.py:368 plugins/WriteGedcom.py:477
#: plugins/WriteGedcom.py:367 plugins/WriteGedcom.py:476
msgid "GEDCOM export"
msgstr ""
#: plugins/WriteGedcom.py:1085
#: plugins/WriteGedcom.py:1084
msgid "Export to GEDCOM"
msgstr ""