Merge with Gramps50 branch

This commit is contained in:
prculley 2019-04-23 11:01:07 -05:00
commit 67c8fd18cb
63 changed files with 4096 additions and 3320 deletions

View File

@ -1,12 +1,12 @@
0 HEAD
1 SOUR Gramps
2 VERS 5.0.1
2 VERS 5.0.2
2 NAME Gramps
1 DATE 7 NOV 2018
2 TIME 16:03:33
1 DATE 5 MAR 2019
2 TIME 09:11:15
1 SUBM @SUBM@
1 FILE C:\Users\prc\AppData\Roaming\gramps\temp\exp_sample_ged.ged
1 COPR Copyright (c) 2018 Alex Roitman,,,.
1 COPR Copyright (c) 2019 Alex Roitman,,,.
1 GEDC
2 VERS 5.5.1
2 FORM LINEAGE-LINKED
@ -1420,8 +1420,8 @@
0 @N0018@ NOTE Another Citation Note
0 @N0019@ NOTE A bad photo for sure
0 @O0000@ OBJE
1 FILE c:\users\prc\workspace\grampsm\main\data\tests\O0.jpg
2 FORM jpeg
1 FILE c:\msys64\mingw64\share\gramps\tests\O0.jpg
2 FORM jpg
2 TITL Michael O'Toole 2015-11
1 NOTE @N0019@
1 CHAN

View File

@ -3,41 +3,41 @@
"http://gramps-project.org/xml/1.7.1/grampsxml.dtd">
<database xmlns="http://gramps-project.org/xml/1.7.1/">
<header>
<created date="2016-08-29" version="5.0.0-alpha1"/>
<created date="2019-03-13" version="5.0.2"/>
<researcher>
</researcher>
</header>
<events>
<event handle="_0000000500000005" change="1472500305" id="E0000">
<event handle="_0000000500000005" change="1" id="E0000">
<type>Birth</type>
<dateval val="1816"/>
<place hlink="_0000000700000007"/>
<citationref hlink="_0000000600000006"/>
</event>
<event handle="_0000000800000008" change="1472500305" id="E0001">
<event handle="_0000000800000008" change="1" id="E0001">
<type>Residence</type>
<dateval val="1850"/>
<place hlink="_0000000a0000000a"/>
<citationref hlink="_0000000900000009"/>
</event>
<event handle="_0000000b0000000b" change="1472500305" id="E0002">
<event handle="_0000000b0000000b" change="1" id="E0002">
<type>Death</type>
<datestr val="1850/1860"/>
<place hlink="_0000000c0000000c"/>
</event>
<event handle="_0000000f0000000f" change="1472500305" id="E0003">
<event handle="_0000000f0000000f" change="1" id="E0003">
<type>Marriage</type>
<dateval val="1841" type="about"/>
<place hlink="_0000001000000010"/>
</event>
<event handle="_0000001100000011" change="1472500305" id="E0004">
<event handle="_0000001100000011" change="1" id="E0004">
<type>Marriage</type>
<dateval val="1847-08"/>
<place hlink="_0000001200000012"/>
</event>
</events>
<people>
<person handle="_0000000100000001" change="1472500305" id="I0278">
<person handle="_0000000100000001" change="1" id="I0278">
<gender>M</gender>
<name type="Birth Name">
<first>Andrew</first>
@ -54,13 +54,13 @@
</person>
</people>
<families>
<family handle="_0000000d0000000d" change="1472500305" id="F0073">
<family handle="_0000000d0000000d" change="1" id="F0073">
<rel type="Married"/>
<father hlink="_0000000100000001"/>
<eventref hlink="_0000000f0000000f" role="Family"/>
<childref hlink="_0000000100000001"/>
</family>
<family handle="_0000000e0000000e" change="1472500305" id="F0074">
<family handle="_0000000e0000000e" change="1" id="F0074">
<rel type="Married"/>
<father hlink="_0000000100000001"/>
<eventref hlink="_0000001100000011" role="Family"/>
@ -68,19 +68,19 @@
</family>
</families>
<citations>
<citation handle="_0000000400000004" change="1472500305" id="C0000">
<citation handle="_0000000400000004" change="1" id="C0000">
<page>Year: 1850; Census Place: District 14, Cape Girardeau, Missouri; Roll: M432_394; Page: 435B; Image: 248</page>
<confidence>2</confidence>
<objref hlink="_0000000300000003"/>
<sourceref hlink="_0000000200000002"/>
</citation>
<citation handle="_0000000600000006" change="1472500305" id="C0001">
<citation handle="_0000000600000006" change="1" id="C0001">
<page>Year: 1850; Census Place: District 14, Cape Girardeau, Missouri; Roll: M432_394; Page: 435B; Image: 248</page>
<confidence>2</confidence>
<objref hlink="_0000000300000003"/>
<sourceref hlink="_0000000200000002"/>
</citation>
<citation handle="_0000000900000009" change="1472500305" id="C0002">
<citation handle="_0000000900000009" change="1" id="C0002">
<page>Year: 1850; Census Place: District 14, Cape Girardeau, Missouri; Roll: M432_394; Page: 435B; Image: 248</page>
<confidence>2</confidence>
<objref hlink="_0000000300000003"/>
@ -88,7 +88,7 @@
</citation>
</citations>
<sources>
<source handle="_0000000200000002" change="1472500305" id="S0029">
<source handle="_0000000200000002" change="1" id="S0029">
<stitle>1850 United States Federal Census</stitle>
<sauthor>Ancestry.com</sauthor>
<spubinfo>Name: Ancestry.com Operations, Inc.; Location: Provo, UT, USA; Date: 2009;</spubinfo>
@ -96,42 +96,43 @@
</source>
</sources>
<places>
<placeobj handle="_0000000700000007" change="1472500305" id="P0000" type="Unknown">
<placeobj handle="_0000000700000007" change="1" id="P0000" type="Unknown">
<ptitle>Tennessee, USA</ptitle>
<pname value="Tennessee, USA"/>
</placeobj>
<placeobj handle="_0000000a0000000a" change="1472500305" id="P0001" type="Unknown">
<placeobj handle="_0000000a0000000a" change="1" id="P0001" type="Unknown">
<ptitle>District 14, Cape Girardeau, Missouri, USA</ptitle>
<pname value="District 14, Cape Girardeau, Missouri, USA"/>
</placeobj>
<placeobj handle="_0000000c0000000c" change="1472500305" id="P0002" type="Unknown">
<placeobj handle="_0000000c0000000c" change="1" id="P0002" type="Unknown">
<ptitle>Bollinger Co. MO</ptitle>
<pname value="Bollinger Co. MO"/>
</placeobj>
<placeobj handle="_0000001000000010" change="1472500305" id="P0003" type="Unknown">
<placeobj handle="_0000001000000010" change="1" id="P0003" type="Unknown">
<ptitle>Union Co.?, IL</ptitle>
<pname value="Union Co.?, IL"/>
</placeobj>
<placeobj handle="_0000001200000012" change="1472500305" id="P0004" type="Unknown">
<placeobj handle="_0000001200000012" change="1" id="P0004" type="Unknown">
<ptitle>Wayne, Missouri, United States</ptitle>
<pname value="Wayne, Missouri, United States"/>
</placeobj>
</places>
<objects>
<object handle="_0000000300000003" change="1472500305" id="M159">
<object handle="_0000000300000003" change="1" id="M159">
<file src="1850 United States Federal Census(11)-1.jpg" mime="image/jpeg" description="1850 United States Federal Census"/>
<noteref hlink="_0000001400000014"/>
<noteref hlink="_0000001500000015"/>
</object>
<object handle="_0000001600000016" change="1472500305" id="M158">
<file src="D:/Users/PRC/Downloads/1850 United States Federal Census(11)-1.jpg" mime="image/jpeg" description="D:\Users\PRC\Downloads\1850 United States Federal Census(11)-1.jpg"/>
<object handle="_0000001600000016" change="1" id="M158">
<file src="/Users/PRC/Downloads/1850 United States Federal Census(11)-1.jpg" mime="image/jpeg" description="/Users/PRC/Downloads/1850 United States Federal Census(11)-1.jpg"/>
<noteref hlink="_0000001700000017"/>
</object>
<object handle="_0000001700000017" change="1472500305" id="M157">
<object handle="_0000001800000018" change="1" id="M157">
<file src="http://1.gravatar.com/avatar/77e02a3c8c665155ad1acaac8c2742e0?s=120&amp;d=mm&amp;r=pg" mime="unknown" description="http://1.gravatar.com/avatar/77e02a3c8c665155ad1acaac8c2742e0?s=120&amp;d=mm&amp;r=pg"/>
</object>
</objects>
<repositories>
<repository handle="_0000001300000013" change="1472500305" id="R0001">
<repository handle="_0000001300000013" change="1" id="R0001">
<rname>Ancestry.com</rname>
<type>Library</type>
<address>
@ -140,16 +141,26 @@
</repository>
</repositories>
<notes>
<note handle="_0000001400000014" change="1472500305" id="N0000" type="Media Note">
<text>Year: 1850; Census Place: District 14, Cape Girardeau, Missouri; Roll: M432_394; Page: 435B; Image: 248</text>
<note handle="_0000001400000014" change="1" id="N0000" type="Media Note">
<text>Year: 1850; Census Place: District 14, Cape Girardeau, Missouri; Roll: M432_394; Page: 435B; Image: 248 </text>
</note>
<note handle="_0000001500000015" change="1472500305" id="N0001" type="GEDCOM import">
<note handle="_0000001500000015" change="1" id="N0001" type="GEDCOM import">
<text>Records not imported into OBJE (multi-media object) Gramps ID M159:
Could not import 1850 United States Federal Census(11)-1.jpg Line 70: 1 FILE 1850 United States Federal Census(11)-1.jpg</text>
Could not import 1850 United States Federal Census(11)-1.jpg Line 70: 1 FILE 1850 United States Federal Census(11)-1.jpg
</text>
<style name="fontface" value="Monospace">
<range start="0" end="200"/>
</style>
</note>
<note handle="_0000001700000017" change="1" id="N0002" type="GEDCOM import">
<text>Records not imported into OBJE (multi-media object) Gramps ID M158:
Could not import D:\Users\PRC\Downloads\1850 United States Federa Line 75: 1 FILE D:\Users\PRC\Downloads\1850 United States Federal Census(11)-1.jpg
</text>
<style name="fontface" value="Monospace">
<range start="0" end="223"/>
</style>
</note>
</notes>
</database>

View File

@ -3,7 +3,7 @@
"http://gramps-project.org/xml/1.7.1/grampsxml.dtd">
<database xmlns="http://gramps-project.org/xml/1.7.1/">
<header>
<created date="2017-05-30" version="5.0.0-alpha1"/>
<created date="2019-03-05" version="5.0.2"/>
<researcher>
</researcher>
</header>
@ -66,9 +66,10 @@
<object handle="_0000000300000003" change="1" id="O0000">
<file src="test_emb_55.jpg" mime="image/jpeg" description="Multimedia link embedded form v5.5"/>
<noteref hlink="_0000000200000002"/>
<noteref hlink="_0000000b0000000b"/>
</object>
<object handle="_0000000400000004" change="548708291" id="M1">
<file src="" mime="" description="Multimedia link to linked form v5.5 blob"/>
<file src="" mime="image/jpeg" description="Multimedia link to linked form v5.5 blob"/>
<attribute type="REFN" value="Ref12345M1">
<noteref hlink="_0000001200000012"/>
</attribute>
@ -117,7 +118,7 @@
<citationref hlink="_0000002700000027"/>
</object>
<object handle="_0000000c0000000c" change="1" id="O0002">
<file src="http://www.geni.com/photo/view?photo_id=6000000001341319061" mime="unknown" description="Multimedia link embedded form v5.5 URL"/>
<file src="http://www.geni.com/photo/view?photo_id=6000000001341319061" mime="text/html" description="Multimedia link embedded form v5.5 URL"/>
<noteref hlink="_0000000b0000000b"/>
</object>
<object handle="_0000000d0000000d" change="1" id="M7">
@ -129,7 +130,7 @@
<noteref hlink="_0000002900000029"/>
</object>
<object handle="_0000001500000015" change="1" id="M2">
<file src="" mime="" description="2nd blob Multimedia link to linked form v5.5 blob"/>
<file src="" mime="image/jpeg" description="2nd blob Multimedia link to linked form v5.5 blob"/>
<noteref hlink="_0000001600000016"/>
</object>
</objects>

View File

@ -3,7 +3,7 @@
"http://gramps-project.org/xml/1.7.1/grampsxml.dtd">
<database xmlns="http://gramps-project.org/xml/1.7.1/">
<header>
<created date="2016-10-24" version="5.0.0-alpha1"/>
<created date="2019-03-05" version="5.0.2"/>
<researcher>
<resname>Alex Roitman,,,</resname>
<resaddr>Not Provided</resaddr>
@ -163,6 +163,7 @@
</event>
<event handle="_0000005500000055" change="1" id="E0026">
<type>Birth</type>
<description>No Date Information</description>
</event>
<event handle="_0000005600000056" change="1" id="E0027">
<type>Death</type>
@ -1456,13 +1457,13 @@
<noteref hlink="_000000f9000000f9"/>
</object>
<object handle="_000000d1000000d1" change="1" id="O0001">
<file src="Magnes&amp;Anna_smiths_marr_cert.jpg" mime="unknown" description="Magnes&amp;Anna_smiths_marr_cert.jpg"/>
<file src="Magnes&amp;Anna_smiths_marr_cert.jpg" mime="image/jpeg" description="Magnes&amp;Anna_smiths_marr_cert.jpg"/>
</object>
<object handle="_000000d8000000d8" change="1" id="O0002">
<file src="John&amp;Alice_smiths_marr_cert.jpg" mime="unknown" description="John&amp;Alice_smiths_marr_cert.jpg"/>
<file src="John&amp;Alice_smiths_marr_cert.jpg" mime="image/jpeg" description="John&amp;Alice_smiths_marr_cert.jpg"/>
</object>
<object handle="_000000f1000000f1" change="1" id="O0003">
<file src="Attic_photo.jpg" mime="unknown" description="Attic_photo.jpg"/>
<file src="Attic_photo.jpg" mime="image/jpeg" description="Attic_photo.jpg"/>
</object>
</objects>
<repositories>
@ -1506,7 +1507,8 @@
<note handle="_0000000100000001" change="1" id="N0000" type="GEDCOM import">
<text>Records not imported into HEAD (header):
GEDCOM FORM not supported Line 14: 2 FORM NOT LINEAGE-LINKED</text>
GEDCOM FORM not supported Line 14: 2 FORM NOT LINEAGE-LINKED
</text>
<style name="fontface" value="Monospace">
<range start="0" end="148"/>
</style>
@ -1514,7 +1516,8 @@ GEDCOM FORM not supported Line 14:
<note handle="_0000000200000002" change="1" id="N0001" type="GEDCOM import">
<text>Records not imported into SUBM (Submitter): (@SUBM@) Alex Roitman,,,:
Line ignored as not understood Line 23: 2 NOTE No address provided (note not supported)</text>
Line ignored as not understood Line 23: 2 NOTE No address provided (note not supported)
</text>
<style name="fontface" value="Monospace">
<range start="0" end="199"/>
</style>
@ -1523,7 +1526,8 @@ Line ignored as not understood Line 23:
<text>Records not imported into FAM (family) Gramps ID F0003:
Line ignored as not understood Line 46: 2 SOUR Not really allowed here
Filename omitted Line 48: 1 OBJE</text>
Filename omitted Line 48: 1 OBJE
</text>
<style name="fontface" value="Monospace">
<range start="0" end="256"/>
</style>
@ -1562,7 +1566,8 @@ Filename omitted Line 48:
<text>Records not imported into INDI (individual) Gramps ID I0016:
Warn: ADDR overwritten Line 204: 3 ADR1 456 Main St again
ADDR element ignored '459 Main St.' Line 202: 2 ADDR 459 Main St., The Village, San Francisco, CA, USA</text>
ADDR element ignored '459 Main St.' Line 202: 2 ADDR 459 Main St., The Village, San Francisco, CA, USA
</text>
<style name="fontface" value="Monospace">
<range start="0" end="304"/>
</style>
@ -1573,7 +1578,8 @@ ADDR element ignored '459 Main St.' Line 202:
<note handle="_0000004700000047" change="1" id="N0014" type="GEDCOM import">
<text>Records not imported into INDI (individual) Gramps ID I0018:
Tag recognized but not supported Line 245: 2 TYPE first generaton</text>
Tag recognized but not supported Line 245: 2 TYPE first generaton
</text>
<style name="fontface" value="Monospace">
<range start="0" end="165"/>
</style>
@ -1604,7 +1610,8 @@ Company. He enlisted in the army at Sparks 7 December 1917 and served as a Corpo
<note handle="_000000cf000000cf" change="1" id="N0021" type="GEDCOM import">
<text>Records not imported into FAM (family) Gramps ID F0010:
Tag recognized but not supported Line 863: 2 _STAT</text>
Tag recognized but not supported Line 863: 2 _STAT
</text>
<style name="fontface" value="Monospace">
<range start="0" end="146"/>
</style>
@ -1613,7 +1620,8 @@ Tag recognized but not supported Line 863:
<text>Records not imported into FAM (family) Gramps ID F0011:
Could not import Magnes&amp;Anna_smiths_marr_cert.jpg Line 878: 3 OBJE
Could not import Magnes&amp;Anna_smiths_marr_cert.jpg Line 881: 2 OBJE</text>
Could not import Magnes&amp;Anna_smiths_marr_cert.jpg Line 881: 2 OBJE
</text>
<style name="fontface" value="Monospace">
<range start="0" end="233"/>
</style>
@ -1621,7 +1629,8 @@ Could not import Magnes&amp;Anna_smiths_marr_cert.jpg Line 8
<note handle="_000000d9000000d9" change="1" id="N0023" type="GEDCOM import">
<text>Records not imported into FAM (family) Gramps ID F0012:
Could not import John&amp;Alice_smiths_marr_cert.jpg Line 905: 1 OBJE</text>
Could not import John&amp;Alice_smiths_marr_cert.jpg Line 905: 1 OBJE
</text>
<style name="fontface" value="Monospace">
<range start="0" end="145"/>
</style>
@ -1629,7 +1638,8 @@ Could not import John&amp;Alice_smiths_marr_cert.jpg Line 9
<note handle="_000000e4000000e4" change="1" id="N0024" type="GEDCOM import">
<text>Records not imported into FAM (family) Gramps ID F0008:
Tag recognized but not supported Line 1005: 1 ADDR 123 Main st, Grantville, Virginia, USA</text>
Tag recognized but not supported Line 1005: 1 ADDR 123 Main st, Grantville, Virginia, USA
</text>
<style name="fontface" value="Monospace">
<range start="0" end="183"/>
</style>
@ -1653,7 +1663,8 @@ Tag recognized but not supported Line 1005:
<text>Records not imported into SOUR (source) Gramps ID S0003:
Tag recognized but not supported Line 1045: 1 DATA
Skipped subordinate line Line 1046: 2 AGNC NYC Public Library</text>
Skipped subordinate line Line 1046: 2 AGNC NYC Public Library
</text>
<style name="fontface" value="Monospace">
<range start="0" end="252"/>
</style>
@ -1669,7 +1680,8 @@ Skipped subordinate line Line 1046:
REFN ignored Line 1075: 3 REFN blah blah
Skipped subordinate line Line 1076: 4 TYPE who knows
Could not import Attic_photo.jpg Line 1079: 3 OBJE</text>
Could not import Attic_photo.jpg Line 1079: 3 OBJE
</text>
<style name="fontface" value="Monospace">
<range start="0" end="344"/>
</style>
@ -1677,7 +1689,8 @@ Could not import Attic_photo.jpg Line 1079:
<note handle="_000000f6000000f6" change="1" id="N0034" type="GEDCOM import">
<text>Records not imported into Top Level:
Unknown tag Line 1106: 0 XXX an unknown token at level 0</text>
Unknown tag Line 1106: 0 XXX an unknown token at level 0
</text>
<style name="fontface" value="Monospace">
<range start="0" end="152"/>
</style>
@ -1685,12 +1698,13 @@ Unknown tag Line 1106:
<note handle="_000000f8000000f8" change="1" id="N0035" type="GEDCOM import">
<text>Records not imported into Top Level:
Unknown tag Line 1109: 1 @X1@ XXX and unknown token xref definition</text>
Unknown tag Line 1109: 1 @X1@ XXX and unknown token xref definition
</text>
<style name="fontface" value="Monospace">
<range start="0" end="163"/>
</style>
</note>
<note handle="_000000f9000000f9" change="1477325896" id="N0036" type="General">
<note handle="_000000f9000000f9" change="1551800790" id="N0036" type="General">
<text>Objects referenced by this note were missing in a file imported on 12/25/1999 12:00:00 AM.</text>
</note>
</notes>

View File

@ -15,7 +15,7 @@
<resphone>(555)123-4567</resphone>
<resemail>anyone@someplace.com</resemail>
</researcher>
<mediapath>{GRAMPS_RESOURCES}/example/gramps</mediapath>
<mediapath>{GRAMPS_RESOURCES}/doc/gramps/example/gramps</mediapath>
</header>
<tags>
<tag handle="_c7642d9389b54417e8b" change="1370206720" name="tag1" color="#000000000000" priority="0"/>

View File

@ -7,7 +7,7 @@
<researcher>
<resname>Alex Roitman,,,</resname>
</researcher>
<mediapath>{GRAMPS_RESOURCES}/example/gramps</mediapath>
<mediapath>{GRAMPS_RESOURCES}/doc/gramps/example/gramps</mediapath>
</header>
<name-formats>
<format number="-1" name="SURNAME, Given (Common)" fmt_str="SURNAME, given (common)" active="1"/>

View File

