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

View File

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

View File

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

View File

@ -3,7 +3,7 @@
"http://gramps-project.org/xml/1.7.1/grampsxml.dtd"> "http://gramps-project.org/xml/1.7.1/grampsxml.dtd">
<database xmlns="http://gramps-project.org/xml/1.7.1/"> <database xmlns="http://gramps-project.org/xml/1.7.1/">
<header> <header>
<created date="2016-10-24" version="5.0.0-alpha1"/> <created date="2019-03-05" version="5.0.2"/>
<researcher> <researcher>
<resname>Alex Roitman,,,</resname> <resname>Alex Roitman,,,</resname>
<resaddr>Not Provided</resaddr> <resaddr>Not Provided</resaddr>
@ -163,6 +163,7 @@
</event> </event>
<event handle="_0000005500000055" change="1" id="E0026"> <event handle="_0000005500000055" change="1" id="E0026">
<type>Birth</type> <type>Birth</type>
<description>No Date Information</description>
</event> </event>
<event handle="_0000005600000056" change="1" id="E0027"> <event handle="_0000005600000056" change="1" id="E0027">
<type>Death</type> <type>Death</type>
@ -1456,13 +1457,13 @@
<noteref hlink="_000000f9000000f9"/> <noteref hlink="_000000f9000000f9"/>
</object> </object>
<object handle="_000000d1000000d1" change="1" id="O0001"> <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>
<object handle="_000000d8000000d8" change="1" id="O0002"> <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>
<object handle="_000000f1000000f1" change="1" id="O0003"> <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> </object>
</objects> </objects>
<repositories> <repositories>
@ -1506,7 +1507,8 @@
<note handle="_0000000100000001" change="1" id="N0000" type="GEDCOM import"> <note handle="_0000000100000001" change="1" id="N0000" type="GEDCOM import">
<text>Records not imported into HEAD (header): <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"> <style name="fontface" value="Monospace">
<range start="0" end="148"/> <range start="0" end="148"/>
</style> </style>
@ -1514,7 +1516,8 @@ GEDCOM FORM not supported Line 14:
<note handle="_0000000200000002" change="1" id="N0001" type="GEDCOM import"> <note handle="_0000000200000002" change="1" id="N0001" type="GEDCOM import">
<text>Records not imported into SUBM (Submitter): (@SUBM@) Alex Roitman,,,: <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"> <style name="fontface" value="Monospace">
<range start="0" end="199"/> <range start="0" end="199"/>
</style> </style>
@ -1523,7 +1526,8 @@ Line ignored as not understood Line 23:
<text>Records not imported into FAM (family) Gramps ID F0003: <text>Records not imported into FAM (family) Gramps ID F0003:
Line ignored as not understood Line 46: 2 SOUR Not really allowed here 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"> <style name="fontface" value="Monospace">
<range start="0" end="256"/> <range start="0" end="256"/>
</style> </style>
@ -1562,7 +1566,8 @@ Filename omitted Line 48:
<text>Records not imported into INDI (individual) Gramps ID I0016: <text>Records not imported into INDI (individual) Gramps ID I0016:
Warn: ADDR overwritten Line 204: 3 ADR1 456 Main St again 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"> <style name="fontface" value="Monospace">
<range start="0" end="304"/> <range start="0" end="304"/>
</style> </style>
@ -1573,7 +1578,8 @@ ADDR element ignored '459 Main St.' Line 202:
<note handle="_0000004700000047" change="1" id="N0014" type="GEDCOM import"> <note handle="_0000004700000047" change="1" id="N0014" type="GEDCOM import">
<text>Records not imported into INDI (individual) Gramps ID I0018: <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"> <style name="fontface" value="Monospace">
<range start="0" end="165"/> <range start="0" end="165"/>
</style> </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"> <note handle="_000000cf000000cf" change="1" id="N0021" type="GEDCOM import">
<text>Records not imported into FAM (family) Gramps ID F0010: <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"> <style name="fontface" value="Monospace">
<range start="0" end="146"/> <range start="0" end="146"/>
</style> </style>
@ -1613,7 +1620,8 @@ Tag recognized but not supported Line 863:
<text>Records not imported into FAM (family) Gramps ID F0011: <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 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"> <style name="fontface" value="Monospace">
<range start="0" end="233"/> <range start="0" end="233"/>
</style> </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"> <note handle="_000000d9000000d9" change="1" id="N0023" type="GEDCOM import">
<text>Records not imported into FAM (family) Gramps ID F0012: <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"> <style name="fontface" value="Monospace">
<range start="0" end="145"/> <range start="0" end="145"/>
</style> </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"> <note handle="_000000e4000000e4" change="1" id="N0024" type="GEDCOM import">
<text>Records not imported into FAM (family) Gramps ID F0008: <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"> <style name="fontface" value="Monospace">
<range start="0" end="183"/> <range start="0" end="183"/>
</style> </style>
@ -1653,7 +1663,8 @@ Tag recognized but not supported Line 1005:
<text>Records not imported into SOUR (source) Gramps ID S0003: <text>Records not imported into SOUR (source) Gramps ID S0003:
Tag recognized but not supported Line 1045: 1 DATA 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"> <style name="fontface" value="Monospace">
<range start="0" end="252"/> <range start="0" end="252"/>
</style> </style>
@ -1669,7 +1680,8 @@ Skipped subordinate line Line 1046:
REFN ignored Line 1075: 3 REFN blah blah REFN ignored Line 1075: 3 REFN blah blah
Skipped subordinate line Line 1076: 4 TYPE who knows 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"> <style name="fontface" value="Monospace">
<range start="0" end="344"/> <range start="0" end="344"/>
</style> </style>
@ -1677,7 +1689,8 @@ Could not import Attic_photo.jpg Line 1079:
<note handle="_000000f6000000f6" change="1" id="N0034" type="GEDCOM import"> <note handle="_000000f6000000f6" change="1" id="N0034" type="GEDCOM import">
<text>Records not imported into Top Level: <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"> <style name="fontface" value="Monospace">
<range start="0" end="152"/> <range start="0" end="152"/>
</style> </style>
@ -1685,12 +1698,13 @@ Unknown tag Line 1106:
<note handle="_000000f8000000f8" change="1" id="N0035" type="GEDCOM import"> <note handle="_000000f8000000f8" change="1" id="N0035" type="GEDCOM import">
<text>Records not imported into Top Level: <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"> <style name="fontface" value="Monospace">
<range start="0" end="163"/> <range start="0" end="163"/>
</style> </style>
</note> </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> <text>Objects referenced by this note were missing in a file imported on 12/25/1999 12:00:00 AM.</text>
</note> </note>
</notes> </notes>

View File

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

View File

@ -7,7 +7,7 @@
<researcher> <researcher>
<resname>Alex Roitman,,,</resname> <resname>Alex Roitman,,,</resname>
</researcher> </researcher>
<mediapath>{GRAMPS_RESOURCES}/example/gramps</mediapath> <mediapath>{GRAMPS_RESOURCES}/doc/gramps/example/gramps</mediapath>
</header> </header>
<name-formats> <name-formats>
<format number="-1" name="SURNAME, Given (Common)" fmt_str="SURNAME, given (common)" active="1"/> <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.street = street
self.reverse = reverse 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.place_formats = []
self.default_format = config.get('preferences.place-format') self.default_format = config.get('preferences.place-format')
if os.path.exists(PLACE_FORMATS): if os.path.exists(PLACE_FORMATS):
self.load_formats() try:
else: self.load_formats()
pf = PlaceFormat(_('Full'), ':', '', 0, False) return
self.place_formats.append(pf) 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): def display_event(self, db, event, fmt=-1):
if not event: if not event:
@ -164,12 +162,20 @@ class PlaceDisplay:
dom.unlink() dom.unlink()
def save_formats(self): def save_formats(self):
with open(PLACE_FORMATS, 'w') as fd: doc = xml.dom.minidom.Document()
fd.write('<?xml version="1.0" encoding="utf-8"?>\n') place_formats = doc.createElement('place_formats')
fd.write('<place_formats>\n') doc.appendChild(place_formats)
for fmt in self.place_formats: for fmt in self.place_formats:
fd.write(fmt.to_xml()) node = doc.createElement('format')
fd.write('</place_formats>\n') 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): def _get_offset(value, index):
if index is not None and value.startswith('p'): if index is not None and value.startswith('p'):

View File

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

View File

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

View File

