diff --git a/po/gramps b/po/gramps new file mode 100644 index 000000000..359bf3a74 --- /dev/null +++ b/po/gramps @@ -0,0 +1,647 @@ +./../src/Assistant.py +./../src/Bookmarks.py +./../src/config.py +./../src/const.py +./../src/DateEdit.py +./../src/DisplayState.py +./../src/ExportAssistant.py +./../src/ExportOptions.py +./../src/gramps.py +./../src/LdsUtils.py +./../src/PlaceUtils.py +./../src/QuestionDialog.py +./../src/QuickReports.py +./../src/Relationship.py +./../src/Reorder.py +./../src/ScratchPad.py +./../src/Spell.py +./../src/TipOfDay.py +./../src/ToolTips.py +./../src/TransUtils.py +./../src/Utils.py +./../src/UndoHistory.py +./../src/cli/arghandler.py +./../src/cli/argparser.py +./../src/cli/clidbman.py +./../src/cli/grampscli.py +./../src/cli/plug/__init__.py +./../src/gen/db/base.py +./../src/gen/db/exceptions.py +./../src/gen/db/undoredo.py +./../src/gen/display/name.py +./../src/gen/lib/attrtype.py +./../src/gen/lib/childreftype.py +./../src/gen/lib/date.py +./../src/gen/lib/eventroletype.py +./../src/gen/lib/eventtype.py +./../src/gen/lib/familyreltype.py +./../src/gen/lib/grampstype.py +./../src/gen/lib/ldsord.py +./../src/gen/lib/markertype.py +./../src/gen/lib/nametype.py +./../src/gen/lib/nameorigintype.py +./../src/gen/lib/notetype.py +./../src/gen/lib/person.py +./../src/gen/lib/repotype.py +./../src/gen/lib/srcmediatype.py +./../src/gen/lib/surnamebase.py +./../src/gen/lib/urltype.py +./../src/gen/mime/_gnomemime.py +./../src/gen/mime/_pythonmime.py +./../src/gen/plug/_gramplet.py +./../src/gen/plug/_manager.py +./../src/gen/plug/_pluginreg.py +./../src/gen/plug/docbackend/docbackend.py +./../src/gen/plug/utils.py +./../src/gen/plug/docgen/graphdoc.py +./../src/gen/plug/report/_constants.py +./../src/gen/plug/report/_paper.py +./../src/gen/plug/report/endnotes.py +./../src/gen/plug/report/utils.py +./../src/gen/proxy/private.py +./../src/gui/aboutdialog.py +./../src/gui/columnorder.py +./../src/gui/configure.py +./../src/gui/dbloader.py +./../src/gui/dbman.py +./../src/gui/filtereditor.py +./../src/gui/grampsbar.py +./../src/gui/grampsgui.py +./../src/gui/makefilter.py +./../src/gui/utils.py +./../src/gui/viewmanager.py +./../src/gui/editors/addmedia.py +./../src/gui/editors/objectentries.py +./../src/gui/editors/editaddress.py +./../src/gui/editors/editattribute.py +./../src/gui/editors/editchildref.py +./../src/gui/editors/editcitation.py +./../src/gui/editors/editevent.py +./../src/gui/editors/editeventref.py +./../src/gui/editors/editfamily.py +./../src/gui/editors/editldsord.py +./../src/gui/editors/editlocation.py +./../src/gui/editors/editlink.py +./../src/gui/editors/editmedia.py +./../src/gui/editors/editmediaref.py +./../src/gui/editors/editname.py +./../src/gui/editors/editnote.py +./../src/gui/editors/editperson.py +./../src/gui/editors/editpersonref.py +./../src/gui/editors/editplace.py +./../src/gui/editors/editprimary.py +./../src/gui/editors/editreporef.py +./../src/gui/editors/editrepository.py +./../src/gui/editors/editsource.py +./../src/gui/editors/editurl.py +./../src/gui/editors/displaytabs/addrembedlist.py +./../src/gui/editors/displaytabs/attrembedlist.py +./../src/gui/editors/displaytabs/backreflist.py +./../src/gui/editors/displaytabs/backrefmodel.py +./../src/gui/editors/displaytabs/buttontab.py +./../src/gui/editors/displaytabs/citationembedlist.py +./../src/gui/editors/displaytabs/dataembedlist.py +./../src/gui/editors/displaytabs/embeddedlist.py +./../src/gui/editors/displaytabs/eventembedlist.py +./../src/gui/editors/displaytabs/eventrefmodel.py +./../src/gui/editors/displaytabs/familyldsembedlist.py +./../src/gui/editors/displaytabs/gallerytab.py +./../src/gui/editors/displaytabs/ldsembedlist.py +./../src/gui/editors/displaytabs/locationembedlist.py +./../src/gui/editors/displaytabs/nameembedlist.py +./../src/gui/editors/displaytabs/namemodel.py +./../src/gui/editors/displaytabs/notetab.py +./../src/gui/editors/displaytabs/personeventembedlist.py +./../src/gui/editors/displaytabs/personrefembedlist.py +./../src/gui/editors/displaytabs/repoembedlist.py +./../src/gui/editors/displaytabs/surnametab.py +./../src/gui/editors/displaytabs/webembedlist.py +./../src/gui/plug/_dialogs.py +./../src/gui/plug/_guioptions.py +./../src/gui/plug/_windows.py +./../src/gui/plug/report/_docreportdialog.py +./../src/gui/plug/report/_graphvizreportdialog.py +./../src/gui/plug/report/_papermenu.py +./../src/gui/plug/report/_reportdialog.py +./../src/gui/plug/report/_stylecombobox.py +./../src/gui/plug/report/_styleeditor.py +./../src/gui/plug/tool.py +./../src/gui/selectors/selectcitation.py +./../src/gui/selectors/selectevent.py +./../src/gui/selectors/selectfamily.py +./../src/gui/selectors/selectnote.py +./../src/gui/selectors/selectobject.py +./../src/gui/selectors/selectperson.py +./../src/gui/selectors/selectplace.py +./../src/gui/selectors/selectrepository.py +./../src/gui/selectors/selectsource.py +./../src/gui/views/listview.py +./../src/gui/views/navigationview.py +./../src/gui/views/pageview.py +./../src/gui/views/tags.py +./../src/gui/views/treemodels/citationtreemodel.py +./../src/gui/views/treemodels/mediamodel.py +./../src/gui/views/treemodels/peoplemodel.py +./../src/gui/views/treemodels/placemodel.py +./../src/gui/views/treemodels/treebasemodel.py +./../src/gui/widgets/buttons.py +./../src/gui/widgets/expandcollapsearrow.py +./../src/gui/widgets/grampletpane.py +./../src/gui/widgets/labels.py +./../src/gui/widgets/monitoredwidgets.py +./../src/gui/widgets/photo.py +./../src/gui/widgets/progressdialog.py +./../src/gui/widgets/styledtexteditor.py +./../src/gui/widgets/tageditor.py +./../src/gui/widgets/undoableentry.py +./../src/gui/widgets/validatedmaskedentry.py +./../src/Simple/_SimpleTable.py +./../src/Merge/mergecitation.py +./../src/Merge/mergeevent.py +./../src/Merge/mergefamily.py +./../src/Merge/mergemedia.py +./../src/Merge/mergenote.py +./../src/Merge/mergeperson.py +./../src/Merge/mergeplace.py +./../src/Merge/mergerepository.py +./../src/Merge/mergesource.py +./../src/docgen/ODSTab.py +./../src/docgen/TextBufDoc.py +./../src/GrampsLogger/_ErrorReportAssistant.py +./../src/GrampsLogger/_ErrorView.py +./../src/plugins/BookReport.py +./../src/plugins/bookreport.gpr.py +./../src/plugins/records.gpr.py +./../src/plugins/Records.py +./../src/plugins/docgen/AsciiDoc.py +./../src/plugins/docgen/docgen.gpr.py +./../src/plugins/docgen/GtkPrint.py +./../src/plugins/docgen/HtmlDoc.py +./../src/plugins/docgen/LaTeXDoc.py +./../src/plugins/docgen/ODFDoc.py +./../src/plugins/docgen/PSDrawDoc.py +./../src/plugins/docgen/RTFDoc.py +./../src/plugins/docgen/SvgDrawDoc.py +./../src/plugins/drawreport/AncestorTree.py +./../src/plugins/drawreport/Calendar.py +./../src/plugins/drawreport/DescendTree.py +./../src/plugins/drawreport/drawplugins.gpr.py +./../src/plugins/drawreport/FanChart.py +./../src/plugins/drawreport/StatisticsChart.py +./../src/plugins/drawreport/TimeLine.py +./../src/plugins/export/export.gpr.py +./../src/plugins/export/ExportCsv.py +./../src/plugins/export/ExportFtree.py +./../src/plugins/export/ExportGedcom.py +./../src/plugins/export/ExportGeneWeb.py +./../src/plugins/export/ExportPkg.py +./../src/plugins/export/ExportVCalendar.py +./../src/plugins/export/ExportVCard.py +./../src/plugins/export/ExportXml.py +./../src/plugins/gramplet/AgeOnDateGramplet.py +./../src/plugins/gramplet/AgeStats.py +./../src/plugins/gramplet/Attributes.py +./../src/plugins/gramplet/AttributesGramplet.py +./../src/plugins/gramplet/Backlinks.py +./../src/plugins/gramplet/bottombar.gpr.py +./../src/plugins/gramplet/CalendarGramplet.py +./../src/plugins/gramplet/Children.py +./../src/plugins/gramplet/Citations.py +./../src/plugins/gramplet/DescendGramplet.py +./../src/plugins/gramplet/EditExifMetadata.py +./../src/plugins/gramplet/Events.py +./../src/plugins/gramplet/FanChartGramplet.py +./../src/plugins/gramplet/FaqGramplet.py +./../src/plugins/gramplet/GivenNameGramplet.py +./../src/plugins/gramplet/gramplet.gpr.py +./../src/plugins/gramplet/Notes.py +./../src/plugins/gramplet/PedigreeGramplet.py +./../src/plugins/gramplet/PersonDetails.py +./../src/plugins/gramplet/PersonResidence.py +./../src/plugins/gramplet/PlaceDetails.py +./../src/plugins/gramplet/QuickViewGramplet.py +./../src/plugins/gramplet/RelativeGramplet.py +./../src/plugins/gramplet/RepositoryDetails.py +./../src/plugins/gramplet/SessionLogGramplet.py +./../src/plugins/gramplet/StatsGramplet.py +./../src/plugins/gramplet/SurnameCloudGramplet.py +./../src/plugins/gramplet/ToDoGramplet.py +./../src/plugins/gramplet/TopSurnamesGramplet.py +./../src/plugins/gramplet/WelcomeGramplet.py +./../src/plugins/gramplet/WhatsNext.py +./../src/plugins/graph/graphplugins.gpr.py +./../src/plugins/graph/GVFamilyLines.py +./../src/plugins/graph/GVHourGlass.py +./../src/plugins/graph/GVRelGraph.py +./../src/plugins/import/import.gpr.py +./../src/plugins/import/ImportCsv.py +./../src/plugins/import/ImportGedcom.py +./../src/plugins/import/ImportGeneWeb.py +./../src/plugins/import/ImportGrdb.py +./../src/plugins/import/ImportProGen.py +./../src/plugins/import/ImportVCard.py +./../src/plugins/import/ImportGpkg.py +./../src/plugins/import/ImportXml.py +./../src/plugins/lib/libcairodoc.py +./../src/plugins/lib/libgedcom.py +./../src/plugins/lib/libgrdb.py +./../src/plugins/lib/libholiday.py +./../src/plugins/lib/libhtmlconst.py +./../src/plugins/lib/libmetadata.py +./../src/plugins/lib/libnarrate.py +./../src/plugins/lib/libpersonview.py +./../src/plugins/lib/libplaceview.py +./../src/plugins/lib/libplugins.gpr.py +./../src/plugins/lib/libtranslate.py +./../src/plugins/lib/libtreebase.py +./../src/plugins/lib/maps/constants.py +./../src/plugins/lib/maps/geography.py +./../src/plugins/lib/maps/grampsmaps.py +./../src/plugins/mapservices/eniroswedenmap.py +./../src/plugins/mapservices/googlemap.py +./../src/plugins/mapservices/mapservice.gpr.py +./../src/plugins/mapservices/openstreetmap.py +./../src/plugins/quickview/AgeOnDate.py +./../src/plugins/quickview/all_events.py +./../src/plugins/quickview/all_relations.py +./../src/plugins/quickview/AttributeMatch.py +./../src/plugins/quickview/FilterByName.py +./../src/plugins/quickview/lineage.py +./../src/plugins/quickview/OnThisDay.py +./../src/plugins/quickview/quickview.gpr.py +./../src/plugins/quickview/References.py +./../src/plugins/quickview/LinkReferences.py +./../src/plugins/quickview/Reporef.py +./../src/plugins/quickview/SameSurnames.py +./../src/plugins/quickview/siblings.py +./../src/plugins/rel/relplugins.gpr.py +./../src/plugins/sidebar/sidebar.gpr.py +./../src/plugins/textreport/AlphabeticalIndex.py +./../src/plugins/textreport/AncestorReport.py +./../src/plugins/textreport/BirthdayReport.py +./../src/plugins/textreport/CustomBookText.py +./../src/plugins/textreport/DescendReport.py +./../src/plugins/textreport/DetAncestralReport.py +./../src/plugins/textreport/DetDescendantReport.py +./../src/plugins/textreport/EndOfLineReport.py +./../src/plugins/textreport/FamilyGroup.py +./../src/plugins/textreport/IndivComplete.py +./../src/plugins/textreport/KinshipReport.py +./../src/plugins/textreport/NumberOfAncestorsReport.py +./../src/plugins/textreport/PlaceReport.py +./../src/plugins/textreport/SimpleBookTitle.py +./../src/plugins/textreport/Summary.py +./../src/plugins/textreport/TableOfContents.py +./../src/plugins/textreport/TagReport.py +./../src/plugins/textreport/textplugins.gpr.py +./../src/plugins/tool/ChangeNames.py +./../src/plugins/tool/ChangeTypes.py +./../src/plugins/tool/Check.py +./../src/plugins/tool/Desbrowser.py +./../src/plugins/tool/Eval.py +./../src/plugins/tool/EventCmp.py +./../src/plugins/tool/EventNames.py +./../src/plugins/tool/ExtractCity.py +./../src/plugins/tool/FindDupes.py +./../src/plugins/tool/Leak.py +./../src/plugins/tool/MediaManager.py +./../src/plugins/tool/MergeCitations.py +./../src/plugins/tool/NotRelated.py +./../src/plugins/tool/OwnerEditor.py +./../src/plugins/tool/PatchNames.py +./../src/plugins/tool/Rebuild.py +./../src/plugins/tool/RebuildRefMap.py +./../src/plugins/tool/RelCalc.py +./../src/plugins/tool/RemoveUnused.py +./../src/plugins/tool/ReorderIds.py +./../src/plugins/tool/SortEvents.py +./../src/plugins/tool/SoundGen.py +./../src/plugins/tool/tools.gpr.py +./../src/plugins/tool/Verify.py +./../src/plugins/view/citationtreeview.py +./../src/plugins/view/citationlistview.py +./../src/plugins/view/eventview.py +./../src/plugins/view/familyview.py +./../src/plugins/view/fanchartview.py +./../src/plugins/view/fanchartview.gpr.py +./../src/plugins/view/geography.gpr.py +./../src/plugins/view/geoevents.py +./../src/plugins/view/geofamily.py +./../src/plugins/view/geoperson.py +./../src/plugins/view/geoplaces.py +./../src/plugins/view/grampletview.py +./../src/plugins/view/htmlrenderer.py +./../src/plugins/view/htmlrenderer.gpr.py +./../src/plugins/view/mediaview.py +./../src/plugins/view/noteview.py +./../src/plugins/view/pedigreeview.py +./../src/plugins/view/personlistview.py +./../src/plugins/view/persontreeview.py +./../src/plugins/view/placelistview.py +./../src/plugins/view/placetreeview.gpr.py +./../src/plugins/view/placetreeview.py +./../src/plugins/view/relview.py +./../src/plugins/view/repoview.py +./../src/plugins/view/sourceview.py +./../src/plugins/view/view.gpr.py +./../src/plugins/webreport/NarrativeWeb.py +./../src/plugins/webreport/WebCal.py +./../src/plugins/webreport/webplugins.gpr.py +./../src/plugins/webstuff/webstuff.gpr.py +./../src/plugins/webstuff/webstuff.py +./../src/Simple/_SimpleAccess.py +./../src/Filters/_FilterParser.py +./../src/Filters/_FilterStore.py +./../src/Filters/_SearchBar.py +./../src/Filters/Rules/_Everything.py +./../src/Filters/Rules/_HasGrampsId.py +./../src/Filters/Rules/_HasTextMatchingSubstringOf.py +./../src/Filters/Rules/_IsPrivate.py +./../src/Filters/Rules/_Rule.py +./../src/Filters/Rules/Person/_ChangedSince.py +./../src/Filters/Rules/Person/_DeepRelationshipPathBetween.py +./../src/Filters/Rules/Person/_Disconnected.py +./../src/Filters/Rules/Person/_Everyone.py +./../src/Filters/Rules/Person/_FamilyWithIncompleteEvent.py +./../src/Filters/Rules/Person/_HasAddress.py +./../src/Filters/Rules/Person/_HasAlternateName.py +./../src/Filters/Rules/Person/_HasAssociation.py +./../src/Filters/Rules/Person/_HasAttribute.py +./../src/Filters/Rules/Person/_HasBirth.py +./../src/Filters/Rules/Person/_HasCitation.py +./../src/Filters/Rules/Person/_HasCommonAncestorWithFilterMatch.py +./../src/Filters/Rules/Person/_HasCommonAncestorWith.py +./../src/Filters/Rules/Person/_HasDeath.py +./../src/Filters/Rules/Person/_HasEvent.py +./../src/Filters/Rules/Person/_HasFamilyAttribute.py +./../src/Filters/Rules/Person/_HasFamilyEvent.py +./../src/Filters/Rules/Person/_HasGallery.py +./../src/Filters/Rules/Person/_HasIdOf.py +./../src/Filters/Rules/Person/_HasLDS.py +./../src/Filters/Rules/Person/_HasNameOf.py +./../src/Filters/Rules/Person/_HasNameOriginType.py +./../src/Filters/Rules/Person/_HasNameType.py +./../src/Filters/Rules/Person/_HasNickname.py +./../src/Filters/Rules/Person/_HasNote.py +./../src/Filters/Rules/Person/_HasNoteMatchingSubstringOf.py +./../src/Filters/Rules/Person/_HasNoteRegexp.py +./../src/Filters/Rules/Person/_HasRelationship.py +./../src/Filters/Rules/Person/_HasSourceCount.py +./../src/Filters/Rules/Person/_HasSourceOf.py +./../src/Filters/Rules/Person/_HasTag.py +./../src/Filters/Rules/Person/_HasTextMatchingSubstringOf.py +./../src/Filters/Rules/Person/_HasUnknownGender.py +./../src/Filters/Rules/Person/_HaveAltFamilies.py +./../src/Filters/Rules/Person/_HaveChildren.py +./../src/Filters/Rules/Person/_IncompleteNames.py +./../src/Filters/Rules/Person/_IsAncestorOfFilterMatch.py +./../src/Filters/Rules/Person/_IsAncestorOf.py +./../src/Filters/Rules/Person/_IsBookmarked.py +./../src/Filters/Rules/Person/_IsChildOfFilterMatch.py +./../src/Filters/Rules/Person/_IsDefaultPerson.py +./../src/Filters/Rules/Person/_IsDescendantFamilyOf.py +./../src/Filters/Rules/Person/_IsDescendantOfFilterMatch.py +./../src/Filters/Rules/Person/_IsDescendantOf.py +./../src/Filters/Rules/Person/_IsDuplicatedAncestorOf.py +./../src/Filters/Rules/Person/_IsFemale.py +./../src/Filters/Rules/Person/_IsLessThanNthGenerationAncestorOfBookmarked.py +./../src/Filters/Rules/Person/_IsLessThanNthGenerationAncestorOfDefaultPerson.py +./../src/Filters/Rules/Person/_IsLessThanNthGenerationAncestorOf.py +./../src/Filters/Rules/Person/_IsLessThanNthGenerationDescendantOf.py +./../src/Filters/Rules/Person/_IsMale.py +./../src/Filters/Rules/Person/_IsMoreThanNthGenerationAncestorOf.py +./../src/Filters/Rules/Person/_IsMoreThanNthGenerationDescendantOf.py +./../src/Filters/Rules/Person/_IsParentOfFilterMatch.py +./../src/Filters/Rules/Person/_PeoplePublic.py +./../src/Filters/Rules/Person/_IsRelatedWith.py +./../src/Filters/Rules/Person/_IsSiblingOfFilterMatch.py +./../src/Filters/Rules/Person/_IsSpouseOfFilterMatch.py +./../src/Filters/Rules/Person/_IsWitness.py +./../src/Filters/Rules/Person/_MatchesEventFilter.py +./../src/Filters/Rules/Person/_MatchesFilter.py +./../src/Filters/Rules/Person/_MatchesSourceConfidence.py +./../src/Filters/Rules/Person/_MatchIdOf.py +./../src/Filters/Rules/Person/_MissingParent.py +./../src/Filters/Rules/Person/_MultipleMarriages.py +./../src/Filters/Rules/Person/_NeverMarried.py +./../src/Filters/Rules/Person/_NoBirthdate.py +./../src/Filters/Rules/Person/_NoDeathdate.py +./../src/Filters/Rules/Person/_PeoplePrivate.py +./../src/Filters/Rules/Person/_PersonWithIncompleteEvent.py +./../src/Filters/Rules/Person/_ProbablyAlive.py +./../src/Filters/Rules/Person/_RegExpIdOf.py +./../src/Filters/Rules/Person/_RegExpName.py +./../src/Filters/Rules/Person/_RelationshipPathBetween.py +./../src/Filters/Rules/Person/_RelationshipPathBetweenBookmarks.py +./../src/Filters/Rules/Person/_SearchName.py +./../src/Filters/Rules/Family/_AllFamilies.py +./../src/Filters/Rules/Family/_ChangedSince.py +./../src/Filters/Rules/Family/_ChildHasIdOf.py +./../src/Filters/Rules/Family/_ChildHasNameOf.py +./../src/Filters/Rules/Family/_FamilyPrivate.py +./../src/Filters/Rules/Family/_FatherHasIdOf.py +./../src/Filters/Rules/Family/_FatherHasNameOf.py +./../src/Filters/Rules/Family/_HasAttribute.py +./../src/Filters/Rules/Family/_HasCitation.py +./../src/Filters/Rules/Family/_HasEvent.py +./../src/Filters/Rules/Family/_HasGallery.py +./../src/Filters/Rules/Family/_HasIdOf.py +./../src/Filters/Rules/Family/_HasLDS.py +./../src/Filters/Rules/Family/_HasNote.py +./../src/Filters/Rules/Family/_HasNoteMatchingSubstringOf.py +./../src/Filters/Rules/Family/_HasNoteRegexp.py +./../src/Filters/Rules/Family/_HasReferenceCountOf.py +./../src/Filters/Rules/Family/_HasRelType.py +./../src/Filters/Rules/Family/_HasSourceCount.py +./../src/Filters/Rules/Family/_HasTag.py +./../src/Filters/Rules/Family/_IsBookmarked.py +./../src/Filters/Rules/Family/_MatchesFilter.py +./../src/Filters/Rules/Family/_MatchesSourceConfidence.py +./../src/Filters/Rules/Family/_MotherHasIdOf.py +./../src/Filters/Rules/Family/_MotherHasNameOf.py +./../src/Filters/Rules/Family/_SearchFatherName.py +./../src/Filters/Rules/Family/_SearchChildName.py +./../src/Filters/Rules/Family/_SearchMotherName.py +./../src/Filters/Rules/Family/_RegExpFatherName.py +./../src/Filters/Rules/Family/_RegExpMotherName.py +./../src/Filters/Rules/Family/_RegExpChildName.py +./../src/Filters/Rules/Family/_RegExpIdOf.py +./../src/Filters/Rules/Event/_AllEvents.py +./../src/Filters/Rules/Event/_ChangedSince.py +./../src/Filters/Rules/Event/_EventPrivate.py +./../src/Filters/Rules/Event/_HasAttribute.py +./../src/Filters/Rules/Event/_HasCitation.py +./../src/Filters/Rules/Event/_HasData.py +./../src/Filters/Rules/Event/_HasGallery.py +./../src/Filters/Rules/Event/_HasIdOf.py +./../src/Filters/Rules/Event/_HasNote.py +./../src/Filters/Rules/Event/_HasNoteMatchingSubstringOf.py +./../src/Filters/Rules/Event/_HasNoteRegexp.py +./../src/Filters/Rules/Event/_HasReferenceCountOf.py +./../src/Filters/Rules/Event/_HasSourceCount.py +./../src/Filters/Rules/Event/_HasType.py +./../src/Filters/Rules/Event/_MatchesFilter.py +./../src/Filters/Rules/Event/_MatchesPersonFilter.py +./../src/Filters/Rules/Event/_MatchesSourceFilter.py +./../src/Filters/Rules/Event/_MatchesSourceConfidence.py +./../src/Filters/Rules/Event/_RegExpIdOf.py +./../src/Filters/Rules/Place/_AllPlaces.py +./../src/Filters/Rules/Place/_ChangedSince.py +./../src/Filters/Rules/Place/_HasGallery.py +./../src/Filters/Rules/Place/_HasIdOf.py +./../src/Filters/Rules/Place/_HasNoLatOrLon.py +./../src/Filters/Rules/Place/_HasNote.py +./../src/Filters/Rules/Place/_HasNoteMatchingSubstringOf.py +./../src/Filters/Rules/Place/_HasNoteRegexp.py +./../src/Filters/Rules/Place/_HasPlace.py +./../src/Filters/Rules/Place/_HasReferenceCountOf.py +./../src/Filters/Rules/Place/_InLatLonNeighborhood.py +./../src/Filters/Rules/Place/_MatchesFilter.py +./../src/Filters/Rules/Place/_MatchesEventFilter.py +./../src/Filters/Rules/Place/_PlacePrivate.py +./../src/Filters/Rules/Place/_RegExpIdOf.py +./../src/Filters/Rules/Source/_AllSources.py +./../src/Filters/Rules/Source/_ChangedSince.py +./../src/Filters/Rules/Source/_HasGallery.py +./../src/Filters/Rules/Source/_HasIdOf.py +./../src/Filters/Rules/Source/_HasNote.py +./../src/Filters/Rules/Source/_HasNoteRegexp.py +./../src/Filters/Rules/Source/_HasNoteMatchingSubstringOf.py +./../src/Filters/Rules/Source/_HasReferenceCountOf.py +./../src/Filters/Rules/Source/_HasRepository.py +./../src/Filters/Rules/Source/_HasRepositoryCallNumberRef.py +./../src/Filters/Rules/Source/_MatchesFilter.py +./../src/Filters/Rules/Source/_MatchesRepositoryFilter.py +./../src/Filters/Rules/Source/_MatchesTitleSubstringOf.py +./../src/Filters/Rules/Source/_SourcePrivate.py +./../src/Filters/Rules/Source/_RegExpIdOf.py +./../src/Filters/Rules/Citation/_AllCitations.py +./../src/Filters/Rules/Citation/_ChangedSince.py +./../src/Filters/Rules/Citation/_CitationPrivate.py +./../src/Filters/Rules/Citation/_HasGallery.py +./../src/Filters/Rules/Citation/_HasIdOf.py +./../src/Filters/Rules/Citation/_HasNote.py +./../src/Filters/Rules/Citation/_HasNoteMatchingSubstringOf.py +./../src/Filters/Rules/Citation/_HasNoteRegexp.py +./../src/Filters/Rules/Citation/_HasReferenceCountOf.py +./../src/Filters/Rules/Citation/_HasSource.py +./../src/Filters/Rules/Citation/_MatchesFilter.py +./../src/Filters/Rules/Citation/_MatchesPageSubstringOf.py +./../src/Filters/Rules/Citation/_RegExpIdOf.py +./../src/Filters/Rules/Citation/_MatchesRepositoryFilter.py +./../src/Filters/Rules/Citation/_MatchesSourceFilter.py +./../src/Filters/Rules/MediaObject/_AllMedia.py +./../src/Filters/Rules/MediaObject/_ChangedSince.py +./../src/Filters/Rules/MediaObject/_HasAttribute.py +./../src/Filters/Rules/MediaObject/_HasIdOf.py +./../src/Filters/Rules/MediaObject/_HasMedia.py +./../src/Filters/Rules/MediaObject/_HasNoteMatchingSubstringOf.py +./../src/Filters/Rules/MediaObject/_HasNoteRegexp.py +./../src/Filters/Rules/MediaObject/_HasReferenceCountOf.py +./../src/Filters/Rules/MediaObject/_HasTag.py +./../src/Filters/Rules/MediaObject/_MatchesFilter.py +./../src/Filters/Rules/MediaObject/_MediaPrivate.py +./../src/Filters/Rules/MediaObject/_RegExpIdOf.py +./../src/Filters/Rules/Repository/_AllRepos.py +./../src/Filters/Rules/Repository/_ChangedSince.py +./../src/Filters/Rules/Repository/_HasIdOf.py +./../src/Filters/Rules/Repository/_HasNoteMatchingSubstringOf.py +./../src/Filters/Rules/Repository/_HasNoteRegexp.py +./../src/Filters/Rules/Repository/_HasReferenceCountOf.py +./../src/Filters/Rules/Repository/_HasRepo.py +./../src/Filters/Rules/Repository/_MatchesFilter.py +./../src/Filters/Rules/Repository/_MatchesNameSubstringOf.py +./../src/Filters/Rules/Repository/_RegExpIdOf.py +./../src/Filters/Rules/Repository/_RepoPrivate.py +./../src/Filters/Rules/Note/_AllNotes.py +./../src/Filters/Rules/Note/_ChangedSince.py +./../src/Filters/Rules/Note/_HasIdOf.py +./../src/Filters/Rules/Note/_MatchesSubstringOf.py +./../src/Filters/Rules/Note/_MatchesRegexpOf.py +./../src/Filters/Rules/Note/_HasNote.py +./../src/Filters/Rules/Note/_HasTag.py +./../src/Filters/Rules/Note/_HasReferenceCountOf.py +./../src/Filters/Rules/Note/_MatchesFilter.py +./../src/Filters/Rules/Note/_RegExpIdOf.py +./../src/Filters/Rules/Note/_NotePrivate.py +./../src/Filters/SideBar/_CitationSidebarFilter.py +./../src/Filters/SideBar/_EventSidebarFilter.py +./../src/Filters/SideBar/_FamilySidebarFilter.py +./../src/Filters/SideBar/_PersonSidebarFilter.py +./../src/Filters/SideBar/_SidebarFilter.py +./../src/Filters/SideBar/_SourceSidebarFilter.py +./../src/Filters/SideBar/_PlaceSidebarFilter.py +./../src/Filters/SideBar/_MediaSidebarFilter.py +./../src/Filters/SideBar/_RepoSidebarFilter.py +./../src/Filters/SideBar/_NoteSidebarFilter.py +../src/plugins/docgen/gtkprint.glade +../src/glade/editperson.glade +../src/glade/grampletpane.glade +../src/glade/baseselector.glade +../src/glade/reorder.glade +../src/glade/tipofday.glade +../src/glade/displaystate.glade +../src/glade/addmedia.glade +../src/glade/questiondialog.glade +../src/glade/configure.glade +../src/glade/dateedit.glade +../src/glade/editsource.glade +../src/glade/styleeditor.glade +../src/glade/dbman.glade +../src/glade/editcitation.glade +../src/glade/editurl.glade +../src/glade/editrepository.glade +../src/glade/editreporef.glade +../src/glade/editpersonref.glade +../src/glade/editlocation.glade +../src/glade/editlink.glade +../src/glade/editfamily.glade +../src/glade/editchildref.glade +../src/glade/editattribute.glade +../src/glade/editaddress.glade +../src/glade/editmedia.glade +../src/glade/editmediaref.glade +../src/glade/editeventref.glade +../src/glade/editldsord.glade +../src/glade/editnote.glade +../src/glade/editplace.glade +../src/glade/editsourceref.glade +../src/glade/editname.glade +../src/glade/editevent.glade +../src/glade/mergecitation.glade +../src/glade/mergedata.glade +../src/glade/mergeevent.glade +../src/glade/mergefamily.glade +../src/glade/mergemedia.glade +../src/glade/mergenote.glade +../src/glade/mergeperson.glade +../src/glade/mergeplace.glade +../src/glade/mergerepository.glade +../src/glade/mergesource.glade +../src/glade/plugins.glade +../src/glade/rule.glade +../src/glade/scratchpad.glade +../src/glade/papermenu.glade +../src/glade/updateaddons.glade +../src/plugins/tool/notrelated.glade +../src/plugins/bookreport.glade +../src/plugins/tool/changenames.glade +../src/plugins/tool/changetypes.glade +../src/plugins/tool/desbrowser.glade +../src/plugins/tool/eval.glade +../src/plugins/tool/eventcmp.glade +../src/plugins/tool/leak.glade +../src/plugins/tool/finddupes.glade +../src/plugins/tool/mergecitations.glade +../src/plugins/tool/ownereditor.glade +../src/plugins/tool/patchnames.glade +../src/plugins/tool/relcalc.glade +../src/plugins/tool/soundgen.glade +../src/plugins/tool/removeunused.glade +../src/plugins/tool/verify.glade +../src/plugins/import/importgedcom.glade +../src/plugins/lib/holidays.xml.in +../data/gramps.desktop.in +../data/gramps.keys.in +../data/gramps.xml.in +../src/data/tips.xml.in diff --git a/po/update_po.py b/po/update_po.py index 0456720f1..551b8c1c3 100644 --- a/po/update_po.py +++ b/po/update_po.py @@ -1,6 +1,6 @@ #! /usr/bin/env python # -# update_po - a gramps tool to update a po file +# update_po - a gramps tool to update translations # # Copyright (C) 2006-2006 Kees Bakker # Copyright (C) 2006 Brian Matherly @@ -27,42 +27,301 @@ import sys from optparse import OptionParser +if sys.platform == 'win32': + # GetText Win 32 obtained from http://gnuwin32.sourceforge.net/packages/gettext.htm + # ....\gettext\bin\msgmerge.exe needs to be on the path + msgmergeCmd = 'msgmerge.exe' + msgfmtCmd = 'msgfmt.exe' + pythonCmd = 'python.exe' +elif sys.platform == 'linux2': + msgmergeCmd = 'msgmerge' + msgfmtCmd = 'msgfmt' + pythonCmd = 'python' + +def tests(): + """ + Testing installed programs. + We made tests (-t flag) by displaying versions of tools if properly + installed. Cannot run all commands without 'gettext' and 'python'. + """ + + try: + print("====='msgmerge'=(merge our translation)=================") + os.system('''%(program)s -V''' % {'program': msgmergeCmd}) + except: + print('Please, install %(program)s for updating your translation' % {'program': msgmergeCmd}) + + try: + print("===='msgfmt'=(format our translation for installation)==") + os.system('''%(program)s -V''' % {'program': msgfmtCmd}) + except: + print('Please, install %(program)s for checking your translation' % {'program': msgfmtCmd}) + + try: + print("=================='python'============================") + os.system('''%(program)s -V''' % {'program': pythonCmd}) + except: + print('Please, install python') + + +def XMLParse(filename, mark): + """ + Experimental alternative to 'intltool-extract' for XML based files. + """ + + # in progress ... + from xml.etree import ElementTree + + tree = ElementTree.parse(filename) + root = tree.getroot() + + tips = names = [] + + for key in root: + if key.tag == mark: + tips.append((key.attrib, ElementTree.tostring(key, encoding="UTF-8"))) + + if mark == '_tip': + for tip in tips: + print(tip) + + if mark == '_name': + print(names) + def main(): + """ + The utility for handling translation stuff. + What is need by Gramps, nothing more. + """ parser = OptionParser( - description='This program updates the PO file(s) for Gramps,' - ' by generating a new file for translator', - usage='%prog [options] lang.po' + description='This program generates a new template and ' + 'also provide some common features.', + usage='%prog [options]' ) - parser.add_option("-a", "--all", - action="store_true", dest="all", default=False, - help="update all translations (not active)") + parser.add_option("-t", "--test", + action="store_true", dest="test", default=False, + help="test if 'python' and 'gettext' are properly installed") + + parser.add_option("-x", "--xml", + action="store_true", dest="xml", default=False, + help="extract messages from xml based file formats") + parser.add_option("-g", "--glade", + action="store_true", dest="glade", default=False, + help="extract messages from glade file format only") + parser.add_option("-c", "--clean", + action="store_true", dest="clean", default=False, + help="remove created files") + parser.add_option("-p", "--pot", + action="store_true", dest="catalog", default=False, + help="create a new catalog") + + # need at least one argument (sv.po, de.po, etc ...) + parser.add_option("-m", "--merge", + action="store_true", dest="merge", default=False, + help="merge lang.po files with last catalog") + parser.add_option("-k", "--check", + action="store_true", dest="check", default=False, + help="check lang.po files") (options, args) = parser.parse_args() - - if options.all: - print('Not implemented yet') - - if sys.platform == 'win32': - # GetText Win 32 obtained from http://gnuwin32.sourceforge.net/packages/gettext.htm - # ....\gettext\bin\msgmerge.exe needs to be on the path - msgfmtCmd = 'msgmerge.exe' - elif sys.platform == 'linux2': - msgfmtCmd = 'msgmerge' - - try: - os.system('''intltool-update -g gramps -o gramps.pot -p''') - print('New template') - except: - pass - for po in args: - print('Merge %(lang)s with last template' % {'lang': po}) - os.system('''%s --no-wrap %s gramps.pot -o %s_updated''' % (msgfmtCmd, po, po)) - print('Updated file: %(lang)s_updated' % {'lang': po}) + if options.test: + tests() + + if options.xml: + extract_xml() + + if options.glade: + extract_glade() + + if options.catalog: + retrieve() + + if options.clean: + clean() + + if options.merge: + merge(args) + + if options.check: + check(args) + +def listing(name, extension): + """ + List files according to extensions. + Parsing from a textual file (gramps) is faster and easy for maintenance. + Like POTFILES.in and POTFILES.skip + """ + + f = open('gramps') + files = [file.strip() for file in f] + f.close() + + temp = open(name, 'w') + + for entry in files: + (module, ext) = os.path.splitext(entry) + if ext == extension: + temp.write(entry) + temp.write('\n') + + temp.close() + + +def headers(): + """ + Look at existing C file format headers. + Generated by 'intltool-extract' but want to get rid of this + dependency (perl, just a set of tools). + """ + + headers = [] + + # in.h; extract_xml + if os.path.isfile('''../src/data/tips.xml.in.h'''): + headers.append('''../src/data/tips.xml.in.h''') + if os.path.isfile('''../src/plugins/lib/holidays.xml.in.h'''): + headers.append('''../src/plugins/lib/holidays.xml.in.h''') + + # cosmetic + if os.path.isfile('''../data/gramps.xml.in.h'''): + headers.append('''../data/gramps.xml.in.h''') + if os.path.isfile('''../data/gramps.desktop.in.h'''): + headers.append('''../data/gramps.desktop.in.h''') + if os.path.isfile('''../data/gramps.keys.in.h'''): + headers.append('''../data/gramps.keys.in.h''') + + return headers + + +def extract_xml(): + """ + Extract translation strings from XML based, keys, mime and desktop + files. Still performed by 'intltool-update'. + Need to look at own XML files parsing and custom translation marks. + """ + + os.system('''intltool-extract --type=gettext/xml ../src/data/tips.xml.in''') + #XMLParse('../src/data/tips.xml.in', '_tip') + os.system('''intltool-extract --type=gettext/xml ../src/plugins/lib/holidays.xml.in''') + #XMLParse('../src/data/tips.xml.in', '_name') + + # cosmetic + # could be simple copies without .in extension + os.system('''intltool-extract --type=gettext/xml ../data/gramps.xml.in''') + os.system('''intltool-extract --type=gettext/ini ../data/gramps.desktop.in''') + os.system('''intltool-extract --type=gettext/keys ../data/gramps.keys.in''') + + +def create_template(): + """ + Create a new file for template, if it does not exist. + """ + + template = open('gramps.pot', 'w') + template.close() + + +def extract_glade(): + """ + Extract messages from a temp file with all .glade + """ + + if not os.path.isfile('gramps.pot'): + create_template() + listing('glade.txt', '.glade') + os.system('''xgettext --add-comments -j -L Glade ''' + '''--from-code=UTF-8 -o gramps.pot --files-from=glade.txt''' + ) + + +def retrieve(): + """ + Extract messages from all files used by Gramps (python, glade, xml) + """ + + extract_xml() + + if not os.path.isfile('gramps.pot'): + create_template() + + listing('python.txt', '.py') + os.system('''xgettext --add-comments -j --directory=. -d gramps ''' + '''-L Python -o gramps.pot --files-from=python.txt ''' + '''--keyword=_ --keyword=ngettext ''' + '''--keyword=sgettext --from-code=UTF-8''' + ) + + extract_glade() + + # C format header (.h extension) + for h in headers(): + print('xgettext for %s') % h + os.system('''xgettext --add-comments -j -o gramps.pot ''' + '''--keyword=N_ --from-code=UTF-8 %(head)s''' % {'head': h} + ) + + clean() + + +def clean(): + """ + Remove created files (C format headers, temp listings) + """ + + for h in headers(): + if os.path.isfile(h): + os.system('''rm %s''' % h) + print('Remove %(head)s' % {'head': h}) + + if os.path.isfile('python.txt'): + os.system('''rm python.txt''') + print("Remove 'python.txt'") + + if os.path.isfile('glade.txt'): + os.system('''rm glade.txt''') + print("Remove 'glade.txt'") + + +def merge(args): + """ + Merge messages with 'gramps.pot' + """ + + if not args: + print('Please, add at least one argument (sv.po, de.po).') + + for arg in args: + if arg[-3:] == '.po': + print('Merge %(lang)s with current template' % {'lang': arg}) + os.system('''%(msgmerge)s --no-wrap %(lang)s gramps.pot -o updated_%(lang)s''' \ + % {'msgmerge': msgmergeCmd, 'lang': arg}) + print("Updated file: 'updated_%(lang)s'." % {'lang': arg}) + else: + print("Please, try to set an argument with .po extension like '%(arg)s.po'." % {'arg': arg}) + + +def check(args): + """ + Check the translation file + """ + + if not args: + print('Please, add at least one argument (sv.po, de.po).') + + for arg in args: + if arg[-3:] == '.po': + print("Checked file: '%(lang.po)s'. See '%(txt)s.txt'." \ + % {'lang.po': arg, 'txt': arg[:2]}) + os.system('''%(python)s ./check_po ./%(lang.po)s > %(lang)s.txt''' \ + % {'python': pythonCmd, 'lang.po': arg, 'lang': arg[:2]}) + os.system('''%(msgfmt)s -c -v %(lang.po)s''' % {'msgfmt': msgfmtCmd, 'lang.po': arg}) + else: + print("Please, try to set an argument with .po extension like '%(arg)s.po'." % {'arg': arg}) if __name__ == "__main__": main()