@ -54,11 +54,6 @@ class PlaceFormat:
self.street = street
self.reverse = reverse
def to_xml(self):
return (' <format name="%s" levels="%s" language="%s" '
'street="%s" reverse="%s"/>\n' %
(self.name, self.levels, self.language,
self.street, self.reverse))
#-------------------------------------------------------------------------
#
@ -71,10 +66,13 @@ class PlaceDisplay:
self.place_formats = []
self.default_format = config.get('preferences.place-format')
if os.path.exists(PLACE_FORMATS):
self.load_formats()
else:
pf = PlaceFormat(_('Full'), ':', '', 0, False)
self.place_formats.append(pf)
try:
self.load_formats()
return
except BaseException:
print(_("Error in '%s' file: cannot load.") % PLACE_FORMATS)
pf = PlaceFormat(_('Full'), ':', '', 0, False)
self.place_formats.append(pf)
def display_event(self, db, event, fmt=-1):
if not event:
@ -164,12 +162,20 @@ class PlaceDisplay:
dom.unlink()
def save_formats(self):
with open(PLACE_FORMATS, 'w') as fd:
fd.write('<?xml version="1.0" encoding="utf-8"?>\n')
fd.write('<place_formats>\n')
for fmt in self.place_formats:
fd.write(fmt.to_xml())
fd.write('</place_formats>\n')
doc = xml.dom.minidom.Document()
place_formats = doc.createElement('place_formats')
doc.appendChild(place_formats)
for fmt in self.place_formats:
node = doc.createElement('format')
place_formats.appendChild(node)
node.setAttribute('name', fmt.name)
node.setAttribute('levels', fmt.levels)
node.setAttribute('language', fmt.language)
node.setAttribute('street', str(fmt.street))
node.setAttribute('reverse', str(fmt.reverse))
with open(PLACE_FORMATS, 'w', encoding='utf-8') as f_d:
doc.writexml(f_d, addindent=' ', newl='\n', encoding='utf-8')
def _get_offset(value, index):
if index is not None and value.startswith('p'):

View File

@ -124,6 +124,9 @@ class GenericFilter:
def get_cursor(self, db):
return db.get_person_cursor()
def get_tree_cursor(self, db):
return db.get_person_cursor()
def make_obj(self):
return Person()
@ -133,13 +136,15 @@ class GenericFilter:
def get_number(self, db):
return db.get_number_of_people()
def check_func(self, db, id_list, task, user=None, tupleind=None):
def check_func(self, db, id_list, task, user=None, tupleind=None,
tree=False):
final_list = []
if user:
user.begin_progress(_('Filter'), _('Applying ...'),
self.get_number(db))
if id_list is None:
with self.get_cursor(db) as cursor:
with (self.get_tree_cursor(db) if tree else
self.get_cursor(db)) as cursor:
for handle, data in cursor:
person = self.make_obj()
person.unserialize(data)
@ -162,14 +167,15 @@ class GenericFilter:
user.end_progress()
return final_list
def check_and(self, db, id_list, user=None, tupleind=None):
def check_and(self, db, id_list, user=None, tupleind=None, tree=False):
final_list = []
flist = self.flist
if user:
user.begin_progress(_('Filter'), _('Applying ...'),
self.get_number(db))
if id_list is None:
with self.get_cursor(db) as cursor:
with (self.get_tree_cursor(db) if tree else
self.get_cursor(db)) as cursor:
for handle, data in cursor:
person = self.make_obj()
person.unserialize(data)
@ -194,14 +200,17 @@ class GenericFilter:
user.end_progress()
return final_list
def check_or(self, db, id_list, user=None, tupleind=None):
return self.check_func(db, id_list, self.or_test, user, tupleind)
def check_or(self, db, id_list, user=None, tupleind=None, tree=False):
return self.check_func(db, id_list, self.or_test, user, tupleind,
tree=False)
def check_one(self, db, id_list, user=None, tupleind=None):
return self.check_func(db, id_list, self.one_test, user, tupleind)
def check_one(self, db, id_list, user=None, tupleind=None, tree=False):
return self.check_func(db, id_list, self.one_test, user, tupleind,
tree=False)
def check_xor(self, db, id_list, user=None, tupleind=None):
return self.check_func(db, id_list, self.xor_test, user, tupleind)
def check_xor(self, db, id_list, user=None, tupleind=None, tree=False):
return self.check_func(db, id_list, self.xor_test, user, tupleind,
tree=False)
def xor_test(self, db, person):
test = False
@ -231,7 +240,7 @@ class GenericFilter:
def check(self, db, handle):
return self.get_check_func()(db, [handle])
def apply(self, db, id_list=None, tupleind=None, user=None):
def apply(self, db, id_list=None, tupleind=None, user=None, tree=False):
"""
Apply the filter using db.
If id_list given, the handles in id_list are used. If not given
@ -251,7 +260,7 @@ class GenericFilter:
m = self.get_check_func()
for rule in self.flist:
rule.requestprepare(db, user)
res = m(db, id_list, user, tupleind)
res = m(db, id_list, user, tupleind, tree)
for rule in self.flist:
rule.requestreset()
return res
@ -315,6 +324,9 @@ class GenericCitationFilter(GenericFilter):
def get_cursor(self, db):
return db.get_citation_cursor()
def get_tree_cursor(self, db):
return db.get_citation_cursor()
def make_obj(self):
return Citation()
@ -332,6 +344,9 @@ class GenericPlaceFilter(GenericFilter):
def get_cursor(self, db):
return db.get_place_cursor()
def get_tree_cursor(self, db):
return db.get_place_tree_cursor()
def make_obj(self):
return Place()

View File

@ -75,6 +75,8 @@ class RelationshipPathBetween(Rule):
self.desc_list(child_ref.ref, map, 0)
def apply_filter(self, rank, handle, plist, pmap):
if not handle:
return
person = self.db.get_person_from_handle(handle)
if person is None:
return

View File

@ -133,7 +133,8 @@ class MergeFamilyQuery:
old_handle = self.titanic.get_handle()
with DbTxn(_('Merge Family'), self.database) as trans:
# commit family in case Phoenix GrampsID, relationship has changed
self.database.commit_family(self.phoenix, trans)
if self.phoenix_fh != self.titanic_fh:
if self.phoenix_fh:
phoenix_father = self.database.get_person_from_handle(
@ -161,6 +162,8 @@ class MergeFamilyQuery:
titanic_mother = None
self.merge_person(phoenix_mother, titanic_mother,
'mother', trans)
# Reload families from db in case the merge_person above changed
# them
self.phoenix = self.database.get_family_from_handle(new_handle)
self.titanic = self.database.get_family_from_handle(old_handle)
@ -174,8 +177,6 @@ class MergeFamilyQuery:
self.phoenix_mh)
else:
phoenix_mother = None
self.phoenix = self.database.get_family_from_handle(new_handle)
self.titanic = self.database.get_family_from_handle(old_handle)
self.phoenix.merge(self.titanic)
self.database.commit_family(self.phoenix, trans)
for childref in self.titanic.get_child_ref_list():

View File

@ -991,8 +991,9 @@ class GVPdfGsDoc(GVDocBase):
tmp_pdf_piece = "%s_%d_%d.pdf" % (tmp_ps, __x, __y)
list_of_pieces.append(tmp_pdf_piece)
# Generate Ghostscript code
command = '%s -q -dBATCH -dNOPAUSE -dSAFER -g%dx%d '\
'-sOutputFile="%s" -r72 -sDEVICE=pdfwrite '\
command = '%s -q -dBATCH -dNOPAUSE -dSAFER '\
'-dDEVICEWIDTHPOINTS=%d -dDEVICEHEIGHTPOINTS=%d '\
'-sOutputFile="%s" -sDEVICE=pdfwrite '\
'-c "<</.HWMargins [%d %d %d %d] /PageOffset [%d %d]>> '\
'setpagedevice" -f "%s"' % (
_GS_CMD, width_pt + 10, height_pt + 10, tmp_pdf_piece,
@ -1002,7 +1003,7 @@ class GVPdfGsDoc(GVDocBase):
os.system(command)
# Merge pieces to single multipage PDF ;
command = '%s -q -dBATCH -dNOPAUSE '\
'-sOUTPUTFILE="%s" -r72 -sDEVICE=pdfwrite %s '\
'-sOUTPUTFILE="%s" -sDEVICE=pdfwrite %s '\
% (_GS_CMD, self._filename, ' '.join(list_of_pieces))
os.system(command)

View File

@ -266,7 +266,7 @@ def mac_setup_localization(glocale):
LOG.debug("No supported languages found in $LANGUAGE")
if not (language and language[0]):
translations = _mac_language_list()
if len(translations) > 0:
if translations and len(translations) > 0:
language = translations
LOG.debug("Returning Translations %s", ':'.join(translations))

View File

@ -131,15 +131,15 @@ class EventEmbedList(DbGUIElement, GroupEmbeddedList):
refs = self.get_data()[self._WORKGROUP]
ref_list = [eref.ref for eref in refs]
indexlist = []
last = 0
last = -1
while True:
try:
last = ref_list.index(handle)
last = ref_list.index(handle, last + 1)
indexlist.append(last)
except ValueError:
break
#remove the deleted workgroup events from the object
for index in indexlist.reverse():
for index in reversed(indexlist):
del refs[index]
#now rebuild the display tab
self.rebuild_callback()

View File

@ -92,6 +92,10 @@ class PersonEventEmbedList(EventEmbedList):
self._data.append(family.get_event_ref_list())
self._groups.append((family_handle, self._FAMNAME,
groupname))
#we register all events that need to be tracked
for group in self._data:
self.callman.register_handles(
{'event': [eref.ref for eref in group]})
self.changed = False
return self._data

View File

@ -38,13 +38,15 @@ from gramps.gen.errors import WindowActiveError
from ...ddtargets import DdTargets
from .personrefmodel import PersonRefModel
from .embeddedlist import EmbeddedList, TEXT_COL, MARKUP_COL, ICON_COL
from ...dbguielement import DbGUIElement
#-------------------------------------------------------------------------
#
#
#
#-------------------------------------------------------------------------
class PersonRefEmbedList(EmbeddedList):
class PersonRefEmbedList(DbGUIElement, EmbeddedList):
_HANDLE_COL = 4
_DND_TYPE = DdTargets.PERSONREF
@ -69,15 +71,61 @@ class PersonRefEmbedList(EmbeddedList):
def __init__(self, dbstate, uistate, track, data):
self.data = data
DbGUIElement.__init__(self, dbstate.db)
EmbeddedList.__init__(self, dbstate, uistate, track,
_('_Associations'), PersonRefModel,
move_buttons=True)
def _connect_db_signals(self):
"""
called on init of DbGUIElement, connect to db as required.
"""
#note: person-rebuild closes the editors, so no need to connect to it
self.callman.register_callbacks(
{'person-update': self.person_change, # change to person we track
'person-delete': self.person_delete, # delete of person we track
})
self.callman.connect_all(keys=['person'])
def person_change(self, *obj):
"""
Callback method called when a tracked person changes (description
changes...)
"""
self.rebuild()
def person_delete(self, hndls):
"""
Callback method called when a tracked person is deleted.
There are two possibilities:
* a tracked non-workgroup person is deleted, just rebuilding the view
will correct this.
* a workgroup person is deleted. The person must be removed from the
obj so that no inconsistent data is shown.
"""
for handle in hndls:
ref_list = [pref.ref for pref in self.data]
indexlist = []
last = -1
while True:
try:
last = ref_list.index(handle, last + 1)
indexlist.append(last)
except ValueError:
break
#remove the deleted workgroup persons from the object
for index in reversed(indexlist):
del self.data[index]
#now rebuild the display tab
self.rebuild()
def get_ref_editor(self):
from .. import EditPersonRef
return EditPersonRef
def get_data(self):
self.callman.register_handles(
{'person': [pref.ref for pref in self.data]})
return self.data
def column_order(self):

View File

@ -40,13 +40,15 @@ from ...ddtargets import DdTargets
from .placerefmodel import PlaceRefModel
from .embeddedlist import EmbeddedList, TEXT_COL
from ...selectors import SelectorFactory
from ...dbguielement import DbGUIElement
#-------------------------------------------------------------------------
#
#
#
#-------------------------------------------------------------------------
class PlaceRefEmbedList(EmbeddedList):
class PlaceRefEmbedList(DbGUIElement, EmbeddedList):
_HANDLE_COL = 4
_DND_TYPE = DdTargets.PLACEREF
@ -65,11 +67,57 @@ class PlaceRefEmbedList(EmbeddedList):
self.data = data
self.handle = handle
self.callback = callback
DbGUIElement.__init__(self, dbstate.db)
EmbeddedList.__init__(self, dbstate, uistate, track,
_('Enclosed By'), PlaceRefModel,
share_button=True, move_buttons=True)
def _connect_db_signals(self):
"""
called on init of DbGUIElement, connect to db as required.
"""
#note: place-rebuild closes the editors, so no need to connect to it
self.callman.register_callbacks(
{'place-update': self.place_change, # change to place we track
'place-delete': self.place_delete, # delete of place we track
})
self.callman.connect_all(keys=['place'])
def place_change(self, *obj):
"""
Callback method called when a tracked place changes (description
changes...)
"""
self.rebuild()
def place_delete(self, hndls):
"""
Callback method called when a tracked place is deleted.
There are two possibilities:
* a tracked non-workgroup place is deleted, just rebuilding the view
will correct this.
* a workgroup place is deleted. The place must be removed from the
obj so that no inconsistent data is shown.
"""
for handle in hndls:
ref_list = [pref.ref for pref in self.data]
indexlist = []
last = -1
while True:
try:
last = ref_list.index(handle, last + 1)
indexlist.append(last)
except ValueError:
break
#remove the deleted workgroup places from the object
for index in reversed(indexlist):
del self.data[index]
#now rebuild the display tab
self.rebuild()
def get_data(self):
self.callman.register_handles(
{'place': [pref.ref for pref in self.data]})
return self.data
def column_order(self):

View File

@ -174,6 +174,8 @@ class EditCitation(EditPrimary):
self._add_db_signal('citation-rebuild', self._do_close)
self._add_db_signal('citation-delete', self.check_for_close)
self._add_db_signal('source-delete', self.source_delete)
self._add_db_signal('source-update', self.source_update)
def _setup_fields(self):
"""
@ -269,6 +271,26 @@ class EditCitation(EditPrimary):
author = ''
self.glade.get_object("author").set_text(author)
def source_update(self, hndls):
''' Source changed outside of dialog, update text if its ours '''
handle = self.obj.get_reference_handle()
if handle and handle in hndls:
source = self.db.get_source_from_handle(handle)
s_lbl = "%s [%s]" % (source.get_title(), source.gramps_id)
self.glade.get_object("source").set_text(s_lbl)
author = source.get_author()
self.glade.get_object("author").set_text(author)
def source_delete(self, hndls):
''' Source deleted outside of dialog, remove it if its ours'''
handle = self.obj.get_reference_handle()
if handle and handle in hndls:
self.obj.set_reference_handle(None)
self.glade.get_object("source").set_markup(
self.source_field.EMPTY_TEXT)
self.glade.get_object("author").set_text('')
self.source_field.set_button(False)
def build_menu_names(self, source):
"""
Provide the information needed by the base class to define the

View File

@ -129,6 +129,8 @@ class EditEvent(EditPrimary):
"""
self._add_db_signal('event-rebuild', self._do_close)
self._add_db_signal('event-delete', self.check_for_close)
self._add_db_signal('place-delete', self.place_delete)
self._add_db_signal('place-update', self.place_update)
def _setup_fields(self):
@ -301,6 +303,24 @@ class EditEvent(EditPrimary):
cmp_obj = self.empty_object()
return cmp_obj.serialize(True)[1:] != self.obj.serialize()[1:]
def place_update(self, hndls):
''' Place changed outside of dialog, update text if its ours '''
handle = self.obj.get_place_handle()
if handle and handle in hndls:
place = self.db.get_place_from_handle(handle)
p_lbl = "%s [%s]" % (place.get_title(), place.gramps_id)
self.top.get_object("place").set_text(p_lbl)
def place_delete(self, hndls):
''' Place deleted outside of dialog, remove it if its ours'''
handle = self.obj.get_place_handle()
if handle and handle in hndls:
self.obj.set_place_handle(None)
self.top.get_object("place").set_markup(
self.place_field.EMPTY_TEXT)
self.place_field.set_button(False)
#-------------------------------------------------------------------------
#
# Delete Query class

View File

@ -120,6 +120,8 @@ class EditEventRef(EditReference):
"""
self._add_db_signal('event-rebuild', self.close)
self._add_db_signal('event-delete', self.check_for_close)
self._add_db_signal('place-delete', self.place_delete)
self._add_db_signal('place-update', self.place_update)
def _setup_fields(self):
@ -279,3 +281,20 @@ class EditEventRef(EditReference):
self.update(self.source_ref,self.source)
self.close()
def place_update(self, hndls):
''' Place changed outside of dialog, update text if its ours '''
handle = self.source.get_place_handle()
if handle and handle in hndls:
place = self.db.get_place_from_handle(handle)
p_lbl = "%s [%s]" % (place.get_title(), place.gramps_id)
self.top.get_object("eer_place").set_text(p_lbl)
def place_delete(self, hndls):
''' Place deleted outside of dialog, remove it if its ours'''
handle = self.source.get_place_handle()
if handle and handle in hndls:
self.source.set_place_handle(None)
self.top.get_object("eer_place").set_markup(
self.place_field.EMPTY_TEXT)
self.place_field.set_button(False)

View File

@ -80,6 +80,7 @@ from gramps.gen.utils.db import (get_birth_or_fallback, get_death_or_fallback,
from ..selectors import SelectorFactory
from gramps.gen.utils.id import create_id
from gramps.gen.const import URL_MANUAL_SECT1
from ..dbguielement import DbGUIElement
#-------------------------------------------------------------------------
#
@ -97,7 +98,8 @@ _KP_ENTER = Gdk.keyval_from_name("KP_Enter")
_LEFT_BUTTON = 1
_RIGHT_BUTTON = 3
class ChildEmbedList(EmbeddedList):
class ChildEmbedList(DbGUIElement, EmbeddedList):
"""
The child embed list is specific to the Edit Family dialog, so it
is contained here instead of in displaytabs.
@ -139,9 +141,54 @@ class ChildEmbedList(EmbeddedList):
Create the object, storing the passed family value
"""
self.family = family
DbGUIElement.__init__(self, dbstate.db)
EmbeddedList.__init__(self, dbstate, uistate, track, _('Chil_dren'),
ChildModel, share_button=True, move_buttons=True)
def _connect_db_signals(self):
"""
called on init of DbGUIElement, connect to db as required.
"""
#note: event-rebuild closes the editors, so no need to connect to it
self.callman.register_callbacks(
{'person-update': self.person_change, # change to person we track
'person-delete': self.person_delete, # delete of person we track
})
self.callman.connect_all(keys=['person'])
def person_change(self, *obj):
"""
Callback method called when a tracked person changes (description
changes...)
"""
self.rebuild()
def person_delete(self, hndls):
"""
Callback method called when a tracked person is deleted.
There are two possibilities:
* a tracked non-workgroup person is deleted, just rebuilding the view
will correct this.
* a workgroup person is deleted. The person must be removed from the
obj so that no inconsistent data is shown.
"""
for handle in hndls:
prefs = self.get_data()
ref_list = [pref.ref for pref in prefs]
indexlist = []
last = -1
while True:
try:
last = ref_list.index(handle, last + 1)
indexlist.append(last)
except ValueError:
break
#remove the deleted workgroup persons from the object
for index in reversed(indexlist):
del prefs[index]
#now rebuild the display tab
self.rebuild()
def get_popup_menu_items(self):
return [
(False, _('Edit child'), self.edit_child_button_clicked),
@ -163,7 +210,10 @@ class ChildEmbedList(EmbeddedList):
Normally, get_data returns a list. However, we return family
object here instead.
"""
return self.family.get_child_ref_list()
prefs = self.family.get_child_ref_list()
self.callman.register_handles(
{'person': [eref.ref for eref in prefs]})
return prefs
def column_order(self):
return [(1, 13), (1, 0), (1, 1), (1, 2), (1, 3), (1, 4), (1, 5), (1, 6),
@ -292,9 +342,11 @@ class ChildEmbedList(EmbeddedList):
name.set_primary_surname(0)
if self.family:
father_handle = self.family.get_father_handle()
father = (self.dbstate.db.get_person_from_handle(father_handle) if
father_handle else None)
mother_handle = self.family.get_mother_handle()
father = self.dbstate.db.get_person_from_handle(father_handle)
mother = self.dbstate.db.get_person_from_handle(mother_handle)
mother = (self.dbstate.db.get_person_from_handle(mother_handle) if
mother_handle else None)
if not father and not mother:
return name
if not father:
@ -411,11 +463,22 @@ class EditFamily(EditPrimary):
'event-update': self.topdata_updated, # change eg birth event fath
'event-rebuild': self.topdata_updated,
'event-delete': self.topdata_updated, # delete eg birth event fath
'person-update': self.topdata_updated, # change eg name of father
'person-update': self.topdata_updated, # change eg name of father
'person-delete' : self.person_delete, # mother/father deleted?
'person-rebuild': self._do_close,
})
self.callman.connect_all(keys=['family', 'event', 'person'])
def person_delete(self, handles):
""" This checks if mother/father is deleted, specifically when newly
added before data is saved """
for hndl in handles:
if self.obj.father_handle == hndl:
self.obj.father_handle = None
if self.obj.mother_handle == hndl:
self.obj.mother_handle = None
self.load_data()
def check_for_family_change(self, handles):
"""
Callback for family-update signal

View File

@ -245,12 +245,13 @@ class EditMedia(EditPrimary):
self.view_media(obj)
def view_media(self, obj):
ref_obj = self.dbstate.db.get_media_from_handle(self.obj.handle)
if self.obj.handle:
ref_obj = self.dbstate.db.get_media_from_handle(self.obj.handle)
if ref_obj:
media_path = media_path_full(self.dbstate.db,
ref_obj.get_path())
open_file_with_default_application(media_path, self.uistate)
if ref_obj:
media_path = media_path_full(self.dbstate.db,
ref_obj.get_path())
open_file_with_default_application(media_path, self.uistate)
def select_file(self, val):
self.determine_mime()

View File

@ -269,9 +269,7 @@ class EditPerson(EditPrimary):
self._add_db_signal('family-delete', self.family_change)
self._add_db_signal('family-update', self.family_change)
self._add_db_signal('family-add', self.family_change)
self._add_db_signal('event-update', self.event_updated)
self._add_db_signal('event-rebuild', self.event_updated)
self._add_db_signal('event-delete', self.event_updated)
def family_change(self, handle_list=[]):
"""