@ -133,7 +133,8 @@ class MergeFamilyQuery:
old_handle = self.titanic.get_handle() old_handle = self.titanic.get_handle()
with DbTxn(_('Merge Family'), self.database) as trans: 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 != self.titanic_fh:
if self.phoenix_fh: if self.phoenix_fh:
phoenix_father = self.database.get_person_from_handle( phoenix_father = self.database.get_person_from_handle(
@ -161,6 +162,8 @@ class MergeFamilyQuery:
titanic_mother = None titanic_mother = None
self.merge_person(phoenix_mother, titanic_mother, self.merge_person(phoenix_mother, titanic_mother,
'mother', trans) '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.phoenix = self.database.get_family_from_handle(new_handle)
self.titanic = self.database.get_family_from_handle(old_handle) self.titanic = self.database.get_family_from_handle(old_handle)
@ -174,8 +177,6 @@ class MergeFamilyQuery:
self.phoenix_mh) self.phoenix_mh)
else: else:
phoenix_mother = None 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.phoenix.merge(self.titanic)
self.database.commit_family(self.phoenix, trans) self.database.commit_family(self.phoenix, trans)
for childref in self.titanic.get_child_ref_list(): 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) tmp_pdf_piece = "%s_%d_%d.pdf" % (tmp_ps, __x, __y)
list_of_pieces.append(tmp_pdf_piece) list_of_pieces.append(tmp_pdf_piece)
# Generate Ghostscript code # Generate Ghostscript code
command = '%s -q -dBATCH -dNOPAUSE -dSAFER -g%dx%d '\ command = '%s -q -dBATCH -dNOPAUSE -dSAFER '\
'-sOutputFile="%s" -r72 -sDEVICE=pdfwrite '\ '-dDEVICEWIDTHPOINTS=%d -dDEVICEHEIGHTPOINTS=%d '\
'-sOutputFile="%s" -sDEVICE=pdfwrite '\
'-c "<</.HWMargins [%d %d %d %d] /PageOffset [%d %d]>> '\ '-c "<</.HWMargins [%d %d %d %d] /PageOffset [%d %d]>> '\
'setpagedevice" -f "%s"' % ( 'setpagedevice" -f "%s"' % (
_GS_CMD, width_pt + 10, height_pt + 10, tmp_pdf_piece, _GS_CMD, width_pt + 10, height_pt + 10, tmp_pdf_piece,
@ -1002,7 +1003,7 @@ class GVPdfGsDoc(GVDocBase):
os.system(command) os.system(command)
# Merge pieces to single multipage PDF ; # Merge pieces to single multipage PDF ;
command = '%s -q -dBATCH -dNOPAUSE '\ command = '%s -q -dBATCH -dNOPAUSE '\
'-sOUTPUTFILE="%s" -r72 -sDEVICE=pdfwrite %s '\ '-sOUTPUTFILE="%s" -sDEVICE=pdfwrite %s '\
% (_GS_CMD, self._filename, ' '.join(list_of_pieces)) % (_GS_CMD, self._filename, ' '.join(list_of_pieces))
os.system(command) os.system(command)

View File

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

View File

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

View File

@ -92,6 +92,10 @@ class PersonEventEmbedList(EventEmbedList):
self._data.append(family.get_event_ref_list()) self._data.append(family.get_event_ref_list())
self._groups.append((family_handle, self._FAMNAME, self._groups.append((family_handle, self._FAMNAME,
groupname)) 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 self.changed = False
return self._data return self._data

View File

@ -38,13 +38,15 @@ from gramps.gen.errors import WindowActiveError
from ...ddtargets import DdTargets from ...ddtargets import DdTargets
from .personrefmodel import PersonRefModel from .personrefmodel import PersonRefModel
from .embeddedlist import EmbeddedList, TEXT_COL, MARKUP_COL, ICON_COL from .embeddedlist import EmbeddedList, TEXT_COL, MARKUP_COL, ICON_COL
from ...dbguielement import DbGUIElement
#------------------------------------------------------------------------- #-------------------------------------------------------------------------
# #
# #
# #
#------------------------------------------------------------------------- #-------------------------------------------------------------------------
class PersonRefEmbedList(EmbeddedList): class PersonRefEmbedList(DbGUIElement, EmbeddedList):
_HANDLE_COL = 4 _HANDLE_COL = 4
_DND_TYPE = DdTargets.PERSONREF _DND_TYPE = DdTargets.PERSONREF
@ -69,15 +71,61 @@ class PersonRefEmbedList(EmbeddedList):
def __init__(self, dbstate, uistate, track, data): def __init__(self, dbstate, uistate, track, data):
self.data = data self.data = data
DbGUIElement.__init__(self, dbstate.db)
EmbeddedList.__init__(self, dbstate, uistate, track, EmbeddedList.__init__(self, dbstate, uistate, track,
_('_Associations'), PersonRefModel, _('_Associations'), PersonRefModel,
move_buttons=True) 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): def get_ref_editor(self):
from .. import EditPersonRef from .. import EditPersonRef
return EditPersonRef return EditPersonRef
def get_data(self): def get_data(self):
self.callman.register_handles(
{'person': [pref.ref for pref in self.data]})
return self.data return self.data
def column_order(self): def column_order(self):

View File

@ -40,13 +40,15 @@ from ...ddtargets import DdTargets
from .placerefmodel import PlaceRefModel from .placerefmodel import PlaceRefModel
from .embeddedlist import EmbeddedList, TEXT_COL from .embeddedlist import EmbeddedList, TEXT_COL
from ...selectors import SelectorFactory from ...selectors import SelectorFactory
from ...dbguielement import DbGUIElement
#------------------------------------------------------------------------- #-------------------------------------------------------------------------
# #
# #
# #
#------------------------------------------------------------------------- #-------------------------------------------------------------------------
class PlaceRefEmbedList(EmbeddedList): class PlaceRefEmbedList(DbGUIElement, EmbeddedList):
_HANDLE_COL = 4 _HANDLE_COL = 4
_DND_TYPE = DdTargets.PLACEREF _DND_TYPE = DdTargets.PLACEREF
@ -65,11 +67,57 @@ class PlaceRefEmbedList(EmbeddedList):
self.data = data self.data = data
self.handle = handle self.handle = handle
self.callback = callback self.callback = callback
DbGUIElement.__init__(self, dbstate.db)
EmbeddedList.__init__(self, dbstate, uistate, track, EmbeddedList.__init__(self, dbstate, uistate, track,
_('Enclosed By'), PlaceRefModel, _('Enclosed By'), PlaceRefModel,
share_button=True, move_buttons=True) 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): def get_data(self):
self.callman.register_handles(
{'place': [pref.ref for pref in self.data]})
return self.data return self.data
def column_order(self): 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-rebuild', self._do_close)
self._add_db_signal('citation-delete', self.check_for_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): def _setup_fields(self):
""" """
@ -269,6 +271,26 @@ class EditCitation(EditPrimary):
author = '' author = ''
self.glade.get_object("author").set_text(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): def build_menu_names(self, source):
""" """
Provide the information needed by the base class to define the 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-rebuild', self._do_close)
self._add_db_signal('event-delete', self.check_for_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): def _setup_fields(self):
@ -301,6 +303,24 @@ class EditEvent(EditPrimary):
cmp_obj = self.empty_object() cmp_obj = self.empty_object()
return cmp_obj.serialize(True)[1:] != self.obj.serialize()[1:] 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 # 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-rebuild', self.close)
self._add_db_signal('event-delete', self.check_for_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): def _setup_fields(self):
@ -279,3 +281,20 @@ class EditEventRef(EditReference):
self.update(self.source_ref,self.source) self.update(self.source_ref,self.source)
self.close() 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 ..selectors import SelectorFactory
from gramps.gen.utils.id import create_id from gramps.gen.utils.id import create_id
from gramps.gen.const import URL_MANUAL_SECT1 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 _LEFT_BUTTON = 1
_RIGHT_BUTTON = 3 _RIGHT_BUTTON = 3
class ChildEmbedList(EmbeddedList):
class ChildEmbedList(DbGUIElement, EmbeddedList):
""" """
The child embed list is specific to the Edit Family dialog, so it The child embed list is specific to the Edit Family dialog, so it
is contained here instead of in displaytabs. is contained here instead of in displaytabs.
@ -139,9 +141,54 @@ class ChildEmbedList(EmbeddedList):
Create the object, storing the passed family value Create the object, storing the passed family value
""" """
self.family = family self.family = family
DbGUIElement.__init__(self, dbstate.db)
EmbeddedList.__init__(self, dbstate, uistate, track, _('Chil_dren'), EmbeddedList.__init__(self, dbstate, uistate, track, _('Chil_dren'),
ChildModel, share_button=True, move_buttons=True) 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): def get_popup_menu_items(self):
return [ return [
(False, _('Edit child'), self.edit_child_button_clicked), (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 Normally, get_data returns a list. However, we return family
object here instead. 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): def column_order(self):
return [(1, 13), (1, 0), (1, 1), (1, 2), (1, 3), (1, 4), (1, 5), (1, 6), 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) name.set_primary_surname(0)
if self.family: if self.family:
father_handle = self.family.get_father_handle() 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() 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) if
mother = self.dbstate.db.get_person_from_handle(mother_handle) mother_handle else None)
if not father and not mother: if not father and not mother:
return name return name
if not father: if not father:
@ -411,11 +463,22 @@ class EditFamily(EditPrimary):
'event-update': self.topdata_updated, # change eg birth event fath 'event-update': self.topdata_updated, # change eg birth event fath
'event-rebuild': self.topdata_updated, 'event-rebuild': self.topdata_updated,
'event-delete': self.topdata_updated, # delete eg birth event fath '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, 'person-rebuild': self._do_close,
}) })
self.callman.connect_all(keys=['family', 'event', 'person']) 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): def check_for_family_change(self, handles):
""" """
Callback for family-update signal Callback for family-update signal

View File

@ -245,12 +245,13 @@ class EditMedia(EditPrimary):
self.view_media(obj) self.view_media(obj)
def view_media(self, 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: if ref_obj:
media_path = media_path_full(self.dbstate.db, media_path = media_path_full(self.dbstate.db,
ref_obj.get_path()) ref_obj.get_path())
open_file_with_default_application(media_path, self.uistate) open_file_with_default_application(media_path, self.uistate)
def select_file(self, val): def select_file(self, val):
self.determine_mime() 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-delete', self.family_change)
self._add_db_signal('family-update', 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('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-rebuild', self.event_updated)
self._add_db_signal('event-delete', self.event_updated)
def family_change(self, handle_list=[]): def family_change(self, handle_list=[]):
""" """

View File

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

View File

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

View File

@ -150,9 +150,6 @@ class MergeCitation(ManagedWindow):
else: else:
phoenix = self.citation2 phoenix = self.citation2
titanic = self.citation1 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: if self.get_widget("page_btn1").get_active() ^ use_handle1:
phoenix.set_page(titanic.get_page()) phoenix.set_page(titanic.get_page())
@ -165,5 +162,8 @@ class MergeCitation(ManagedWindow):
query = MergeCitationQuery(self.dbstate, phoenix, titanic) query = MergeCitationQuery(self.dbstate, phoenix, titanic)
query.execute() 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.uistate.set_busy_cursor(False)
self.close() self.close()

View File

@ -167,9 +167,6 @@ class MergeEvent(ManagedWindow):
else: else:
phoenix = self.ev2 phoenix = self.ev2
titanic = self.ev1 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: if self.get_widget("type_btn1").get_active() ^ use_handle1:
phoenix.set_type(titanic.get_type()) phoenix.set_type(titanic.get_type())
@ -185,5 +182,8 @@ class MergeEvent(ManagedWindow):
query = MergeEventQuery(self.dbstate, phoenix, titanic) query = MergeEventQuery(self.dbstate, phoenix, titanic)
query.execute() 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.uistate.set_busy_cursor(False)
self.close() self.close()

View File

@ -203,9 +203,6 @@ class MergeFamily(ManagedWindow):
else: else:
phoenix = self.fy2 phoenix = self.fy2
titanic = self.fy1 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_fh = phoenix.get_father_handle()
phoenix_mh = phoenix.get_mother_handle() phoenix_mh = phoenix.get_mother_handle()
@ -223,6 +220,9 @@ class MergeFamily(ManagedWindow):
query = MergeFamilyQuery(self.database, phoenix, titanic, query = MergeFamilyQuery(self.database, phoenix, titanic,
phoenix_fh, phoenix_mh) phoenix_fh, phoenix_mh)
query.execute() 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: except MergeError as err:
ErrorDialog(_("Cannot merge people"), str(err), ErrorDialog(_("Cannot merge people"), str(err),
parent=self.window) parent=self.window)

View File

@ -147,9 +147,6 @@ class MergeMedia(ManagedWindow):
else: else:
phoenix = self.mo2 phoenix = self.mo2
titanic = self.mo1 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: if self.get_widget("path_btn1").get_active() ^ use_handle1:
phoenix.set_path(titanic.get_path()) phoenix.set_path(titanic.get_path())
@ -163,4 +160,7 @@ class MergeMedia(ManagedWindow):
query = MergeMediaQuery(self.dbstate, phoenix, titanic) query = MergeMediaQuery(self.dbstate, phoenix, titanic)
query.execute() 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() self.close()

View File

@ -159,9 +159,6 @@ class MergeNote(ManagedWindow):
else: else:
phoenix = self.no2 phoenix = self.no2
titanic = self.no1 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: if self.get_widget("text_btn1").get_active() ^ use_handle1:
phoenix.set_styledtext(titanic.get_styledtext()) phoenix.set_styledtext(titanic.get_styledtext())
@ -174,4 +171,7 @@ class MergeNote(ManagedWindow):
query = MergeNoteQuery(self.dbstate, phoenix, titanic) query = MergeNoteQuery(self.dbstate, phoenix, titanic)
query.execute() 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() self.close()

View File

@ -321,9 +321,6 @@ class MergePerson(ManagedWindow):
else: else:
phoenix = self.pr2 phoenix = self.pr2
titanic = self.pr1 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: if self.get_widget("name_btn1").get_active() ^ use_handle1:
swapname = phoenix.get_primary_name() swapname = phoenix.get_primary_name()
@ -347,6 +344,9 @@ class MergePerson(ManagedWindow):
"handle. We recommend that you go to Relationships " "handle. We recommend that you go to Relationships "
"view and see if additional manual merging of families " "view and see if additional manual merging of families "
"is necessary."), parent=self.window) "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: except MergeError as err:
ErrorDialog(_("Cannot merge people"), str(err), ErrorDialog(_("Cannot merge people"), str(err),
parent=self.window) parent=self.window)

View File

@ -197,9 +197,6 @@ class MergePlace(ManagedWindow):
else: else:
phoenix = self.pl2 phoenix = self.pl2
titanic = self.pl1 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: if self.get_widget("title_btn1").get_active() ^ use_handle1:
phoenix.set_title(titanic.get_title()) phoenix.set_title(titanic.get_title())
@ -218,6 +215,9 @@ class MergePlace(ManagedWindow):
query = MergePlaceQuery(self.dbstate, phoenix, titanic) query = MergePlaceQuery(self.dbstate, phoenix, titanic)
query.execute() 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: if self.callback:
self.callback() self.callback()

View File

@ -140,9 +140,6 @@ class MergeRepository(ManagedWindow):
else: else:
phoenix = self.rp2 phoenix = self.rp2
titanic = self.rp1 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: if self.get_widget("name_btn1").get_active() ^ use_handle1:
phoenix.set_name(titanic.get_name()) phoenix.set_name(titanic.get_name())
@ -153,5 +150,8 @@ class MergeRepository(ManagedWindow):
query = MergeRepositoryQuery(self.dbstate, phoenix, titanic) query = MergeRepositoryQuery(self.dbstate, phoenix, titanic)
query.execute() 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.uistate.set_busy_cursor(False)
self.close() self.close()

View File

@ -159,9 +159,6 @@ class MergeSource(ManagedWindow):
else: else:
phoenix = self.src2 phoenix = self.src2
titanic = self.src1 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: if self.get_widget("title_btn1").get_active() ^ use_handle1:
phoenix.set_title(titanic.get_title()) phoenix.set_title(titanic.get_title())
@ -176,5 +173,8 @@ class MergeSource(ManagedWindow):
query = MergeSourceQuery(self.dbstate, phoenix, titanic) query = MergeSourceQuery(self.dbstate, phoenix, titanic)
query.execute() 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.uistate.set_busy_cursor(False)
self.close() self.close()

View File