View File

@ -182,8 +182,8 @@ class EditPlace(EditPrimary):
def set_latlongitude(self, value):
try:
coma = value.index(',')
self.longitude.set_text(value[coma+1:])
self.latitude.set_text(value[:coma])
self.longitude.set_text(value[coma+1:].strip())
self.latitude.set_text(value[:coma].strip())
self.top.get_object("lat_entry").validate(force=True)
self.top.get_object("lon_entry").validate(force=True)
self.obj.set_latitude(self.latitude.get_value())

View File

@ -175,8 +175,8 @@ class EditPlaceRef(EditReference):
def set_latlongitude(self, value):
try:
coma = value.index(',')
self.longitude.set_text(value[coma+1:])
self.latitude.set_text(value[:coma])
self.longitude.set_text(value[coma+1:].strip())
self.latitude.set_text(value[:coma].strip())
self.top.get_object("lat_entry").validate(force=True)
self.top.get_object("lon_entry").validate(force=True)
self.source.set_latitude(self.latitude.get_value())

View File

@ -150,9 +150,6 @@ class MergeCitation(ManagedWindow):
else:
phoenix = self.citation2
titanic = self.citation1
# Add second handle to history so that when merge is complete,
# phoenix is the selected row.
self.uistate.set_active(phoenix.get_handle(), 'Citation')
if self.get_widget("page_btn1").get_active() ^ use_handle1:
phoenix.set_page(titanic.get_page())
@ -165,5 +162,8 @@ class MergeCitation(ManagedWindow):
query = MergeCitationQuery(self.dbstate, phoenix, titanic)
query.execute()
# Add the selected handle to history so that when merge is complete,
# phoenix is the selected row.
self.uistate.set_active(phoenix.get_handle(), 'Citation')
self.uistate.set_busy_cursor(False)
self.close()

View File

@ -167,9 +167,6 @@ class MergeEvent(ManagedWindow):
else:
phoenix = self.ev2
titanic = self.ev1
# Add second handle to history so that when merge is complete,
# phoenix is the selected row.
self.uistate.set_active(phoenix.get_handle(), 'Event')
if self.get_widget("type_btn1").get_active() ^ use_handle1:
phoenix.set_type(titanic.get_type())
@ -185,5 +182,8 @@ class MergeEvent(ManagedWindow):
query = MergeEventQuery(self.dbstate, phoenix, titanic)
query.execute()
# Add the selected handle to history so that when merge is complete,
# phoenix is the selected row.
self.uistate.set_active(phoenix.get_handle(), 'Event')
self.uistate.set_busy_cursor(False)
self.close()

View File

@ -203,9 +203,6 @@ class MergeFamily(ManagedWindow):
else:
phoenix = self.fy2
titanic = self.fy1
# Add second handle to history so that when merge is complete,
# phoenix is the selected row.
self.uistate.set_active(phoenix.get_handle(), 'Family')
phoenix_fh = phoenix.get_father_handle()
phoenix_mh = phoenix.get_mother_handle()
@ -223,6 +220,9 @@ class MergeFamily(ManagedWindow):
query = MergeFamilyQuery(self.database, phoenix, titanic,
phoenix_fh, phoenix_mh)
query.execute()
# Add the selected handle to history so that when merge is complete,
# phoenix is the selected row.
self.uistate.set_active(phoenix.get_handle(), 'Family')
except MergeError as err:
ErrorDialog(_("Cannot merge people"), str(err),
parent=self.window)

View File

@ -147,9 +147,6 @@ class MergeMedia(ManagedWindow):
else:
phoenix = self.mo2
titanic = self.mo1
# Add second handle to history so that when merge is complete,
# phoenix is the selected row.
self.uistate.set_active(phoenix.get_handle(), 'Media')
if self.get_widget("path_btn1").get_active() ^ use_handle1:
phoenix.set_path(titanic.get_path())
@ -163,4 +160,7 @@ class MergeMedia(ManagedWindow):
query = MergeMediaQuery(self.dbstate, phoenix, titanic)
query.execute()
# Add the selected handle to history so that when merge is complete,
# phoenix is the selected row.
self.uistate.set_active(phoenix.get_handle(), 'Media')
self.close()

View File

@ -159,9 +159,6 @@ class MergeNote(ManagedWindow):
else:
phoenix = self.no2
titanic = self.no1
# Add second handle to history so that when merge is complete,
# phoenix is the selected row.
self.uistate.set_active(phoenix.get_handle(), 'Note')
if self.get_widget("text_btn1").get_active() ^ use_handle1:
phoenix.set_styledtext(titanic.get_styledtext())
@ -174,4 +171,7 @@ class MergeNote(ManagedWindow):
query = MergeNoteQuery(self.dbstate, phoenix, titanic)
query.execute()
# Add the selected handle to history so that when merge is complete,
# phoenix is the selected row.
self.uistate.set_active(phoenix.get_handle(), 'Note')
self.close()

View File

@ -321,9 +321,6 @@ class MergePerson(ManagedWindow):
else:
phoenix = self.pr2
titanic = self.pr1
# Add second handle to history so that when merge is complete,
# phoenix is the selected row.
self.uistate.set_active(phoenix.get_handle(), 'Person')
if self.get_widget("name_btn1").get_active() ^ use_handle1:
swapname = phoenix.get_primary_name()
@ -347,6 +344,9 @@ class MergePerson(ManagedWindow):
"handle. We recommend that you go to Relationships "
"view and see if additional manual merging of families "
"is necessary."), parent=self.window)
# Add the selected handle to history so that when merge is complete,
# phoenix is the selected row.
self.uistate.set_active(phoenix.get_handle(), 'Person')
except MergeError as err:
ErrorDialog(_("Cannot merge people"), str(err),
parent=self.window)

View File

@ -197,9 +197,6 @@ class MergePlace(ManagedWindow):
else:
phoenix = self.pl2
titanic = self.pl1
# Add second handle to history so that when merge is complete,
# phoenix is the selected row.
self.uistate.set_active(phoenix.get_handle(), 'Place')
if self.get_widget("title_btn1").get_active() ^ use_handle1:
phoenix.set_title(titanic.get_title())
@ -218,6 +215,9 @@ class MergePlace(ManagedWindow):
query = MergePlaceQuery(self.dbstate, phoenix, titanic)
query.execute()
# Add the selected handle to history so that when merge is complete,
# phoenix is the selected row.
self.uistate.set_active(phoenix.get_handle(), 'Place')
if self.callback:
self.callback()

View File

@ -140,9 +140,6 @@ class MergeRepository(ManagedWindow):
else:
phoenix = self.rp2
titanic = self.rp1
# Add second handle to history so that when merge is complete,
# phoenix is the selected row.
self.uistate.set_active(phoenix.get_handle(), 'Repository')
if self.get_widget("name_btn1").get_active() ^ use_handle1:
phoenix.set_name(titanic.get_name())
@ -153,5 +150,8 @@ class MergeRepository(ManagedWindow):
query = MergeRepositoryQuery(self.dbstate, phoenix, titanic)
query.execute()
# Add the selected handle to history so that when merge is complete,
# phoenix is the selected row.
self.uistate.set_active(phoenix.get_handle(), 'Repository')
self.uistate.set_busy_cursor(False)
self.close()

View File

@ -159,9 +159,6 @@ class MergeSource(ManagedWindow):
else:
phoenix = self.src2
titanic = self.src1
# Add second handle to history so that when merge is complete,
# phoenix is the selected row.
self.uistate.set_active(phoenix.get_handle(), 'Source')
if self.get_widget("title_btn1").get_active() ^ use_handle1:
phoenix.set_title(titanic.get_title())
@ -176,5 +173,8 @@ class MergeSource(ManagedWindow):
query = MergeSourceQuery(self.dbstate, phoenix, titanic)
query.execute()
# Add the selected handle to history so that when merge is complete,
# phoenix is the selected row.
self.uistate.set_active(phoenix.get_handle(), 'Source')
self.uistate.set_busy_cursor(False)
self.close()

View File