@ -586,7 +586,7 @@ class TreeBaseModel(GObject.GObject, Gtk.TreeModel, BaseModel):
assert not skip assert not skip
if dfilter: if dfilter:
cdb = CacheProxyDb(self.db) cdb = CacheProxyDb(self.db)
for handle in dfilter.apply(cdb, for handle in dfilter.apply(cdb, tree=True,
user=User(parent=self.uistate.window)): user=User(parent=self.uistate.window)):
status_ppl.heartbeat() status_ppl.heartbeat()
data = data_map(handle) 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.libformatting import FormattingHelper
from gramps.gen.utils.db import (find_children, find_parents, find_witnessed_people, from gramps.gen.utils.db import (find_children, find_parents, find_witnessed_people,
get_age, get_timeperiod, preset_name) 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 GRAMPS_LOCALE as glocale
from gramps.gen.const import ( from gramps.gen.const import (
PIXELS_PER_GENERATION, 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): def draw_radial_text(self, cr, text, radiusin, radiusout, start_rad, stop_rad, font, flipped):
layout = self.create_pango_layout(text) layout = self.create_pango_layout(text)
if is_quartz():
PangoCairo.context_set_resolution(layout.get_context(), 72)
layout.set_font_description(font) layout.set_font_description(font)
layout.set_wrap(Pango.WrapMode.WORD_CHAR) 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. Text not fitting a single line will be char-wrapped away.
""" """
layout = self.create_pango_layout(text) layout = self.create_pango_layout(text)
if is_quartz():
PangoCairo.context_set_resolution(layout.get_context(), 72)
layout.set_font_description(font) layout.set_font_description(font)
layout.set_wrap(Pango.WrapMode.WORD_CHAR) 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.set_source_rgb(color[0], color[1], color[2])
cr.fill() cr.fill()
layout = self.create_pango_layout(text) layout = self.create_pango_layout(text)
if is_quartz():
PangoCairo.context_set_resolution(layout.get_context(), 72)
layout.set_font_description(font) layout.set_font_description(font)
cr.move_to(startw+gradwidth+4, starth) cr.move_to(startw+gradwidth+4, starth)
cr.set_source_rgb(0, 0, 0) #black 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. 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() 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): def get_name_group_mapping(self, key):
""" """
@ -341,7 +343,8 @@ class DBAPI(DbGeneric):
self.dbapi.execute( self.dbapi.execute(
"SELECT grouping FROM name_group WHERE name = ?", [key]) "SELECT grouping FROM name_group WHERE name = ?", [key])
row = self.dbapi.fetchone() 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] return row[0]
else: else:
return key return key
@ -566,7 +569,7 @@ class DBAPI(DbGeneric):
self.dbapi.execute("SELECT grouping FROM name_group WHERE name = ?", self.dbapi.execute("SELECT grouping FROM name_group WHERE name = ?",
[key]) [key])
row = self.dbapi.fetchone() 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): 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 = ?", self.dbapi.execute("SELECT 1 FROM name_group WHERE name = ?",
[name]) [name])
row = self.dbapi.fetchone() row = self.dbapi.fetchone()
if row: if row and grouping is not None:
self.dbapi.execute("UPDATE name_group SET grouping=? " self.dbapi.execute("UPDATE name_group SET grouping=? "
"WHERE name = ?", [grouping, name]) "WHERE name = ?", [grouping, name])
elif row and grouping is None:
self.dbapi.execute("DELETE FROM name_group WHERE name = ?", [name])
grouping = ''
else: else:
self.dbapi.execute( self.dbapi.execute(
"INSERT INTO name_group (name, grouping) VALUES (?, ?)", "INSERT INTO name_group (name, grouping) VALUES (?, ?)",
[name, grouping]) [name, grouping])
self._txn_commit() self._txn_commit()
self.emit('person-groupname-rebuild', (name, grouping))
def _commit_base(self, obj, obj_key, trans, change_time): def _commit_base(self, obj, obj_key, trans, change_time):
""" """

View File

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

View File