@ -586,7 +586,7 @@ class TreeBaseModel(GObject.GObject, Gtk.TreeModel, BaseModel):
assert not skip
if dfilter:
cdb = CacheProxyDb(self.db)
for handle in dfilter.apply(cdb,
for handle in dfilter.apply(cdb, tree=True,
user=User(parent=self.uistate.window)):
status_ppl.heartbeat()
data = data_map(handle)

View File

@ -63,6 +63,7 @@ from gramps.gen.utils.alive import probably_alive
from gramps.gen.utils.libformatting import FormattingHelper
from gramps.gen.utils.db import (find_children, find_parents, find_witnessed_people,
get_age, get_timeperiod, preset_name)
from gramps.gen.constfunc import is_quartz
from gramps.gen.const import GRAMPS_LOCALE as glocale
from gramps.gen.const import (
PIXELS_PER_GENERATION,
@ -670,6 +671,8 @@ class FanChartBaseWidget(Gtk.DrawingArea):
def draw_radial_text(self, cr, text, radiusin, radiusout, start_rad, stop_rad, font, flipped):
layout = self.create_pango_layout(text)
if is_quartz():
PangoCairo.context_set_resolution(layout.get_context(), 72)
layout.set_font_description(font)
layout.set_wrap(Pango.WrapMode.WORD_CHAR)
@ -701,6 +704,8 @@ class FanChartBaseWidget(Gtk.DrawingArea):
Text not fitting a single line will be char-wrapped away.
"""
layout = self.create_pango_layout(text)
if is_quartz():
PangoCairo.context_set_resolution(layout.get_context(), 72)
layout.set_font_description(font)
layout.set_wrap(Pango.WrapMode.WORD_CHAR)
@ -771,6 +776,8 @@ class FanChartBaseWidget(Gtk.DrawingArea):
cr.set_source_rgb(color[0], color[1], color[2])
cr.fill()
layout = self.create_pango_layout(text)
if is_quartz():
PangoCairo.context_set_resolution(layout.get_context(), 72)
layout.set_font_description(font)
cr.move_to(startw+gradwidth+4, starth)
cr.set_source_rgb(0, 0, 0) #black

View File

@ -330,9 +330,11 @@ class DBAPI(DbGeneric):
"""
Return the defined names that have been assigned to a default grouping.
"""
self.dbapi.execute("SELECT name FROM name_group ORDER BY name")
self.dbapi.execute("SELECT name, grouping FROM name_group "
"ORDER BY name")
rows = self.dbapi.fetchall()
return [row[0] for row in rows]
# not None test below fixes db corrupted by 11011 for export
return [row[0] for row in rows if row[1] is not None]
def get_name_group_mapping(self, key):
"""
@ -341,7 +343,8 @@ class DBAPI(DbGeneric):
self.dbapi.execute(
"SELECT grouping FROM name_group WHERE name = ?", [key])
row = self.dbapi.fetchone()
if row:
if row and row[0] is not None:
# not None test fixes db corrupted by 11011
return row[0]
else:
return key
@ -566,7 +569,7 @@ class DBAPI(DbGeneric):
self.dbapi.execute("SELECT grouping FROM name_group WHERE name = ?",
[key])
row = self.dbapi.fetchone()
return True if row else False
return row and row[0] is not None
def set_name_group_mapping(self, name, grouping):
"""
@ -576,14 +579,18 @@ class DBAPI(DbGeneric):
self.dbapi.execute("SELECT 1 FROM name_group WHERE name = ?",
[name])
row = self.dbapi.fetchone()
if row:
if row and grouping is not None:
self.dbapi.execute("UPDATE name_group SET grouping=? "
"WHERE name = ?", [grouping, name])
elif row and grouping is None:
self.dbapi.execute("DELETE FROM name_group WHERE name = ?", [name])
grouping = ''
else:
self.dbapi.execute(
"INSERT INTO name_group (name, grouping) VALUES (?, ?)",
[name, grouping])
self._txn_commit()
self.emit('person-groupname-rebuild', (name, grouping))
def _commit_base(self, obj, obj_key, trans, change_time):
"""

View File

@ -46,6 +46,7 @@ import cairo
# Gramps modules
#
#------------------------------------------------------------------------
from gramps.gen.constfunc import is_quartz
import gramps.plugins.lib.libcairodoc as libcairodoc
from gramps.gen.plug.docgen import INDEX_TYPE_ALP, INDEX_TYPE_TOC
from gramps.gen.errors import ReportError
@ -109,6 +110,8 @@ class CairoDocgen(libcairodoc.CairoDoc):
pango_context = fontmap.create_context()
options = cairo.FontOptions()
options.set_hint_metrics(cairo.HINT_METRICS_OFF)
if is_quartz():
PangoCairo.context_set_resolution(pango_context, 72)
PangoCairo.context_set_font_options(pango_context, options)
layout = Pango.Layout(pango_context)
PangoCairo.update_context(cr, pango_context)

View File

@ -538,7 +538,6 @@ class RecurseDown:
spouse_handle = utils.find_spouse(person, family)
if (self.max_spouses > s_level and
spouse_handle and
spouse_handle not in self.families_seen):
def _spouse_box(who):
return self.add_person_box((x_level, s_level+1),

View File

@ -104,15 +104,6 @@ LANGUAGES = {
#
#-------------------------------------------------------------------------
MIME2GED = {
"image/bmp" : "bmp",
"image/gif" : "gif",
"image/jpeg" : "jpeg",
"image/x-pcx" : "pcx",
"image/tiff" : "tiff",
"audio/x-wav" : "wav"
}
QUALITY_MAP = {
Citation.CONF_VERY_HIGH : "3",
Citation.CONF_HIGH : "2",
@ -1467,8 +1458,7 @@ class GedcomWriter(UpdateCallback):
gramps_id = media.get_gramps_id()
self._writeln(0, '@%s@' % gramps_id, 'OBJE')
mime = media.get_mime_type()
form = MIME2GED.get(mime, mime)
form = os.path.splitext(media.get_path())[1][1:]
path = media_path_full(self.dbase, media.get_path())
self._writeln(1, 'FILE', path, limit=255)
if form:

View File

@ -61,9 +61,9 @@ from gramps.gen.plug.menu import (NumberOption, ColorOption, BooleanOption,
EnumeratedListOption, PersonListOption,
SurnameColorOption)
from gramps.gen.utils.db import get_birth_or_fallback, get_death_or_fallback
from gramps.gen.utils.location import get_main_location
from gramps.gen.proxy import CacheProxyDb
from gramps.gen.errors import ReportError
from gramps.gen.display.place import displayer as _pd
#------------------------------------------------------------------------
#
@ -1089,27 +1089,7 @@ class FamilyLinesReport(Report):
if place_handle:
place = self._db.get_place_from_handle(place_handle)
if place:
location = get_main_location(self._db, place)
if location.get(PlaceType.HAMLET):
place_text = location.get(PlaceType.HAMLET)
elif location.get(PlaceType.VILLAGE):
place_text = location.get(PlaceType.VILLAGE)
elif location.get(PlaceType.TOWN):
place_text = location.get(PlaceType.TOWN)
elif location.get(PlaceType.CITY):
place_text = location.get(PlaceType.CITY)
elif location.get(PlaceType.PARISH):
place_text = location.get(PlaceType.PARISH)
elif location.get(PlaceType.COUNTY):
place_text = location.get(PlaceType.COUNTY)
elif location.get(PlaceType.PROVINCE):
place_text = location.get(PlaceType.PROVINCE)
elif location.get(PlaceType.REGION):
place_text = location.get(PlaceType.REGION)
elif location.get(PlaceType.STATE):
place_text = location.get(PlaceType.STATE)
elif location.get(PlaceType.COUNTRY):
place_text = location.get(PlaceType.COUNTRY)
place_text = _pd.display(self._db, place)
place_text = place_text.replace('<', '&#60;')
place_text = place_text.replace('>', '&#62;')
return place_text

View File

@ -494,13 +494,13 @@ class RelGraphReport(Report):
self.doc.start_subgraph(fam_id)
f_handle = fam.get_father_handle()
m_handle = fam.get_mother_handle()
if f_handle:
if f_handle in self.persons:
father = self._db.get_person_from_handle(f_handle)
self.doc.add_link(father.get_gramps_id(),
fam_id, "",
self.arrowheadstyle,
self.arrowtailstyle)
if m_handle:
if m_handle in self.persons:
mother = self._db.get_person_from_handle(m_handle)
self.doc.add_link(mother.get_gramps_id(),
fam_id, "",

View File

@ -1149,6 +1149,8 @@ class GrampsParser(UpdateCallback):
self.placeobj.title = attrs.get('title', '')
self.locations = 0
self.update(self.p.CurrentLineNumber)
if self.default_tag:
self.placeobj.add_tag(self.default_tag.handle)
return self.placeobj
def start_location(self, attrs):
@ -1276,6 +1278,8 @@ class GrampsParser(UpdateCallback):
self.event.private = bool(attrs.get("priv"))
self.event.change = int(attrs.get('change', self.change))
self.info.add('new-object', EVENT_KEY, self.event)
if self.default_tag:
self.event.add_tag(self.default_tag.handle)
return self.event
def start_eventref(self, attrs):
@ -1754,7 +1758,7 @@ class GrampsParser(UpdateCallback):
' with "%(parent)s", did not change this grouping to "%(value)s".') % {
'key' : key, 'parent' : present, 'value' : value }
self.user.warn(_("Gramps ignored a name grouping"), msg)
else:
elif value != 'None': # None test fixes file corrupted by 11011
self.db.set_name_group_mapping(key, value)
def start_last(self, attrs):
@ -2089,6 +2093,8 @@ class GrampsParser(UpdateCallback):
self.conf if self.__xml_version >= (1, 5, 1)
else 0 ) # See bug# 7125
self.info.add('new-object', CITATION_KEY, self.citation)
if self.default_tag:
self.citation.add_tag(self.default_tag.handle)
return self.citation
def start_sourceref(self, attrs):
@ -2143,6 +2149,8 @@ class GrampsParser(UpdateCallback):
self.source.private = bool(attrs.get("priv"))
self.source.change = int(attrs.get('change', self.change))
self.info.add('new-object', SOURCE_KEY, self.source)
if self.default_tag:
self.source.add_tag(self.default_tag.handle)
return self.source
def start_reporef(self, attrs):
@ -2261,6 +2269,8 @@ class GrampsParser(UpdateCallback):
self.repo.private = bool(attrs.get("priv"))
self.repo.change = int(attrs.get('change', self.change))
self.info.add('new-object', REPOSITORY_KEY, self.repo)
if self.default_tag:
self.repo.add_tag(self.default_tag.handle)
return self.repo
def stop_people(self, *tag):

View File

@ -94,6 +94,7 @@ import time
# from xml.parsers.expat import ParserCreate
from collections import defaultdict, OrderedDict
import string
import mimetypes
from io import StringIO, TextIOWrapper
from urllib.parse import urlparse
@ -123,7 +124,7 @@ from gramps.gen.lib import (
Surname, Tag, Url, UrlType, PlaceType, PlaceRef, PlaceName)
from gramps.gen.db import DbTxn
from gramps.gen.updatecallback import UpdateCallback
from gramps.gen.mime import get_type
from gramps.gen.utils.file import media_path
from gramps.gen.utils.id import create_id
from gramps.gen.utils.lds import TEMPLES
from gramps.gen.utils.unknown import make_unknown, create_explanation_note
@ -531,15 +532,6 @@ PEDIGREE_TYPES = {
'adopted': TYPE_ADOPT,
'foster' : TYPE_FOSTER, }
MIME_MAP = {
'jpeg' : 'image/jpeg', 'rtf' : 'text/rtf',
'jpg' : 'image/jpeg', 'pdf' : 'application/pdf',
'mpeg' : 'video/mpeg', 'gif' : 'image/gif',
'mpg' : 'video/mpeg', 'bmp' : 'image/x-ms-bmp',
'tiff' : 'image/tiff', 'aif' : 'audio/x-aiff',
'text' : 'text/plain', 'w8bn' : 'application/msword',
'wav' : 'audio/x-wav', 'mov' : 'video/quicktime', }
FTW_BAD_PLACE = [
EventType.OCCUPATION,
EventType.RELIGION,
@ -2315,8 +2307,8 @@ class GedcomParser(UpdateCallback):
TOKEN_MEDI : self.__media_ref_medi, # v5.5.1
TOKEN_TITL : self.__media_ref_titl,
TOKEN_FILE : self.__media_ref_file,
TOKEN_NOTE : self.__media_ref_note,
TOKEN_RNOTE : self.__media_ref_note,
TOKEN_NOTE : self.__obje_note, # illegal, but often there
TOKEN_RNOTE : self.__obje_note, # illegal, but often there
TOKEN__PRIM : self.__media_ref_prim, # LFT etc.
TOKEN_IGNORE : self.__ignore,
}
@ -2728,7 +2720,6 @@ class GedcomParser(UpdateCallback):
self.attrs = list(amap.values())
self.gedattr = dict([key, val] for val, key in amap.items())
self.search_paths = []
def parse_gedcom_file(self, use_trans=False):
"""
@ -2765,8 +2756,8 @@ class GedcomParser(UpdateCallback):
self.place_import.generate_hierarchy(self.trans)
if not self.dbase.get_feature("skip-check-xref"):
self.__check_xref()
if not self.dbase.get_feature("skip-check-xref"):
self.__check_xref()
self.dbase.enable_signals()
self.dbase.request_rebuild()
if self.number_of_errors == 0:
@ -3021,6 +3012,9 @@ class GedcomParser(UpdateCallback):
# FIXME: problem possibly caused by umlaut/accented character
# in filename
return (0, fullname)
# strip off Windows drive letter, if present
if len(fullname) > 3 and fullname[1] == ':':
fullname = fullname[2:]
# look where we found the '.ged', using the full path in fullname
other = os.path.join(altpath, fullname)
if os.path.isfile(other):
@ -3029,15 +3023,15 @@ class GedcomParser(UpdateCallback):
other = os.path.join(altpath, os.path.basename(fullname))
if os.path.isfile(other):
return (1, other)
# I don't think the following code does anything because search_paths
# is never initialized...
if len(fullname) > 3:
if fullname[1] == ':':
fullname = fullname[2:]
for path in self.search_paths:
other = os.path.normpath("%s/%s" % (path, fullname))
if os.path.isfile(other):
return (1, other)
# lets try using the base path for relative media paths
other = os.path.join(media_path(self.dbase), fullname)
if os.path.isfile(other):
return (1, fullname)
# lets try using the base path for relative media paths with base name
other = os.path.join(media_path(self.dbase),
os.path.basename(fullname))
if os.path.isfile(other):
return (1, os.path.basename(fullname))
return (0, fullname)
def __get_next_line(self):
@ -5331,7 +5325,7 @@ class GedcomParser(UpdateCallback):
sub_state.attr = None
sub_state.filename = ""
sub_state.title = ""
sub_state.note = ""
sub_state.media = Media()
sub_state.level = state.level + 1
sub_state.prim = ""
@ -5366,8 +5360,9 @@ class GedcomParser(UpdateCallback):
# to allow import of references to URLs (especially for import from
# geni.com), do not try to find the file if it is blatently a URL
res = urlparse(sub_state.filename)
if sub_state.filename != '' and \
(res.scheme == '' or res.scheme == 'file'):
if sub_state.filename != '' and (res.scheme == '' or
len(res.scheme) == 1 or
res.scheme == 'file'):
(valid, path) = self.__find_file(sub_state.filename,
self.dir_path)
if not valid:
@ -5376,7 +5371,7 @@ class GedcomParser(UpdateCallback):
else:
path = sub_state.filename
# Multiple references to the same media silently drops the later
# ones, even if title, notes etc. are different
# ones, even if title, etc. are different
photo_handle = self.media_map.get(path)
if photo_handle is None:
photo = Media()
@ -5384,21 +5379,30 @@ class GedcomParser(UpdateCallback):
if sub_state.title:
photo.set_description(sub_state.title)
else:
photo.set_description(path)
photo.set_description(path.replace('\\', '/'))
full_path = os.path.abspath(path)
if os.path.isfile(full_path):
photo.set_mime_type(get_type(full_path))
else:
photo.set_mime_type(MIME_MAP.get(sub_state.form,
'unknown'))
if sub_state.note:
photo.add_note(sub_state.note)
# deal with mime types
value = mimetypes.guess_type(full_path)
if value and value[0]: # found from filename
photo.set_mime_type(value[0])
else: # get from OBJE.FILE.FORM
if '/' in sub_state.form: # already has expanded mime type
photo.set_mime_type(sub_state.form)
else:
value = mimetypes.types_map.get('.' + sub_state.form,
_('unknown'))
photo.set_mime_type(value)
if sub_state.attr:
photo.attribute_list.append(sub_state.attr)
self.dbase.add_media(photo, self.trans)
self.media_map[path] = photo.handle
else:
photo = self.dbase.get_media_from_handle(photo_handle)
# copy notes to our media
for note in sub_state.media.get_note_list():
photo.add_note(note)
self.dbase.commit_media(photo, self.trans)
if sub_state.prim == "Y":
state.photo = photo.handle
oref = MediaRef()
@ -5458,21 +5462,6 @@ class GedcomParser(UpdateCallback):
return
state.filename = line.data
def __media_ref_note(self, line, state):
"""
+1 <<NOTE_STRUCTURE>> {0:M}
@param line: The current line in GedLine format
@type line: GedLine
@param state: The current state
@type state: CurrentState
"""
obj = Media()
self.__parse_note(line, obj, state)
nlist = obj.get_note_list()
if nlist:
state.note = nlist[0]
def __media_ref_prim(self, line, state):
"""
+1 _PRIM <Y/N> {0:1}
@ -6703,6 +6692,17 @@ class GedcomParser(UpdateCallback):
if state.media.get_path() == "":
self.__add_msg(_("Filename omitted"), line, state)
# deal with mime types
value = mimetypes.guess_type(state.media.get_path())
if value and value[0]: # found from filename
state.media.set_mime_type(value[0])
else: # get from OBJE.FILE.FORM
if '/' in state.form: # already has expanded mime type
state.media.set_mime_type(state.form)
else:
value = mimetypes.types_map.get('.' + state.form,
_('unknown'))
state.media.set_mime_type(value)
# Add the default reference if no source has found
self.__add_default_source(media)
@ -6738,21 +6738,21 @@ class GedcomParser(UpdateCallback):
self.__skip_subordinate_levels(state.level + 1, state)
return
res = urlparse(line.data)
if line.data != '' and (res.scheme == '' or res.scheme == 'file'):
if line.data != '' and (res.scheme == '' or
len(res.scheme) == 1 or res.scheme == 'file'):
(file_ok, filename) = self.__find_file(line.data, self.dir_path)
if state.form != "url":
# Might not work if FORM doesn't precede FILE
if not file_ok:
self.__add_msg(_("Could not import %s") % filename, line,
self.__add_msg(_("Could not import %s") % line.data, line,
state)
path = filename
else:
path = line.data
state.media.set_path(path)
state.media.set_mime_type(get_type(path))
if not state.media.get_description():
state.media.set_description(path)
state.media.set_description(path.replace('\\', '/'))
def __obje_title(self, line, state):
"""
@ -7827,6 +7827,9 @@ class GedcomParser(UpdateCallback):
sub_state.pf = self.place_parser
self.__parse_level(sub_state, event_map, self.__undefined)
if(description == 'Y' and event.date.is_empty() and
event.type == EventType.BIRTH and not event.place):
event.set_description(_("No Date Information"))
state.msg += sub_state.msg
self.__add_place(event, sub_state)

View File

@ -20,16 +20,19 @@
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
#
"""
This module is the base class for all geography view module
"""
#-------------------------------------------------------------------------
#
# Python modules
#
#-------------------------------------------------------------------------
from gramps.gen.const import GRAMPS_LOCALE as glocale
_ = glocale.translation.sgettext
import os
import re
import time
import logging
import gi
from gi.repository import GLib
#-------------------------------------------------------------------------
@ -38,6 +41,7 @@ from gi.repository import GLib
#
#-------------------------------------------------------------------------
from gi.repository import Gtk
from gi.repository import OsmGpsMap as osmgpsmap
#-------------------------------------------------------------------------
#
@ -55,23 +59,22 @@ from gramps.gen.config import config
from gramps.gui.editors import EditPlace, EditEvent, EditFamily, EditPerson
from gramps.gui.selectors.selectplace import SelectPlace
from gramps.gen.utils.file import media_path_full
from gramps.gen.const import GRAMPS_LOCALE as glocale
import gi
gi.require_version('OsmGpsMap', '1.0')
from gi.repository import OsmGpsMap as osmgpsmap
from . import constants
from .osmgps import OsmGps
from .selectionlayer import SelectionLayer
from .placeselection import PlaceSelection
from .cairoprint import CairoPrintSave
from .libkml import Kml
gi.require_version('OsmGpsMap', '1.0')
_ = glocale.translation.sgettext
#------------------------------------------------------------------------
#
# Set up logging
#
#------------------------------------------------------------------------
import logging
_LOG = logging.getLogger("maps.geography")
#-------------------------------------------------------------------------
@ -89,11 +92,6 @@ GEOGRAPHY_PATH = os.path.join(HOME_DIR, "maps")
PLACE_REGEXP = re.compile('<span background="green">(.*)</span>')
PLACE_STRING = '<span background="green">%s</span>'
# pylint: disable=unused-argument
# pylint: disable=unused-variable
# pylint: disable=no-member
# pylint: disable=maybe-no-member
def _get_sign(value):
"""
return 1 if we have a negative number, 0 in other case
@ -155,20 +153,13 @@ class GeoGraphyView(OsmGps, NavigationView):
self.places_found = []
self.select_fct = None
self.geo_mainmap = None
self.reloadtiles = None
theme = Gtk.IconTheme.get_default()
self.geo_mainmap = theme.load_surface('gramps-geo-mainmap', 48, 1,
None, 0)
self.geo_altmap = theme.load_surface('gramps-geo-altmap', 48, 1,
None, 0)
if (config.get('geography.map_service') in
(constants.OPENSTREETMAP,
constants.MAPS_FOR_FREE,
constants.OPENCYCLEMAP,
constants.OSM_PUBLIC_TRANSPORT,
)):
default_image = self.geo_mainmap
else:
default_image = self.geo_altmap
self.sort = []
self.geo_othermap = {}
for ident in (EventType.BIRTH,
EventType.DEATH,
@ -190,11 +181,14 @@ class GeoGraphyView(OsmGps, NavigationView):
self.changemap = None
self.clearmap = None
self.nbplaces = 0
self.nbmarkers = 0
self.place_without_coordinates = []
def add_bookmark(self, *menu):
def add_bookmark(self, menu):
"""
Add the place to the bookmark
"""
dummy_menu = menu
mlist = self.selected_handles()
if mlist:
self.bookmarks.add(mlist[0])
@ -210,6 +204,7 @@ class GeoGraphyView(OsmGps, NavigationView):
"""
Add the place to the bookmark from the popup menu
"""
dummy_menu = menu
if handle:
self.uistate.set_active(handle, self.navigation_type())
self.bookmarks.add(handle)
@ -264,6 +259,9 @@ class GeoGraphyView(OsmGps, NavigationView):
self._config.save()
def clear_view(self):
"""
Clear the map: places, markers, tracks, messages...
"""
self.place_list = []
self.remove_all_markers()
self.remove_all_gps()
@ -278,6 +276,7 @@ class GeoGraphyView(OsmGps, NavigationView):
is no need to store the database, since we will get the value
from self.state.db
"""
dummy_dbse = dbse
if self.active:
self.bookmarks.redraw()
self.build_tree()
@ -309,20 +308,26 @@ class GeoGraphyView(OsmGps, NavigationView):
use it to monitor changes in the ini file
"""
self._config.connect("geography.path",
self.set_path)
self.set_path)
self._config.connect("geography.zoom_when_center",
self.set_zoom_when_center)
self.set_zoom_when_center)
def set_path(self, client, cnxn_id, entry, data):
"""
All geography views must have the same path for maps
"""
dummy_client = client
dummy_cnxn_id = cnxn_id
dummy_data = data
config.set("geography.path", entry)
def set_zoom_when_center(self, client, cnxn_id, entry, data):
"""
All geography views must have the same zoom_when_center for maps
"""
dummy_client = client
dummy_cnxn_id = cnxn_id
dummy_data = data
config.set("geography.zoom_when_center", int(entry))
#-------------------------------------------------------------------------
@ -330,7 +335,7 @@ class GeoGraphyView(OsmGps, NavigationView):
# Map Menu
#
#-------------------------------------------------------------------------
def build_nav_menu(self, obj, event, lat, lon):
def build_nav_menu(self, osm, event, lat, lon):
"""
Builds the menu for actions on the map.
"""
@ -384,9 +389,7 @@ class GeoGraphyView(OsmGps, NavigationView):
menu.append(add_item)
map_name = constants.MAP_TITLE[config.get("geography.map_service")]
title = _("Replace '%(map)s' by =>") % {
'map' : map_name
}
title = _("Replace '%(map)s' by =>") % {'map' : map_name}
add_item = Gtk.MenuItem(label=title)
add_item.show()
menu.append(add_item)
@ -404,8 +407,7 @@ class GeoGraphyView(OsmGps, NavigationView):
changemap.append(changemapitem)
reload_text = _("Reload all visible tiles for '%(map)s'.") % {
'map' : map_name
}
'map' : map_name}
self.reloadtiles = Gtk.MenuItem(label=reload_text)
reloadtiles = self.reloadtiles
reloadtiles.connect("activate", self.reload_visible_tiles)
@ -414,13 +416,12 @@ class GeoGraphyView(OsmGps, NavigationView):
menu.append(reloadtiles)
clear_text = _("Clear the '%(map)s' tiles cache.") % {
'map' : map_name
}
'map' : map_name}
self.clearmap = Gtk.MenuItem(label=clear_text)
clearmap = self.clearmap
clearmap.connect("activate", self.clear_map,
constants.TILES_PATH[config.get(
"geography.map_service")])
"geography.map_service")])
clearmap.show()
menu.append(clearmap)
@ -433,12 +434,14 @@ class GeoGraphyView(OsmGps, NavigationView):
"""
We need to reload all visible tiles for the current map
"""
dummy_menu = menu
self.reload_tiles()
def clear_map(self, menu, the_map):
"""
We need to clean the tiles cache for the current map
"""
dummy_menu = menu
import shutil
path = "%s%c%s" % (config.get('geography.path'), os.sep, the_map)
@ -455,6 +458,8 @@ class GeoGraphyView(OsmGps, NavigationView):
"""
Center the map at the new position then save it.
"""
dummy_menu = menu
dummy_event = event
self.osm.set_center_and_zoom(lat, lon,
config.get("geography.zoom_when_center"))
self.save_center(lat, lon)
@ -474,21 +479,19 @@ class GeoGraphyView(OsmGps, NavigationView):
for mark in self.sort:
# as we are not precise with our hand, reduce the precision
# depending on the zoom.
precision = {
1 : '%3.0f', 2 : '%3.1f', 3 : '%3.1f', 4 : '%3.1f',
5 : '%3.2f', 6 : '%3.2f', 7 : '%3.2f', 8 : '%3.3f',
9 : '%3.3f', 10 : '%3.3f', 11 : '%3.3f', 12 : '%3.3f',
precision = {1 : '%3.0f', 2 : '%3.1f', 3 : '%3.1f', 4 : '%3.1f',
5 : '%3.2f', 6 : '%3.2f', 7 : '%3.2f', 8 : '%3.3f',
9 : '%3.3f', 10 : '%3.3f', 11 : '%3.3f', 12 : '%3.3f',
13 : '%3.3f', 14 : '%3.4f', 15 : '%3.4f', 16 : '%3.4f',
17 : '%3.4f', 18 : '%3.4f'
}.get(config.get("geography.zoom"), '%3.1f')
shift = {
1 : 5.0, 2 : 5.0, 3 : 3.0,
4 : 1.0, 5 : 0.5, 6 : 0.3, 7 : 0.15,
8 : 0.06, 9 : 0.03, 10 : 0.015,
11 : 0.005, 12 : 0.003, 13 : 0.001,
14 : 0.0005, 15 : 0.0003, 16 : 0.0001,
17 : 0.0001, 18 : 0.0001
}.get(config.get("geography.zoom"), 5.0)
}.get(config.get("geography.zoom"), '%3.1f')
shift = {1 : 5.0, 2 : 5.0, 3 : 3.0,
4 : 1.0, 5 : 0.5, 6 : 0.3, 7 : 0.15,
8 : 0.06, 9 : 0.03, 10 : 0.015,
11 : 0.005, 12 : 0.003, 13 : 0.001,
14 : 0.0005, 15 : 0.0003, 16 : 0.0001,
17 : 0.0001, 18 : 0.0001
}.get(config.get("geography.zoom"), 5.0)
latp = precision % lat
lonp = precision % lon
mlatp = precision % float(mark[3])
@ -498,7 +501,7 @@ class GeoGraphyView(OsmGps, NavigationView):
" place='%s'", float(mark[3]), lat, precision, mark[0])
_LOG.debug("compare longitude : %s with %s (precision = %s)"
" zoom=%d", float(mark[4]), lon, precision,
config.get("geography.zoom"))
config.get("geography.zoom"))
if (float(mlatp) >= (float(latp) - shift)) and \
(float(mlatp) <= (float(latp) + shift)):
latok = True
@ -537,6 +540,8 @@ class GeoGraphyView(OsmGps, NavigationView):
"""
Add a new marker
"""
dummy_menu = menu
dummy_event = event
mapservice = config.get('geography.map_service')
if (mapservice in (constants.OPENSTREETMAP,
constants.OPENSTREETMAP_RENDERER)):
@ -622,7 +627,7 @@ class GeoGraphyView(OsmGps, NavigationView):
"""
Create a list of places without coordinates.
"""
if not [gid, place] in self.place_without_coordinates:
if [gid, place] not in self.place_without_coordinates:
self.place_without_coordinates.append([gid, place])
self.without += 1
@ -636,19 +641,19 @@ class GeoGraphyView(OsmGps, NavigationView):
self.remove_all_gps()
self.remove_all_tracks()
if (self.current_map is not None and
self.current_map != config.get("geography.map_service")):
self.current_map != config.get("geography.map_service")):
self.change_map(self.osm, config.get("geography.map_service"))
last = ""
current = ""
differtype = False
#savetype = None
lat = 0.0
lon = 0.0
icon = None
count = 0
colour = None
self.uistate.set_busy_cursor(True)
_LOG.debug("%s", time.strftime("start create_marker : "
"%a %d %b %Y %H:%M:%S", time.gmtime()))
"%a %d %b %Y %H:%M:%S", time.gmtime()))
for mark in self.sort:
current = ([mark[3], mark[4]])
if last == "":
@ -676,10 +681,10 @@ class GeoGraphyView(OsmGps, NavigationView):
differtype = True
if lat != 0.0 and lon != 0.0:
self.add_marker(None, None, lat, lon, icon, differtype,
count, color=mark[12])
count, color=colour)
self._set_center_and_zoom()
_LOG.debug("%s", time.strftime(" stop create_marker : "
"%a %d %b %Y %H:%M:%S", time.gmtime()))
"%a %d %b %Y %H:%M:%S", time.gmtime()))
self.uistate.set_busy_cursor(False)
def _visible_marker(self, lat, lon):
@ -704,27 +709,25 @@ class GeoGraphyView(OsmGps, NavigationView):
We zoom in until at least one marker missing.
"""
if ((self._visible_marker(p1lat, p1lon)
and self._visible_marker(p2lat, p2lon))
and lvl < 18):
and self._visible_marker(p2lat, p2lon)) and lvl < 18):
lvl += 1
self.osm.set_zoom(lvl)
GLib.timeout_add(int(50), self._autozoom_in, lvl,
p1lat, p1lon, p2lat, p2lon)
p1lat, p1lon, p2lat, p2lon)
else:
GLib.timeout_add(int(50), self._autozoom_out, lvl,
p1lat, p1lon, p2lat, p2lon)
p1lat, p1lon, p2lat, p2lon)
def _autozoom_out(self, lvl, p1lat, p1lon, p2lat, p2lon):
"""
We zoom out until all markers visible.
"""
if (not (self._visible_marker(p1lat, p1lon)
and self._visible_marker(p2lat, p2lon))
and lvl > 1):
and self._visible_marker(p2lat, p2lon)) and lvl > 1):
lvl -= 1
self.osm.set_zoom(lvl)
GLib.timeout_add(int(50), self._autozoom_out, lvl,
p1lat, p1lon, p2lat, p2lon)
p1lat, p1lon, p2lat, p2lon)
else:
layer = self.get_selection_layer()
if layer:
@ -751,7 +754,7 @@ class GeoGraphyView(OsmGps, NavigationView):
p2lon = self.end_selection.rlon
# We zoom in until at least one marker missing.
GLib.timeout_add(int(50), self._autozoom_in, level_start,
p1lat, p1lon, p2lat, p2lon)
p1lat, p1lon, p2lat, p2lon)
def _set_center_and_zoom(self):
"""
@ -764,54 +767,16 @@ class GeoGraphyView(OsmGps, NavigationView):
The following is too complex. In some case, all markers are not present.
"""
# Select the center of the map and the zoom
signminlon = _get_sign(self.minlon)
signminlat = _get_sign(self.minlat)
signmaxlon = _get_sign(self.maxlon)
signmaxlat = _get_sign(self.maxlat)
current = osmgpsmap.MapPoint.new_degrees(self.minlat, self.minlon)
self.end_selection = current
current = osmgpsmap.MapPoint.new_degrees(self.maxlat, self.maxlon)
self.begin_selection = current
if signminlon == signmaxlon:
maxlong = abs(abs(self.minlon) - abs(self.maxlon))
else:
maxlong = abs(abs(self.minlon) + abs(self.maxlon))
if signminlat == signmaxlat:
maxlat = abs(abs(self.minlat) - abs(self.maxlat))
else:
maxlat = abs(abs(self.minlat) + abs(self.maxlat))
latit = longt = 0.0
for mark in self.sort:
if signminlat == signmaxlat:
if signminlat == 1:
latit = self.minlat+self.centerlat
else:
latit = self.maxlat-self.centerlat
elif self.maxlat > self.centerlat:
latit = self.maxlat-self.centerlat
else:
latit = self.minlat+self.centerlat
if signminlon == signmaxlon:
if signminlon == 1:
longt = self.minlon+self.centerlon
else:
longt = self.maxlon-self.centerlon
elif self.maxlon > self.centerlon:
longt = self.maxlon-self.centerlon
else:
longt = self.minlon+self.centerlon
# all maps: 0.0 for longitude and latitude means no location.
if latit == longt == 0.0:
latit = longt = 0.00000001
self.latit = latit
self.longt = longt
if config.get("geography.lock"):
self.osm.set_center_and_zoom(config.get("geography.center-lat"),
config.get("geography.center-lon"),
config.get("geography.zoom"))
else:
self._autozoom()
self.save_center(self.latit, self.longt)
config.set("geography.zoom", self.osm.props.zoom)
self.end_selection = None
@ -823,9 +788,8 @@ class GeoGraphyView(OsmGps, NavigationView):
family_list = [
dbstate.db.get_family_from_handle(ref_handle)
for (ref_type, ref_handle) in
dbstate.db.find_backlink_handles(event.handle)
if ref_type == 'Family'
]
dbstate.db.find_backlink_handles(event.handle)
if ref_type == 'Family']
fnam = mnam = _("Unknown")
if family_list:
for family in family_list:
@ -855,7 +819,7 @@ class GeoGraphyView(OsmGps, NavigationView):
object_handle = media_ref.get_reference_handle()
media_obj = self.dbstate.db.get_media_from_handle(object_handle)
path = media_obj.get_path()
name, extension = os.path.splitext(path)
dummy_name, extension = os.path.splitext(path)
if extension == ".kml":
path = media_path_full(self.dbstate.db, path)
if os.path.isfile(path):
@ -870,6 +834,7 @@ class GeoGraphyView(OsmGps, NavigationView):
"""
Print or save the view that is currently shown
"""
dummy_obj = obj
if Gtk.MAJOR_VERSION == 3 and Gtk.MINOR_VERSION < 11:
from gramps.gui.dialog import WarningDialog
WarningDialog(
@ -893,6 +858,8 @@ class GeoGraphyView(OsmGps, NavigationView):
"""
Center the map at the marker position
"""
dummy_lat = lat
dummy_lon = lon
self.set_center(menu, event, float(mark[3]), float(mark[4]))
def add_place_bubble_message(self, event, lat, lon, marks,
@ -900,6 +867,7 @@ class GeoGraphyView(OsmGps, NavigationView):
"""
Create the place menu of a marker
"""
dummy_marks = marks
add_item = Gtk.MenuItem()
add_item.show()
menu.append(add_item)
@ -927,21 +895,27 @@ class GeoGraphyView(OsmGps, NavigationView):
"""
Edit the selected place at the marker position
"""
dummy_menu = menu
dummy_event = event
self.mark = mark
place = self.dbstate.db.get_place_from_gramps_id(self.mark[9])
parent_list = place.get_placeref_list()
if len(parent_list) > 0:
if parent_list:
parent = parent_list[0].ref
else:
parent = None
self.select_fct = PlaceSelection(self.uistate, self.dbstate, self.osm,
self.selection_layer, self.place_list,
lat, lon, self.__edit_place, parent)
self.selection_layer, self.place_list,
lat, lon, self.__edit_place, parent)
def edit_person(self, menu, event, lat, lon, mark):
"""
Edit the selected person at the marker position
"""
dummy_menu = menu
dummy_event = event
dummy_lat = lat
dummy_lon = lon
_LOG.debug("edit_person : %s", mark[8])
# need to add code here to edit the person.
person = self.dbstate.db.get_person_from_gramps_id(mark[8])
@ -954,6 +928,10 @@ class GeoGraphyView(OsmGps, NavigationView):
"""
Edit the selected family at the marker position
"""
dummy_menu = menu
dummy_event = event
dummy_lat = lat
dummy_lon = lon
_LOG.debug("edit_family : %s", mark[11])
family = self.dbstate.db.get_family_from_gramps_id(mark[11])
try:
@ -965,6 +943,9 @@ class GeoGraphyView(OsmGps, NavigationView):
"""
Edit the selected event at the marker position
"""
dummy_menu = menu
dummy_lat = lat
dummy_lon = lon
_LOG.debug("edit_event : %s", mark[10])
event = self.dbstate.db.get_event_from_gramps_id(mark[10])
try:
@ -977,9 +958,11 @@ class GeoGraphyView(OsmGps, NavigationView):
Add a new place using longitude and latitude of location centered
on the map
"""
dummy_menu = menu
dummy_event = event
self.select_fct = PlaceSelection(self.uistate, self.dbstate, self.osm,
self.selection_layer, self.place_list,
lat, lon, self.__add_place)
self.selection_layer, self.place_list,
lat, lon, self.__add_place)
def add_place_from_kml(self, menu, event, lat, lon):
"""
@ -990,6 +973,10 @@ class GeoGraphyView(OsmGps, NavigationView):
3 - create the place(s) with name and title found in the kml marker.
"""
dummy_menu = menu
dummy_event = event
dummy_lat = lat
dummy_lon = lon
# Ask for the kml file
filtering = Gtk.FileFilter()
filtering.add_pattern("*.kml")
@ -1046,13 +1033,13 @@ class GeoGraphyView(OsmGps, NavigationView):
If we have a place history, we must show all places to avoid an empty
place selection in the PlaceSelection.
"""
if self.uistate.get_active('Place'):
self._createmap(None)
dummy_menu = menu
dummy_event = event
selector = SelectPlace(self.dbstate, self.uistate, [])
place = selector.run()
if place:
parent_list = place.get_placeref_list()
if len(parent_list) > 0:
if parent_list:
parent = parent_list[0].ref
else:
parent = None
@ -1072,20 +1059,19 @@ class GeoGraphyView(OsmGps, NavigationView):
gids = gids + ", " + plce.gramps_id
if nb_places > 1:
from gramps.gui.dialog import WarningDialog
ptitle = place_title
WarningDialog(
_('You have at least two places with the same title.'),
_("The title of the places is:\n%(title)s\n"
"The following places are similar: %(gid)s\n"
"You should eiher rename the places or merge them.\n\n"
"%(bold_start)s"
"I can't proceed with your request"
"%(bold_end)s.\n") % {
'bold_start' : '<b>',
'bold_end' : '</b>',
'title': '<b>' + place_title + '</b>',
'gid': gids},
parent=self.uistate.window
)
_('You have at least two places with the same title.'),
_("The title of the places is:\n%(title)s\n"
"The following places are similar: %(gid)s\n"
"You should eiher rename the places or merge them.\n\n"
"%(bold_start)s"
"I can't proceed with your request"
"%(bold_end)s.\n") % {'bold_start' : '<b>',
'bold_end' : '</b>',
'title': '<b>' + ptitle + '</b>',
'gid': gids},
parent=self.uistate.window)
else:
self.mark = [None, None, None, None, None, None, None,
None, None, place.gramps_id, None, None]
@ -1150,6 +1136,7 @@ class GeoGraphyView(OsmGps, NavigationView):
"""
Edit the selected place at the marker position
"""
dummy_parent = parent
self.select_fct.close()
place = self.dbstate.db.get_place_from_gramps_id(self.mark[9])
place.set_latitude(str(plat))
@ -1195,6 +1182,10 @@ class GeoGraphyView(OsmGps, NavigationView):
"""
Do we need to lock the zoom and position ?
"""
dummy_client = client
dummy_cnxn_id = cnxn_id
dummy_entry = entry
dummy_data = data
if config.get("geography.lock"):
config.set("geography.lock", False)
self._set_center_and_zoom()
@ -1206,6 +1197,10 @@ class GeoGraphyView(OsmGps, NavigationView):
"""
We asked to change the crosshair.
"""
dummy_client = client
dummy_cnxn_id = cnxn_id
dummy_entry = entry
dummy_data = data
if config.get("geography.show_cross"):
config.set("geography.show_cross", False)
else:
@ -1240,35 +1235,37 @@ class GeoGraphyView(OsmGps, NavigationView):
grid.set_row_spacing(6)
self.path_entry = Gtk.Entry()
configdialog.add_path_box(grid,
_('Where to save the tiles for offline mode.'),
0, self.path_entry, config.get('geography.path'),
self.set_tilepath, self.select_tilepath)
_('Where to save the tiles for offline'
' mode.'),
0, self.path_entry,
config.get('geography.path'),
self.set_tilepath, self.select_tilepath)
configdialog.add_text(grid,
_('If you have no more space in your file system. '
'You can remove all tiles placed in the above path.\n'
'Be careful! If you have no internet, you\'ll get no map.'),
2, line_wrap=False)
configdialog.add_slider(grid,
_('Zoom used when centering'),
3, 'geography.zoom_when_center',
(2, 16))
configdialog.add_slider(grid,
_('The maximum number of places to show'),
4, 'geography.max_places',
(1000, 10000))
_('If you have no more space in your file system.'
' You can remove all tiles placed in the above'
' path.\nBe careful! If you have no internet,'
' you\'ll get no map.'),
2, line_wrap=False)
configdialog.add_slider(grid, _('Zoom used when centering'),
3, 'geography.zoom_when_center',
(2, 16))
configdialog.add_slider(grid, _('The maximum number of places to show'),
4, 'geography.max_places',
(1000, 10000))
configdialog.add_checkbox(grid,
_('Use keypad for shortcuts :\n'
'Either we choose the + and - from the keypad if we '
'select this,\n'
'or we use the characters from the keyboard.'),
5, 'geography.use-keypad',
extra_callback=self.update_shortcuts)
_('Use keypad for shortcuts :\nEither we '
'choose the + and - from the keypad if we '
'select this,\nor we use the characters '
'from the keyboard.'),
5, 'geography.use-keypad',
extra_callback=self.update_shortcuts)
return _('The map'), grid
def set_tilepath(self, *obj):
"""
Save the tile path in the config section.
"""
dummy_obj = obj
if self.path_entry.get_text().strip():
config.set('geography.path', self.path_entry.get_text())
else:
@ -1278,6 +1275,7 @@ class GeoGraphyView(OsmGps, NavigationView):
"""
Call a file chooser selection box to select the tile path.
"""
dummy_obj = obj
selected_dir = Gtk.FileChooserDialog(
_("Select tile cache directory for offline mode"),
action=Gtk.FileChooserAction.SELECT_FOLDER,

View File

@ -48,6 +48,7 @@ from gi.repository import Pango, PangoCairo
# Gramps Modules
#
#-------------------------------------------------------------------------
from gramps.gen.constfunc import is_quartz
#-------------------------------------------------------------------------
#
@ -131,6 +132,8 @@ class MessageLayer(GObject.GObject, osmgpsmap.MapLayer):
ctx.save()
ctx.move_to(100, 5)
layout = PangoCairo.create_layout(ctx)
if is_quartz():
PangoCairo.context_set_resolution(layout.get_context(), 72)
layout.set_font_description(descr)
layout.set_indent(Pango.SCALE * 0)
layout.set_alignment(Pango.Alignment.LEFT)

View File

@ -181,7 +181,7 @@ class DbTestClassBase(object):
('family-delete', ['0000000600000006']),
('person-update', ['0000000100000001', '0000000200000002',
'0000000100000001', '0000000200000002']),
('family-update', ['0000000500000005'])]
('family-update', ['0000000500000005', '0000000500000005'])]
self.assertEqual(sigs, self.sigs, msg="merge families")
fam_cnt = self.db.get_number_of_families()
pers_cnt = self.db.get_number_of_people()
@ -222,7 +222,7 @@ class DbTestClassBase(object):
('person-update', ['0000000200000002', '0000000100000001',
'0000000200000002', '0000000100000001']),
('family-update', ['0000000500000005', '0000000600000006',
'0000000600000006'])]
'0000000600000006', '0000000500000005'])]
self.assertEqual(sigs, self.sigs, msg="undo merge signals check")
fam_cnt = self.db.get_number_of_families()
pers_cnt = self.db.get_number_of_people()
@ -303,7 +303,7 @@ class DbTestClassBase(object):
('family-delete', ['0000000600000006']),
('person-update', ['0000000100000001', '0000000200000002',
'0000000100000001', '0000000200000002']),
('family-update', ['0000000500000005'])]
('family-update', ['0000000500000005', '0000000500000005'])]
self.assertEqual(sigs, self.sigs, msg="merge families")
fam_cnt = self.db.get_number_of_families()
pers_cnt = self.db.get_number_of_people()

View File

@ -193,6 +193,7 @@ class DuplicatePeopleTool(tool.Tool, ManagedWindow):
index = 0
males = {}
females = {}
self.map = {}
length = self.db.get_number_of_people()

View File

@ -79,6 +79,7 @@ class SortEvents(PluginWindows.ToolManagedWindowBatch):
"""
The name of the initial menu tab.
"""
self.setup_configs('interface.sortevents', 500, 350)
return _("Options")
def run(self):

View File

@ -259,6 +259,8 @@ class PersonBoxWidgetCairo(_PersonWidgetBase):
alh = self.get_allocated_height()
if not self.textlayout:
self.textlayout = PangoCairo.create_layout(context)
if is_quartz():
PangoCairo.context_set_resolution(self.textlayout.get_context(), 72)
# The following seems like it Should work, but it doesn't
# font_desc = self.get_style_context().get_property(
# "font", Gtk.StateFlags.NORMAL)

View File

@ -156,6 +156,8 @@ class RelationshipView(NavigationView):
self.use_shade = self._config.get('preferences.relation-shade')
self.theme = self._config.get('preferences.relation-display-theme')
self.toolbar_visible = config.get('interface.toolbar-on')
self.age_precision = config.get('preferences.age-display-precision')
def get_handle_from_gramps_id(self, gid):
"""
@ -720,29 +722,30 @@ class RelationshipView(NavigationView):
if death:
death_date = death.get_date_object()
if (death_date and death_date.get_valid()):
age = death_date - birth_date
subgrid.attach(widgets.BasicLabel(_("%s:") % death_title),
1, 2, 1, 1)
deathwidget = widgets.BasicLabel("%s (%s)" %
(self.format_event(death), age),
Pango.EllipsizeMode.END)
age = (death_date - birth_date).format(
precision=self.age_precision)
subgrid.attach(widgets.BasicLabel(
_("%s:") % death_title), 1, 2, 1, 1)
deathwidget = widgets.BasicLabel(
"%s (%s)" % (self.format_event(death), age),
Pango.EllipsizeMode.END)
deathwidget.set_selectable(True)
subgrid.attach(deathwidget,
2, 2, 1, 1)
subgrid.attach(deathwidget, 2, 2, 1, 1)
showed_death = True
if not showed_death:
age = Today() - birth_date
age = (Today() - birth_date).format(
precision=self.age_precision)
if probably_alive(person, self.dbstate.db):
subgrid.attach(widgets.BasicLabel(_("%s:") % _("Alive")),
1, 2, 1, 1)
subgrid.attach(widgets.BasicLabel("(%s)" % age, Pango.EllipsizeMode.END),
2, 2, 1, 1)
subgrid.attach(widgets.BasicLabel(
_("%s:") % _("Alive")), 1, 2, 1, 1)
subgrid.attach(widgets.BasicLabel(
"(%s)" % age, Pango.EllipsizeMode.END), 2, 2, 1, 1)
else:
subgrid.attach(widgets.BasicLabel(_("%s:") % _("Death")),
1, 2, 1, 1)
subgrid.attach(widgets.BasicLabel("%s (%s)" % (_("unknown"), age),
Pango.EllipsizeMode.END),
2, 2, 1, 1)
subgrid.attach(widgets.BasicLabel(
_("%s:") % _("Death")), 1, 2, 1, 1)
subgrid.attach(widgets.BasicLabel(
"%s (%s)" % (_("unknown"), age),
Pango.EllipsizeMode.END), 2, 2, 1, 1)
showed_death = True
if not showed_death:

View File

@ -26,10 +26,6 @@ environ['PANGO_SYSCONFDIR'] = bundle_etc
environ['PANGO_LIBDIR'] = bundle_lib
environ['GDK_PIXBUF_MODULE_FILE'] = join(bundle_lib, 'gdk-pixbuf-2.0',
'2.10.0', 'loaders.cache')
if int(release().split('.')[0]) > 10:
environ['GTK_IM_MODULE_FILE'] = join(bundle_etc, 'gtk-3.0',
'gtk.immodules')
environ['GI_TYPELIB_PATH'] = join(bundle_lib, 'girepository-1.0')
environ['GVBINDIR'] = join(bundle_lib, 'graphviz')
environ['ENCHANT_MODULE_PATH'] = join(bundle_lib, 'enchant')

View File

@ -2,7 +2,7 @@
# This file is distributed under the same license as the Gramps package.
# Radek Malcic <malcic@atlas.cz>, 2004
# Jiří Pejchal <jiri.pejchal@gmail.com>, 2005
# Zdeněk Hataš <zdenek.hatas@gmail.com>, 2006 - 2018
# Zdeněk Hataš <zdenek.hatas@gmail.com>, 2006 - 2019
#
# Common terms and translations:
# ancestor předek
@ -37,8 +37,8 @@ msgid ""
msgstr ""
"Project-Id-Version: gramps 3.3.x\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-07-24 14:13+0100\n"
"PO-Revision-Date: 2018-12-22 16:24+0100\n"
"POT-Creation-Date: 2018-12-26 11:20-0600\n"
"PO-Revision-Date: 2019-01-11 18:01+0100\n"
"Last-Translator: Zdeněk Hataš <zdenek.hatas@gmail.com>\n"
"Language-Team: Czech <Czech <gnome-cs-list@gnome.org>>\n"
"Language: cs\n"
@ -899,6 +899,15 @@ msgstr ""
"uložit jako webové stránky. Celou databázi, vybrané rodiny nebo jedince lze "
"exportovat do kolekce stránek připravených k publikaci na webu."
#: ../data/tips.xml.in.h:46
msgid ""
"<b>Reporting Bugs in Gramps</b><br/>The best way to report a bug in Gramps "
"is to use the Gramps bug tracking system at https://gramps-project.org/bugs/"
msgstr ""
"<b>Hlášení chyb v Gramps</b><br/>Nejlepší způsob, jak nahlásit chybu v "
"Gramps, je použít systém sledování chyb na stránce https://gramps-project."
"org/bugs/"
#: ../data/tips.xml.in.h:46
msgid ""
"<b>Reporting Bugs in Gramps</b><br/>The best way to report a bug in Gramps "
@ -3803,6 +3812,15 @@ msgstr "Různé filtry"
msgid "No description"
msgstr "Bez popisu"
#. more references to a filter than expected
#: ../gramps/gen/filters/rules/_rule.py:94
msgid "The filter definition contains a loop."
msgstr ""
#: ../gramps/gen/filters/rules/_rule.py:95
msgid "One rule references another which eventually references the first."
msgstr ""
#: ../gramps/gen/filters/rules/citation/_allcitations.py:45
msgid "Every citation"
msgstr "Všechny citace"
@ -18127,6 +18145,10 @@ msgstr "Zkopírovat vše"
msgid "See data not in Filter"
msgstr "Zobrazit data mimo filtr"
#: ../gramps/gui/plug/report/_bookdialog.py:92
msgid "Generate_Book_dialog"
msgstr "Generate_Book_dialog"
#: ../gramps/gui/plug/report/_bookdialog.py:166
msgid "Available Books"
msgstr "Dostupné knihy"
@ -18450,6 +18472,10 @@ msgstr "výchozí"
msgid "Document Styles"
msgstr "Styly dokumentu"
#: ../gramps/gui/plug/report/_styleeditor.py:108
msgid "manual|Document_Styles_dialog"
msgstr "Document_Styles_dialog"
#: ../gramps/gui/plug/report/_styleeditor.py:140
msgid "New Style"
msgstr "Nový styl"
@ -18476,6 +18502,10 @@ msgstr "Vyberte styl"
msgid "Style editor"
msgstr "Editor stylů"
#: ../gramps/gui/plug/report/_styleeditor.py:241
msgid "manual|Style_editor_dialog"
msgstr "Style_editor_dialog"
#: ../gramps/gui/plug/report/_styleeditor.py:341
#: ../gramps/gui/plug/report/_styleeditor.py:369
#: ../gramps/gui/plug/report/_styleeditor.py:387
@ -18597,6 +18627,10 @@ msgstr "Vybrat mediální objekt"
msgid "manual|Select_Child_selector"
msgstr "Select_Child_selector"
#: ../gramps/gui/selectors/selectperson.py:70
msgid "manual|Select_Person_selector"
msgstr "Select_Person_selector"
#: ../gramps/gui/selectors/selectperson.py:56
msgid "manual|Select_Father_selector"
msgstr "Select_Father_selector"
@ -18621,10 +18655,18 @@ msgstr "Repositories"
msgid "Select Repository"
msgstr "Vybrat archiv"
#: ../gramps/gui/selectors/selectrepository.py:75
msgid "manual|Select_Repository_selector"
msgstr "Select_Repository_selector"
#: ../gramps/gui/selectors/selectsource.py:62
msgid "Select Source"
msgstr "Vybrat pramen"
#: ../gramps/gui/selectors/selectsource.py:76
msgid "manual|Select_Source_selector"
msgstr "Select_Source_selector"
#: ../gramps/gui/spell.py:92
msgid "Off"
msgstr "Vyp"
@ -19600,6 +19642,10 @@ msgstr ""
msgid "Progress Information"
msgstr "Informace o průběhu"
#: ../gramps/gui/widgets/reorderfam.py:63
msgid "manual|Reorder_Relationships_dialog"
msgstr "Reorder_Relationships_dialog"
#: ../gramps/gui/widgets/reorderfam.py:79
msgid "Reorder Relationships"
msgstr "Přeskupit vazby"
@ -21789,6 +21835,10 @@ msgstr "EMAIL"
msgid "WWW"
msgstr "WWW"
#: ../gramps/plugins/export/exportgedcom.py:1438
msgid "Writing media"
msgstr "Zapisují se média"
#: ../gramps/plugins/export/exportgedcom.py:1570
msgid "GEDCOM Export failed"
msgstr "Export GEDCOM selhal"
@ -23416,6 +23466,10 @@ msgstr "Upravit vybranou poznámku k úkolu"
msgid "Add a new To Do note"
msgstr "Přidat novou poznámku k úkolu"
#: ../gramps/plugins/gramplet/todo.py:201
msgid "First select the object to which you want to attach a note"
msgstr ""
#: ../gramps/plugins/gramplet/todogramplet.py:149
msgid "Unattached"
msgstr "Nepřipojen"
@ -32649,6 +32703,10 @@ msgstr "Správce médií..."
msgid "Media Manager"
msgstr "Správce médií"
#: ../gramps/plugins/tool/mediamanager.py:91
msgid "Help"
msgstr "Nápověda"
#: ../gramps/plugins/tool/mediamanager.py:97
#: ../gramps/plugins/webreport/basepage.py:1483
#: ../gramps/plugins/webreport/basepage.py:1606
@ -40080,3 +40138,4 @@ msgstr "Správce médií"
#~ msgid "Password:"
#~ msgstr "Heslo:"

View File

@ -37389,3 +37389,4 @@ msgstr "Mediehåndtering"
#~ msgid "Applying Person Filter..."
#~ msgstr "Anvender Personfilter..."

338
po/de.po

File diff suppressed because it is too large Load Diff

View File