@ -538,7 +538,6 @@ class RecurseDown:
spouse_handle = utils.find_spouse(person, family) spouse_handle = utils.find_spouse(person, family)
if (self.max_spouses > s_level and if (self.max_spouses > s_level and
spouse_handle and
spouse_handle not in self.families_seen): spouse_handle not in self.families_seen):
def _spouse_box(who): def _spouse_box(who):
return self.add_person_box((x_level, s_level+1), 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 = { QUALITY_MAP = {
Citation.CONF_VERY_HIGH : "3", Citation.CONF_VERY_HIGH : "3",
Citation.CONF_HIGH : "2", Citation.CONF_HIGH : "2",
@ -1467,8 +1458,7 @@ class GedcomWriter(UpdateCallback):
gramps_id = media.get_gramps_id() gramps_id = media.get_gramps_id()
self._writeln(0, '@%s@' % gramps_id, 'OBJE') self._writeln(0, '@%s@' % gramps_id, 'OBJE')
mime = media.get_mime_type() form = os.path.splitext(media.get_path())[1][1:]
form = MIME2GED.get(mime, mime)
path = media_path_full(self.dbase, media.get_path()) path = media_path_full(self.dbase, media.get_path())
self._writeln(1, 'FILE', path, limit=255) self._writeln(1, 'FILE', path, limit=255)
if form: if form:

View File

@ -61,9 +61,9 @@ from gramps.gen.plug.menu import (NumberOption, ColorOption, BooleanOption,
EnumeratedListOption, PersonListOption, EnumeratedListOption, PersonListOption,
SurnameColorOption) SurnameColorOption)
from gramps.gen.utils.db import get_birth_or_fallback, get_death_or_fallback 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.proxy import CacheProxyDb
from gramps.gen.errors import ReportError 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: if place_handle:
place = self._db.get_place_from_handle(place_handle) place = self._db.get_place_from_handle(place_handle)
if place: if place:
location = get_main_location(self._db, place) place_text = _pd.display(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 = place_text.replace('<', '&#60;') place_text = place_text.replace('<', '&#60;')
place_text = place_text.replace('>', '&#62;') place_text = place_text.replace('>', '&#62;')
return place_text return place_text

View File

@ -494,13 +494,13 @@ class RelGraphReport(Report):
self.doc.start_subgraph(fam_id) self.doc.start_subgraph(fam_id)
f_handle = fam.get_father_handle() f_handle = fam.get_father_handle()
m_handle = fam.get_mother_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) father = self._db.get_person_from_handle(f_handle)
self.doc.add_link(father.get_gramps_id(), self.doc.add_link(father.get_gramps_id(),
fam_id, "", fam_id, "",
self.arrowheadstyle, self.arrowheadstyle,
self.arrowtailstyle) self.arrowtailstyle)
if m_handle: if m_handle in self.persons:
mother = self._db.get_person_from_handle(m_handle) mother = self._db.get_person_from_handle(m_handle)
self.doc.add_link(mother.get_gramps_id(), self.doc.add_link(mother.get_gramps_id(),
fam_id, "", fam_id, "",

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -26,10 +26,6 @@ environ['PANGO_SYSCONFDIR'] = bundle_etc
environ['PANGO_LIBDIR'] = bundle_lib environ['PANGO_LIBDIR'] = bundle_lib
environ['GDK_PIXBUF_MODULE_FILE'] = join(bundle_lib, 'gdk-pixbuf-2.0', environ['GDK_PIXBUF_MODULE_FILE'] = join(bundle_lib, 'gdk-pixbuf-2.0',
'2.10.0', 'loaders.cache') '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['GI_TYPELIB_PATH'] = join(bundle_lib, 'girepository-1.0')
environ['GVBINDIR'] = join(bundle_lib, 'graphviz') environ['GVBINDIR'] = join(bundle_lib, 'graphviz')
environ['ENCHANT_MODULE_PATH'] = join(bundle_lib, 'enchant') 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. # This file is distributed under the same license as the Gramps package.
# Radek Malcic <malcic@atlas.cz>, 2004 # Radek Malcic <malcic@atlas.cz>, 2004
# Jiří Pejchal <jiri.pejchal@gmail.com>, 2005 # 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: # Common terms and translations:
# ancestor předek # ancestor předek
@ -37,8 +37,8 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: gramps 3.3.x\n" "Project-Id-Version: gramps 3.3.x\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-07-24 14:13+0100\n" "POT-Creation-Date: 2018-12-26 11:20-0600\n"
"PO-Revision-Date: 2018-12-22 16:24+0100\n" "PO-Revision-Date: 2019-01-11 18:01+0100\n"
"Last-Translator: Zdeněk Hataš <zdenek.hatas@gmail.com>\n" "Last-Translator: Zdeněk Hataš <zdenek.hatas@gmail.com>\n"
"Language-Team: Czech <Czech <gnome-cs-list@gnome.org>>\n" "Language-Team: Czech <Czech <gnome-cs-list@gnome.org>>\n"
"Language: cs\n" "Language: cs\n"
@ -899,6 +899,15 @@ msgstr ""
"uložit jako webové stránky. Celou databázi, vybrané rodiny nebo jedince lze " "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." "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 #: ../data/tips.xml.in.h:46
msgid "" msgid ""
"<b>Reporting Bugs in Gramps</b><br/>The best way to report a bug in Gramps " "<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" msgid "No description"
msgstr "Bez popisu" 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 #: ../gramps/gen/filters/rules/citation/_allcitations.py:45
msgid "Every citation" msgid "Every citation"
msgstr "Všechny citace" msgstr "Všechny citace"
@ -18127,6 +18145,10 @@ msgstr "Zkopírovat vše"
msgid "See data not in Filter" msgid "See data not in Filter"
msgstr "Zobrazit data mimo filtr" 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 #: ../gramps/gui/plug/report/_bookdialog.py:166
msgid "Available Books" msgid "Available Books"
msgstr "Dostupné knihy" msgstr "Dostupné knihy"
@ -18450,6 +18472,10 @@ msgstr "výchozí"
msgid "Document Styles" msgid "Document Styles"
msgstr "Styly dokumentu" 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 #: ../gramps/gui/plug/report/_styleeditor.py:140
msgid "New Style" msgid "New Style"
msgstr "Nový styl" msgstr "Nový styl"
@ -18476,6 +18502,10 @@ msgstr "Vyberte styl"
msgid "Style editor" msgid "Style editor"
msgstr "Editor stylů" 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:341
#: ../gramps/gui/plug/report/_styleeditor.py:369 #: ../gramps/gui/plug/report/_styleeditor.py:369
#: ../gramps/gui/plug/report/_styleeditor.py:387 #: ../gramps/gui/plug/report/_styleeditor.py:387
@ -18597,6 +18627,10 @@ msgstr "Vybrat mediální objekt"
msgid "manual|Select_Child_selector" msgid "manual|Select_Child_selector"
msgstr "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 #: ../gramps/gui/selectors/selectperson.py:56
msgid "manual|Select_Father_selector" msgid "manual|Select_Father_selector"
msgstr "Select_Father_selector" msgstr "Select_Father_selector"
@ -18621,10 +18655,18 @@ msgstr "Repositories"
msgid "Select Repository" msgid "Select Repository"
msgstr "Vybrat archiv" msgstr "Vybrat archiv"
#: ../gramps/gui/selectors/selectrepository.py:75
msgid "manual|Select_Repository_selector"
msgstr "Select_Repository_selector"
#: ../gramps/gui/selectors/selectsource.py:62 #: ../gramps/gui/selectors/selectsource.py:62
msgid "Select Source" msgid "Select Source"
msgstr "Vybrat pramen" msgstr "Vybrat pramen"
#: ../gramps/gui/selectors/selectsource.py:76
msgid "manual|Select_Source_selector"
msgstr "Select_Source_selector"
#: ../gramps/gui/spell.py:92 #: ../gramps/gui/spell.py:92
msgid "Off" msgid "Off"
msgstr "Vyp" msgstr "Vyp"
@ -19600,6 +19642,10 @@ msgstr ""
msgid "Progress Information" msgid "Progress Information"
msgstr "Informace o průběhu" 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 #: ../gramps/gui/widgets/reorderfam.py:79
msgid "Reorder Relationships" msgid "Reorder Relationships"
msgstr "Přeskupit vazby" msgstr "Přeskupit vazby"
@ -21789,6 +21835,10 @@ msgstr "EMAIL"
msgid "WWW" msgid "WWW"
msgstr "WWW" msgstr "WWW"
#: ../gramps/plugins/export/exportgedcom.py:1438
msgid "Writing media"
msgstr "Zapisují se média"
#: ../gramps/plugins/export/exportgedcom.py:1570 #: ../gramps/plugins/export/exportgedcom.py:1570
msgid "GEDCOM Export failed" msgid "GEDCOM Export failed"
msgstr "Export GEDCOM selhal" msgstr "Export GEDCOM selhal"
@ -23416,6 +23466,10 @@ msgstr "Upravit vybranou poznámku k úkolu"
msgid "Add a new To Do note" msgid "Add a new To Do note"
msgstr "Přidat novou poznámku k úkolu" 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 #: ../gramps/plugins/gramplet/todogramplet.py:149
msgid "Unattached" msgid "Unattached"
msgstr "Nepřipojen" msgstr "Nepřipojen"
@ -32649,6 +32703,10 @@ msgstr "Správce médií..."
msgid "Media Manager" msgid "Media Manager"
msgstr "Správce médií" 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/tool/mediamanager.py:97
#: ../gramps/plugins/webreport/basepage.py:1483 #: ../gramps/plugins/webreport/basepage.py:1483
#: ../gramps/plugins/webreport/basepage.py:1606 #: ../gramps/plugins/webreport/basepage.py:1606
@ -40080,3 +40138,4 @@ msgstr "Správce médií"
#~ msgid "Password:" #~ msgid "Password:"
#~ msgstr "Heslo:" #~ msgstr "Heslo:"

View File

@ -37389,3 +37389,4 @@ msgstr "Mediehåndtering"
#~ msgid "Applying Person Filter..." #~ msgid "Applying Person Filter..."
#~ msgstr "Anvender Personfilter..." #~ 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 "" msgstr ""
"Project-Id-Version: Gramps_5_fi\n" "Project-Id-Version: Gramps_5_fi\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-11-29 06:08+0200\n" "POT-Creation-Date: 2019-01-02 11:13+0200\n"
"PO-Revision-Date: 2018-11-29 06:48+0200\n" "PO-Revision-Date: 2019-01-05 07:31+0200\n"
"Last-Translator: Matti Niemelä <niememat@gmail.com>\n" "Last-Translator: Matti Niemelä <niememat@gmail.com>\n"
"Language-Team: suomi <niememat@gmail.com>\n" "Language-Team: suomi <niememat@gmail.com>\n"
"Language: fi\n" "Language: fi\n"
@ -19292,6 +19292,11 @@ msgstr "Kopioi kaikki"
msgid "See data not in Filter" msgid "See data not in Filter"
msgstr "Valitse tiedot joihin suodin on kohdistunut" 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 #: ../gramps/gui/plug/report/_bookdialog.py:166
msgid "Available Books" msgid "Available Books"
msgstr "Valmiit kirjamallit" msgstr "Valmiit kirjamallit"
@ -19630,6 +19635,11 @@ msgstr "oletus"
msgid "Document Styles" msgid "Document Styles"
msgstr "Asiakirjatyylit" 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 #: ../gramps/gui/plug/report/_styleeditor.py:140
msgid "New Style" msgid "New Style"
msgstr "Uusi tyyli" msgstr "Uusi tyyli"
@ -19653,10 +19663,16 @@ msgstr "Puuttuvat tiedot"
msgid "Select a style" msgid "Select a style"
msgstr "Valitse tyyli" msgstr "Valitse tyyli"
#: ../gramps/gui/plug/report/_styleeditor.py:226 # 20181220
#: ../gramps/gui/plug/report/_styleeditor.py:298 #: ../gramps/gui/plug/report/_styleeditor.py:233
#: ../gramps/gui/plug/report/_styleeditor.py:308
msgid "Style editor" 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:341
#: ../gramps/gui/plug/report/_styleeditor.py:369 #: ../gramps/gui/plug/report/_styleeditor.py:369
@ -19807,6 +19823,11 @@ msgstr "Valitse mediatiedosto"
msgid "manual|Select_Child_selector" msgid "manual|Select_Child_selector"
msgstr "Valitse_lapsi_ikkuna" 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 # WIKI_HELP_SEC osa1
#: ../gramps/gui/selectors/selectperson.py:56 #: ../gramps/gui/selectors/selectperson.py:56
#: ../gramps/gui/selectors/selectperson.py:64 #: ../gramps/gui/selectors/selectperson.py:64
@ -19841,6 +19862,11 @@ msgstr "Arkistot"
msgid "Select Repository" msgid "Select Repository"
msgstr "Valitse arkisto" 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:62
#: ../gramps/gui/selectors/selectsource.py:59 #: ../gramps/gui/selectors/selectsource.py:59
msgid "Select Source" msgid "Select Source"
@ -20867,6 +20893,11 @@ msgstr ""
msgid "Progress Information" msgid "Progress Information"
msgstr "Edistymistietoja" 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 #: ../gramps/gui/widgets/reorderfam.py:79
msgid "Reorder Relationships" msgid "Reorder Relationships"
msgstr "Järjestä uudelleen suhteet" msgstr "Järjestä uudelleen suhteet"
@ -34633,6 +34664,11 @@ msgstr "Median_hallinta..."
msgid "Media Manager" msgid "Media Manager"
msgstr "Medianhallinta" msgstr "Medianhallinta"
# 20181220
#: ../gramps/plugins/tool/mediamanager.py:91
msgid "Help"
msgstr "_Ohjeet"
#: ../gramps/plugins/tool/mediamanager.py:97 #: ../gramps/plugins/tool/mediamanager.py:97
#: ../gramps/plugins/webreport/basepage.py:1483 #: ../gramps/plugins/webreport/basepage.py:1483
#: ../gramps/plugins/webreport/basepage.py:1606 #: ../gramps/plugins/webreport/basepage.py:1606
@ -39842,3 +39878,4 @@ msgstr ""
#~ msgid " " #~ msgid " "
#~ msgstr " " #~ 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 # Italian translation for GRAMPS
# This file is distributed under the same license as the Gramps package. # 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: # Common and noteworthy translations:
# #
@ -57,13 +57,13 @@
# #
# Marco Molteni <molter@gufi.org>, 2001-2002;. # Marco Molteni <molter@gufi.org>, 2001-2002;.
# Lorenzo Cappelletti <lorenzo.cappelletti@email.it>, 2003. # 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 "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: gramps\n" "Project-Id-Version: gramps\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-05-20 09:31-0500\n" "POT-Creation-Date: 2018-12-26 11:20-0600\n"
"PO-Revision-Date: 2018-07-15 16:38+0100\n" "PO-Revision-Date: 2019-02-10 16:07+0100\n"
"Last-Translator: Luigi Toscano <luigi.toscano@tiscali.it>\n" "Last-Translator: Luigi Toscano <luigi.toscano@tiscali.it>\n"
"Language-Team: Italian <tp@lists.linux.it>\n" "Language-Team: Italian <tp@lists.linux.it>\n"
"Language: it\n" "Language: it\n"
@ -3734,6 +3734,16 @@ msgstr "Altri filtri"
msgid "No description" msgid "No description"
msgstr "Nessuna descrizione" 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 #: ../gramps/gen/filters/rules/citation/_allcitations.py:45
msgid "Every citation" msgid "Every citation"
msgstr "Ogni citazione" msgstr "Ogni citazione"
@ -9599,7 +9609,7 @@ msgstr "Sopra"
#: ../gramps/gen/plug/docgen/treedoc.py:69 #: ../gramps/gen/plug/docgen/treedoc.py:69
msgid "Below" msgid "Below"
msgstr "Sotto:" msgstr "Sotto"
#: ../gramps/gen/plug/docgen/treedoc.py:70 #: ../gramps/gen/plug/docgen/treedoc.py:70
msgid "Not shown" msgid "Not shown"
@ -9755,7 +9765,7 @@ msgstr "Stile dei bordi"
#: ../gramps/gen/plug/docgen/treedoc.py:187 #: ../gramps/gen/plug/docgen/treedoc.py:187
msgid "Style of the edges between nodes." 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 #: ../gramps/gen/plug/docgen/treedoc.py:190
msgid "Level distance" msgid "Level distance"
@ -18123,6 +18133,11 @@ msgstr "Copia tutto"
msgid "See data not in Filter" msgid "See data not in Filter"
msgstr "Visualizzare dati non nel filtro" 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 #: ../gramps/gui/plug/report/_bookdialog.py:166
msgid "Available Books" msgid "Available Books"
msgstr "Libri disponibili" msgstr "Libri disponibili"
@ -18449,6 +18464,11 @@ msgstr "predefinito"
msgid "Document Styles" msgid "Document Styles"
msgstr "Stili documenti" 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 #: ../gramps/gui/plug/report/_styleeditor.py:140
msgid "New Style" msgid "New Style"
msgstr "Nuovo stile" msgstr "Nuovo stile"
@ -18475,6 +18495,11 @@ msgstr "Seleziona uno stile"
msgid "Style editor" msgid "Style editor"
msgstr "Editor stili" 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:341
#: ../gramps/gui/plug/report/_styleeditor.py:369 #: ../gramps/gui/plug/report/_styleeditor.py:369
#: ../gramps/gui/plug/report/_styleeditor.py:387 #: ../gramps/gui/plug/report/_styleeditor.py:387
@ -18605,6 +18630,11 @@ msgstr "Seleziona oggetto multimediale"
msgid "manual|Select_Child_selector" msgid "manual|Select_Child_selector"
msgstr "" msgstr ""
#: ../gramps/gui/selectors/selectperson.py:70
#, fuzzy
msgid "manual|Select_Person_selector"
msgstr "Fusione_luoghi"
#: ../gramps/gui/selectors/selectperson.py:56 #: ../gramps/gui/selectors/selectperson.py:56
msgid "manual|Select_Father_selector" msgid "manual|Select_Father_selector"
msgstr "" msgstr ""
@ -18631,10 +18661,20 @@ msgstr "Depositi"
msgid "Select Repository" msgid "Select Repository"
msgstr "Seleziona deposito" msgstr "Seleziona deposito"
#: ../gramps/gui/selectors/selectrepository.py:75
#, fuzzy
msgid "manual|Select_Repository_selector"
msgstr "Fusione_note"
#: ../gramps/gui/selectors/selectsource.py:62 #: ../gramps/gui/selectors/selectsource.py:62
msgid "Select Source" msgid "Select Source"
msgstr "Seleziona fonte" msgstr "Seleziona fonte"
#: ../gramps/gui/selectors/selectsource.py:76
#, fuzzy
msgid "manual|Select_Source_selector"
msgstr "Fusione_note"
#: ../gramps/gui/spell.py:92 #: ../gramps/gui/spell.py:92
msgid "Off" msgid "Off"
msgstr "Disattivato" msgstr "Disattivato"
@ -19605,6 +19645,11 @@ msgstr ""
msgid "Progress Information" msgid "Progress Information"
msgstr "Informazioni di avanzamento" 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 #: ../gramps/gui/widgets/reorderfam.py:79
msgid "Reorder Relationships" msgid "Reorder Relationships"
msgstr "Riordina relazioni" msgstr "Riordina relazioni"
@ -21715,6 +21760,11 @@ msgstr "EMAIL"
msgid "WWW" msgid "WWW"
msgstr "WWW" msgstr "WWW"
#: ../gramps/plugins/export/exportgedcom.py:1438
#, fuzzy
msgid "Writing media"
msgstr "Scrittura dati note"
#: ../gramps/plugins/export/exportgedcom.py:1570 #: ../gramps/plugins/export/exportgedcom.py:1570
msgid "GEDCOM Export failed" msgid "GEDCOM Export failed"
msgstr "Esportazione GEDCOM non riuscita" msgstr "Esportazione GEDCOM non riuscita"
@ -23374,6 +23424,11 @@ msgstr "Modifica la nota selezionata"
msgid "Add a new To Do note" msgid "Add a new To Do note"
msgstr "Aggiunge una nuova nota" 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 #: ../gramps/plugins/gramplet/todogramplet.py:149
msgid "Unattached" msgid "Unattached"
msgstr "Non allegato" msgstr "Non allegato"
@ -23389,6 +23444,9 @@ msgid ""
"powerful features.\n" "powerful features.\n"
"\n" "\n"
msgstr "" 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 #: ../gramps/plugins/gramplet/welcomegramplet.py:105
msgid "Links" msgid "Links"
@ -23427,6 +23485,11 @@ msgid ""
"powerful, yet easy to use.\n" "powerful, yet easy to use.\n"
"\n" "\n"
msgstr "" 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 #: ../gramps/plugins/gramplet/welcomegramplet.py:124
msgid "Getting Started" msgid "Getting Started"
@ -23440,6 +23503,11 @@ msgid ""
"For more details, please read the information at the links above\n" "For more details, please read the information at the links above\n"
"\n" "\n"
msgstr "" 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 #: ../gramps/plugins/gramplet/welcomegramplet.py:130
msgid "Dashboard View" msgid "Dashboard View"
@ -23456,6 +23524,17 @@ msgid ""
"can also drag the Properties button to reposition the gramplet on this page, " "can also drag the Properties button to reposition the gramplet on this page, "
"and detach the gramplet to float above Gramps." "and detach the gramplet to float above Gramps."
msgstr "" 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 #. 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. #. 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 #: ../gramps/plugins/tool/tools.gpr.py:309
msgid "Rebuild Gender Statistics" msgid "Rebuild Gender Statistics"
msgstr "Ricostrusci statistiche sui sessi" msgstr "Ricostruisci statistiche sui sessi"
#: ../gramps/plugins/tool/tools.gpr.py:310 #: ../gramps/plugins/tool/tools.gpr.py:310
msgid "Rebuilds gender statistics for name gender guessing..." msgid "Rebuilds gender statistics for name gender guessing..."
@ -36305,7 +36384,7 @@ msgstr ""
#: ../gramps/plugins/webreport/narrativeweb.py:2016 #: ../gramps/plugins/webreport/narrativeweb.py:2016
#, fuzzy #, fuzzy
msgid "Do we include the web calendar ?" msgid "Do we include the web calendar ?"
msgstr "Il titolo del calendario" msgstr ""
#: ../gramps/plugins/webreport/narrativeweb.py:2026 #: ../gramps/plugins/webreport/narrativeweb.py:2026
msgid "Where do you place your web site ? default = /WEBCAL" 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 segnalazioni di bug si deve usare https://gramps-project.org/bugs/ "
#~ "per le viste ufficiali, altrimenti bisogna contattare l'autore della " #~ "per le viste ufficiali, altrimenti bisogna contattare l'autore della "
#~ "vista (%(firstauthoremail)s). " #~ "vista (%(firstauthoremail)s). "

236
po/ru.po
View File

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

View File

@ -1,13 +1,13 @@
# Slovenian translation for Gramps # Slovenian translation for Gramps
# This file is distributed under the same license as the Gramps package. # This file is distributed under the same license as the Gramps package.
# Copyright (c) 2007 gramps-project # Copyright (c) 2007 gramps-project
# Bernard Banko <beernarrd (at) gmail.com>, 2007-2017. # Bernard Banko <beernarrd at gmail.com>, 2007-2019.
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: gramps 3.3\n" "Project-Id-Version: gramps 3.3\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-05-20 09:31-0500\n" "POT-Creation-Date: 2018-12-26 11:20-0600\n"
"PO-Revision-Date: 2017-08-29 13:26+0200\n" "PO-Revision-Date: 2019-02-24 22:16+0200\n"
"Last-Translator: Bernard Banko <beernarrd at gmail.com>\n" "Last-Translator: Bernard Banko <beernarrd at gmail.com>\n"
"Language-Team: lugos.si\n" "Language-Team: lugos.si\n"
"Language: sl\n" "Language: sl\n"
@ -3766,6 +3766,15 @@ msgstr "Razni filtri"
msgid "No description" msgid "No description"
msgstr "Brez opisa" 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 #: ../gramps/gen/filters/rules/citation/_allcitations.py:45
msgid "Every citation" msgid "Every citation"
msgstr "Vsak navedek" msgstr "Vsak navedek"
@ -18143,6 +18152,10 @@ msgstr "Kopiraj vse"
msgid "See data not in Filter" msgid "See data not in Filter"
msgstr "Prikaži podatke zunaj filtra" 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 #: ../gramps/gui/plug/report/_bookdialog.py:166
msgid "Available Books" msgid "Available Books"
msgstr "Knjige na voljo" msgstr "Knjige na voljo"
@ -18468,6 +18481,10 @@ msgstr "privzeto"
msgid "Document Styles" msgid "Document Styles"
msgstr "Slogi dokumentov" 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 #: ../gramps/gui/plug/report/_styleeditor.py:140
msgid "New Style" msgid "New Style"
msgstr "Nov slog" msgstr "Nov slog"
@ -18494,6 +18511,10 @@ msgstr "Izberi slog"
msgid "Style editor" msgid "Style editor"
msgstr "Urejevalnik slogov" 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:341
#: ../gramps/gui/plug/report/_styleeditor.py:369 #: ../gramps/gui/plug/report/_styleeditor.py:369
#: ../gramps/gui/plug/report/_styleeditor.py:387 #: ../gramps/gui/plug/report/_styleeditor.py:387
@ -18618,6 +18639,10 @@ msgstr "Izberi predmet"
msgid "manual|Select_Child_selector" msgid "manual|Select_Child_selector"
msgstr "Izbor_otroka" msgstr "Izbor_otroka"
#: ../gramps/gui/selectors/selectperson.py:70
msgid "manual|Select_Person_selector"
msgstr "Izbirnik_Izbor_kraja"
#: ../gramps/gui/selectors/selectperson.py:56 #: ../gramps/gui/selectors/selectperson.py:56
msgid "manual|Select_Father_selector" msgid "manual|Select_Father_selector"
msgstr "Izbor_očeta" msgstr "Izbor_očeta"
@ -18642,10 +18667,18 @@ msgstr "Nahajališča"
msgid "Select Repository" msgid "Select Repository"
msgstr "Izberi nahajališče" 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 #: ../gramps/gui/selectors/selectsource.py:62
msgid "Select Source" msgid "Select Source"
msgstr "Izberi vir" msgstr "Izberi vir"
#: ../gramps/gui/selectors/selectsource.py:76
msgid "manual|Select_Source_selector"
msgstr "Izbirnik_Izbor_opombe"
#: ../gramps/gui/spell.py:92 #: ../gramps/gui/spell.py:92
msgid "Off" msgid "Off"
msgstr "Izklopljeno" msgstr "Izklopljeno"
@ -19620,6 +19653,10 @@ msgstr ""
msgid "Progress Information" msgid "Progress Information"
msgstr "Podatki o napredovanju" 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 #: ../gramps/gui/widgets/reorderfam.py:79
msgid "Reorder Relationships" msgid "Reorder Relationships"
msgstr "Preuredi sorodstva" msgstr "Preuredi sorodstva"
@ -21818,6 +21855,11 @@ msgstr "EMAIL"
msgid "WWW" msgid "WWW"
msgstr "WWW" msgstr "WWW"
#: ../gramps/plugins/export/exportgedcom.py:1438
#, fuzzy
msgid "Writing media"
msgstr "Zapisovanje predmetov"
#: ../gramps/plugins/export/exportgedcom.py:1570 #: ../gramps/plugins/export/exportgedcom.py:1570
msgid "GEDCOM Export failed" msgid "GEDCOM Export failed"
msgstr "Izvoz GEDCOM ni bil uspešen" 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/gramplet/gramplet.gpr.py:1138
#: ../gramps/plugins/textreport/recordsreport.py:118 #: ../gramps/plugins/textreport/recordsreport.py:118
msgid "Records" msgid "Records"
msgstr "Zapisi" msgstr "Rekordi"
#: ../gramps/plugins/gramplet/gramplet.gpr.py:1128 #: ../gramps/plugins/gramplet/gramplet.gpr.py:1128
#: ../gramps/plugins/textreport/textplugins.gpr.py:416 #: ../gramps/plugins/textreport/textplugins.gpr.py:416
msgid "Shows some interesting records about people and families" 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 #: ../gramps/plugins/gramplet/gramplet.gpr.py:1143
msgid "Person To Do" msgid "Person To Do"
@ -23370,6 +23412,18 @@ msgstr "Število oseb"
msgid "Individuals with unknown gender" msgid "Individuals with unknown gender"
msgstr "Osebe neznanega spola" 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/gramplet/statsgramplet.py:115
#: ../gramps/plugins/textreport/summary.py:211 #: ../gramps/plugins/textreport/summary.py:211
#: ../gramps/plugins/webreport/statistics.py:129 #: ../gramps/plugins/webreport/statistics.py:129
@ -23388,6 +23442,10 @@ msgstr "Edinstveni priimki"
msgid "Media Objects" msgid "Media Objects"
msgstr "Zunanji predmeti" 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/gramplet/statsgramplet.py:128
#: ../gramps/plugins/webreport/statistics.py:138 #: ../gramps/plugins/webreport/statistics.py:138
msgid "Total number of media object references" msgid "Total number of media object references"
@ -23461,6 +23519,10 @@ msgstr "Uredi izbrano opombo Narediti"
msgid "Add a new To Do note" msgid "Add a new To Do note"
msgstr "Dodaj novo opombo Narediti" 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 #: ../gramps/plugins/gramplet/todogramplet.py:149
msgid "Unattached" msgid "Unattached"
msgstr "Nepripeto" msgstr "Nepripeto"
@ -31911,7 +31973,7 @@ msgstr "Ustvari abecedno kazalo za knjižna poročila."
#: ../gramps/plugins/textreport/textplugins.gpr.py:415 #: ../gramps/plugins/textreport/textplugins.gpr.py:415
msgid "Records Report" msgid "Records Report"
msgstr "Poročilo o zapisih" msgstr "Poročilo o rekordih"
#: ../gramps/plugins/textreport/textplugins.gpr.py:437 #: ../gramps/plugins/textreport/textplugins.gpr.py:437
msgid "Note Link Report" msgid "Note Link Report"
@ -32857,6 +32919,10 @@ msgstr "Upravljalnik_zunanjih_predmetov..."
msgid "Media Manager" msgid "Media Manager"
msgstr "Upravljalnik zunanjih predmetov" msgstr "Upravljalnik zunanjih predmetov"
#: ../gramps/plugins/tool/mediamanager.py:91
msgid "Help"
msgstr "Pomoč"
#: ../gramps/plugins/tool/mediamanager.py:97 #: ../gramps/plugins/tool/mediamanager.py:97
#: ../gramps/plugins/webreport/basepage.py:1483 #: ../gramps/plugins/webreport/basepage.py:1483
#: ../gramps/plugins/webreport/basepage.py:1606 #: ../gramps/plugins/webreport/basepage.py:1606
@ -37191,3 +37257,4 @@ msgstr "Upravljalnik_zunanjih_predmetov"
#~ msgid "Alphabet Menu: %s" #~ msgid "Alphabet Menu: %s"
#~ msgstr "Abecedni meni: %s" #~ msgstr "Abecedni meni: %s"

111
po/sv.po
View File

@ -20,39 +20,29 @@
# Jens Arvidsson <jya@sverige.nu>, 2002-2005. # Jens Arvidsson <jya@sverige.nu>, 2002-2005.
# Stefan Björk <betula@users.sourceforge.net>, 2005-2006. # 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. # 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 "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: sv\n" "Project-Id-Version: sv\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-07-24 14:13+0100\n" "POT-Creation-Date: 2018-12-26 11:20-0600\n"
"PO-Revision-Date: 2018-11-15 18:11+0100\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-Team: \n"
"Language: sv\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: Poedit 2.0.6\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 #: ../data/gramps.appdata.xml.in.h:1
msgid "" msgid "Gramps is a genealogy program that is both intuitive for hobbyists and feature-complete for professional genealogists."
"Gramps is a genealogy program that is both intuitive for hobbyists and " msgstr "Gramps är ett släktforskningsprogram som både är intuitivt för hobbyforskaren och komplett för den professionelle släktforskaren."
"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."
#: ../data/gramps.appdata.xml.in.h:2 #: ../data/gramps.appdata.xml.in.h:2
msgid "" 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."
"It gives you the ability to record the many details of the life of an " 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."
"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."
#: ../data/gramps.appdata.xml.in.h:3 #: ../data/gramps.appdata.xml.in.h:3
msgid "" msgid ""
@ -3352,7 +3342,7 @@ msgstr "suffix"
#: ../gramps/gen/display/name.py:610 ../gramps/gen/display/name.py:710 #: ../gramps/gen/display/name.py:610 ../gramps/gen/display/name.py:710
msgid "Name|call" msgid "Name|call"
msgstr "tilltalsnamnnamn" msgstr "tilltalsnamn"
#: ../gramps/gen/display/name.py:613 ../gramps/gen/display/name.py:712 #: ../gramps/gen/display/name.py:613 ../gramps/gen/display/name.py:712
msgid "Name|common" msgid "Name|common"
@ -3786,6 +3776,15 @@ msgstr "Diverse filter"
msgid "No description" msgid "No description"
msgstr "Beskrivning saknas" 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 #: ../gramps/gen/filters/rules/citation/_allcitations.py:45
msgid "Every citation" msgid "Every citation"
msgstr "Varje citering" msgstr "Varje citering"
@ -10994,7 +10993,7 @@ msgstr "Bidrag av"
#. TRANSLATORS: Translate this to your name in your native language #. TRANSLATORS: Translate this to your name in your native language
#: ../gramps/gui/aboutdialog.py:120 #: ../gramps/gui/aboutdialog.py:120
msgid "translator-credits" msgid "translator-credits"
msgstr "Peter Landgren, Pär Ekholm" msgstr "Pär Ekholm"
#: ../gramps/gui/aboutdialog.py:131 #: ../gramps/gui/aboutdialog.py:131
#, python-format #, python-format
@ -18150,6 +18149,10 @@ msgstr "Kopiera allt"
msgid "See data not in Filter" msgid "See data not in Filter"
msgstr "Se data ej i 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 #: ../gramps/gui/plug/report/_bookdialog.py:166
msgid "Available Books" msgid "Available Books"
msgstr "Tillgängliga böcker" msgstr "Tillgängliga böcker"
@ -18477,6 +18480,10 @@ msgstr "standard"
msgid "Document Styles" msgid "Document Styles"
msgstr "Dokumentmallar" 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 #: ../gramps/gui/plug/report/_styleeditor.py:140
msgid "New Style" msgid "New Style"
msgstr "Ny mall" msgstr "Ny mall"
@ -18503,6 +18510,10 @@ msgstr "Välj en mall"
msgid "Style editor" msgid "Style editor"
msgstr "Mallredigerare" 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:341
#: ../gramps/gui/plug/report/_styleeditor.py:369 #: ../gramps/gui/plug/report/_styleeditor.py:369
#: ../gramps/gui/plug/report/_styleeditor.py:387 #: ../gramps/gui/plug/report/_styleeditor.py:387
@ -18627,6 +18638,10 @@ msgstr "Välj mediaobjekt"
msgid "manual|Select_Child_selector" msgid "manual|Select_Child_selector"
msgstr "Välj barnselektor" 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 #: ../gramps/gui/selectors/selectperson.py:56
msgid "manual|Select_Father_selector" msgid "manual|Select_Father_selector"
msgstr "Välj farselektor" msgstr "Välj farselektor"
@ -18651,10 +18666,18 @@ msgstr "manual|Arkivplatser"
msgid "Select Repository" msgid "Select Repository"
msgstr "Välj arkivplats" 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 #: ../gramps/gui/selectors/selectsource.py:62
msgid "Select Source" msgid "Select Source"
msgstr "Välj källa" 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 #: ../gramps/gui/spell.py:92
msgid "Off" msgid "Off"
msgstr "Av" msgstr "Av"
@ -19632,6 +19655,10 @@ msgstr ""
msgid "Progress Information" msgid "Progress Information"
msgstr "Framåtskridande" 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 #: ../gramps/gui/widgets/reorderfam.py:79
msgid "Reorder Relationships" msgid "Reorder Relationships"
msgstr "Ordna om släktskap" msgstr "Ordna om släktskap"
@ -21825,6 +21852,10 @@ msgstr "E-POST"
msgid "WWW" msgid "WWW"
msgstr "WWW" msgstr "WWW"
#: ../gramps/plugins/export/exportgedcom.py:1438
msgid "Writing media"
msgstr "Skriver media"
#: ../gramps/plugins/export/exportgedcom.py:1570 #: ../gramps/plugins/export/exportgedcom.py:1570
msgid "GEDCOM Export failed" msgid "GEDCOM Export failed"
msgstr "GEDCOM-export misslyckades" msgstr "GEDCOM-export misslyckades"
@ -23453,6 +23484,10 @@ msgstr "Redigera den valda Att Göra notisen"
msgid "Add a new To Do note" msgid "Add a new To Do note"
msgstr "Lägg till ny Att Göra notis" 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 #: ../gramps/plugins/gramplet/todogramplet.py:149
msgid "Unattached" msgid "Unattached"
msgstr "Okopplad" msgstr "Okopplad"
@ -36415,12 +36450,10 @@ msgstr "Webb-kalender-rapport"
msgid "Calculating Holidays for year %04d" msgid "Calculating Holidays for year %04d"
msgstr "Beräknar helgdagar för år %04d" msgstr "Beräknar helgdagar för år %04d"
#: ../gramps/plugins/webreport/webcal.py:486 #: ../gramps/plugins/webreport/webcal.py:491
#, python-format #, python-format
msgid "" msgid "the \"WebCal\" will be the potential-email Subject|Created for %(html_email_author_start)sWebCal%(html_email_author_end)s"
"the \"WebCal\" will be the potential-email Subject|Created for " msgstr "\"WebCal\" kommer att vara den viktigaste e-postsubjektet|Skapat för %(html_email_author_start)sWebCal%(html_email_author_end)s"
"%(html_email_author_start)sWebCal%(html_email_author_end)s"
msgstr "Skapat för %(html_email_author_start)sWebCal%(html_email_author_end)s"
#: ../gramps/plugins/webreport/webcal.py:494 #: ../gramps/plugins/webreport/webcal.py:494
#, python-format #, python-format
@ -37400,17 +37433,21 @@ msgstr "Media_hanterare"
#~ msgid "Place Locations" #~ msgid "Place Locations"
#~ msgstr "Platslokalisering" #~ msgstr "Platslokalisering"
#~ msgid "Incomplete names" #: ../gramps/plugins/gramplet/statsgramplet.py:156
#~ msgstr "Ofullständigt namn" msgid "Incomplete names"
msgstr "Ofullständiga namn"
#~ msgid "Individuals missing birth dates" #: ../gramps/plugins/gramplet/statsgramplet.py:160
#~ msgstr "Personer som saknar födelsedatum" msgid "Individuals missing birth dates"
msgstr "Personer som saknar födelsedatum"
#~ msgid "Disconnected individuals" #: ../gramps/plugins/gramplet/statsgramplet.py:164
#~ msgstr "Isolerade personer" msgid "Disconnected individuals"
msgstr "Släktlösa personer"
#~ msgid "Individuals with media objects" #: ../gramps/plugins/gramplet/statsgramplet.py:181
#~ msgstr "Personer med mediaobjekt" msgid "Individuals with media objects"
msgstr "Personer med mediaobjekt"
#~ msgid "Empty event note ignored" #~ msgid "Empty event note ignored"
#~ msgstr "Tom händelsenotis ignorerades" #~ msgstr "Tom händelsenotis ignorerades"
@ -41216,8 +41253,9 @@ msgstr "Media_hanterare"
#~ msgid "Dates on events are either about or after/before" #~ msgid "Dates on events are either about or after/before"
#~ msgstr "Datum för händelser är antingen omkring eller efter/före" #~ msgstr "Datum för händelser är antingen omkring eller efter/före"
#~ msgid "Help" #: ../gramps/plugins/tool/mediamanager.py:91
#~ msgstr "Hjälp" msgid "Help"
msgstr "Hjälp"
#~ msgid "" #~ msgid ""
#~ "The Calculate Estimated Dates Tool is used to add and remove birth and " #~ "The Calculate Estimated Dates Tool is used to add and remove birth and "
@ -41420,3 +41458,4 @@ msgstr "Media_hanterare"
#~ msgid "Name Format Editor" #~ msgid "Name Format Editor"
#~ msgstr "Namnformatsredigerare" #~ msgstr "Namnformatsredigerare"

View File

@ -51,11 +51,18 @@ from __future__ import print_function
import os import os
import sys import sys
import shutil
from argparse import ArgumentParser from argparse import ArgumentParser
# Windows OS # 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 Win 32 obtained from http://gnuwin32.sourceforge.net/packages/gettext.htm
# ....\gettext\bin\msgmerge.exe needs to be on the path # ....\gettext\bin\msgmerge.exe needs to be on the path
msgmergeCmd = os.path.join('C:', 'Program Files(x86)', 'gettext', 'bin', 'msgmerge.exe') msgmergeCmd = os.path.join('C:', 'Program Files(x86)', 'gettext', 'bin', 'msgmerge.exe')
@ -163,7 +170,7 @@ def TipsParse(filename, mark):
"Editor." "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) marklist = root.iter(mark)
for key in marklist: for key in marklist:
tip = ElementTree.tostring(key, encoding="UTF-8", method="xml") tip = ElementTree.tostring(key, encoding="UTF-8", method="xml")