@ -9,8 +9,8 @@ msgid ""
msgstr ""
"Project-Id-Version: Gramps_5_fi\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-11-29 06:08+0200\n"
"PO-Revision-Date: 2018-11-29 06:48+0200\n"
"POT-Creation-Date: 2019-01-02 11:13+0200\n"
"PO-Revision-Date: 2019-01-05 07:31+0200\n"
"Last-Translator: Matti Niemelä <niememat@gmail.com>\n"
"Language-Team: suomi <niememat@gmail.com>\n"
"Language: fi\n"
@ -19292,6 +19292,11 @@ msgstr "Kopioi kaikki"
msgid "See data not in Filter"
msgstr "Valitse tiedot joihin suodin on kohdistunut"
# 20181220 OK
#: ../gramps/gui/plug/report/_bookdialog.py:92
msgid "Generate_Book_dialog"
msgstr "Tuota_kirja"
#: ../gramps/gui/plug/report/_bookdialog.py:166
msgid "Available Books"
msgstr "Valmiit kirjamallit"
@ -19630,6 +19635,11 @@ msgstr "oletus"
msgid "Document Styles"
msgstr "Asiakirjatyylit"
# 20181220 ok
#: ../gramps/gui/plug/report/_styleeditor.py:108
msgid "manual|Document_Styles_dialog"
msgstr "Asiakirjatyylit"
#: ../gramps/gui/plug/report/_styleeditor.py:140
msgid "New Style"
msgstr "Uusi tyyli"
@ -19653,10 +19663,16 @@ msgstr "Puuttuvat tiedot"
msgid "Select a style"
msgstr "Valitse tyyli"
#: ../gramps/gui/plug/report/_styleeditor.py:226
#: ../gramps/gui/plug/report/_styleeditor.py:298
# 20181220
#: ../gramps/gui/plug/report/_styleeditor.py:233
#: ../gramps/gui/plug/report/_styleeditor.py:308
msgid "Style editor"
msgstr "Tyyli muokkain"
msgstr "Tyylimuokkain"
# 20181220 ok
#: ../gramps/gui/plug/report/_styleeditor.py:241
msgid "manual|Style_editor_dialog"
msgstr "Tyylimuokkain"
#: ../gramps/gui/plug/report/_styleeditor.py:341
#: ../gramps/gui/plug/report/_styleeditor.py:369
@ -19807,6 +19823,11 @@ msgstr "Valitse mediatiedosto"
msgid "manual|Select_Child_selector"
msgstr "Valitse_lapsi_ikkuna"
# 20190104
#: ../gramps/gui/selectors/selectperson.py:70
msgid "manual|Select_Person_selector"
msgstr "Valitse_henkil.C3.B6"
# WIKI_HELP_SEC osa1
#: ../gramps/gui/selectors/selectperson.py:56
#: ../gramps/gui/selectors/selectperson.py:64
@ -19841,6 +19862,11 @@ msgstr "Arkistot"
msgid "Select Repository"
msgstr "Valitse arkisto"
# 20190104
#: ../gramps/gui/selectors/selectrepository.py:75
msgid "manual|Select_Repository_selector"
msgstr "Valitse_arkisto"
#: ../gramps/gui/selectors/selectsource.py:62
#: ../gramps/gui/selectors/selectsource.py:59
msgid "Select Source"
@ -20867,6 +20893,11 @@ msgstr ""
msgid "Progress Information"
msgstr "Edistymistietoja"
# 20181220
#: ../gramps/gui/widgets/reorderfam.py:63
msgid "manual|Reorder_Relationships_dialog"
msgstr "Järjestä_suhteet_uudelleen"
#: ../gramps/gui/widgets/reorderfam.py:79
msgid "Reorder Relationships"
msgstr "Järjestä uudelleen suhteet"
@ -34633,6 +34664,11 @@ msgstr "Median_hallinta..."
msgid "Media Manager"
msgstr "Medianhallinta"
# 20181220
#: ../gramps/plugins/tool/mediamanager.py:91
msgid "Help"
msgstr "_Ohjeet"
#: ../gramps/plugins/tool/mediamanager.py:97
#: ../gramps/plugins/webreport/basepage.py:1483
#: ../gramps/plugins/webreport/basepage.py:1606
@ -39842,3 +39878,4 @@ msgstr ""
#~ msgid " "
#~ msgstr " "

430
po/fr.po

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

1032
po/hr.po

File diff suppressed because it is too large Load Diff

View File

@ -1,6 +1,6 @@
# Italian translation for GRAMPS
# This file is distributed under the same license as the Gramps package.
# Copyright (C) 2001-2013 the Gramps Project
# Copyright (C) 2001-2019 the Gramps Project
#
# Common and noteworthy translations:
#
@ -57,13 +57,13 @@
#
# Marco Molteni <molter@gufi.org>, 2001-2002;.
# Lorenzo Cappelletti <lorenzo.cappelletti@email.it>, 2003.
# Luigi Toscano <luigi.toscano@tiscali.it>, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018.
# Luigi Toscano <luigi.toscano@tiscali.it>, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019.
msgid ""
msgstr ""
"Project-Id-Version: gramps\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-05-20 09:31-0500\n"
"PO-Revision-Date: 2018-07-15 16:38+0100\n"
"POT-Creation-Date: 2018-12-26 11:20-0600\n"
"PO-Revision-Date: 2019-02-10 16:07+0100\n"
"Last-Translator: Luigi Toscano <luigi.toscano@tiscali.it>\n"
"Language-Team: Italian <tp@lists.linux.it>\n"
"Language: it\n"
@ -3734,6 +3734,16 @@ msgstr "Altri filtri"
msgid "No description"
msgstr "Nessuna descrizione"
#. more references to a filter than expected
#: ../gramps/gen/filters/rules/_rule.py:94
#, fuzzy
msgid "The filter definition contains a loop."
msgstr "Definizione del formato non corretta"
#: ../gramps/gen/filters/rules/_rule.py:95
msgid "One rule references another which eventually references the first."
msgstr ""
#: ../gramps/gen/filters/rules/citation/_allcitations.py:45
msgid "Every citation"
msgstr "Ogni citazione"
@ -9599,7 +9609,7 @@ msgstr "Sopra"
#: ../gramps/gen/plug/docgen/treedoc.py:69
msgid "Below"
msgstr "Sotto:"
msgstr "Sotto"
#: ../gramps/gen/plug/docgen/treedoc.py:70
msgid "Not shown"
@ -9755,7 +9765,7 @@ msgstr "Stile dei bordi"
#: ../gramps/gen/plug/docgen/treedoc.py:187
msgid "Style of the edges between nodes."
msgstr "Stile dei bordi tra i noi"
msgstr "Stile dei bordi tra i nodi."
#: ../gramps/gen/plug/docgen/treedoc.py:190
msgid "Level distance"
@ -18123,6 +18133,11 @@ msgstr "Copia tutto"
msgid "See data not in Filter"
msgstr "Visualizzare dati non nel filtro"
#: ../gramps/gui/plug/report/_bookdialog.py:92
#, fuzzy
msgid "Generate_Book_dialog"
msgstr "Genera libro"
#: ../gramps/gui/plug/report/_bookdialog.py:166
msgid "Available Books"
msgstr "Libri disponibili"
@ -18449,6 +18464,11 @@ msgstr "predefinito"
msgid "Document Styles"
msgstr "Stili documenti"
#: ../gramps/gui/plug/report/_styleeditor.py:108
#, fuzzy
msgid "manual|Document_Styles_dialog"
msgstr "Finestra_nuova_fonti"
#: ../gramps/gui/plug/report/_styleeditor.py:140
msgid "New Style"
msgstr "Nuovo stile"
@ -18475,6 +18495,11 @@ msgstr "Seleziona uno stile"
msgid "Style editor"
msgstr "Editor stili"
#: ../gramps/gui/plug/report/_styleeditor.py:241
#, fuzzy
msgid "manual|Style_editor_dialog"
msgstr "Editor nomi di luoghi"
#: ../gramps/gui/plug/report/_styleeditor.py:341
#: ../gramps/gui/plug/report/_styleeditor.py:369
#: ../gramps/gui/plug/report/_styleeditor.py:387
@ -18605,6 +18630,11 @@ msgstr "Seleziona oggetto multimediale"
msgid "manual|Select_Child_selector"
msgstr ""
#: ../gramps/gui/selectors/selectperson.py:70
#, fuzzy
msgid "manual|Select_Person_selector"
msgstr "Fusione_luoghi"
#: ../gramps/gui/selectors/selectperson.py:56
msgid "manual|Select_Father_selector"
msgstr ""
@ -18631,10 +18661,20 @@ msgstr "Depositi"
msgid "Select Repository"
msgstr "Seleziona deposito"
#: ../gramps/gui/selectors/selectrepository.py:75
#, fuzzy
msgid "manual|Select_Repository_selector"
msgstr "Fusione_note"
#: ../gramps/gui/selectors/selectsource.py:62
msgid "Select Source"
msgstr "Seleziona fonte"
#: ../gramps/gui/selectors/selectsource.py:76
#, fuzzy
msgid "manual|Select_Source_selector"
msgstr "Fusione_note"
#: ../gramps/gui/spell.py:92
msgid "Off"
msgstr "Disattivato"
@ -19605,6 +19645,11 @@ msgstr ""
msgid "Progress Information"
msgstr "Informazioni di avanzamento"
#: ../gramps/gui/widgets/reorderfam.py:63
#, fuzzy
msgid "manual|Reorder_Relationships_dialog"
msgstr "Riordina relazioni"
#: ../gramps/gui/widgets/reorderfam.py:79
msgid "Reorder Relationships"
msgstr "Riordina relazioni"
@ -21715,6 +21760,11 @@ msgstr "EMAIL"
msgid "WWW"
msgstr "WWW"
#: ../gramps/plugins/export/exportgedcom.py:1438
#, fuzzy
msgid "Writing media"
msgstr "Scrittura dati note"
#: ../gramps/plugins/export/exportgedcom.py:1570
msgid "GEDCOM Export failed"
msgstr "Esportazione GEDCOM non riuscita"
@ -23374,6 +23424,11 @@ msgstr "Modifica la nota selezionata"
msgid "Add a new To Do note"
msgstr "Aggiunge una nuova nota"
#: ../gramps/plugins/gramplet/todo.py:201
#, fuzzy
msgid "First select the object to which you want to attach a note"
msgstr "Selezionare il luogo per il quale mostrare il fumetto informativo."
#: ../gramps/plugins/gramplet/todogramplet.py:149
msgid "Unattached"
msgstr "Non allegato"
@ -23389,6 +23444,9 @@ msgid ""
"powerful features.\n"
"\n"
msgstr ""
"Gramps è un software progettato per la ricerca genealogica. Seppure simile "
"ad altri programmi genealogici, Gramps offre alcune funzioni uniche e "
"potenti.\n"
#: ../gramps/plugins/gramplet/welcomegramplet.py:105
msgid "Links"
@ -23427,6 +23485,11 @@ msgid ""
"powerful, yet easy to use.\n"
"\n"
msgstr ""
"Gramps è stato creato da genealogisti per genealogisti, organizzati nel "
"progetto Gramps. Gramps è un software Open Source; questo vuol dire che "
"siete liberi di copiarlo e distribuirlo a chiunque desideriate. È sviluppato "
"e mantenuto da una squadra di volontari di tutto il mondo che ha per "
"obiettivo quello di rendere Gramps potente, ma comunque semplice da usare.\n"
#: ../gramps/plugins/gramplet/welcomegramplet.py:124
msgid "Getting Started"
@ -23440,6 +23503,11 @@ msgid ""
"For more details, please read the information at the links above\n"
"\n"
msgstr ""
"La prima cosa da fare è creare un nuovo albero genealogico. Per creare un "
"nuovo albero genealogico (talvolta chiamato database) selezionare «Alberi "
"genealogici» dal menu, scegliere «Gestisci alberi genealogici», premere "
"«Nuovo» e dare un nome al database. Per maggiori informazioni consultare le "
"informazioni raggiungibili dai collegamenti segnalati precedentemente\n"
#: ../gramps/plugins/gramplet/welcomegramplet.py:130
msgid "Dashboard View"
@ -23456,6 +23524,17 @@ msgid ""
"can also drag the Properties button to reposition the gramplet on this page, "
"and detach the gramplet to float above Gramps."
msgstr ""
"Questa è la vista del «cruscotto», dove è possibile aggiungere ulteriori "
"gramplet. È possibile aggiungere ulteriori gramplet ad ogni vista "
"aggiungendo una barra laterale o una barra in basso, tramite un clic del "
"pulsante destro alla destra della scheda.\n"
"\n"
"Si possono aggiungere ulteriori colone con un clic sull'icona di "
"configurazione nella barra degli strumenti, mentre un clic destro sullo "
"sfondo permette di aggiungere ulteriori gramplet. È anche possibile "
"trascinare il pulsante delle proprietà di una gramplet per cambiarne la "
"posizione nella pagina, e staccare la gramplet in una finestra separata da "
"quella di Gramps."
#. Minimum number of lines we want to see. Further lines with the same
#. distance to the main person will be added on top of this.
@ -33712,7 +33791,7 @@ msgstr "Ricostruisce le mappe dei riferimenti"
#: ../gramps/plugins/tool/tools.gpr.py:309
msgid "Rebuild Gender Statistics"
msgstr "Ricostrusci statistiche sui sessi"
msgstr "Ricostruisci statistiche sui sessi"
#: ../gramps/plugins/tool/tools.gpr.py:310
msgid "Rebuilds gender statistics for name gender guessing..."
@ -36305,7 +36384,7 @@ msgstr ""
#: ../gramps/plugins/webreport/narrativeweb.py:2016
#, fuzzy
msgid "Do we include the web calendar ?"
msgstr "Il titolo del calendario"
msgstr ""
#: ../gramps/plugins/webreport/narrativeweb.py:2026
msgid "Where do you place your web site ? default = /WEBCAL"
@ -43887,3 +43966,4 @@ msgstr "Gestore_oggetti_multimediali"
#~ "Per le segnalazioni di bug si deve usare https://gramps-project.org/bugs/ "
#~ "per le viste ufficiali, altrimenti bisogna contattare l'autore della "
#~ "vista (%(firstauthoremail)s). "

236
po/ru.po
View File

@ -10,14 +10,14 @@
# Andrey Baznikin (http://d.scn.ru/), 2009-2011.
# Vassilii Khachaturov <vassilii@tarunz.org>, 2011-2014.
# Egor Reentov <egor.gramps@gmail.com>, 2011-2013.
# Ivan Komaritsyn <vantu5z@mail.ru>, 2015-2018.
# Ivan Komaritsyn <vantu5z@mail.ru>, 2015-2019.
#
msgid ""
msgstr ""
"Project-Id-Version: gramps50\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-12-04 14:34+0300\n"
"PO-Revision-Date: 2018-12-04 15:57+0300\n"
"POT-Creation-Date: 2019-02-23 11:42-0300\n"
"PO-Revision-Date: 2019-03-12 14:36-0300\n"
"Last-Translator: Ivan Komaritsyn <vantu5z@mail.ru>\n"
"Language-Team: Russian\n"
"Language: ru\n"
@ -1215,7 +1215,7 @@ msgstr "Используется строка параметров: %s"
#: ../gramps/cli/arghandler.py:466
#, python-format
msgid "Exporting: file %(filename)s, format %(format)s."
msgstr "Экспортируются: файл %(filename)s, формат %(format)s."
msgstr "Экспорт: файл %(filename)s, формат %(format)s."
#: ../gramps/cli/arghandler.py:477
msgid "Cleaning up."
@ -1503,7 +1503,7 @@ msgstr ""
"gramps\n"
"\n"
"Внимание: Эти примеры указаны для оболочки bash.\n"
"Точный синтаксис командной строки может отличаться для прочих оболочек и под "
"Точный синтаксис командной строки может отличаться для других оболочек и под "
"Windows.\n"
#: ../gramps/cli/argparser.py:248 ../gramps/cli/argparser.py:421
@ -1517,8 +1517,8 @@ msgid ""
"Type gramps --help for an overview of commands, or read the manual pages."
msgstr ""
"Ошибка при разборе аргументов: %s \n"
"Наберите gramps --help чтобы увидеть аргументы командной строки или "
"прочитайте страницы руководства."
"Наберите gramps --help чтобы увидеть доступные аргументы командной строки "
"или прочитайте страницы руководства."
#: ../gramps/cli/argparser.py:268
#, python-format
@ -1658,7 +1658,7 @@ msgstr "%(str1)s: %(str2)s"
#: ../gramps/cli/clidbman.py:274
#, python-format
msgid "Starting Import, %s"
msgstr "Импортирование %s"
msgstr "Начало импорта %s"
#: ../gramps/cli/clidbman.py:280
msgid "Import finished..."
@ -3864,7 +3864,7 @@ msgstr "Название фильтра:"
#: ../gramps/gen/filters/rules/_matchesfilterbase.py:70
#, python-format
msgid "Can't find filter %s in the defined custom filters"
msgstr "Не удалось найти фильтр «%s» среди заданных фильтров пользователя"
msgstr "Не удалось найти фильтр «%s» среди фильтров пользователя"
#: ../gramps/gen/filters/rules/_matchessourcefilterbase.py:47
#: ../gramps/gen/filters/rules/citation/_matchessourcefilter.py:48
@ -8942,7 +8942,7 @@ msgstr "Хранилище"
#: ../gramps/gen/lib/reporef.py:96 ../gramps/gui/clipboard.py:505
msgid "Repository ref"
msgstr "ссылка на хранилище"
msgstr "Ссылка на хранилище"
#: ../gramps/gen/lib/reporef.py:107
#: ../gramps/gui/editors/displaytabs/repoembedlist.py:68
@ -9215,7 +9215,7 @@ msgstr "Эл. почта"
#: ../gramps/gen/lib/urltype.py:50
msgid "Web Home"
msgstr "Домашняя страница в WWW"
msgstr "Домашняя страница в сети"
#: ../gramps/gen/lib/urltype.py:51
msgid "Web Search"
@ -9235,11 +9235,11 @@ msgstr "Ведётся поиск..."
#: ../gramps/gen/merge/mergecitationquery.py:61
msgid "Merge Citation"
msgstr "Объединение цитаты"
msgstr "Объединение цитат"
#: ../gramps/gen/merge/mergeeventquery.py:59
msgid "Merge Event Objects"
msgstr "События объединены"
msgstr "Объединение событий"
#: ../gramps/gen/merge/mergefamilyquery.py:90
msgid "A parent should be a father or mother."
@ -9255,17 +9255,17 @@ msgid ""
"A parent and child cannot be merged. To merge these people, you must first "
"break the relationship between them."
msgstr ""
"Объединение детей и родителей не разрешено. Для объединения этих людей вы "
"должны сначала удалить связи между ними."
"Объединение детей и родителей не разрешено. Для объединения этих людей "
"необходимо сначала удалить связи между ними."
#: ../gramps/gen/merge/mergefamilyquery.py:135
msgid "Merge Family"
msgstr "Объединить семью"
msgstr "Объединение семей"
#: ../gramps/gen/merge/mergemediaquery.py:59
#: ../gramps/gui/merge/mergemedia.py:66
msgid "Merge Media Objects"
msgstr "Объединить документы или изображения"
msgstr "Объединение документов или изображений"
#: ../gramps/gen/merge/mergenotequery.py:58 ../gramps/gui/merge/mergenote.py:66
msgid "Merge Notes"
@ -9295,7 +9295,7 @@ msgstr "Объединение хранилищ"
#: ../gramps/gen/merge/mergesourcequery.py:62
msgid "Merge Source"
msgstr "Объединить источник"
msgstr "Объединение источников"
#: ../gramps/gen/plug/_gramplet.py:345
#, python-format
@ -9319,7 +9319,7 @@ msgid ""
" but is not known to the module. Ignoring..."
msgstr ""
"Настройка «%(opt_name)s» задана в %(file)s,\n"
" но не поддерживается данным модулем. Игнорирую..."
" но не поддерживается данным модулем. Игнорируется..."
#: ../gramps/gen/plug/_pluginreg.py:59
msgid "Stable"
@ -9395,7 +9395,7 @@ msgstr "Разное"
#: ../gramps/gen/plug/_pluginreg.py:1176
#, python-format
msgid "ERROR: Failed reading plugin registration %(filename)s"
msgstr "ОШИБКА: Не удается прочесть файл регистрации модулей %(filename)s"
msgstr "ОШИБКА: Не удаётся прочесть файл регистрации модуля %(filename)s"
#: ../gramps/gen/plug/_pluginreg.py:1154
#, python-format
@ -9634,7 +9634,7 @@ msgstr "Ориентация графа"
#: ../gramps/gen/plug/docgen/graphdoc.py:152
msgid "Whether graph goes from top to bottom or left to right."
msgstr "Строить граф сверху вниз либо слева направо."
msgstr "Строить граф сверху вниз, либо слева направо."
#: ../gramps/gen/plug/docgen/graphdoc.py:156
msgid "Number of Horizontal Pages"
@ -9776,12 +9776,12 @@ msgid ""
"graphs will result in longer lines and larger graphs."
msgstr ""
"Подграфы могут помочь Graphviz расположить супругов рядом, но на сложных "
"графах это приведет к более длинным линиям и бо́льшим графам."
"графах это приведёт к более длинным линиям и бо́льшим графам."
#. ###############################
#: ../gramps/gen/plug/docgen/graphdoc.py:257
msgid "Note to add to the graph"
msgstr "Комментарий для добавления к графу"
msgstr "Комментарий к графу"
#: ../gramps/gen/plug/docgen/graphdoc.py:259
msgid "This text will be added to the graph."
@ -9846,7 +9846,7 @@ msgstr "Graphviz файл"
#: ../gramps/gen/plug/docgen/paperstyle.py:78
msgid "paper size|Letter"
msgstr "Letter"
msgstr "Письмо"
#: ../gramps/gen/plug/docgen/paperstyle.py:80
msgid "paper size|Legal"
@ -10090,10 +10090,9 @@ msgstr "Допустимые значения: "
#.
#. ------------------------------------------------------------------------
#: ../gramps/gen/plug/report/_book.py:71 ../gramps/gui/plug/_dialogs.py:59
#: ../gramps/gui/plug/report/_bookdialog.py:84 ../gramps/gui/viewmanager.py:122
#: ../gramps/gui/viewmanager.py:121
#: ../gramps/gui/plug/report/_bookdialog.py:86 ../gramps/gui/viewmanager.py:121
msgid "Unsupported"
msgstr "Не поддерживаемые"
msgstr "Неподдерживаемые"
#: ../gramps/gen/plug/report/_constants.py:45
msgid "Text Reports"
@ -10236,11 +10235,9 @@ msgid "Name format"
msgstr "Формат имён"
#: ../gramps/gen/plug/report/stdoptions.py:78
#: ../gramps/plugins/webreport/webcal.py:1679
#: ../gramps/plugins/webreport/webcal.py:1685
#: ../gramps/plugins/webreport/webcal.py:1686
msgid "Select the format to display names"
msgstr "Выберите формат отображения имен"
msgstr "Выберите формат отображения имён"
#: ../gramps/gen/plug/report/stdoptions.py:106
msgid "Include data marked private"
@ -10495,7 +10492,7 @@ msgstr "Ошибка: отсутствует параметр gramps_target_vers
#: ../gramps/gen/plug/utils.py:380
#, python-format
msgid "Installing '%s'..."
msgstr "Устанавливаем '%s'..."
msgstr "Установка '%s'..."
#: ../gramps/gen/plug/utils.py:385
#, python-format
@ -10527,9 +10524,9 @@ msgstr ""
"перезапустите Gramps."
#: ../gramps/gen/relationship.py:1273
#: ../gramps/plugins/view/pedigreeview.py:1531
#: ../gramps/plugins/view/pedigreeview.py:1533
msgid "Relationship loop detected"
msgstr "Обнаружена петля в отношениях"
msgstr "Обнаружен цикл в отношениях"
#: ../gramps/gen/relationship.py:1332
#, python-format
@ -10538,11 +10535,11 @@ msgid ""
"It is possible that relationships have been missed"
msgstr ""
"Поиск в семейном древе достиг максимальной глубины в %d поколений.\n"
"Возможно что некоторые отношения не были найдены"
"Возможно, что некоторые отношения не были найдены"
#: ../gramps/gen/relationship.py:1406
msgid "Relationship loop detected:"
msgstr "Обнаружена петля в отношениях:"
msgstr "Обнаружен цикл в отношениях:"
#: ../gramps/gen/relationship.py:1407
#, python-format
@ -10657,7 +10654,7 @@ msgid ""
"Family relationship translator not available for language '%s'. Using "
"'english' instead."
msgstr ""
"Перевод терминологии родственных отношений для языка «%s» не осуществлён. "
"Перевод терминологии родственных отношений для языка «%s» недоступен. "
"Будет использована английская терминология."
#: ../gramps/gen/utils/alive.py:145 ../gramps/plugins/importer/importcsv.py:201
@ -12045,11 +12042,11 @@ msgstr "Проверить дополнения на наличие обновл
msgid "Checking Addons Failed"
msgstr "Не удалось проверить дополнения"
#: ../gramps/gui/configure.py:1467
#: ../gramps/gui/configure.py:1476
msgid "The addon repository appears to be unavailable. Please try again later."
msgstr ""
"Сервер с дополнениями временно недоступен. Пожалуйста, попробуйте ещё раз "
"попозже."
"через некоторое время."
#: ../gramps/gui/configure.py:1480
msgid "There are no available addons of this type"
@ -12086,15 +12083,13 @@ msgstr "Хост"
msgid "Port"
msgstr "Порт"
#: ../gramps/gui/configure.py:1534
msgid "Family Tree Database path"
msgstr ""
"Путь к базе данных\n"
"с семейным древом"
#: ../gramps/gui/configure.py:1543
msgid "Family Tree Database path"
msgstr "Путь к базе данных с семейным древом"
#: ../gramps/gui/configure.py:1552
msgid "Automatically load last Family Tree"
msgstr "Автоматически загружать последнюю базу данных"
msgstr "Автоматически загружать последнее семейное древо"
#: ../gramps/gui/configure.py:1549
msgid "Backup path"
@ -12318,10 +12313,10 @@ msgstr "У Вас нет доступа для чтения выбранного
msgid "Cannot create file"
msgstr "Не удалось создать файл"
#: ../gramps/gui/dbloader.py:585 ../gramps/gui/dbloader.py:558
#: ../gramps/gui/dbloader.py:558
#, python-format
msgid "Could not import file: %s"
msgstr "Ошибка импорта файла %s"
msgstr "Ошибка импорта файла: %s"
#: ../gramps/gui/dbloader.py:586 ../gramps/gui/dbloader.py:559
msgid ""
@ -12622,7 +12617,7 @@ msgstr ""
#: ../gramps/gui/dbman.py:925
msgid "Proceed, I have taken a backup"
msgstr "Продолжить, ведь я сделал резервную копию"
msgstr "Продолжить, я уже сделал резервную копию"
#: ../gramps/gui/dbman.py:926
msgid "Stop"
@ -18472,37 +18467,32 @@ msgstr "Фильтр ссылок"
#: ../gramps/gui/plug/export/_exportoptions.py:346
msgid "Click to see preview after reference filter"
msgstr "Щелкните чтобы увидеть предпросмотр после применения фильтра ссылок"
msgstr "Щёлкните, чтобы увидеть предпросмотр после применения фильтра ссылок"
# fixme! проверить на живой программе
#: ../gramps/gui/plug/export/_exportoptions.py:396
msgid "Hide order"
msgstr "Скрыть упорядочивание"
#: ../gramps/gui/plug/export/_exportoptions.py:589
#: ../gramps/gui/plug/export/_exportoptions.py:592
msgid "Filtering private data"
msgstr "Фильтрую частные данные"
msgstr "Применение фильтра личных данных"
#: ../gramps/gui/plug/export/_exportoptions.py:598
#: ../gramps/gui/plug/export/_exportoptions.py:601
msgid "Filtering living persons"
msgstr "Фильтрую ныне живущих лиц"
msgstr "Применение фильтра ныне живущих лиц"
#: ../gramps/gui/plug/export/_exportoptions.py:615
#: ../gramps/gui/plug/export/_exportoptions.py:618
msgid "Applying selected person filter"
msgstr "Применить выбранный фильтр людей"
msgstr "Применение выбранного фильтра лиц"
#: ../gramps/gui/plug/export/_exportoptions.py:625
#: ../gramps/gui/plug/export/_exportoptions.py:628
msgid "Applying selected note filter"
msgstr "Применить выбранный фильтр заметок"
msgstr "Применение выбранного фильтра заметок"
#: ../gramps/gui/plug/export/_exportoptions.py:634
#: ../gramps/gui/plug/export/_exportoptions.py:637
msgid "Filtering referenced records"
msgstr "Фильтрую записи по ссылкам"
msgstr "Фильтр записей по ссылкам"
#: ../gramps/gui/plug/export/_exportoptions.py:675
#: ../gramps/gui/plug/export/_exportoptions.py:678
@ -18531,10 +18521,9 @@ msgstr "Включать все выбранные заметки"
msgid "Replace given names of living people"
msgstr "Изменять имена живых людей"
#: ../gramps/gui/plug/export/_exportoptions.py:732
#: ../gramps/gui/plug/export/_exportoptions.py:735
msgid "Replace complete name of living people"
msgstr "Изменять имена живых людей"
msgstr "Изменять имена живых людей полностью"
#: ../gramps/gui/plug/export/_exportoptions.py:733
#: ../gramps/gui/plug/export/_exportoptions.py:736
@ -18589,6 +18578,10 @@ msgstr "Копировать всё"
msgid "See data not in Filter"
msgstr "Смотреть данные, неподходящие под фильтр"
#: ../gramps/gui/plug/report/_bookdialog.py:92
msgid "Generate_Book_dialog"
msgstr "Создание_книги"
#: ../gramps/gui/plug/report/_bookdialog.py:166
msgid "Available Books"
msgstr "Доступные книги"
@ -18597,9 +18590,9 @@ msgstr "Доступные книги"
msgid "Discard Unsaved Changes"
msgstr "Отменить несохранённые изменения"
#: ../gramps/gui/plug/report/_bookdialog.py:241
#: ../gramps/gui/plug/report/_bookdialog.py:248
msgid "You have made changes which have not been saved."
msgstr "Изменения, сделанные вами, ещё не были сохранены."
msgstr "Изменения, сделанные Вами, ещё не были сохранены."
#: ../gramps/gui/plug/report/_bookdialog.py:242
#: ../gramps/gui/plug/report/_bookdialog.py:738
@ -18841,7 +18834,7 @@ msgstr "Параметры документа"
#: ../gramps/gui/plug/report/_reportdialog.py:503
#: ../gramps/gui/plug/report/_reportdialog.py:530
msgid "Permission problem"
msgstr "Ошибка отсутствия прав"
msgstr "Ошибка прав доступа"
#: ../gramps/gui/plug/report/_reportdialog.py:504
#, python-format
@ -18850,7 +18843,7 @@ msgid ""
"\n"
"Please select another directory or correct the permissions."
msgstr ""
"Отсутствуют права на запись в каталог %s\n"
"Отсутствуют права на запись в этот каталог %s\n"
"\n"
"Пожалуйста, выберите другой каталог или измените права доступа."
@ -18880,7 +18873,7 @@ msgid ""
msgstr ""
"Нет прав для создания %s\n"
"\n"
"Пожалуйста, выберите другой путь или измените права."
"Пожалуйста, выберите другой путь или измените права доступа."
#: ../gramps/gui/plug/report/_reportdialog.py:538
#: ../gramps/plugins/export/exportxml.py:146
@ -18899,14 +18892,14 @@ msgstr ""
"\n"
"Пожалуйста, выберите другой каталог или создайте его."
#: ../gramps/gui/plug/report/_reportdialog.py:665
#: ../gramps/gui/plug/tool.py:136 ../gramps/plugins/tool/relcalc.py:150
#: ../gramps/gui/plug/report/_reportdialog.py:668
#: ../gramps/gui/plug/tool.py:136 ../gramps/plugins/tool/relcalc.py:157
msgid "Active person has not been set"
msgstr "Базовое лицо не установлено"
msgstr "Активное лицо не установлено"
#: ../gramps/gui/plug/report/_reportdialog.py:666
#: ../gramps/gui/plug/report/_reportdialog.py:669
msgid "You must select an active person for this report to work properly."
msgstr "Для работы этого отчёта необходимо выбрать активное лицо."
msgstr "Для создания этого отчёта необходимо выбрать активное лицо."
#: ../gramps/gui/plug/report/_reportdialog.py:721
#: ../gramps/gui/plug/report/_reportdialog.py:728
@ -18927,6 +18920,10 @@ msgstr "по умолчанию"
msgid "Document Styles"
msgstr "Стили документов"
#: ../gramps/gui/plug/report/_styleeditor.py:108
msgid "manual|Document_Styles_dialog"
msgstr "Стили_документов"
#: ../gramps/gui/plug/report/_styleeditor.py:140
msgid "New Style"
msgstr "Новый стиль"
@ -18955,6 +18952,10 @@ msgstr "Выберите стиль"
msgid "Style editor"
msgstr "Редактор стилей"
#: ../gramps/gui/plug/report/_styleeditor.py:241
msgid "manual|Style_editor_dialog"
msgstr "Редактор_стилей"
#: ../gramps/gui/plug/report/_styleeditor.py:341
#: ../gramps/gui/plug/report/_styleeditor.py:369
#: ../gramps/gui/plug/report/_styleeditor.py:387
@ -19016,9 +19017,9 @@ msgstr ""
msgid "_Proceed with the tool"
msgstr "_Запустить инструмент"
#: ../gramps/gui/plug/tool.py:137 ../gramps/plugins/tool/relcalc.py:151
#: ../gramps/gui/plug/tool.py:137 ../gramps/plugins/tool/relcalc.py:158
msgid "You must select an active person for this tool to work properly."
msgstr "Для работы этого инструмента необходимо выбрать активное лицо."
msgstr "Для запуска этого инструмента необходимо выбрать активное лицо."
#: ../gramps/gui/selectors/selectcitation.py:51
#: ../gramps/gui/selectors/selectcitation.py:86
@ -19097,6 +19098,10 @@ msgstr "Выберите документ"
msgid "manual|Select_Child_selector"
msgstr "Выбор_ребёнка"
#: ../gramps/gui/selectors/selectperson.py:70
msgid "manual|Select_Person_selector"
msgstr "Выбор_лица"
#: ../gramps/gui/selectors/selectperson.py:56
#: ../gramps/gui/selectors/selectperson.py:64
msgid "manual|Select_Father_selector"
@ -19127,6 +19132,10 @@ msgstr "Хранилища"
msgid "Select Repository"
msgstr "Выберите хранилище"
#: ../gramps/gui/selectors/selectrepository.py:75
msgid "manual|Select_Repository_selector"
msgstr "Выбор_хранилища"
#: ../gramps/gui/selectors/selectsource.py:62
#: ../gramps/gui/selectors/selectsource.py:59
msgid "Select Source"
@ -19151,7 +19160,7 @@ msgstr ""
#: ../gramps/gui/spell.py:153
#, python-format
msgid "Spelling checker initialization failed: %s"
msgstr "Ошибка при инициализации проверки правописания: %s"
msgstr "Ошибка при инициализации проверки правописания: %s"
#: ../gramps/gui/tipofday.py:67 ../gramps/gui/tipofday.py:68
#: ../gramps/gui/tipofday.py:121 ../gramps/gui/viewmanager.py:538
@ -19226,15 +19235,15 @@ msgstr "История очищена"
#: ../gramps/gui/utils.py:230
msgid "Canceling..."
msgstr "Отменяю..."
msgstr "Производится отмена..."
#: ../gramps/gui/utils.py:310
msgid "Please do not force closing this important dialog."
msgstr "Пожалуйста, не закрывайте этот важный диалог силой."
msgstr "Пожалуйста, не закрывайте этот важный диалог."
#: ../gramps/gui/utils.py:374
msgid "The external program failed to launch or experienced an error"
msgstr "Внешняя программа не смогла запуститься, либо в ней случился сбой"
msgstr "Внешняя программа не смогла запуститься или в ней произошёл сбой"
#: ../gramps/gui/utils.py:384
msgid "Error from external program"
@ -19441,9 +19450,9 @@ msgid "Key %s is not bound"
msgstr "Клавиша %s не назначена"
#. registering plugins
#: ../gramps/gui/viewmanager.py:788 ../gramps/gui/viewmanager.py:787
#: ../gramps/gui/viewmanager.py:787
msgid "Registering plugins..."
msgstr "Регистрирую модули..."
msgstr "Регистрация модулей..."
#: ../gramps/gui/viewmanager.py:796 ../gramps/gui/viewmanager.py:795
msgid "Ready"
@ -19454,14 +19463,12 @@ msgstr "Готово"
msgid "Abort changes?"
msgstr "Отказаться от изменений?"
#: ../gramps/gui/viewmanager.py:842 ../gramps/gui/viewmanager.py:841
#: ../gramps/gui/viewmanager.py:851
msgid ""
"Aborting changes will return the database to the state it was before you "
"started this editing session."
msgstr ""
"Отказ от изменений вернёт базу данных в состояние до начала вашей текущей "
"сессии."
"Отказ от изменений вернёт базу данных в состояние до начала текущей сессии."
#: ../gramps/gui/viewmanager.py:844 ../gramps/gui/viewmanager.py:843
#: ../gramps/gui/viewmanager.py:853
@ -19473,21 +19480,17 @@ msgstr "Отказаться от изменений"
msgid "Cannot abandon session's changes"
msgstr "Ошибка отката изменений сессии"
#: ../gramps/gui/viewmanager.py:856 ../gramps/gui/viewmanager.py:855
#: ../gramps/gui/viewmanager.py:865
msgid ""
"Changes cannot be completely abandoned because the number of changes made in "
"the session exceeded the limit."
msgstr ""
"Нельзя откатить все изменения, поскольку число изменений, совершенных в "
"сессии, превзошло предел."
"Нельзя откатить все изменения, поскольку число изменений, совершённых в "
"сессии, превысило предел."
#: ../gramps/gui/viewmanager.py:1017 ../gramps/gui/viewmanager.py:1016
#: ../gramps/gui/viewmanager.py:1026
msgid "View failed to load. Check error output."
msgstr ""
"Не удалось загрузить вид. Проверьте сообщения об ошибках в окне, из которого "
"запущен Gramps."
msgstr "Не удалось загрузить вид. Проверьте сообщения об ошибках."
# statistics over import results
#: ../gramps/gui/viewmanager.py:1169 ../gramps/gui/viewmanager.py:1168
@ -19515,7 +19518,6 @@ msgstr "Ошибка сохранения резервной копии"
msgid "Failed Loading View"
msgstr "Не удалось загрузить вид"
#: ../gramps/gui/viewmanager.py:1689 ../gramps/gui/viewmanager.py:1688
#: ../gramps/gui/viewmanager.py:1698
#, python-format
msgid ""
@ -19534,8 +19536,8 @@ msgstr ""
"\n"
"%(error_msg)s\n"
"\n"
"Если не можете устранить причину сами, то можно либо сообщить об ошибке по "
"адресу %(gramps_bugtracker_url)s, либо связаться с автором вида "
"Если не можете устранить причину сами, то сообщите об ошибке по адресу "
"%(gramps_bugtracker_url)s, либо свяжитесь с автором вида "
"(%(firstauthoremail)s).\n"
"\n"
"Если не хотите, чтобы Gramps пыталась загрузить этот вид в следующий раз, "
@ -19546,7 +19548,6 @@ msgstr ""
msgid "Failed Loading Plugin"
msgstr "Ошибка загрузки модуля"
#: ../gramps/gui/viewmanager.py:1782 ../gramps/gui/viewmanager.py:1781
#: ../gramps/gui/viewmanager.py:1791
#, python-format
msgid ""
@ -19565,8 +19566,8 @@ msgstr ""
"\n"
"%(error_msg)s\n"
"\n"
"Если не можете устранить причину сами, то можно либо сообщить об ошибке по "
"адресу %(gramps_bugtracker_url)s, либо связаться с автором модуля "
"Если не можете устранить причину сами, то сообщите об ошибке по адресу "
"%(gramps_bugtracker_url)s, либо свяжитесь с автором модуля "
"(%(firstauthoremail)s).\n"
"\n"
"Если не хотите, чтобы Gramps пыталась загрузить этот модуль в следующий раз, "
@ -19699,13 +19700,12 @@ msgstr "Нельзя поставить закладку: ничто не выд
msgid "Multiple Selection Delete"
msgstr "Удаление нескольких элементов"
#: ../gramps/gui/views/listview.py:546 ../gramps/gui/views/listview.py:553
#: ../gramps/gui/views/listview.py:553
msgid ""
"More than one item has been selected for deletion. Select the option "
"indicating how to delete the items:"
msgstr ""
"Для удаления выделено более одного элемента. Выберите параметры индикации "
"при удалении:"
"Для удаления выделено более одного элемента. Выберите параметры для удаления:"
#: ../gramps/gui/views/listview.py:548 ../gramps/gui/views/listview.py:555
msgid "Delete All"
@ -19715,13 +19715,13 @@ msgstr "Удалить всё"
msgid "Confirm Each Delete"
msgstr "Подтверждать каждое удаление"
#: ../gramps/gui/views/listview.py:560 ../gramps/gui/views/listview.py:567
#: ../gramps/gui/views/listview.py:567
msgid ""
"This item is currently being used. Deleting it will remove it from the "
"database and from all other items that reference it."
msgstr ""
"Этот элемент в настоящее время используется. Удаление сотрёт его из базы "
"данных и из всех других элементов, которые ссылаются на это."
"данных и из всех других элементов, которые ссылаются на него."
#: ../gramps/gui/views/listview.py:564 ../gramps/plugins/view/familyview.py:269
#: ../gramps/gui/views/listview.py:571
@ -19739,9 +19739,9 @@ msgstr "Удалить %s?"
msgid "_Delete Item"
msgstr "Уалить элемент"
#: ../gramps/gui/views/listview.py:614 ../gramps/gui/views/listview.py:621
#: ../gramps/gui/views/listview.py:621
msgid "Column clicked, sorting..."
msgstr "Выбран столбец, сортирую..."
msgstr "Выбран столбец, сортировка..."
#: ../gramps/gui/views/listview.py:1043 ../gramps/gui/views/listview.py:1057
msgid "Export View as Spreadsheet"
@ -19769,7 +19769,7 @@ msgstr "Создана закладка для %s"
#: ../gramps/plugins/lib/maps/geography.py:221
#: ../gramps/plugins/view/familyview.py:223
msgid "A bookmark could not be set because no one was selected."
msgstr "Нельзя поставить закладку: никто не выделен."
msgstr "Нельзя создать закладку: никто не выделен."
#: ../gramps/gui/views/navigationview.py:274
msgid "_Add Bookmark"
@ -20023,10 +20023,9 @@ msgstr "Братья/Сёстры"
msgid "Related"
msgstr "Связанные"
#: ../gramps/gui/widgets/fanchart.py:1806
#: ../gramps/gui/widgets/fanchart.py:1809
#: ../gramps/gui/widgets/fanchart.py:1816
msgid "Add partner to person"
msgstr "Добавляю партнёра к лицу"
msgstr "Добавить партнёра к лицу"
#: ../gramps/gui/widgets/fanchart.py:1813
#: ../gramps/gui/widgets/fanchart.py:1816
@ -20054,7 +20053,7 @@ msgid ""
"Select the down arrow on the right corner for adding, removing or restoring "
"gramplets."
msgstr ""
"Нажмите значок со стрелочкой в правом нижнем углу, чтобы добавить, удалить, "
"Нажмите значок со стрелочкой в правом нижнем углу, чтобы добавить, удалить "
"или восстановить грамплеты."
#: ../gramps/gui/widgets/grampletbar.py:486
@ -20148,7 +20147,7 @@ msgid ""
"Double-click on the picture to view it in the default image viewer "
"application."
msgstr ""
"Двойной щелчок по изображению приведёт к просмотру в программе по умолчанию."
"Двойной щелчок по изображению для его просмотра в программе по умолчанию."
#: ../gramps/gui/widgets/photo.py:87
msgid "Make Active Media"
@ -20167,6 +20166,10 @@ msgstr ""
msgid "Progress Information"
msgstr "Информация о прогрессе"
#: ../gramps/gui/widgets/reorderfam.py:63
msgid "manual|Reorder_Relationships_dialog"
msgstr "Порядок_отношений"
#: ../gramps/gui/widgets/reorderfam.py:79
msgid "Reorder Relationships"
msgstr "Упорядочить отношения"
@ -20431,7 +20434,7 @@ msgstr "Создаёт документы в формате «просто те
#: ../gramps/plugins/docgen/docgen.gpr.py:55
msgid "Print..."
msgstr "Напечатать..."
msgstr "Печать..."
#: ../gramps/plugins/docgen/docgen.gpr.py:56
msgid "Generates documents and prints them directly."
@ -34089,6 +34092,10 @@ msgstr "Управлениеокументами..."
msgid "Media Manager"
msgstr "Управление документами"
#: ../gramps/plugins/tool/mediamanager.py:91
msgid "Help"
msgstr "Справка"
#: ../gramps/plugins/tool/mediamanager.py:97
#: ../gramps/plugins/webreport/basepage.py:1483
#: ../gramps/plugins/webreport/basepage.py:1606
@ -34755,13 +34762,13 @@ msgstr "Сортировать события"
msgid "Sort event changes"
msgstr "Сортировка изменений события"
#: ../gramps/plugins/tool/sortevents.py:112
#: ../gramps/plugins/tool/sortevents.py:113
msgid "Sorting personal events..."
msgstr "Сортирую события лиц..."
msgstr "Сортировка событий лиц..."
#: ../gramps/plugins/tool/sortevents.py:134
#: ../gramps/plugins/tool/sortevents.py:135
msgid "Sorting family events..."
msgstr "Сортирую события семей..."
msgstr "Сортировка событий семей..."
#: ../gramps/plugins/tool/sortevents.py:165
msgid "Tool Options"
@ -38702,7 +38709,7 @@ msgstr "Определение фильтра содержит цикл."
#: ../gramps/gen/filters/rules/_rule.py:95
msgid "One rule references another which eventually references the first."
msgstr "Одно из праил ссылается на другое, которое ссылается на первое."
msgstr "Одно из правил ссылается на другое, которое ссылается на первое."
#: ../gramps/gui/selectors/selectsource.py:76
msgid "manual|Select_Source_selector"
@ -42293,3 +42300,4 @@ msgstr "Управлениеокументами"
#~ "Используйте https://gramps-project.org/bugs/ чтобы сообщить об ошибке в "
#~ "официально поддерживаемых видах, или свяжитесь с автором "
#~ "(%(firstauthoremail)s) в противном случае. "

View File

@ -1,13 +1,13 @@
# Slovenian translation for Gramps
# This file is distributed under the same license as the Gramps package.
# Copyright (c) 2007 gramps-project
# Bernard Banko <beernarrd (at) gmail.com>, 2007-2017.
# Bernard Banko <beernarrd at gmail.com>, 2007-2019.
msgid ""
msgstr ""
"Project-Id-Version: gramps 3.3\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-05-20 09:31-0500\n"
"PO-Revision-Date: 2017-08-29 13:26+0200\n"
"POT-Creation-Date: 2018-12-26 11:20-0600\n"
"PO-Revision-Date: 2019-02-24 22:16+0200\n"
"Last-Translator: Bernard Banko <beernarrd at gmail.com>\n"
"Language-Team: lugos.si\n"
"Language: sl\n"
@ -3766,6 +3766,15 @@ msgstr "Razni filtri"
msgid "No description"
msgstr "Brez opisa"
#. more references to a filter than expected
#: ../gramps/gen/filters/rules/_rule.py:94
msgid "The filter definition contains a loop."
msgstr "Filter vsebuje samega sebe."
#: ../gramps/gen/filters/rules/_rule.py:95
msgid "One rule references another which eventually references the first."
msgstr "Pravilo nanaša na pravilo, ki že vsebuje prvega."
#: ../gramps/gen/filters/rules/citation/_allcitations.py:45
msgid "Every citation"
msgstr "Vsak navedek"
@ -18143,6 +18152,10 @@ msgstr "Kopiraj vse"
msgid "See data not in Filter"
msgstr "Prikaži podatke zunaj filtra"
#: ../gramps/gui/plug/report/_bookdialog.py:92
msgid "Generate_Book_dialog"
msgstr "Pogovorno_okno_Izdelaj_knjigo"
#: ../gramps/gui/plug/report/_bookdialog.py:166
msgid "Available Books"
msgstr "Knjige na voljo"
@ -18468,6 +18481,10 @@ msgstr "privzeto"
msgid "Document Styles"
msgstr "Slogi dokumentov"
#: ../gramps/gui/plug/report/_styleeditor.py:108
msgid "manual|Document_Styles_dialog"
msgstr "Pogovorno_okno_Določi_sloge"
#: ../gramps/gui/plug/report/_styleeditor.py:140
msgid "New Style"
msgstr "Nov slog"
@ -18494,6 +18511,10 @@ msgstr "Izberi slog"
msgid "Style editor"
msgstr "Urejevalnik slogov"
#: ../gramps/gui/plug/report/_styleeditor.py:241
msgid "manual|Style_editor_dialog"
msgstr "Pogovorno_okno_Urejevalnik_slogov"
#: ../gramps/gui/plug/report/_styleeditor.py:341
#: ../gramps/gui/plug/report/_styleeditor.py:369
#: ../gramps/gui/plug/report/_styleeditor.py:387
@ -18618,6 +18639,10 @@ msgstr "Izberi predmet"
msgid "manual|Select_Child_selector"
msgstr "Izbor_otroka"
#: ../gramps/gui/selectors/selectperson.py:70
msgid "manual|Select_Person_selector"
msgstr "Izbirnik_Izbor_kraja"
#: ../gramps/gui/selectors/selectperson.py:56
msgid "manual|Select_Father_selector"
msgstr "Izbor_očeta"
@ -18642,10 +18667,18 @@ msgstr "Nahajališča"
msgid "Select Repository"
msgstr "Izberi nahajališče"
#: ../gramps/gui/selectors/selectrepository.py:75
msgid "manual|Select_Repository_selector"
msgstr "Izbirnik_Izbor_matere"
#: ../gramps/gui/selectors/selectsource.py:62
msgid "Select Source"
msgstr "Izberi vir"
#: ../gramps/gui/selectors/selectsource.py:76
msgid "manual|Select_Source_selector"
msgstr "Izbirnik_Izbor_opombe"
#: ../gramps/gui/spell.py:92
msgid "Off"
msgstr "Izklopljeno"
@ -19620,6 +19653,10 @@ msgstr ""
msgid "Progress Information"
msgstr "Podatki o napredovanju"
#: ../gramps/gui/widgets/reorderfam.py:63
msgid "manual|Reorder_Relationships_dialog"
msgstr "Pogovorno_okno_Preuredi_sorodstva"
#: ../gramps/gui/widgets/reorderfam.py:79
msgid "Reorder Relationships"
msgstr "Preuredi sorodstva"
@ -21818,6 +21855,11 @@ msgstr "EMAIL"
msgid "WWW"
msgstr "WWW"
#: ../gramps/plugins/export/exportgedcom.py:1438
#, fuzzy
msgid "Writing media"
msgstr "Zapisovanje predmetov"
#: ../gramps/plugins/export/exportgedcom.py:1570
msgid "GEDCOM Export failed"
msgstr "Izvoz GEDCOM ni bil uspešen"
@ -22951,12 +22993,12 @@ msgstr "Pripomoček, ki zagotavlja filter za opombe"
#: ../gramps/plugins/gramplet/gramplet.gpr.py:1138
#: ../gramps/plugins/textreport/recordsreport.py:118
msgid "Records"
msgstr "Zapisi"
msgstr "Rekordi"
#: ../gramps/plugins/gramplet/gramplet.gpr.py:1128
#: ../gramps/plugins/textreport/textplugins.gpr.py:416
msgid "Shows some interesting records about people and families"
msgstr "Prikaže nekaj zanimivih zapisov o ljudeh in družinah"
msgstr "Prikaže nekaj zanimivih rekordnih podatkov o ljudeh in družinah"
#: ../gramps/plugins/gramplet/gramplet.gpr.py:1143
msgid "Person To Do"
@ -23370,6 +23412,18 @@ msgstr "Število oseb"
msgid "Individuals with unknown gender"
msgstr "Osebe neznanega spola"
#: ../gramps/plugins/gramplet/statsgramplet.py:156
msgid "Incomplete names"
msgstr "Nepopolna imena"
#: ../gramps/plugins/gramplet/statsgramplet.py:160
msgid "Individuals missing birth dates"
msgstr "Osebe z manjkajočimi datumi rojstva"
#: ../gramps/plugins/gramplet/statsgramplet.py:164
msgid "Disconnected individuals"
msgstr "Nepovezane osebe"
#: ../gramps/plugins/gramplet/statsgramplet.py:115
#: ../gramps/plugins/textreport/summary.py:211
#: ../gramps/plugins/webreport/statistics.py:129
@ -23388,6 +23442,10 @@ msgstr "Edinstveni priimki"
msgid "Media Objects"
msgstr "Zunanji predmeti"
#: ../gramps/plugins/gramplet/statsgramplet.py:181
msgid "Individuals with media objects"
msgstr "Osebe z zunajimi predmeti"
#: ../gramps/plugins/gramplet/statsgramplet.py:128
#: ../gramps/plugins/webreport/statistics.py:138
msgid "Total number of media object references"
@ -23461,6 +23519,10 @@ msgstr "Uredi izbrano opombo Narediti"
msgid "Add a new To Do note"
msgstr "Dodaj novo opombo Narediti"
#: ../gramps/plugins/gramplet/todo.py:201
msgid "First select the object to which you want to attach a note"
msgstr "Najprej izberite predmet, ki bi mu radi pripeli opombo"
#: ../gramps/plugins/gramplet/todogramplet.py:149
msgid "Unattached"
msgstr "Nepripeto"
@ -31911,7 +31973,7 @@ msgstr "Ustvari abecedno kazalo za knjižna poročila."
#: ../gramps/plugins/textreport/textplugins.gpr.py:415
msgid "Records Report"
msgstr "Poročilo o zapisih"
msgstr "Poročilo o rekordih"
#: ../gramps/plugins/textreport/textplugins.gpr.py:437
msgid "Note Link Report"
@ -32857,6 +32919,10 @@ msgstr "Upravljalnik_zunanjih_predmetov..."
msgid "Media Manager"
msgstr "Upravljalnik zunanjih predmetov"
#: ../gramps/plugins/tool/mediamanager.py:91
msgid "Help"
msgstr "Pomoč"
#: ../gramps/plugins/tool/mediamanager.py:97
#: ../gramps/plugins/webreport/basepage.py:1483
#: ../gramps/plugins/webreport/basepage.py:1606
@ -37191,3 +37257,4 @@ msgstr "Upravljalnik_zunanjih_predmetov"
#~ msgid "Alphabet Menu: %s"
#~ msgstr "Abecedni meni: %s"

111
po/sv.po
View File

@ -20,39 +20,29 @@
# Jens Arvidsson <jya@sverige.nu>, 2002-2005.
# Stefan Björk <betula@users.sourceforge.net>, 2005-2006.
# Peter Landgren <peter.talken@telia.com>, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017.
# Pär Ekholm <par.ekholm@pekholm.se>, 2018.
# Pär Ekholm <par.ekholm@pekholm.se>, 2018, 2019.
msgid ""
msgstr ""
"Project-Id-Version: sv\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-07-24 14:13+0100\n"
"PO-Revision-Date: 2018-11-15 18:11+0100\n"
"POT-Creation-Date: 2018-12-26 11:20-0600\n"
"PO-Revision-Date: 2019-01-02 22:39+0100\n"
"Last-Translator: Pär Ekholm <par.ekholm@pekholm.se>\n"
"Language-Team: \n"
"Language: sv\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: Poedit 2.0.6\n"
"Last-Translator: Pär Ekholm <par.ekholm@pekholm.se>\n"
"Language: sv\n"
#: ../data/gramps.appdata.xml.in.h:1
msgid ""
"Gramps is a genealogy program that is both intuitive for hobbyists and "
"feature-complete for professional genealogists."
msgstr ""
"Gramps är ett släktforskningsprogram som är både intuitivt för "
"hobbyforskaren och komplett för den professionelle släktforskaren."
msgid "Gramps is a genealogy program that is both intuitive for hobbyists and feature-complete for professional genealogists."
msgstr "Gramps är ett släktforskningsprogram som både är intuitivt för hobbyforskaren och komplett för den professionelle släktforskaren."
#: ../data/gramps.appdata.xml.in.h:2
msgid ""
"It gives you the ability to record the many details of the life of an "
"individual as well as the complex relationships between various people, "
"places and events."
msgstr ""
"Det ger dig tillgång till möjligheten att notera många livsdetaljer hos "
"person såväl som de komplexa släktskapen mellan många människor, platser och "
"händelser."
msgid "It gives you the ability to record the many details of the life of an individual as well as the complex relationships between various people, places and events."
msgstr "Det ger dig tillgång till möjligheten att notera många livsdetaljer hos en person såväl som de komplexa släktskapen mellan många människor, platser och händelser."
#: ../data/gramps.appdata.xml.in.h:3
msgid ""
@ -3352,7 +3342,7 @@ msgstr "suffix"
#: ../gramps/gen/display/name.py:610 ../gramps/gen/display/name.py:710
msgid "Name|call"
msgstr "tilltalsnamnnamn"
msgstr "tilltalsnamn"
#: ../gramps/gen/display/name.py:613 ../gramps/gen/display/name.py:712
msgid "Name|common"
@ -3786,6 +3776,15 @@ msgstr "Diverse filter"
msgid "No description"
msgstr "Beskrivning saknas"
#. more references to a filter than expected
#: ../gramps/gen/filters/rules/_rule.py:94
msgid "The filter definition contains a loop."
msgstr "Filterdefinitionen innehåller en slinga."
#: ../gramps/gen/filters/rules/_rule.py:95
msgid "One rule references another which eventually references the first."
msgstr "En regel hänvisar en annan som så småningom hänvisar den första."
#: ../gramps/gen/filters/rules/citation/_allcitations.py:45
msgid "Every citation"
msgstr "Varje citering"
@ -10994,7 +10993,7 @@ msgstr "Bidrag av"
#. TRANSLATORS: Translate this to your name in your native language
#: ../gramps/gui/aboutdialog.py:120
msgid "translator-credits"
msgstr "Peter Landgren, Pär Ekholm"
msgstr "Pär Ekholm"
#: ../gramps/gui/aboutdialog.py:131
#, python-format
@ -18150,6 +18149,10 @@ msgstr "Kopiera allt"
msgid "See data not in Filter"
msgstr "Se data ej i filter"
#: ../gramps/gui/plug/report/_bookdialog.py:92
msgid "Generate_Book_dialog"
msgstr "Dialog för att skapa bok"
#: ../gramps/gui/plug/report/_bookdialog.py:166
msgid "Available Books"
msgstr "Tillgängliga böcker"
@ -18477,6 +18480,10 @@ msgstr "standard"
msgid "Document Styles"
msgstr "Dokumentmallar"
#: ../gramps/gui/plug/report/_styleeditor.py:108
msgid "manual|Document_Styles_dialog"
msgstr "Dialog för dokumentmallar"
#: ../gramps/gui/plug/report/_styleeditor.py:140
msgid "New Style"
msgstr "Ny mall"
@ -18503,6 +18510,10 @@ msgstr "Välj en mall"
msgid "Style editor"
msgstr "Mallredigerare"
#: ../gramps/gui/plug/report/_styleeditor.py:241
msgid "manual|Style_editor_dialog"
msgstr "Mallredigerardialog"
#: ../gramps/gui/plug/report/_styleeditor.py:341
#: ../gramps/gui/plug/report/_styleeditor.py:369
#: ../gramps/gui/plug/report/_styleeditor.py:387
@ -18627,6 +18638,10 @@ msgstr "Välj mediaobjekt"
msgid "manual|Select_Child_selector"
msgstr "Välj barnselektor"
#: ../gramps/gui/selectors/selectperson.py:70
msgid "manual|Select_Person_selector"
msgstr "Välj personselektor"
#: ../gramps/gui/selectors/selectperson.py:56
msgid "manual|Select_Father_selector"
msgstr "Välj farselektor"
@ -18651,10 +18666,18 @@ msgstr "manual|Arkivplatser"
msgid "Select Repository"
msgstr "Välj arkivplats"
#: ../gramps/gui/selectors/selectrepository.py:75
msgid "manual|Select_Repository_selector"
msgstr "Välj arkivplatsselektor"
#: ../gramps/gui/selectors/selectsource.py:62
msgid "Select Source"
msgstr "Välj källa"
#: ../gramps/gui/selectors/selectsource.py:76
msgid "manual|Select_Source_selector"
msgstr "Välj källselektor"
#: ../gramps/gui/spell.py:92
msgid "Off"
msgstr "Av"
@ -19632,6 +19655,10 @@ msgstr ""
msgid "Progress Information"
msgstr "Framåtskridande"
#: ../gramps/gui/widgets/reorderfam.py:63
msgid "manual|Reorder_Relationships_dialog"
msgstr "Dialog för att ordna om släktskap"
#: ../gramps/gui/widgets/reorderfam.py:79
msgid "Reorder Relationships"
msgstr "Ordna om släktskap"
@ -21825,6 +21852,10 @@ msgstr "E-POST"
msgid "WWW"
msgstr "WWW"
#: ../gramps/plugins/export/exportgedcom.py:1438
msgid "Writing media"
msgstr "Skriver media"
#: ../gramps/plugins/export/exportgedcom.py:1570
msgid "GEDCOM Export failed"
msgstr "GEDCOM-export misslyckades"
@ -23453,6 +23484,10 @@ msgstr "Redigera den valda Att Göra notisen"
msgid "Add a new To Do note"
msgstr "Lägg till ny Att Göra notis"
#: ../gramps/plugins/gramplet/todo.py:201
msgid "First select the object to which you want to attach a note"
msgstr "Välj först objektet som du vill koppla en notis till"
#: ../gramps/plugins/gramplet/todogramplet.py:149
msgid "Unattached"
msgstr "Okopplad"
@ -36415,12 +36450,10 @@ msgstr "Webb-kalender-rapport"
msgid "Calculating Holidays for year %04d"
msgstr "Beräknar helgdagar för år %04d"
#: ../gramps/plugins/webreport/webcal.py:486
#: ../gramps/plugins/webreport/webcal.py:491
#, python-format
msgid ""
"the \"WebCal\" will be the potential-email Subject|Created for "
"%(html_email_author_start)sWebCal%(html_email_author_end)s"
msgstr "Skapat för %(html_email_author_start)sWebCal%(html_email_author_end)s"
msgid "the \"WebCal\" will be the potential-email Subject|Created for %(html_email_author_start)sWebCal%(html_email_author_end)s"
msgstr "\"WebCal\" kommer att vara den viktigaste e-postsubjektet|Skapat för %(html_email_author_start)sWebCal%(html_email_author_end)s"
#: ../gramps/plugins/webreport/webcal.py:494
#, python-format
@ -37400,17 +37433,21 @@ msgstr "Media_hanterare"
#~ msgid "Place Locations"
#~ msgstr "Platslokalisering"
#~ msgid "Incomplete names"
#~ msgstr "Ofullständigt namn"
#: ../gramps/plugins/gramplet/statsgramplet.py:156
msgid "Incomplete names"
msgstr "Ofullständiga namn"
#~ msgid "Individuals missing birth dates"
#~ msgstr "Personer som saknar födelsedatum"
#: ../gramps/plugins/gramplet/statsgramplet.py:160
msgid "Individuals missing birth dates"
msgstr "Personer som saknar födelsedatum"
#~ msgid "Disconnected individuals"
#~ msgstr "Isolerade personer"
#: ../gramps/plugins/gramplet/statsgramplet.py:164
msgid "Disconnected individuals"
msgstr "Släktlösa personer"
#~ msgid "Individuals with media objects"
#~ msgstr "Personer med mediaobjekt"
#: ../gramps/plugins/gramplet/statsgramplet.py:181
msgid "Individuals with media objects"
msgstr "Personer med mediaobjekt"
#~ msgid "Empty event note ignored"
#~ msgstr "Tom händelsenotis ignorerades"
@ -41216,8 +41253,9 @@ msgstr "Media_hanterare"
#~ msgid "Dates on events are either about or after/before"
#~ msgstr "Datum för händelser är antingen omkring eller efter/före"
#~ msgid "Help"
#~ msgstr "Hjälp"
#: ../gramps/plugins/tool/mediamanager.py:91
msgid "Help"
msgstr "Hjälp"
#~ msgid ""
#~ "The Calculate Estimated Dates Tool is used to add and remove birth and "
@ -41420,3 +41458,4 @@ msgstr "Media_hanterare"
#~ msgid "Name Format Editor"
#~ msgstr "Namnformatsredigerare"

View File

@ -51,11 +51,18 @@ from __future__ import print_function
import os
import sys
import shutil
from argparse import ArgumentParser
# Windows OS
if sys.platform == 'win32':
if sys.platform in ['linux', 'linux2', 'darwin', 'cygwin'] or shutil.which('msgmerge'):
msgmergeCmd = 'msgmerge'
msgfmtCmd = 'msgfmt'
msgattribCmd = 'msgattrib'
xgettextCmd = 'xgettext'
pythonCmd = os.path.join(sys.prefix, 'bin', 'python3')
elif sys.platform == 'win32':
# GetText Win 32 obtained from http://gnuwin32.sourceforge.net/packages/gettext.htm
# ....\gettext\bin\msgmerge.exe needs to be on the path
msgmergeCmd = os.path.join('C:', 'Program Files(x86)', 'gettext', 'bin', 'msgmerge.exe')
@ -163,7 +170,7 @@ def TipsParse(filename, mark):
"Editor."
'''
with open('../data/tips.xml.in.h', 'w') as tips:
with open('../data/tips.xml.in.h', 'w', encoding='utf-8') as tips:
marklist = root.iter(mark)
for key in marklist:
tip = ElementTree.tostring(key, encoding="UTF-8", method="xml")