summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--app/Contracts/CustomTagInterface.php40
-rw-r--r--app/CustomTags/Aldfaer.php99
-rw-r--r--app/CustomTags/Ancestry.php79
-rw-r--r--app/CustomTags/BrothersKeeper.php117
-rw-r--r--app/CustomTags/FamilySearch.php55
-rw-r--r--app/CustomTags/FamilyTreeBuilder.php66
-rw-r--r--app/CustomTags/FamilyTreeMaker.php141
-rw-r--r--app/CustomTags/Gedcom7.php173
-rw-r--r--app/CustomTags/GedcomL.php314
-rw-r--r--app/CustomTags/GenPlusWin.php55
-rw-r--r--app/CustomTags/Geneatique.php85
-rw-r--r--app/CustomTags/Heredis.php62
-rw-r--r--app/CustomTags/Legacy.php161
-rw-r--r--app/CustomTags/MyHeritage.php69
-rw-r--r--app/CustomTags/PersonalAncestralFile.php85
-rw-r--r--app/CustomTags/PhpGedView.php88
-rw-r--r--app/CustomTags/ProGen.php59
-rw-r--r--app/CustomTags/Reunion.php67
-rw-r--r--app/CustomTags/RootsMagic.php67
-rw-r--r--app/CustomTags/TheMasterGenealogist.php56
-rw-r--r--app/Gedcom.php1037
21 files changed, 1980 insertions, 995 deletions
diff --git a/app/Contracts/CustomTagInterface.php b/app/Contracts/CustomTagInterface.php
new file mode 100644
index 0000000000..233b68d718
--- /dev/null
+++ b/app/Contracts/CustomTagInterface.php
@@ -0,0 +1,40 @@
+<?php
+
+/**
+ * webtrees: online genealogy
+ * Copyright (C) 2022 webtrees development team
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+declare(strict_types=1);
+
+namespace Fisharebest\Webtrees\Contracts;
+
+/**
+ * Definitions for custom tags created by various applications.
+ */
+interface CustomTagInterface
+{
+ /**
+ * The name of the application.
+ *
+ * @return string
+ */
+ public function name(): string;
+
+ /**
+ * Tags created by this application.
+ *
+ * @return array<string,ElementInterface>
+ */
+ public function tags(): array;
+}
diff --git a/app/CustomTags/Aldfaer.php b/app/CustomTags/Aldfaer.php
new file mode 100644
index 0000000000..ca186a662e
--- /dev/null
+++ b/app/CustomTags/Aldfaer.php
@@ -0,0 +1,99 @@
+<?php
+
+/**
+ * webtrees: online genealogy
+ * Copyright (C) 2022 webtrees development team
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+declare(strict_types=1);
+
+namespace Fisharebest\Webtrees\CustomTags;
+
+use Fisharebest\Webtrees\Contracts\CustomTagInterface;
+use Fisharebest\Webtrees\Contracts\ElementInterface;
+use Fisharebest\Webtrees\Elements\AddressEmail;
+use Fisharebest\Webtrees\Elements\AddressFax;
+use Fisharebest\Webtrees\Elements\AddressLine;
+use Fisharebest\Webtrees\Elements\AddressWebPage;
+use Fisharebest\Webtrees\Elements\CustomElement;
+use Fisharebest\Webtrees\Elements\DateValue;
+use Fisharebest\Webtrees\Elements\EmptyElement;
+use Fisharebest\Webtrees\Elements\Marriage;
+use Fisharebest\Webtrees\Elements\PhoneNumber;
+use Fisharebest\Webtrees\Elements\TimeValue;
+use Fisharebest\Webtrees\I18N;
+
+/**
+ * GEDCOM files created by Aldfaer
+ *
+ * @see http://aldfaer.net
+ */
+class Aldfaer implements CustomTagInterface
+{
+ /**
+ * The name of the application.
+ *
+ * @return string
+ */
+ public function name(): string
+ {
+ return 'Aldfaer';
+ }
+
+ /**
+ * Tags created by this application.
+ *
+ * @return array<string,ElementInterface>
+ */
+ public function tags(): array
+ {
+ return [
+ 'FAM:MARR_CIVIL' => new Marriage(I18N::translate('Civil marriage')),
+ 'FAM:MARR_PARTNERS' => new Marriage(I18N::translate('Registered partnership')),
+ 'FAM:MARR_RELIGIOUS' => new Marriage(I18N::translate('Religious marriage')),
+ 'FAM:MARR_UNKNOWN' => new Marriage(I18N::translate('Marriage')),
+ 'FAM:_ALDFAER_NOREL' => new EmptyElement('No relation'), // What is this?
+ 'HEAD:SUBM:ADDR' => new AddressLine(I18N::translate('Address')),
+ 'HEAD:SUBM:PHON' => new PhoneNumber(I18N::translate('Phone')),
+ 'HEAD:SUBM:_EMAI' => new AddressEmail(I18N::translate('Email')),
+ 'HEAD:SUBM:_FAX' => new AddressFax(I18N::translate('Fax')),
+ 'HEAD:SUBM:_WWW' => new AddressWebPage(I18N::translate('URL')),
+ 'INDI:BIRT:_ALDFAER_TIME' => new TimeValue(I18N::translate('Time of birth')),
+ 'INDI:BIRT:_LENGTH' => new CustomElement(I18N::translate('Length')),
+ 'INDI:BIRT:_WEIGHT' => new CustomElement(I18N::translate('Weight')),
+ 'INDI:DEAT:_ALDFAER_TIME' => new TimeValue(I18N::translate('Time of death')),
+ 'INDI:_REFERENCE' => new CustomElement(''),
+ 'INDI:_PRIVACY' => new CustomElement(''),
+ 'INDI:_PRIVACY:_OBJECTION' => new CustomElement(''),
+ 'INDI:_PRIVACY:_PUBLISH' => new CustomElement(''),
+ 'INDI:NAME:_SURNAS' => new CustomElement(I18N::translate('Alternative spelling of surname')),
+ 'INDI:DEAT:_DATE' => new DateValue(I18N::translate('Date')),
+ 'INDI:_INQUBIRT' => new CustomElement(''),
+ 'INDI:_INQUCHIL' => new CustomElement(''),
+ 'INDI:_INQURELA' => new CustomElement(''),
+ 'INDI:_INQUDEAT' => new CustomElement(''),
+ 'INDI:_INQUVAR1' => new CustomElement(''),
+ 'INDI:_INQUVAR1CAT' => new CustomElement(''),
+ 'INDI:_INQUVAR2' => new CustomElement(''),
+ 'INDI:_INQUVAR2CAT' => new CustomElement(''),
+ 'INDI:_INQUVAR3' => new CustomElement(''),
+ 'INDI:_INQUVAR3CAT' => new CustomElement(''),
+ 'INDI:_NOPARTNER' => new CustomElement(''),
+ 'INDI:_NEW' => new CustomElement(''),
+ 'INDI:_BOLD' => new CustomElement(''),
+ 'INDI:_ITALIC' => new CustomElement(''),
+ 'INDI:_UNDERLINE' => new CustomElement(''),
+ 'INDI:_COLOR' => new CustomElement(''),
+ ];
+ }
+}
diff --git a/app/CustomTags/Ancestry.php b/app/CustomTags/Ancestry.php
new file mode 100644
index 0000000000..44e74cecee
--- /dev/null
+++ b/app/CustomTags/Ancestry.php
@@ -0,0 +1,79 @@
+<?php
+
+/**
+ * webtrees: online genealogy
+ * Copyright (C) 2022 webtrees development team
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+declare(strict_types=1);
+
+namespace Fisharebest\Webtrees\CustomTags;
+
+use Fisharebest\Webtrees\Contracts\CustomTagInterface;
+use Fisharebest\Webtrees\Contracts\ElementInterface;
+use Fisharebest\Webtrees\Elements\AddressWebPage;
+use Fisharebest\Webtrees\Elements\AutomatedRecordId;
+use Fisharebest\Webtrees\Elements\CustomElement;
+use Fisharebest\Webtrees\Elements\CustomEvent;
+use Fisharebest\Webtrees\Elements\CustomFact;
+use Fisharebest\Webtrees\Elements\DateValue;
+use Fisharebest\Webtrees\Elements\LdsInitiatory;
+use Fisharebest\Webtrees\Elements\PlaceName;
+use Fisharebest\Webtrees\Elements\SubmitterText;
+use Fisharebest\Webtrees\I18N;
+
+/**
+ * GEDCOM files created by Ancestry
+ *
+ * @see https://www.ancestry.com/
+ * @see https://www.webtrees.net/index.php/en/forum/help-for-release-2-1-x/36664-2-1-beta-support-for-indi-even-sour-data-note-and-the-like
+ */
+class Ancestry implements CustomTagInterface
+{
+ /**
+ * The name of the application.
+ *
+ * @return string
+ */
+ public function name(): string
+ {
+ return 'Ancestry';
+ }
+
+ /**
+ * Tags created by this application.
+ *
+ * @return array<string,ElementInterface>
+ */
+ public function tags(): array
+ {
+ return [
+ 'HEAD:SOUR:_TREE' => new CustomElement(I18N::translate('Family tree')),
+ 'HEAD:SOUR:_TREE:NOTE' => new SubmitterText(I18N::translate('Note')),
+ 'HEAD:SOUR:_TREE:RIN' => new AutomatedRecordId(I18N::translate('Record ID number')),
+ 'INDI:*:SOUR:_APID' => /* I18N: GEDCOM tag _APID */ new CustomElement(I18N::translate('Ancestry PID')),
+ 'INDI:*:SOUR:DATA:NOTE' => new SubmitterText(I18N::translate('Note')),
+ 'INDI:_EMPLOY' => new CustomFact(I18N::translate('Occupation')),
+ 'INDI:_FUN' => new CustomEvent(I18N::translate('Funeral')),
+ 'INDI:_INIT' => new LdsInitiatory(I18N::translate('LDS initiatory')),
+ 'INDI:_ORDI' => new CustomEvent(I18N::translate('Ordination')),
+ 'INDI:_ORIG' => new CustomFact(I18N::translate('Origin')),
+ 'INDI:_DEST' => new CustomFact(I18N::translate('Destination')),
+ 'OBJE:DATE' => new DateValue(I18N::translate('Date')),
+ 'OBJE:PLAC' => new PlaceName(I18N::translate('Place')),
+ 'OBJE:_CREA' => /* I18N: GEDCOM tag _CREA */ new CustomElement(I18N::translate('Created at')),
+ 'OBJE:_ORIG' => /* I18N: GEDCOM tag _ORIG */ new CustomElement(I18N::translate('Original text')),
+ 'OBJE:_ORIG:_URL' => new AddressWebPage(I18N::translate('URL')),
+ ];
+ }
+}
diff --git a/app/CustomTags/BrothersKeeper.php b/app/CustomTags/BrothersKeeper.php
new file mode 100644
index 0000000000..fb2024959e
--- /dev/null
+++ b/app/CustomTags/BrothersKeeper.php
@@ -0,0 +1,117 @@
+<?php
+
+/**
+ * webtrees: online genealogy
+ * Copyright (C) 2022 webtrees development team
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+declare(strict_types=1);
+
+namespace Fisharebest\Webtrees\CustomTags;
+
+use Fisharebest\Webtrees\Contracts\CustomTagInterface;
+use Fisharebest\Webtrees\Contracts\ElementInterface;
+use Fisharebest\Webtrees\Elements\AddressEmail;
+use Fisharebest\Webtrees\Elements\CustomElement;
+use Fisharebest\Webtrees\Elements\CustomEvent;
+use Fisharebest\Webtrees\Elements\CustomFact;
+use Fisharebest\Webtrees\Elements\CustomFamilyEvent;
+use Fisharebest\Webtrees\Elements\CustomIndividualEvent;
+use Fisharebest\Webtrees\Elements\DateValue;
+use Fisharebest\Webtrees\Elements\NamePersonal;
+use Fisharebest\Webtrees\Elements\PlaceName;
+use Fisharebest\Webtrees\I18N;
+
+/**
+ * GEDCOM files created by Brothers Keeper
+ *
+ * @see https://wiki-de.genealogy.net/GEDCOM/_Nutzerdef-Tag
+ */
+class BrothersKeeper implements CustomTagInterface
+{
+ /**
+ * The name of the application.
+ *
+ * @return string
+ */
+ public function name(): string
+ {
+ return 'Brothers Keeper';
+ }
+
+ /**
+ * Tags created by this application.
+ *
+ * @return array<string,ElementInterface>
+ */
+ public function tags(): array
+ {
+ return [
+ 'FAM:*:_EVN' => new CustomElement('Event number'),
+ 'FAM:CHIL:_FREL' => new CustomElement(I18N::translate('Relationship to father')),
+ 'FAM:CHIL:_MREL' => new CustomElement(I18N::translate('Relationship to mother')),
+ 'FAM:_COML' => new CustomFamilyEvent(I18N::translate('Common law marriage')),
+ 'FAM:_MARI' => new CustomFamilyEvent(I18N::translate('Marriage intention')),
+ 'FAM:_MBON' => new CustomFamilyEvent(I18N::translate('Marriage bond')),
+ 'FAM:_NMR' => new CustomFamilyEvent(I18N::translate('Not married'), ['NOTE' => '0:M', 'SOUR' => '0:M']),
+ 'FAM:_PRMN' => new CustomElement(I18N::translate('Permanent number')),
+ 'FAM:_SEPR' => new CustomFamilyEvent(I18N::translate('Separated')),
+ 'FAM:_TODO' => new CustomElement(I18N::translate('Research task')),
+ 'INDI:*:_EVN' => new CustomElement('Event number'),
+ 'INDI:NAME:_ADPN' => new NamePersonal(I18N::translate('Adopted name'), []),
+ 'INDI:NAME:_AKAN' => new NamePersonal(I18N::translate('Also known as'), []),
+ 'INDI:NAME:_BIRN' => new NamePersonal(I18N::translate('Birth name'), []),
+ 'INDI:NAME:_CALL' => new NamePersonal('Called name', []),
+ 'INDI:NAME:_CENN' => new NamePersonal('Census name', []),
+ 'INDI:NAME:_CURN' => new NamePersonal('Current name', []),
+ 'INDI:NAME:_FARN' => new NamePersonal(I18N::translate('Estate name'), []),
+ 'INDI:NAME:_FKAN' => new NamePersonal('Formal name', []),
+ 'INDI:NAME:_FRKA' => new NamePersonal('Formerly known as', []),
+ 'INDI:NAME:_GERN' => new NamePersonal('German name', []),
+ 'INDI:NAME:_HEBN' => new NamePersonal(I18N::translate('Hebrew name'), []),
+ 'INDI:NAME:_HNM' => new NamePersonal(I18N::translate('Hebrew name'), []),
+ 'INDI:NAME:_INDG' => new NamePersonal('Indigenous name', []),
+ 'INDI:NAME:_INDN' => new NamePersonal('Indian name', []),
+ 'INDI:NAME:_LNCH' => new NamePersonal('Legal name change', []),
+ 'INDI:NAME:_MARN' => new NamePersonal('Married name', []),
+ 'INDI:NAME:_MARNM' => new NamePersonal('Married name', []),
+ 'INDI:NAME:_OTHN' => new NamePersonal('Other name', []),
+ 'INDI:NAME:_RELN' => new NamePersonal('Religious name', []),
+ 'INDI:NAME:_SHON' => new NamePersonal('Short name', []),
+ 'INDI:NAME:_SLDN' => new NamePersonal('Soldier name', []),
+ 'INDI:_ADPF' => new CustomElement(I18N::translate('Adopted by father')),
+ 'INDI:_ADPM' => new CustomElement(I18N::translate('Adopted by mother')),
+ 'INDI:_BRTM' => new CustomIndividualEvent(I18N::translate('Brit milah')),
+ 'INDI:_BRTM:DATE' => new DateValue(I18N::translate('Date of brit milah')),
+ 'INDI:_BRTM:PLAC' => new PlaceName(I18N::translate('Place of brit milah')),
+ 'INDI:_EMAIL' => new AddressEmail(I18N::translate('Email address')),
+ 'INDI:_EYEC' => new CustomFact(I18N::translate('Eye color')),
+ 'INDI:_FNRL' => new CustomElement(I18N::translate('Funeral')),
+ 'INDI:_HAIR' => new CustomFact(I18N::translate('Hair color')),
+ 'INDI:_HEIG' => new CustomFact(I18N::translate('Height')),
+ 'INDI:_INTE' => new CustomElement(I18N::translate('Interment')),
+ 'INDI:_MEDC' => new CustomFact(I18N::translate('Medical')),
+ 'INDI:_MILT' => new CustomElement(I18N::translate('Military service')),
+ 'INDI:_NLIV' => new CustomFact(I18N::translate('Not living')),
+ 'INDI:_NMAR' => new CustomEvent(I18N::translate('Never married'), ['NOTE' => '0:M', 'SOUR' => '0:M']),
+ 'INDI:_PRMN' => new CustomElement(I18N::translate('Permanent number')),
+ 'INDI:_TODO' => new CustomElement(I18N::translate('Research task')),
+ 'INDI:_WEIG' => new CustomFact(I18N::translate('Weight')),
+ 'INDI:_YART' => new CustomIndividualEvent(I18N::translate('Yahrzeit')),
+ // 1 XXXX
+ // 2 _EVN ##
+ // 1 ASSO @Xnnn@
+ // 2 RELA Witness at event _EVN ##
+ ];
+ }
+}
diff --git a/app/CustomTags/FamilySearch.php b/app/CustomTags/FamilySearch.php
new file mode 100644
index 0000000000..0500cd5309
--- /dev/null
+++ b/app/CustomTags/FamilySearch.php
@@ -0,0 +1,55 @@
+<?php
+
+/**
+ * webtrees: online genealogy
+ * Copyright (C) 2022 webtrees development team
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+declare(strict_types=1);
+
+namespace Fisharebest\Webtrees\CustomTags;
+
+use Fisharebest\Webtrees\Contracts\CustomTagInterface;
+use Fisharebest\Webtrees\Contracts\ElementInterface;
+use Fisharebest\Webtrees\Elements\FamilySearchFamilyTreeId;
+use Fisharebest\Webtrees\I18N;
+
+/**
+ * GEDCOM files created by FamilySearch
+ *
+ * @see https://www.familysearch.org/en
+ */
+class FamilySearch implements CustomTagInterface
+{
+ /**
+ * The name of the application.
+ *
+ * @return string
+ */
+ public function name(): string
+ {
+ return 'FamilySearch';
+ }
+
+ /**
+ * Tags created by this application.
+ *
+ * @return array<string,ElementInterface>
+ */
+ public function tags(): array
+ {
+ return [
+ 'INDI:_FSFTID' => /* I18N: familysearch.org */ new FamilySearchFamilyTreeId(I18N::translate('FamilySearch ID')),
+ ];
+ }
+}
diff --git a/app/CustomTags/FamilyTreeBuilder.php b/app/CustomTags/FamilyTreeBuilder.php
new file mode 100644
index 0000000000..c9c8e98f14
--- /dev/null
+++ b/app/CustomTags/FamilyTreeBuilder.php
@@ -0,0 +1,66 @@
+<?php
+
+/**
+ * webtrees: online genealogy
+ * Copyright (C) 2022 webtrees development team
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+declare(strict_types=1);
+
+namespace Fisharebest\Webtrees\CustomTags;
+
+use Fisharebest\Webtrees\Contracts\CustomTagInterface;
+use Fisharebest\Webtrees\Contracts\ElementInterface;
+use Fisharebest\Webtrees\Elements\CustomElement;
+use Fisharebest\Webtrees\Elements\DateValue;
+use Fisharebest\Webtrees\Elements\NamePersonal;
+use Fisharebest\Webtrees\Elements\PlaceName;
+use Fisharebest\Webtrees\I18N;
+
+/**
+ * GEDCOM files created by FamilySearch
+ *
+ * @see https://www.familysearch.org/en/
+ */
+class FamilyTreeBuilder implements CustomTagInterface
+{
+ /**
+ * The name of the application.
+ *
+ * @return string
+ */
+ public function name(): string
+ {
+ return 'FamilyTreeBuilder';
+ }
+
+ /**
+ * Tags created by this application.
+ *
+ * @return array<string,ElementInterface>
+ */
+ public function tags(): array
+ {
+ return [
+ '*:_UPD' => /* I18N: GEDCOM tag _UPD */ new CustomElement(I18N::translate('Updated at')), // e.g. "1 _UPD 14 APR 2012 00:14:10 GMT-5"
+ 'INDI:NAME:_AKA' => new NamePersonal(I18N::translate('Also known as'), []),
+ 'OBJE:_ALBUM' => new CustomElement(I18N::translate('Album')), // XREF to an album
+ 'OBJE:_DATE' => new DateValue(I18N::translate('Date')),
+ 'OBJE:_FILESIZE' => new CustomElement(I18N::translate('File size')),
+ 'OBJE:_PHOTO_RIN' => new CustomElement(I18N::translate('Record ID number')),
+ 'OBJE:_PLACE' => new PlaceName(I18N::translate('Place')),
+ '_ALBUM:_PHOTO' => new CustomElement(I18N::translate('Photo')),
+ '_ALBUM:_PHOTO:_PRIN' => new CustomElement(I18N::translate('Highlighted image')),
+ ];
+ }
+}
diff --git a/app/CustomTags/FamilyTreeMaker.php b/app/CustomTags/FamilyTreeMaker.php
new file mode 100644
index 0000000000..b004c61046
--- /dev/null
+++ b/app/CustomTags/FamilyTreeMaker.php
@@ -0,0 +1,141 @@
+<?php
+
+/**
+ * webtrees: online genealogy
+ * Copyright (C) 2022 webtrees development team
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+declare(strict_types=1);
+
+namespace Fisharebest\Webtrees\CustomTags;
+
+use Fisharebest\Webtrees\Contracts\CustomTagInterface;
+use Fisharebest\Webtrees\Contracts\ElementInterface;
+use Fisharebest\Webtrees\Elements\CustomElement;
+use Fisharebest\Webtrees\Elements\NamePersonal;
+use Fisharebest\Webtrees\I18N;
+
+/**
+ * GEDCOM files created by FamilyTreeMaker
+ *
+ * @see https://wiki-de.genealogy.net/GEDCOM/_Nutzerdef-Tag
+ */
+class FamilyTreeMaker implements CustomTagInterface
+{
+ /**
+ * The name of the application.
+ *
+ * @return string
+ */
+ public function name(): string
+ {
+ return 'FamilyTreeMaker';
+ }
+
+ /**
+ * Tags created by this application.
+ *
+ * @return array<string,ElementInterface>
+ */
+ public function tags(): array
+ {
+ return [
+ 'FAM:CHIL:_FREL' => new CustomElement(I18N::translate('Relationship to father')),
+ 'FAM:CHIL:_MREL' => new CustomElement(I18N::translate('Relationship to mother')),
+ 'FAM:_DETS' => new CustomElement(I18N::translate('Death of one spouse')),
+ 'FAM:_FA1' => new CustomElement(I18N::translate('Fact 1')),
+ 'FAM:_FA10' => new CustomElement(I18N::translate('Fact 10')),
+ 'FAM:_FA11' => new CustomElement(I18N::translate('Fact 11')),
+ 'FAM:_FA12' => new CustomElement(I18N::translate('Fact 12')),
+ 'FAM:_FA13' => new CustomElement(I18N::translate('Fact 13')),
+ 'FAM:_FA2' => new CustomElement(I18N::translate('Fact 2')),
+ 'FAM:_FA3' => new CustomElement(I18N::translate('Fact 3')),
+ 'FAM:_FA4' => new CustomElement(I18N::translate('Fact 4')),
+ 'FAM:_FA5' => new CustomElement(I18N::translate('Fact 5')),
+ 'FAM:_FA6' => new CustomElement(I18N::translate('Fact 6')),
+ 'FAM:_FA7' => new CustomElement(I18N::translate('Fact 7')),
+ 'FAM:_FA8' => new CustomElement(I18N::translate('Fact 8')),
+ 'FAM:_FA9' => new CustomElement(I18N::translate('Fact 9')),
+ 'FAM:_MEND' => new CustomElement(I18N::translate('Marriage ending status')),
+ 'FAM:_MSTAT' => new CustomElement(I18N::translate('Marriage beginning status')),
+ 'FAM:_SEPR' => new CustomElement(I18N::translate('Separation')),
+ 'HEAD:_SCHEMA' => new CustomElement(I18N::translate('Schema')),
+ 'HEAD:_SCHEMA:FAM' => new CustomElement(I18N::translate('Family')),
+ 'HEAD:_SCHEMA:FAM:_FA*:LABL' => new CustomElement(I18N::translate('Label')),
+ 'HEAD:_SCHEMA:FAM:_FA1' => new CustomElement(I18N::translate('Fact 1')),
+ 'HEAD:_SCHEMA:FAM:_FA10' => new CustomElement(I18N::translate('Fact 10')),
+ 'HEAD:_SCHEMA:FAM:_FA11' => new CustomElement(I18N::translate('Fact 11')),
+ 'HEAD:_SCHEMA:FAM:_FA12' => new CustomElement(I18N::translate('Fact 12')),
+ 'HEAD:_SCHEMA:FAM:_FA13' => new CustomElement(I18N::translate('Fact 13')),
+ 'HEAD:_SCHEMA:FAM:_FA2' => new CustomElement(I18N::translate('Fact 2')),
+ 'HEAD:_SCHEMA:FAM:_FA3' => new CustomElement(I18N::translate('Fact 3')),
+ 'HEAD:_SCHEMA:FAM:_FA4' => new CustomElement(I18N::translate('Fact 4')),
+ 'HEAD:_SCHEMA:FAM:_FA5' => new CustomElement(I18N::translate('Fact 5')),
+ 'HEAD:_SCHEMA:FAM:_FA6' => new CustomElement(I18N::translate('Fact 6')),
+ 'HEAD:_SCHEMA:FAM:_FA7' => new CustomElement(I18N::translate('Fact 7')),
+ 'HEAD:_SCHEMA:FAM:_FA8' => new CustomElement(I18N::translate('Fact 8')),
+ 'HEAD:_SCHEMA:FAM:_FA9' => new CustomElement(I18N::translate('Fact 9')),
+ 'HEAD:_SCHEMA:FAM:_M*:LABL' => new CustomElement(I18N::translate('Label')),
+ 'HEAD:_SCHEMA:FAM:_MEND' => new CustomElement(I18N::translate('Marriage ending status')),
+ 'HEAD:_SCHEMA:FAM:_MSTAT' => new CustomElement(I18N::translate('Marriage beginning status')),
+ 'HEAD:_SCHEMA:INDI' => new CustomElement(I18N::translate('Individual')),
+ 'HEAD:_SCHEMA:INDI:_FA*:LABL' => new CustomElement(I18N::translate('Label')),
+ 'HEAD:_SCHEMA:INDI:_FA1' => new CustomElement(I18N::translate('Fact 1')),
+ 'HEAD:_SCHEMA:INDI:_FA10' => new CustomElement(I18N::translate('Fact 10')),
+ 'HEAD:_SCHEMA:INDI:_FA11' => new CustomElement(I18N::translate('Fact 11')),
+ 'HEAD:_SCHEMA:INDI:_FA12' => new CustomElement(I18N::translate('Fact 12')),
+ 'HEAD:_SCHEMA:INDI:_FA13' => new CustomElement(I18N::translate('Fact 13')),
+ 'HEAD:_SCHEMA:INDI:_FA2' => new CustomElement(I18N::translate('Fact 2')),
+ 'HEAD:_SCHEMA:INDI:_FA3' => new CustomElement(I18N::translate('Fact 3')),
+ 'HEAD:_SCHEMA:INDI:_FA4' => new CustomElement(I18N::translate('Fact 4')),
+ 'HEAD:_SCHEMA:INDI:_FA5' => new CustomElement(I18N::translate('Fact 5')),
+ 'HEAD:_SCHEMA:INDI:_FA6' => new CustomElement(I18N::translate('Fact 6')),
+ 'HEAD:_SCHEMA:INDI:_FA7' => new CustomElement(I18N::translate('Fact 7')),
+ 'HEAD:_SCHEMA:INDI:_FA8' => new CustomElement(I18N::translate('Fact 8')),
+ 'HEAD:_SCHEMA:INDI:_FA9' => new CustomElement(I18N::translate('Fact 9')),
+ 'HEAD:_SCHEMA:INDI:_FREL' => new CustomElement(I18N::translate('Relationship to father')),
+ 'HEAD:_SCHEMA:INDI:_M*:LABL' => new CustomElement(I18N::translate('Label')),
+ 'HEAD:_SCHEMA:INDI:_MREL' => new CustomElement(I18N::translate('Relationship to mother')),
+ 'INDI:*:SOUR:_APID' => /* I18N: GEDCOM tag _APID */ new CustomElement(I18N::translate('Ancestry.com source identifier')),
+ 'INDI:*:SOUR:_LINK' => new CustomElement(I18N::translate('External link')),
+ 'INDI:NAME:_AKA' => new NamePersonal(I18N::translate('Also known as'), []),
+ 'INDI:NAME:_MARNM' => new NamePersonal(I18N::translate('Married name'), []),
+ 'INDI:_CIRC' => new CustomElement(I18N::translate('Circumcision')),
+ 'INDI:_DCAUSE' => new CustomElement(I18N::translate('Cause of death')),
+ 'INDI:_DEG' => new CustomElement(I18N::translate('Degree')),
+ 'INDI:_DNA' => new CustomElement(I18N::translate('DNA markers')),
+ 'INDI:_ELEC' => new CustomElement('Elected'),
+ 'INDI:_EMPLOY' => new CustomElement('Employment'),
+ 'INDI:_EXCM' => new CustomElement('Excommunicated'),
+ 'INDI:_FA1' => new CustomElement(I18N::translate('Fact 1')),
+ 'INDI:_FA10' => new CustomElement(I18N::translate('Fact 10')),
+ 'INDI:_FA11' => new CustomElement(I18N::translate('Fact 11')),
+ 'INDI:_FA12' => new CustomElement(I18N::translate('Fact 12')),
+ 'INDI:_FA13' => new CustomElement(I18N::translate('Fact 13')),
+ 'INDI:_FA2' => new CustomElement(I18N::translate('Fact 2')),
+ 'INDI:_FA3' => new CustomElement(I18N::translate('Fact 3')),
+ 'INDI:_FA4' => new CustomElement(I18N::translate('Fact 4')),
+ 'INDI:_FA5' => new CustomElement(I18N::translate('Fact 5')),
+ 'INDI:_FA6' => new CustomElement(I18N::translate('Fact 6')),
+ 'INDI:_FA7' => new CustomElement(I18N::translate('Fact 7')),
+ 'INDI:_FA8' => new CustomElement(I18N::translate('Fact 8')),
+ 'INDI:_FA9' => new CustomElement(I18N::translate('Fact 9')),
+ 'INDI:_MDCL' => new CustomElement(I18N::translate('Medical')),
+ 'INDI:_MILT' => new CustomElement(I18N::translate('Military service')),
+ 'INDI:_MILTID' => new CustomElement('Military ID number'),
+ 'INDI:_MISN' => new CustomElement('Mission'),
+ 'INDI:_NAMS' => new CustomElement(I18N::translate('Namesake')),
+ 'INDI:_UNKN' => new CustomElement(I18N::translate('Unknown')), // Special individual ID code for later file comparisons
+ ];
+ }
+}
diff --git a/app/CustomTags/Gedcom7.php b/app/CustomTags/Gedcom7.php
new file mode 100644
index 0000000000..3e3faf8d48
--- /dev/null
+++ b/app/CustomTags/Gedcom7.php
@@ -0,0 +1,173 @@
+<?php
+
+/**
+ * webtrees: online genealogy
+ * Copyright (C) 2022 webtrees development team
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+declare(strict_types=1);
+
+namespace Fisharebest\Webtrees\CustomTags;
+
+use Fisharebest\Webtrees\Contracts\CustomTagInterface;
+use Fisharebest\Webtrees\Contracts\ElementInterface;
+use Fisharebest\Webtrees\Elements\Creation;
+use Fisharebest\Webtrees\Elements\CustomElement;
+use Fisharebest\Webtrees\Elements\DateValueExact;
+use Fisharebest\Webtrees\Elements\DateValueToday;
+use Fisharebest\Webtrees\Elements\ExternalIdentifier;
+use Fisharebest\Webtrees\Elements\ExternalIdentifierType;
+use Fisharebest\Webtrees\Elements\FamilyFact;
+use Fisharebest\Webtrees\Elements\LdsInitiatory;
+use Fisharebest\Webtrees\Elements\LdsOrdinanceStatus;
+use Fisharebest\Webtrees\Elements\NonEvent;
+use Fisharebest\Webtrees\Elements\RoleInEvent;
+use Fisharebest\Webtrees\Elements\TempleCode;
+use Fisharebest\Webtrees\Elements\TimeValue;
+use Fisharebest\Webtrees\Elements\TimeValueNow;
+use Fisharebest\Webtrees\Elements\Uid;
+use Fisharebest\Webtrees\Elements\UserReferenceNumber;
+use Fisharebest\Webtrees\Elements\UserReferenceType;
+use Fisharebest\Webtrees\Elements\XrefAssociate;
+use Fisharebest\Webtrees\Elements\XrefSharedNote;
+use Fisharebest\Webtrees\I18N;
+
+/**
+ * GEDCOM files created by Gedcom7
+ *
+ * @see https://gedcom.io
+ */
+class Gedcom7 implements CustomTagInterface
+{
+ /**
+ * The name of the application.
+ *
+ * @return string
+ */
+ public function name(): string
+ {
+ return 'Gedcom 7';
+ }
+
+ /**
+ * Tags created by this application.
+ *
+ * @return array<string,ElementInterface>
+ */
+ public function tags(): array
+ {
+ return [
+ 'FAM:NO' => new NonEvent('Event did not happen'),
+ 'INDI:NO' => new NonEvent('Event did not happen'),
+ 'FAM:*:ASSO' => new XrefAssociate(I18N::translate('Associate')),
+ 'FAM:*:ASSO:PHRASE' => new CustomElement(I18N::translate('Phrase')),
+ 'FAM:*:ASSO:ROLE' => new RoleInEvent(I18N::translate('Role')),
+ 'FAM:*:ASSO:ROLE:PHRASE' => new CustomElement(I18N::translate('Phrase')),
+ 'FAM:*:DATE:TIME' => new TimeValue(I18N::translate('Time')),
+ 'FAM:*:PLAC:EXID' => new ExternalIdentifier(I18N::translate('External identifier')),
+ 'FAM:*:PLAC:EXID:TYPE' => new ExternalIdentifierType(I18N::translate('Type')),
+ 'FAM:*:SDATE' => new CustomElement(I18N::translate('Sort date')),
+ 'FAM:*:SDATE:PHRASE' => new CustomElement(I18N::translate('Phrase')),
+ 'FAM:*:SDATE:TIME' => new CustomElement(I18N::translate('Sort time')),
+ 'FAM:*:SNOTE' => new XrefSharedNote(I18N::translate('Shared note')),
+ 'FAM:*:UID' => new Uid(I18N::translate('Unique identifier')),
+ 'FAM:ASSO' => new XrefAssociate(I18N::translate('Associate')),
+ 'FAM:ASSO:PHRASE' => new CustomElement(I18N::translate('Phrase')),
+ 'FAM:ASSO:ROLE' => new RoleInEvent(I18N::translate('Role')),
+ 'FAM:ASSO:ROLE:PHRASE' => new CustomElement(I18N::translate('Phrase')),
+ 'FAM:CREA' => new Creation(I18N::translate('Created at')),
+ 'FAM:CREA:DATE' => new DateValueToday(I18N::translate('Creation date')),
+ 'FAM:CREA:DATE:TIME' => new TimeValueNow(I18N::translate('Creation time')),
+ 'FAM:EXID' => new ExternalIdentifier(I18N::translate('External identifier')),
+ 'FAM:EXID:TYPE' => new ExternalIdentifierType(I18N::translate('Type')),
+ 'FAM:FACT' => new FamilyFact(I18N::translate('Fact')),
+ 'FAM:REFN' => new UserReferenceNumber(I18N::translate('Reference number')),
+ 'FAM:REFN:TYPE' => new UserReferenceType(I18N::translate('Type')),
+ 'FAM:SNOTE' => new XrefSharedNote(I18N::translate('Shared note')),
+ 'FAM:UID' => new Uid(I18N::translate('Unique identifier')),
+ 'INDI:*:ASSO' => new XrefAssociate(I18N::translate('Associate')),
+ 'INDI:*:ASSO:PHRASE' => new CustomElement(I18N::translate('Phrase')),
+ 'INDI:*:ASSO:ROLE' => new RoleInEvent(I18N::translate('Role')),
+ 'INDI:*:ASSO:ROLE:PHRASE' => new CustomElement(I18N::translate('Phrase')),
+ 'INDI:*:DATE:TIME' => new TimeValue(I18N::translate('Time')),
+ 'INDI:*:PLAC:EXID' => new ExternalIdentifier(I18N::translate('External identifier')),
+ 'INDI:*:PLAC:EXID:TYPE' => new ExternalIdentifierType(I18N::translate('Type')),
+ 'INDI:*:SDATE' => new CustomElement(I18N::translate('Sort date')),
+ 'INDI:*:SDATE:PHRASE' => new CustomElement(I18N::translate('Phrase')),
+ 'INDI:*:SDATE:TIME' => new CustomElement(I18N::translate('Sort time')),
+ 'INDI:*:SNOTE' => new XrefSharedNote(I18N::translate('Shared note')),
+ 'INDI:*:UID' => new Uid(I18N::translate('Unique identifier')),
+ 'INDI:ADOP:FAMC:ADOP:PHRASE' => new CustomElement(I18N::translate('Phrase')),
+ 'INDI:ALIA:PHRASE' => new CustomElement(I18N::translate('Phrase')),
+ 'INDI:ASSO' => new XrefAssociate(I18N::translate('Associate')),
+ 'INDI:ASSO:PHRASE' => new CustomElement(I18N::translate('Phrase')),
+ 'INDI:ASSO:ROLE' => new RoleInEvent(I18N::translate('Role')),
+ 'INDI:ASSO:ROLE:PHRASE' => new CustomElement(I18N::translate('Phrase')),
+ 'INDI:BIRT:DATE:TIME' => new TimeValue(I18N::translate('Time of birth')),
+ 'INDI:CREA' => new Creation(I18N::translate('Created at')),
+ 'INDI:CREA:DATE' => new DateValueToday(I18N::translate('Creation date')),
+ 'INDI:CREA:DATE:TIME' => new TimeValueNow(I18N::translate('Creation time')),
+ 'INDI:DEAT:DATE:TIME' => new TimeValue(I18N::translate('Time of death')),
+ 'INDI:EXID' => new ExternalIdentifier(I18N::translate('External identifier')),
+ 'INDI:EXID:TYPE' => new ExternalIdentifierType(I18N::translate('Type')),
+ 'INDI:INIL' => /* I18N: GEDCOM tag INIL - an LDS ceremony */ new LdsInitiatory(I18N::translate('LDS initiatory')),
+ 'INDI:INIL:STAT' => new LdsOrdinanceStatus(I18N::translate('Status')),
+ 'INDI:INIL:STAT:DATE' => new DateValueExact(I18N::translate('Date of status change')),
+ 'INDI:INIL:STAT:DATE:TIME' => new TimeValue(I18N::translate('Time of status change')),
+ 'INDI:INIL:TEMP' => new TempleCode(I18N::translate('Temple')),
+ 'INDI:REFN' => new UserReferenceNumber(I18N::translate('Reference number')),
+ 'INDI:REFN:TYPE' => new UserReferenceType(I18N::translate('Type')),
+ 'INDI:SNOTE' => new XrefSharedNote(I18N::translate('Shared note')),
+ 'INDI:UID' => new Uid(I18N::translate('Unique identifier')),
+ 'OBJE:CREA' => new Creation(I18N::translate('Created at')),
+ 'OBJE:CREA:DATE' => new DateValueToday(I18N::translate('Creation date')),
+ 'OBJE:CREA:DATE:TIME' => new TimeValueNow(I18N::translate('Creation time')),
+ 'OBJE:SNOTE' => new XrefSharedNote(I18N::translate('Shared note')),
+ 'REPO:CREA' => new Creation(I18N::translate('Created at')),
+ 'REPO:CREA:DATE' => new DateValueToday(I18N::translate('Creation date')),
+ 'REPO:CREA:DATE:TIME' => new TimeValueNow(I18N::translate('Creation time')),
+ 'REPO:EXID' => new ExternalIdentifier(I18N::translate('External identifier')),
+ 'REPO:EXID:TYPE' => new ExternalIdentifierType(I18N::translate('Type')),
+ 'REPO:REFN' => new UserReferenceNumber(I18N::translate('Reference number')),
+ 'REPO:REFN:TYPE' => new UserReferenceType(I18N::translate('Type')),
+ 'REPO:SNOTE' => new XrefSharedNote(I18N::translate('Shared note')),
+ 'REPO:UID' => new Uid(I18N::translate('Unique identifier')),
+ 'SNOTE:CREA' => new Creation(I18N::translate('Created at')),
+ 'SNOTE:CREA:DATE' => new DateValueToday(I18N::translate('Creation date')),
+ 'SNOTE:CREA:DATE:TIME' => new TimeValueNow(I18N::translate('Creation time')),
+ 'SNOTE:EXID' => new ExternalIdentifier(I18N::translate('External identifier')),
+ 'SNOTE:EXID:TYPE' => new ExternalIdentifierType(I18N::translate('Type')),
+ 'SNOTE:REFN' => new UserReferenceNumber(I18N::translate('Reference number')),
+ 'SNOTE:REFN:TYPE' => new UserReferenceType(I18N::translate('Type')),
+ 'SNOTE:UID' => new Uid(I18N::translate('Unique identifier')),
+ 'SOUR:CREA' => new Creation(I18N::translate('Created at')),
+ 'SOUR:CREA:DATE' => new DateValueToday(I18N::translate('Creation date')),
+ 'SOUR:CREA:DATE:TIME' => new TimeValueNow(I18N::translate('Creation time')),
+ 'SOUR:EXID' => new ExternalIdentifier(I18N::translate('External identifier')),
+ 'SOUR:EXID:TYPE' => new ExternalIdentifierType(I18N::translate('Type')),
+ 'SOUR:REFN' => new UserReferenceNumber(I18N::translate('Reference number')),
+ 'SOUR:REFN:TYPE' => new UserReferenceType(I18N::translate('Type')),
+ 'SOUR:SNOTE' => new XrefSharedNote(I18N::translate('Shared note')),
+ 'SOUR:UID' => new Uid(I18N::translate('Unique identifier')),
+ 'SUBM:CREA' => new Creation(I18N::translate('Created at')),
+ 'SUBM:CREA:DATE' => new DateValueToday(I18N::translate('Creation date')),
+ 'SUBM:CREA:DATE:TIME' => new TimeValueNow(I18N::translate('Creation time')),
+ 'SUBM:EXID' => new ExternalIdentifier(I18N::translate('External identifier')),
+ 'SUBM:EXID:TYPE' => new ExternalIdentifierType(I18N::translate('Type')),
+ 'SUBM:REFN' => new UserReferenceNumber(I18N::translate('Reference number')),
+ 'SUBM:REFN:TYPE' => new UserReferenceType(I18N::translate('Type')),
+ 'SUBM:SNOTE' => new XrefSharedNote(I18N::translate('Shared note')),
+ 'SUBM:UID' => new Uid(I18N::translate('Unique identifier')),
+ ];
+ }
+}
diff --git a/app/CustomTags/GedcomL.php b/app/CustomTags/GedcomL.php
new file mode 100644
index 0000000000..9d87393207
--- /dev/null
+++ b/app/CustomTags/GedcomL.php
@@ -0,0 +1,314 @@
+<?php
+
+/**
+ * webtrees: online genealogy
+ * Copyright (C) 2022 webtrees development team
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+declare(strict_types=1);
+
+namespace Fisharebest\Webtrees\CustomTags;
+
+use Fisharebest\Webtrees\Contracts\CustomTagInterface;
+use Fisharebest\Webtrees\Contracts\ElementInterface;
+use Fisharebest\Webtrees\Elements\AddressCity;
+use Fisharebest\Webtrees\Elements\AddressCountry;
+use Fisharebest\Webtrees\Elements\AddressEmail;
+use Fisharebest\Webtrees\Elements\AddressFax;
+use Fisharebest\Webtrees\Elements\AddressLine;
+use Fisharebest\Webtrees\Elements\AddressLine1;
+use Fisharebest\Webtrees\Elements\AddressLine2;
+use Fisharebest\Webtrees\Elements\AddressLine3;
+use Fisharebest\Webtrees\Elements\AddressPostalCode;
+use Fisharebest\Webtrees\Elements\AddressState;
+use Fisharebest\Webtrees\Elements\AddressWebPage;
+use Fisharebest\Webtrees\Elements\CauseOfEvent;
+use Fisharebest\Webtrees\Elements\CertaintyAssessment;
+use Fisharebest\Webtrees\Elements\Change;
+use Fisharebest\Webtrees\Elements\ChangeDate;
+use Fisharebest\Webtrees\Elements\CustomElement;
+use Fisharebest\Webtrees\Elements\DateValue;
+use Fisharebest\Webtrees\Elements\DateValueToday;
+use Fisharebest\Webtrees\Elements\EmptyElement;
+use Fisharebest\Webtrees\Elements\EventAttributeType;
+use Fisharebest\Webtrees\Elements\EventTypeCitedFrom;
+use Fisharebest\Webtrees\Elements\FamilyStatusText;
+use Fisharebest\Webtrees\Elements\GovIdentifier;
+use Fisharebest\Webtrees\Elements\HierarchicalRelationship;
+use Fisharebest\Webtrees\Elements\LanguageId;
+use Fisharebest\Webtrees\Elements\LocationRecord;
+use Fisharebest\Webtrees\Elements\MaidenheadLocator;
+use Fisharebest\Webtrees\Elements\NamePieceGiven;
+use Fisharebest\Webtrees\Elements\NoteStructure;
+use Fisharebest\Webtrees\Elements\PafUid;
+use Fisharebest\Webtrees\Elements\PhoneNumber;
+use Fisharebest\Webtrees\Elements\PhoneticType;
+use Fisharebest\Webtrees\Elements\PlaceHierarchy;
+use Fisharebest\Webtrees\Elements\PlaceLatitude;
+use Fisharebest\Webtrees\Elements\PlaceLongtitude;
+use Fisharebest\Webtrees\Elements\PlaceName;
+use Fisharebest\Webtrees\Elements\PlacePhoneticVariation;
+use Fisharebest\Webtrees\Elements\PlaceRomanizedVariation;
+use Fisharebest\Webtrees\Elements\RelationIsDescriptor;
+use Fisharebest\Webtrees\Elements\ReligiousAffiliation;
+use Fisharebest\Webtrees\Elements\ResearchTask;
+use Fisharebest\Webtrees\Elements\ResearchTaskPriority;
+use Fisharebest\Webtrees\Elements\ResearchTaskStatus;
+use Fisharebest\Webtrees\Elements\ResearchTaskType;
+use Fisharebest\Webtrees\Elements\ResponsibleAgency;
+use Fisharebest\Webtrees\Elements\RestrictionNotice;
+use Fisharebest\Webtrees\Elements\RoleInEvent;
+use Fisharebest\Webtrees\Elements\RomanizedType;
+use Fisharebest\Webtrees\Elements\SexXValue;
+use Fisharebest\Webtrees\Elements\SourceData;
+use Fisharebest\Webtrees\Elements\SubmitterText;
+use Fisharebest\Webtrees\Elements\TextFromSource;
+use Fisharebest\Webtrees\Elements\TimeValueNow;
+use Fisharebest\Webtrees\Elements\VersionNumber;
+use Fisharebest\Webtrees\Elements\WhereWithinSource;
+use Fisharebest\Webtrees\Elements\XrefAssociate;
+use Fisharebest\Webtrees\Elements\XrefLocation;
+use Fisharebest\Webtrees\Elements\XrefMedia;
+use Fisharebest\Webtrees\Elements\XrefRepository;
+use Fisharebest\Webtrees\Elements\XrefSource;
+use Fisharebest\Webtrees\I18N;
+
+/**
+ * GEDCOM files created by Gedcom-L
+ *
+ * @see https://www.genwiki.de/GEDCOM-L
+ */
+class GedcomL implements CustomTagInterface
+{
+ /**
+ * The name of the application.
+ *
+ * @return string
+ */
+ public function name(): string
+ {
+ return 'GEDCOM-L';
+ }
+
+ /**
+ * Tags created by this application.
+ *
+ * @return array<string,ElementInterface>
+ */
+ public function tags(): array
+ {
+ return [
+ 'FAM:*:ADDR:_NAME' => new CustomElement(I18N::translate('Name of addressee')),
+ // I18N: https://gov.genealogy.net
+ 'FAM:*:PLAC:_GOV' => new GovIdentifier(I18N::translate('GOV identifier')),
+ 'FAM:*:PLAC:_LOC' => new XrefLocation(I18N::translate('Location')),
+ // I18N: https://en.wikipedia.org/wiki/Maidenhead_Locator_System
+ 'FAM:*:PLAC:_MAIDENHEAD' => new MaidenheadLocator(I18N::translate('Maidenhead location code')),
+ 'FAM:*:PLAC:_POST' => new AddressPostalCode(I18N::translate('Postal code')),
+ 'FAM:*:PLAC:_POST:DATE' => new DateValue(I18N::translate('Date')),
+ 'FAM:*:_ASSO' => new XrefAssociate(I18N::translate('Associate')),
+ 'FAM:*:_ASSO:NOTE' => new NoteStructure(I18N::translate('Note on association')),
+ 'FAM:*:_ASSO:RELA' => new RelationIsDescriptor(I18N::translate('Relationship')),
+ 'FAM:*:_ASSO:SOUR' => new XrefSource(I18N::translate('Source citation')),
+ 'FAM:*:_ASSO:SOUR:DATA' => new SourceData(I18N::translate('Data')),
+ 'FAM:*:_ASSO:SOUR:DATA:DATE' => new DateValue(I18N::translate('Date of entry in original source')),
+ 'FAM:*:_ASSO:SOUR:DATA:TEXT' => new TextFromSource(I18N::translate('Text')),
+ 'FAM:*:_ASSO:SOUR:EVEN' => new EventTypeCitedFrom(I18N::translate('Event')),
+ 'FAM:*:_ASSO:SOUR:EVEN:ROLE' => new RoleInEvent(I18N::translate('Role')),
+ 'FAM:*:_ASSO:SOUR:NOTE' => new NoteStructure(I18N::translate('Note on source citation')),
+ 'FAM:*:_ASSO:SOUR:OBJE' => new XrefMedia(I18N::translate('Media object')),
+ 'FAM:*:_ASSO:SOUR:PAGE' => new WhereWithinSource(I18N::translate('Citation details')),
+ 'FAM:*:_ASSO:SOUR:QUAY' => new CertaintyAssessment(I18N::translate('Quality of data')),
+ 'FAM:*:_WITN' => new CustomElement(I18N::translate('Witnesses')),
+ 'FAM:_ASSO' => new XrefAssociate(I18N::translate('Associate')),
+ 'FAM:_ASSO:RELA' => new RelationIsDescriptor(I18N::translate('Relationship')),
+ 'FAM:_STAT' => new FamilyStatusText(I18N::translate('Family status')),
+ 'FAM:_TODO' => new ResearchTask(I18N::translate('Research task'), ['DESC' => '1:1', '_CAT' => '0:1', '_PRTY' => '0:1', 'TYPE' => '0:1', 'NOTE' => '0:M', 'DATA' => '0:1', 'STAT' => '0:1', '_CDATE' => '0:1', '_RDATE' => '0:1', 'REPO' => '0:1', '_UID' => '0:M']),
+ 'FAM:_TODO:DATA' => new SubmitterText(I18N::translate('The solution')),
+ 'FAM:_TODO:DATE' => new DateValueToday(I18N::translate('Creation date')),
+ 'FAM:_TODO:DESC' => new CustomElement(I18N::translate('Description')),
+ 'FAM:_TODO:NOTE' => new NoteStructure(I18N::translate('Note')),
+ 'FAM:_TODO:REPO' => new XrefRepository(I18N::translate('Repository'), []),
+ 'FAM:_TODO:STAT' => new ResearchTaskStatus(I18N::translate('Status')),
+ 'FAM:_TODO:TYPE' => new ResearchTaskType(I18N::translate('Type of research task')),
+ 'FAM:_TODO:_CAT' => new CustomElement(I18N::translate('Category')),
+ 'FAM:_TODO:_CDATE' => new DateValue(I18N::translate('Completion date')),
+ 'FAM:_TODO:_PRTY' => new ResearchTaskPriority(I18N::translate('Priority')),
+ 'FAM:_TODO:_RDATE' => new DateValue(I18N::translate('Reminder date')),
+ 'FAM:_UID' => new PafUid(I18N::translate('Unique identifier')),
+ 'HEAD:GEDC:VERS:_ADDENDUM' => new EmptyElement(I18N::translate('GEDCOM-L')),
+ 'HEAD:GEDC:VERS:_ADDENDUM:VERS' => new VersionNumber(I18N::translate('Version')),
+ 'HEAD:GEDC:VERS:_ADDENDUM:WWW' => new AddressWebPage(I18N::translate('URL')),
+ 'HEAD:SOUR:CORP:ADDR:_NAME' => new CustomElement(I18N::translate('Name of addressee')),
+ 'HEAD:_SCHEMA' => new EmptyElement(I18N::translate('Schema')),
+ 'HEAD:_SCHEMA:*' => new EmptyElement(I18N::translate('Base GEDCOM tag')),
+ 'HEAD:_SCHEMA:*:*' => new EmptyElement(I18N::translate('New GEDCOM tag')),
+ 'HEAD:_SCHEMA:*:*:*' => new EmptyElement(I18N::translate('New GEDCOM tag')),
+ 'HEAD:_SCHEMA:*:*:*:*' => new EmptyElement(I18N::translate('New GEDCOM tag')),
+ 'HEAD:_SCHEMA:*:*:*:*:*' => new EmptyElement(I18N::translate('New GEDCOM tag')),
+ 'HEAD:_SCHEMA:*:*:*:*:*:*' => new EmptyElement(I18N::translate('New GEDCOM tag')),
+ 'HEAD:_SCHEMA:*:*:*:*:*:*:_DEFN' => new EmptyElement(I18N::translate('Definition')),
+ 'HEAD:_SCHEMA:*:*:*:*:*:_DEFN' => new EmptyElement(I18N::translate('Definition')),
+ 'HEAD:_SCHEMA:*:*:*:*:_DEFN' => new EmptyElement(I18N::translate('Definition')),
+ 'HEAD:_SCHEMA:*:*:*:_DEFN' => new EmptyElement(I18N::translate('Definition')),
+ 'HEAD:_SCHEMA:*:*:_DEFN' => new EmptyElement(I18N::translate('Definition')),
+ 'INDI:*:ADDR:_NAME' => new CustomElement(I18N::translate('Name of addressee')),
+ // I18N: https://gov.genealogy.net
+ 'INDI:*:PLAC:_GOV' => new GovIdentifier(I18N::translate('GOV identifier')),
+ 'INDI:*:PLAC:_LOC' => new XrefLocation(I18N::translate('Location')),
+ // I18N: https://en.wikipedia.org/wiki/Maidenhead_Locator_System
+ 'INDI:*:PLAC:_MAIDENHEAD' => new MaidenheadLocator(I18N::translate('Maidenhead location code')),
+ 'INDI:*:PLAC:_POST' => new AddressPostalCode(I18N::translate('Postal code')),
+ 'INDI:*:PLAC:_POST:DATE' => new DateValue(I18N::translate('Date')),
+ 'INDI:*:_ASSO' => new XrefAssociate(I18N::translate('Associate')),
+ 'INDI:*:_ASSO:NOTE' => new NoteStructure(I18N::translate('Note on association')),
+ 'INDI:*:_ASSO:RELA' => new RelationIsDescriptor(I18N::translate('Relationship')),
+ 'INDI:*:_ASSO:SOUR' => new XrefSource(I18N::translate('Source citation')),
+ 'INDI:*:_ASSO:SOUR:DATA' => new SourceData(I18N::translate('Data')),
+ 'INDI:*:_ASSO:SOUR:DATA:DATE' => new DateValue(I18N::translate('Date of entry in original source')),
+ 'INDI:*:_ASSO:SOUR:DATA:TEXT' => new TextFromSource(I18N::translate('Text')),
+ 'INDI:*:_ASSO:SOUR:EVEN' => new EventTypeCitedFrom(I18N::translate('Event')),
+ 'INDI:*:_ASSO:SOUR:EVEN:ROLE' => new RoleInEvent(I18N::translate('Role')),
+ 'INDI:*:_ASSO:SOUR:NOTE' => new NoteStructure(I18N::translate('Note on source citation')),
+ 'INDI:*:_ASSO:SOUR:OBJE' => new XrefMedia(I18N::translate('Media object')),
+ 'INDI:*:_ASSO:SOUR:PAGE' => new WhereWithinSource(I18N::translate('Citation details')),
+ 'INDI:*:_ASSO:SOUR:QUAY' => new CertaintyAssessment(I18N::translate('Quality of data')),
+ 'INDI:*:_WITN' => new CustomElement(I18N::translate('Witnesses')),
+ 'INDI:BAPM:_GODP' => new CustomElement(I18N::translate('Godparents')),
+ 'INDI:CHR:_GODP' => new CustomElement(I18N::translate('Godparents')),
+ 'INDI:NAME:_RUFNAME' => new NamePieceGiven(I18N::translate('Rufname')),
+ 'INDI:OBJE:_PRIM' => new CustomElement(I18N::translate('Highlighted image')),
+ 'INDI:SEX' => new SexXValue(I18N::translate('Gender')),
+ 'INDI:_TODO' => new ResearchTask(I18N::translate('Research task')),
+ 'INDI:_TODO:DATA' => new SubmitterText(I18N::translate('The solution')),
+ 'INDI:_TODO:DATE' => new DateValueToday(I18N::translate('Creation date')),
+ 'INDI:_TODO:DESC' => new CustomElement(I18N::translate('Description')),
+ 'INDI:_TODO:NOTE' => new NoteStructure(I18N::translate('Note')),
+ 'INDI:_TODO:REPO' => new XrefRepository(I18N::translate('Repository'), []),
+ 'INDI:_TODO:STAT' => new ResearchTaskStatus(I18N::translate('Status')),
+ 'INDI:_TODO:TYPE' => new ResearchTaskType(I18N::translate('Type of research task')),
+ 'INDI:_TODO:_CAT' => new CustomElement(I18N::translate('Category')),
+ 'INDI:_TODO:_CDATE' => new DateValue(I18N::translate('Completion date')),
+ 'INDI:_TODO:_PRTY' => new ResearchTaskPriority(I18N::translate('Priority')),
+ 'INDI:_TODO:_RDATE' => new DateValue(I18N::translate('Reminder date')),
+ 'INDI:_UID' => new PafUid(I18N::translate('Unique identifier')),
+ 'NOTE:_UID' => new PafUid(I18N::translate('Unique identifier')),
+ 'OBJE:FILE:_PRIM' => new CustomElement(I18N::translate('Highlighted image')),
+ 'OBJE:_UID' => new PafUid(I18N::translate('Unique identifier')),
+ 'REPO:ADDR:_NAME' => new CustomElement(I18N::translate('Name of addressee')),
+ 'REPO:_UID' => new PafUid(I18N::translate('Unique identifier')),
+ 'SOUR:_UID' => new PafUid(I18N::translate('Unique identifier')),
+ 'SOUR:DATA:EVEN:PLAC:_LOC' => new XrefLocation(I18N::translate('Location')),
+ // I18N: https://en.wikipedia.org/wiki/Maidenhead_Locator_System
+ 'SOUR:DATA:EVEN:PLAC:_MAIDENHEAD' => new MaidenheadLocator(I18N::translate('Maidenhead location code')),
+ 'SOUR:DATA:EVEN:PLAC:_POST' => new AddressPostalCode(I18N::translate('Postal code')),
+ 'SOUR:DATA:EVEN:PLAC:_POST:DATE' => new DateValue(I18N::translate('Date')),
+ 'SUBM:ADDR:_NAME' => new CustomElement(I18N::translate('Name of addressee')),
+ 'SUBM:_UID' => new PafUid(I18N::translate('Unique identifier')),
+ 'SUBN:_UID' => new PafUid(I18N::translate('Unique identifier')),
+ '_LOC' => new LocationRecord(I18N::translate('Location')),
+ '_LOC:CHAN' => new Change(I18N::translate('Last change')),
+ '_LOC:CHAN:DATE' => new ChangeDate(I18N::translate('Date of last change')),
+ '_LOC:CHAN:DATE:TIME' => new TimeValueNow(I18N::translate('Time of last change')),
+ '_LOC:CHAN:NOTE' => new NoteStructure(I18N::translate('Note on last change')),
+ '_LOC:EVEN' => new CustomElement(I18N::translate('Event'), ['TYPE' => '0:1', 'DATE' => '0:1', 'PLAC' => '0:1', 'ADDR' => '0:1', 'EMAIL' => '0:1:?', 'WWW' => '0:1:?', 'PHON' => '0:1:?', 'FAX' => '0:1:?', 'CAUS' => '0:1', 'AGNC' => '0:1', 'RELI' => '0:1', 'NOTE' => '0:M', 'OBJE' => '0:M', 'SOUR' => '0:M', 'RESN' => '0:1']),
+ '_LOC:EVEN:ADDR' => new AddressLine(I18N::translate('Address')),
+ '_LOC:EVEN:ADDR:ADR1' => new AddressLine1(I18N::translate('Address line 1')),
+ '_LOC:EVEN:ADDR:ADR2' => new AddressLine2(I18N::translate('Address line 2')),
+ '_LOC:EVEN:ADDR:ADR3' => new AddressLine3(I18N::translate('Address line 3')),
+ '_LOC:EVEN:ADDR:CITY' => new AddressCity(I18N::translate('City')),
+ '_LOC:EVEN:ADDR:CTRY' => new AddressCountry(I18N::translate('Country')),
+ '_LOC:EVEN:ADDR:POST' => new AddressPostalCode(I18N::translate('Postal code')),
+ '_LOC:EVEN:ADDR:STAE' => new AddressState(I18N::translate('State')),
+ '_LOC:EVEN:AGNC' => new ResponsibleAgency(I18N::translate('Agency')),
+ '_LOC:EVEN:CAUS' => new CauseOfEvent(I18N::translate('Cause')),
+ '_LOC:EVEN:DATE' => new DateValue(I18N::translate('Date of event')),
+ '_LOC:EVEN:EMAIL' => new AddressEmail(I18N::translate('Email address')),
+ '_LOC:EVEN:FAX' => new AddressFax(I18N::translate('Fax')),
+ '_LOC:EVEN:NOTE' => new NoteStructure(I18N::translate('Note')),
+ '_LOC:EVEN:OBJE' => new XrefMedia(I18N::translate('Media object')),
+ '_LOC:EVEN:PHON' => new PhoneNumber(I18N::translate('Phone')),
+ '_LOC:EVEN:PLAC' => new PlaceName(I18N::translate('Place of event')),
+ '_LOC:EVEN:PLAC:FONE' => new PlacePhoneticVariation(I18N::translate('Phonetic place')),
+ '_LOC:EVEN:PLAC:FONE:TYPE' => new PhoneticType(I18N::translate('Type')),
+ '_LOC:EVEN:PLAC:FORM' => new PlaceHierarchy(I18N::translate('Format')),
+ '_LOC:EVEN:PLAC:MAP' => new EmptyElement(I18N::translate('Coordinates'), ['LATI' => '1:1', 'LONG' => '1:1']),
+ '_LOC:EVEN:PLAC:MAP:LATI' => new PlaceLatitude(I18N::translate('Latitude')),
+ '_LOC:EVEN:PLAC:MAP:LONG' => new PlaceLongtitude(I18N::translate('Longitude')),
+ '_LOC:EVEN:PLAC:NOTE' => new NoteStructure(I18N::translate('Note on place')),
+ '_LOC:EVEN:PLAC:ROMN' => new PlaceRomanizedVariation(I18N::translate('Romanized place')),
+ '_LOC:EVEN:PLAC:ROMN:TYPE' => new RomanizedType(I18N::translate('Type')),
+ '_LOC:EVEN:PLAC:_LOC' => new XrefLocation(I18N::translate('Location')),
+ '_LOC:EVEN:RELI' => new ReligiousAffiliation(I18N::translate('Religion'), []),
+ '_LOC:EVEN:RESN' => new RestrictionNotice(I18N::translate('Restriction')),
+ '_LOC:EVEN:SOUR' => new XrefSource(I18N::translate('Source citation')),
+ '_LOC:EVEN:TYPE' => new EventAttributeType(I18N::translate('Type of event')),
+ '_LOC:EVEN:WWW' => new CustomElement(I18N::translate('URL')),
+ '_LOC:MAP' => new EmptyElement(I18N::translate('Coordinates'), ['LATI' => '1:1', 'LONG' => '1:1']),
+ '_LOC:MAP:LATI' => new PlaceLatitude(I18N::translate('Latitude')),
+ '_LOC:MAP:LONG' => new PlaceLongtitude(I18N::translate('Longitude')),
+ '_LOC:NAME' => new PlaceName(I18N::translate('Place'), ['ABBR' => '0:1', 'DATE' => '0:1', 'LANG' => '0:1', 'SOUR' => '0:M']),
+ '_LOC:NAME:ABBR' => new CustomElement(I18N::translate('Abbreviation')),
+ '_LOC:NAME:ABBR:TYPE' => new CustomElement(I18N::translate('Type of abbreviation')),
+ '_LOC:NAME:DATE' => new DateValue(I18N::translate('Date')),
+ '_LOC:NAME:LANG' => new LanguageId(I18N::translate('Language')),
+ '_LOC:NAME:SOUR' => new XrefSource(I18N::translate('Source')),
+ '_LOC:NOTE' => new NoteStructure(I18N::translate('Note')),
+ '_LOC:OBJE' => new XrefMedia(I18N::translate('Media')),
+ '_LOC:RELI' => new ReligiousAffiliation(I18N::translate('Religion'), []),
+ '_LOC:SOUR' => new XrefSource(I18N::translate('Source')),
+ '_LOC:SOUR:DATA' => new SourceData(I18N::translate('Data')),
+ '_LOC:SOUR:DATA:DATE' => new DateValue(I18N::translate('Date of entry in original source')),
+ '_LOC:SOUR:DATA:TEXT' => new TextFromSource(I18N::translate('Text')),
+ '_LOC:SOUR:EVEN' => new EventTypeCitedFrom(I18N::translate('Event')),
+ '_LOC:SOUR:EVEN:ROLE' => new RoleInEvent(I18N::translate('Role')),
+ '_LOC:SOUR:NOTE' => new NoteStructure(I18N::translate('Note on source citation')),
+ '_LOC:SOUR:OBJE' => new XrefMedia(I18N::translate('Media object')),
+ '_LOC:SOUR:PAGE' => new WhereWithinSource(I18N::translate('Citation details')),
+ '_LOC:SOUR:QUAY' => new CertaintyAssessment(I18N::translate('Quality of data')),
+ '_LOC:TYPE' => new CustomElement(I18N::translate('Type of location'), ['DATE' => '0:1', '_GOVTYPE' => '0:1', 'SOUR' => '0:M']),
+ '_LOC:TYPE:DATE' => new DateValue(I18N::translate('Date')),
+ '_LOC:TYPE:SOUR' => new XrefSource(I18N::translate('Source')),
+ '_LOC:TYPE:_GOVTYPE' => new CustomElement(I18N::translate('GOV identifier type')),
+ '_LOC:_AIDN' => new CustomElement(I18N::translate('Administrative ID')),
+ '_LOC:_AIDN:DATE' => new DateValue(I18N::translate('Date')),
+ '_LOC:_AIDN:SOUR' => new XrefSource(I18N::translate('Source')),
+ '_LOC:_AIDN:TYPE' => new CustomElement(I18N::translate('Type of administrative ID')),
+ '_LOC:_DMGD' => new CustomElement(I18N::translate('Demographic data')),
+ '_LOC:_DMGD:DATE' => new DateValue(I18N::translate('Date')),
+ '_LOC:_DMGD:SOUR' => new XrefSource(I18N::translate('Source')),
+ '_LOC:_DMGD:TYPE' => new CustomElement(I18N::translate('Type of demographic data')),
+ // I18N: https://gov.genealogy.net
+ '_LOC:_GOV' => new GovIdentifier(I18N::translate('GOV identifier')),
+ '_LOC:_LOC' => new XrefLocation(I18N::translate('Parent location'), ['DATE' => '0:1', 'SOUR' => '0:M', 'TYPE' => '0:1']),
+ '_LOC:_LOC:DATE' => new DateValue(I18N::translate('Date')),
+ '_LOC:_LOC:SOUR' => new XrefSource(I18N::translate('Source')),
+ '_LOC:_LOC:TYPE' => new HierarchicalRelationship(I18N::translate('Hierarchical relationship')),
+ // I18N: https://en.wikipedia.org/wiki/Maidenhead_Locator_System
+ '_LOC:_MAIDENHEAD' => new MaidenheadLocator(I18N::translate('Maidenhead location code')),
+ '_LOC:_POST' => new AddressPostalCode(I18N::translate('Postal code')),
+ '_LOC:_POST:DATE' => new DateValue(I18N::translate('Date')),
+ '_LOC:_POST:SOUR' => new XrefSource(I18N::translate('Source')),
+ '_LOC:_UID' => new PafUid(I18N::translate('Unique identifier')),
+ '_LOC:*:SOUR:DATA' => new SourceData(I18N::translate('Data')),
+ '_LOC:*:SOUR:DATA:DATE' => new DateValue(I18N::translate('Date of entry in original source')),
+ '_LOC:*:SOUR:DATA:TEXT' => new TextFromSource(I18N::translate('Text')),
+ '_LOC:*:SOUR:EVEN' => new EventTypeCitedFrom(I18N::translate('Event')),
+ '_LOC:*:SOUR:EVEN:ROLE' => new RoleInEvent(I18N::translate('Role')),
+ '_LOC:*:SOUR:NOTE' => new NoteStructure(I18N::translate('Note on source citation')),
+ '_LOC:*:SOUR:OBJE' => new XrefMedia(I18N::translate('Media object')),
+ '_LOC:*:SOUR:PAGE' => new WhereWithinSource(I18N::translate('Citation details')),
+ '_LOC:*:SOUR:QUAY' => new CertaintyAssessment(I18N::translate('Quality of data')),
+ ];
+ }
+}
diff --git a/app/CustomTags/GenPlusWin.php b/app/CustomTags/GenPlusWin.php
new file mode 100644
index 0000000000..910d11466c
--- /dev/null
+++ b/app/CustomTags/GenPlusWin.php
@@ -0,0 +1,55 @@
+<?php
+
+/**
+ * webtrees: online genealogy
+ * Copyright (C) 2022 webtrees development team
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+declare(strict_types=1);
+
+namespace Fisharebest\Webtrees\CustomTags;
+
+use Fisharebest\Webtrees\Contracts\CustomTagInterface;
+use Fisharebest\Webtrees\Contracts\ElementInterface;
+use Fisharebest\Webtrees\Elements\FamilySearchFamilyTreeId;
+use Fisharebest\Webtrees\I18N;
+
+/**
+ * GEDCOM files created by GenPlusWin
+ *
+ * @see https://www.genpluswin.de
+ */
+class GenPlusWin implements CustomTagInterface
+{
+ /**
+ * The name of the application.
+ *
+ * @return string
+ */
+ public function name(): string
+ {
+ return 'GenPlusWin';
+ }
+
+ /**
+ * Tags created by this application.
+ *
+ * @return array<string,ElementInterface>
+ */
+ public function tags(): array
+ {
+ return [
+ 'INDI:_FSFTID' => /* I18N: familysearch.org */ new FamilySearchFamilyTreeId(I18N::translate('FamilySearch ID')),
+ ];
+ }
+}
diff --git a/app/CustomTags/Geneatique.php b/app/CustomTags/Geneatique.php
new file mode 100644
index 0000000000..2432621c81
--- /dev/null
+++ b/app/CustomTags/Geneatique.php
@@ -0,0 +1,85 @@
+<?php
+
+/**
+ * webtrees: online genealogy
+ * Copyright (C) 2022 webtrees development team
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+declare(strict_types=1);
+
+namespace Fisharebest\Webtrees\CustomTags;
+
+use Fisharebest\Webtrees\Contracts\CustomTagInterface;
+use Fisharebest\Webtrees\Contracts\ElementInterface;
+use Fisharebest\Webtrees\Elements\DescriptiveTitle;
+use Fisharebest\Webtrees\Elements\MultimediaFormat;
+use Fisharebest\Webtrees\Elements\NamePersonal;
+use Fisharebest\Webtrees\Elements\TimeValue;
+use Fisharebest\Webtrees\I18N;
+
+/**
+ * GEDCOM files created by Généatique
+ *
+ * @see https://www.geneatique.com/
+ */
+class Geneatique implements CustomTagInterface
+{
+ /**
+ * The name of the application.
+ *
+ * @return string
+ */
+ public function name(): string
+ {
+ return 'Généatique';
+ }
+
+ /**
+ * Tags created by this application.
+ *
+ * @return array<string,ElementInterface>
+ */
+ public function tags(): array
+ {
+ return [
+ 'INDI:DEAT:DATE:TIME' => new TimeValue(I18N::translate('Time of death')),
+ 'OBJE:FORM' => new MultimediaFormat(I18N::translate('Format')),
+ 'OBJE:TITL' => new DescriptiveTitle(I18N::translate('Title')),
+ 'INDI:NAME:_AKA' => new NamePersonal(I18N::translate('Also known as'), []),
+ 'INDI:NAME:_MARNM' => new NamePersonal(I18N::translate('Also known as'), []),
+
+ /*
+ Pour déclarer les témoins dans les actes de naissance
+
+ Balise GEDCOM non valide. INDI:BIRT:ASSO
+ INDI:BIRT:ASSO:TYPE
+ INDI:BIRT:ASSO:RELA
+ INDI:DEAT:PLAC:QUAY
+ INDI:BIRT:OBJE:QUAY
+ INDI:BIRT:SOUR:TEXT
+
+ Dans les mariages
+
+ FAM:MARR:ASSO
+ FAM:MARR:ASSO:TYPE
+ FAM:MARR:ASSO:RELA
+ FAM:MARR:WWW:QUAY
+ OBJE:WWW
+ OBJE:SOUR:TEXTHTTPS
+ OBJE:NOTE:WWW
+ SOUR:QUAY
+ SOUR:TYPE
+ */
+ ];
+ }
+}
diff --git a/app/CustomTags/Heredis.php b/app/CustomTags/Heredis.php
new file mode 100644
index 0000000000..a1f9c0d89e
--- /dev/null
+++ b/app/CustomTags/Heredis.php
@@ -0,0 +1,62 @@
+<?php
+
+/**
+ * webtrees: online genealogy
+ * Copyright (C) 2022 webtrees development team
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+declare(strict_types=1);
+
+namespace Fisharebest\Webtrees\CustomTags;
+
+use Fisharebest\Webtrees\Contracts\CustomTagInterface;
+use Fisharebest\Webtrees\Contracts\ElementInterface;
+use Fisharebest\Webtrees\Elements\CustomElement;
+use Fisharebest\Webtrees\I18N;
+
+/**
+ * GEDCOM files created by Heredis
+ *
+ * @see https://www.heredis.com
+ */
+class Heredis implements CustomTagInterface
+{
+ /**
+ * The name of the application.
+ *
+ * @return string
+ */
+ public function name(): string
+ {
+ return 'Heredis';
+ }
+
+ /**
+ * Tags created by this application.
+ *
+ * @return array<string,ElementInterface>
+ */
+ public function tags(): array
+ {
+ return [
+ 'INDI:SIGN' => new CustomElement(I18N::translate('Signature')),
+ /* Reported on the forum - but what do they mean?
+ 'INDI:_FIL' => new CustomElement(I18N::translate('???')),
+ 'INDI:*:_FNA' => new CustomElement(I18N::translate('???')),
+ 'INDI:????:????:_SUBMAP' => new EmptyElement(I18N::translate('Coordinates'), ['INDI' => '1:1', 'LONG' => '1:1']),
+ 'INDI:????:????:_SUBMAP:LATI' => new PlaceLatitude(I18N::translate('Latitude')),
+ 'INDI:????:????:_SUBMAP:LONG' => new PlaceLongtitude(I18N::translate('Longitude')),
+ */
+ ];
+ }
+}
diff --git a/app/CustomTags/Legacy.php b/app/CustomTags/Legacy.php
new file mode 100644
index 0000000000..b805b11557
--- /dev/null
+++ b/app/CustomTags/Legacy.php
@@ -0,0 +1,161 @@
+<?php
+
+/**
+ * webtrees: online genealogy
+ * Copyright (C) 2022 webtrees development team
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+declare(strict_types=1);
+
+namespace Fisharebest\Webtrees\CustomTags;
+
+use Fisharebest\Webtrees\Contracts\CustomTagInterface;
+use Fisharebest\Webtrees\Contracts\ElementInterface;
+use Fisharebest\Webtrees\Elements\AddressWebPage;
+use Fisharebest\Webtrees\Elements\CustomElement;
+use Fisharebest\Webtrees\Elements\DateValue;
+use Fisharebest\Webtrees\Elements\PafUid;
+use Fisharebest\Webtrees\I18N;
+
+/**
+ * GEDCOM files created by Legacy
+ *
+ * @see https://legacyfamilytree.com
+ * @see http://support.legacyfamilytree.com/article/AA-00520/0/GEDCOM-Files-custom-tags-in-Legacy.html
+ */
+class Legacy implements CustomTagInterface
+{
+ /**
+ * The name of the application.
+ *
+ * @return string
+ */
+ public function name(): string
+ {
+ return 'Legacy';
+ }
+
+ /**
+ * Tags created by this application.
+ *
+ * @return array<string,ElementInterface>
+ */
+ public function tags(): array
+ {
+ return [
+ 'FAM:*:ADDR:_PRIV' => new CustomElement(I18N::translate('Private')),
+ 'FAM:*:PLAC:_VERI' => new CustomElement(I18N::translate('Verified')),
+ 'FAM:*:SOUR:DATE' => new DateValue(I18N::translate('Date')),
+ 'FAM:*:SOUR:_VERI' => new CustomElement(I18N::translate('Verified')),
+ 'FAM:*:_PRIV' => new CustomElement(I18N::translate('Private')),
+ 'FAM:CHIL:_FREL' => new CustomElement(I18N::translate('Relationship to father')),
+ 'FAM:CHIL:_MREL' => new CustomElement(I18N::translate('Relationship to mother')),
+ 'FAM:CHIL:_STAT' => new CustomElement(I18N::translate('Status')),
+ 'FAM:EVEN:_OVER' => new CustomElement('Event sentence override'),
+ 'FAM:MARR:_HTITL' => new CustomElement(I18N::translate('Label for husband')),
+ 'FAM:MARR:_RPT_PHRS' => /* I18N: ''GEDCOM tag _RPT_PHRS */ new CustomElement(I18N::translate('Report phrase')),
+ 'FAM:MARR:_RPT_PHRS2' => /* I18N: ''GEDCOM tag _RPT_PHRS */ new CustomElement(I18N::translate('Report phrase')),
+ 'FAM:MARR:_STAT' => new CustomElement(I18N::translate('Status')),
+ 'FAM:MARR:_WTITL' => new CustomElement(I18N::translate('Label for wife')),
+ 'FAM:_NONE' => new CustomElement(I18N::translate('No children')),
+ 'FAM:_TAG' => new CustomElement('Tag'),
+ 'FAM:_TAG2' => new CustomElement('Tag #2'),
+ 'FAM:_TAG3' => new CustomElement('Tag #3'),
+ 'FAM:_TAG4' => new CustomElement('Tag #4'),
+ 'FAM:_TAG5' => new CustomElement('Tag #5'),
+ 'FAM:_TAG6' => new CustomElement('Tag #6'),
+ 'FAM:_TAG7' => new CustomElement('Tag #7'),
+ 'FAM:_TAG8' => new CustomElement('Tag #8'),
+ 'FAM:_TAG9' => new CustomElement('Tag #9'),
+ 'FAM:_UID' => new PafUid(I18N::translate('Unique identifier')),
+ 'HEAD:_EVENT_DEFN' => new CustomElement('Event definition'),
+ 'HEAD:_EVENT_DEFN:_CONF_FLAG' => new CustomElement(I18N::translate('Private')),
+ 'HEAD:_EVENT_DEFN:_DATE_TYPE' => new CustomElement(I18N::translate('Date')),
+ 'HEAD:_EVENT_DEFN:_DESC_FLAG' => new CustomElement(I18N::translate('Description')),
+ 'HEAD:_EVENT_DEFN:_PLACE_TYPE' => new CustomElement(I18N::translate('Place')),
+ 'HEAD:_EVENT_DEFN:_PP_EXCLUDE' => new CustomElement('Exclude event from potential problems report'),
+ 'HEAD:_EVENT_DEFN:_SEN1' => new CustomElement('Event sentence definition'),
+ 'HEAD:_EVENT_DEFN:_SEN2' => new CustomElement('Event sentence definition'),
+ 'HEAD:_EVENT_DEFN:_SEN3' => new CustomElement('Event sentence definition'),
+ 'HEAD:_EVENT_DEFN:_SEN4' => new CustomElement('Event sentence definition'),
+ 'HEAD:_EVENT_DEFN:_SEN5' => new CustomElement('Event sentence definition'),
+ 'HEAD:_EVENT_DEFN:_SEN6' => new CustomElement('Event sentence definition'),
+ 'HEAD:_EVENT_DEFN:_SEN7' => new CustomElement('Event sentence definition'),
+ 'HEAD:_EVENT_DEFN:_SEN8' => new CustomElement('Event sentence definition'),
+ 'HEAD:_EVENT_DEFN:_SENDOF' => new CustomElement('Event sentence, female, date only'),
+ 'HEAD:_EVENT_DEFN:_SENDOM' => new CustomElement('Event sentence, male, date only'),
+ 'HEAD:_EVENT_DEFN:_SENDOU' => new CustomElement('Event sentence, unknown sex, date only'),
+ 'HEAD:_EVENT_DEFN:_SENDPF' => new CustomElement('Event sentence, female, date and place'),
+ 'HEAD:_EVENT_DEFN:_SENDPM' => new CustomElement('Event sentence, male, date and place'),
+ 'HEAD:_EVENT_DEFN:_SENDPU' => new CustomElement('Event sentence, unknown sex, date and place'),
+ 'HEAD:_EVENT_DEFN:_SENF' => new CustomElement('Event sentence, female'),
+ 'HEAD:_EVENT_DEFN:_SENM' => new CustomElement('Event sentence, male'),
+ 'HEAD:_EVENT_DEFN:_SENPOF' => new CustomElement('Event sentence, unknown sex'),
+ 'HEAD:_EVENT_DEFN:_SENPOM' => new CustomElement('Event sentence, female, place only'),
+ 'HEAD:_EVENT_DEFN:_SENPOU' => new CustomElement('Event sentence, male, place only'),
+ 'HEAD:_EVENT_DEFN:_SENU' => new CustomElement('Event sentence, unknown sex, place only'),
+ 'HEAD:_PLAC_DEFN' => new CustomElement('Place definition'),
+ 'HEAD:_PLAC_DEFN:_PREP' => new CustomElement('Place preposition'),
+ 'INDI:*:ADDR:_EMAIL' => new CustomElement(I18N::translate('Email')),
+ 'INDI:*:ADDR:_LIST1' => new CustomElement('Include in the “newsletter” group'),
+ 'INDI:*:ADDR:_LIST2' => new CustomElement('Include in the “family association” group'),
+ 'INDI:*:ADDR:_LIST3' => new CustomElement('Include in the “birthday” group'),
+ 'INDI:*:ADDR:_LIST4' => new CustomElement('Include in the “research” group'),
+ 'INDI:*:ADDR:_LIST5' => new CustomElement('Include in the “christmas” group'),
+ 'INDI:*:ADDR:_LIST6' => new CustomElement('Include in the “holiday” group'),
+ 'INDI:*:ADDR:_NAME' => new CustomElement(I18N::translate('Name of addressee')),
+ 'INDI:*:ADDR:_PRIV' => new CustomElement(I18N::translate('Private')),
+ 'INDI:*:ADDR:_SORT' => new CustomElement('The spelling of a name to be used when sorting addresses for a report'),
+ 'INDI:*:ADDR:_TAG' => new CustomElement('Tag'),
+ 'INDI:*:PLAC:_TAG' => new CustomElement('Tag'),
+ 'INDI:*:PLAC:_VERI' => new CustomElement(I18N::translate('Verified')),
+ 'INDI:*:SOUR:DATE' => new DateValue(I18N::translate('Date')),
+ 'INDI:*:SOUR:_VERI' => new CustomElement(I18N::translate('Verified')),
+ 'INDI:*:_PRIV' => new CustomElement(I18N::translate('Private')),
+ 'INDI:EVEN:_OVER' => new CustomElement('Event sentence override'),
+ 'INDI:SOUR:_VERI' => new CustomElement(I18N::translate('Verified')),
+ 'INDI:_TAG' => new CustomElement('Tag'),
+ 'INDI:_TAG2' => new CustomElement('Tag #2'),
+ 'INDI:_TAG3' => new CustomElement('Tag #3'),
+ 'INDI:_TAG4' => new CustomElement('Tag #4'),
+ 'INDI:_TAG5' => new CustomElement('Tag #5'),
+ 'INDI:_TAG6' => new CustomElement('Tag #6'),
+ 'INDI:_TAG7' => new CustomElement('Tag #7'),
+ 'INDI:_TAG8' => new CustomElement('Tag #8'),
+ 'INDI:_TAG9' => new CustomElement('Tag #9'),
+ 'INDI:_TODO' => new CustomElement(I18N::translate('Research task')),
+ 'INDI:_TODO:PRTY' => new CustomElement(I18N::translate('Priority')),
+ 'INDI:_TODO:_CAT' => new CustomElement(I18N::translate('Category')),
+ 'INDI:_TODO:_CDATE' => new CustomElement(I18N::translate('Completion date')),
+ 'INDI:_TODO:_LOCL' => new CustomElement(I18N::translate('Location')),
+ 'INDI:_TODO:_RDATE' => new CustomElement(I18N::translate('Reminder date')),
+ 'INDI:_UID' => new PafUid(I18N::translate('Unique identifier')),
+ 'INDI:_URL' => new AddressWebPage(I18N::translate('URL')),
+ 'OBJE:_DATE' => new CustomElement(I18N::translate('Date')),
+ 'OBJE:_PRIM' => new CustomElement(I18N::translate('Highlighted image')),
+ 'OBJE:_SCBK' => new CustomElement(I18N::translate('Scrapbook')),
+ 'OBJE:_SOUND' => new CustomElement(I18N::translate('Audio')),
+ 'OBJE:_TYPE' => new CustomElement(I18N::translate('Type')),
+ 'OBJE:_UID' => new PafUid(I18N::translate('Unique identifier')),
+ 'REPO:_UID' => new PafUid(I18N::translate('Unique identifier')),
+ 'SOUR:_ITALIC' => new CustomElement('The source title should be printed in italic on reports'),
+ 'SOUR:_PAREN' => new CustomElement('The source title should be printed within parentheses on reports'),
+ 'SOUR:_QUOTED' => new CustomElement('The source title should be printed within quotes on reports'),
+ 'SOUR:_TAG' => new CustomElement('Exclude the source citation detail on reports'),
+ 'SOUR:_TAG2' => new CustomElement('Exclude the source citation on reports'),
+ 'SOUR:_TAG3' => new CustomElement('Include the source citation detail text on reports'),
+ 'SOUR:_TAG4' => new CustomElement('Include the source citation detail notes on reports'),
+ 'SOUR:_UID' => new PafUid(I18N::translate('Unique identifier')),
+ ];
+ }
+}
diff --git a/app/CustomTags/MyHeritage.php b/app/CustomTags/MyHeritage.php
new file mode 100644
index 0000000000..5e85db0757
--- /dev/null
+++ b/app/CustomTags/MyHeritage.php
@@ -0,0 +1,69 @@
+<?php
+
+/**
+ * webtrees: online genealogy
+ * Copyright (C) 2022 webtrees development team
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+declare(strict_types=1);
+
+namespace Fisharebest\Webtrees\CustomTags;
+
+use Fisharebest\Webtrees\Contracts\CustomTagInterface;
+use Fisharebest\Webtrees\Contracts\ElementInterface;
+use Fisharebest\Webtrees\Elements\AutomatedRecordId;
+use Fisharebest\Webtrees\Elements\CustomElement;
+use Fisharebest\Webtrees\Elements\PafUid;
+use Fisharebest\Webtrees\I18N;
+
+/**
+ * GEDCOM files created by MyHeritage
+ *
+ * @see https://www.myheritage.com
+ */
+class MyHeritage implements CustomTagInterface
+{
+ /**
+ * The name of the application.
+ *
+ * @return string
+ */
+ public function name(): string
+ {
+ return 'MyHeritage';
+ }
+
+ /**
+ * Tags created by this application.
+ *
+ * @return array<string,ElementInterface>
+ */
+ public function tags(): array
+ {
+ return [
+ 'FAM:*:_UID' => new PafUid(I18N::translate('Unique identifier')),
+ 'FAM:*:RIN' => new AutomatedRecordId(I18N::translate('Record ID number')),
+ 'HEAD:DATE:_TIMEZONE' => new CustomElement(I18N::translate('Time zone')),
+ 'HEAD:SOUR:_RTLSAVE' => new CustomElement(I18N::translate('Text direction')), // ?
+ 'HEAD:_RINS' => new CustomElement(I18N::translate('Record ID number')), // ?
+ 'HEAD:_UID' => new PafUid(I18N::translate('Unique identifier')),
+ 'HEAD:_PROJECT_GUID' => new PafUid(I18N::translate('Unique identifier')),
+ 'HEAD:_EXPORTED_FROM_SITE_ID' => new CustomElement(I18N::translate('Site identification code')),
+ 'HEAD:_DESCRIPTION_AWARE' => new CustomElement(I18N::translate('Description')), // ?
+ 'INDI:PERSONALPHOTO' => new CustomElement(I18N::translate('Photograph')),
+ 'INDI:*:_UID' => new PafUid(I18N::translate('Unique identifier')),
+ 'INDI:*:RIN' => new AutomatedRecordId(I18N::translate('Record ID number')),
+ '*:_UPD' => new CustomElement(I18N::translate('Updated at')),
+ ];
+ }
+}
diff --git a/app/CustomTags/PersonalAncestralFile.php b/app/CustomTags/PersonalAncestralFile.php
new file mode 100644
index 0000000000..d00d78cea7
--- /dev/null
+++ b/app/CustomTags/PersonalAncestralFile.php
@@ -0,0 +1,85 @@
+<?php
+
+/**
+ * webtrees: online genealogy
+ * Copyright (C) 2022 webtrees development team
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+declare(strict_types=1);
+
+namespace Fisharebest\Webtrees\CustomTags;
+
+use Fisharebest\Webtrees\Contracts\CustomTagInterface;
+use Fisharebest\Webtrees\Contracts\ElementInterface;
+use Fisharebest\Webtrees\Elements\AddressCity;
+use Fisharebest\Webtrees\Elements\AddressCountry;
+use Fisharebest\Webtrees\Elements\AddressEmail;
+use Fisharebest\Webtrees\Elements\AddressFax;
+use Fisharebest\Webtrees\Elements\AddressLine;
+use Fisharebest\Webtrees\Elements\AddressLine1;
+use Fisharebest\Webtrees\Elements\AddressLine2;
+use Fisharebest\Webtrees\Elements\AddressPostalCode;
+use Fisharebest\Webtrees\Elements\AddressState;
+use Fisharebest\Webtrees\Elements\CustomElement;
+use Fisharebest\Webtrees\Elements\FamilySearchFamilyTreeId;
+use Fisharebest\Webtrees\Elements\NamePersonal;
+use Fisharebest\Webtrees\Elements\PafUid;
+use Fisharebest\Webtrees\Elements\PhoneNumber;
+use Fisharebest\Webtrees\I18N;
+
+/**
+ * GEDCOM files created by Personal Ancestral File
+ */
+class PersonalAncestralFile implements CustomTagInterface
+{
+ /**
+ * The name of the application.
+ *
+ * @return string
+ */
+ public function name(): string
+ {
+ return 'Personal Ancestral File';
+ }
+
+ /**
+ * Tags created by this application.
+ *
+ * @return array<string,ElementInterface>
+ */
+ public function tags(): array
+ {
+ return [
+ 'FAM:_UID' => new PafUid(I18N::translate('Unique identifier')),
+ 'INDI:NAME:_ADPN' => new NamePersonal(I18N::translate('Adopted name'), []),
+ 'INDI:NAME:_AKA' => new NamePersonal(I18N::translate('Also known as'), []),
+ 'INDI:NAME:_AKAN' => new NamePersonal(I18N::translate('Also known as'), []),
+ 'INDI:ADDR' => new AddressLine(I18N::translate('Address')),
+ 'INDI:ADDR:ADR1' => new AddressLine1(I18N::translate('Address line 1')),
+ 'INDI:ADDR:ADR2' => new AddressLine2(I18N::translate('Address line 2')),
+ 'INDI:ADDR:CITY' => new AddressCity(I18N::translate('City')),
+ 'INDI:ADDR:CTRY' => new AddressCountry(I18N::translate('Country')),
+ 'INDI:ADDR:POST' => new AddressPostalCode(I18N::translate('Postal code')),
+ 'INDI:ADDR:STAE' => new AddressState(I18N::translate('State')),
+ 'INDI:ADDR:_NAME' => new CustomElement(I18N::translate('Name of addressee')),
+ 'INDI:EMAIL' => new AddressEmail(I18N::translate('Email address')),
+ 'INDI:FAX' => new AddressFax(I18N::translate('Fax')),
+ 'INDI:PHON' => new PhoneNumber(I18N::translate('Phone')),
+ 'INDI:URL' => new CustomElement(I18N::translate('URL')),
+ 'INDI:_UID' => new PafUid(I18N::translate('Unique identifier')),
+ 'OBJE:_UID' => new PafUid(I18N::translate('Unique identifier')),
+ 'REPO:_UID' => new PafUid(I18N::translate('Unique identifier')),
+ 'SOUR:_UID' => new PafUid(I18N::translate('Unique identifier')),
+ ];
+ }
+}
diff --git a/app/CustomTags/PhpGedView.php b/app/CustomTags/PhpGedView.php
new file mode 100644
index 0000000000..cea2d9f550
--- /dev/null
+++ b/app/CustomTags/PhpGedView.php
@@ -0,0 +1,88 @@
+<?php
+
+/**
+ * webtrees: online genealogy
+ * Copyright (C) 2022 webtrees development team
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+declare(strict_types=1);
+
+namespace Fisharebest\Webtrees\CustomTags;
+
+use Fisharebest\Webtrees\Contracts\CustomTagInterface;
+use Fisharebest\Webtrees\Contracts\ElementInterface;
+use Fisharebest\Webtrees\Elements\AddressWebPage;
+use Fisharebest\Webtrees\Elements\CustomElement;
+use Fisharebest\Webtrees\Elements\CustomIndividualEvent;
+use Fisharebest\Webtrees\Elements\NamePersonal;
+use Fisharebest\Webtrees\Elements\NoteStructure;
+use Fisharebest\Webtrees\Elements\RelationIsDescriptor;
+use Fisharebest\Webtrees\Elements\RestrictionNotice;
+use Fisharebest\Webtrees\Elements\WebtreesUser;
+use Fisharebest\Webtrees\Elements\XrefAssociate;
+use Fisharebest\Webtrees\Elements\XrefMedia;
+use Fisharebest\Webtrees\I18N;
+
+/**
+ * GEDCOM files created by phpGedView
+ *
+ * @see http://www.phpgedview.net
+ */
+class PhpGedView implements CustomTagInterface
+{
+ /**
+ * The name of the application.
+ *
+ * @return string
+ */
+ public function name(): string
+ {
+ return 'phpGedView';
+ }
+
+ /**
+ * Tags created by this application.
+ *
+ * @return array<string,ElementInterface>
+ */
+ public function tags(): array
+ {
+ return [
+ 'FAM:CHAN:_PGVU' => new WebtreesUser(I18N::translate('Author of last change')),
+ 'FAM:COMM' => new CustomElement(I18N::translate('Comment')),
+ 'INDI:*:ASSO' => new XrefAssociate(I18N::translate('Associate')),
+ 'INDI:*:ASSO:RELA' => new RelationIsDescriptor(I18N::translate('Relationship')),
+ 'INDI:*:PLAC:_HEB' => new NoteStructure(I18N::translate('Place in Hebrew')),
+ 'INDI:BURI:CEME' => new CustomElement(I18N::translate('Cemetery')),
+ 'INDI:CHAN:_PGVU' => new WebtreesUser(I18N::translate('Author of last change')),
+ 'INDI:COMM' => new CustomElement(I18N::translate('Comment')),
+ 'INDI:NAME:_HEB' => new NamePersonal(I18N::translate('Name in Hebrew'), []),
+ 'INDI:_HOL' => new CustomIndividualEvent(I18N::translate('Holocaust')),
+ 'INDI:_MILI' => new CustomIndividualEvent(I18N::translate('Military')),
+ 'INDI:_PGV_OBJS' => new XrefMedia(I18N::translate('Re-order media')),
+ 'NOTE:CHAN:_PGVU' => new WebtreesUser(I18N::translate('Author of last change')),
+ 'OBJE:CHAN:_PGVU' => new WebtreesUser(I18N::translate('Author of last change')),
+ 'OBJE:_THUM' => new CustomElement(I18N::translate('Thumbnail image')),
+ 'REPO:CHAN:_PGVU' => new WebtreesUser(I18N::translate('Author of last change')),
+ 'SOUR:CHAN:_PGVU' => new WebtreesUser(I18N::translate('Author of last change')),
+ 'SOUR:SERV' => new CustomElement(I18N::translate('Remote server')),
+ 'SOUR:URL' => new AddressWebPage(I18N::translate('URL')),
+ 'SOUR:URL:TYPE' => new CustomElement(I18N::translate('Type')), // e.g. "FamilySearch"
+ 'SOUR:URL:_BLOCK' => new CustomElement(I18N::translate('Block')), // "e.g. "false"
+ 'SOUR:_DBID' => new CustomElement(I18N::translate('Database name')),
+ 'SOUR:_DBID:_PASS' => new CustomElement(I18N::translate('Database password')),
+ 'SOUR:_DBID:_PASS:RESN' => new RestrictionNotice(I18N::translate('Restriction')),
+ 'SOUR:_DBID:_USER' => new CustomElement(I18N::translate('Database user account')),
+ ];
+ }
+}
diff --git a/app/CustomTags/ProGen.php b/app/CustomTags/ProGen.php
new file mode 100644
index 0000000000..47d3fb90b3
--- /dev/null
+++ b/app/CustomTags/ProGen.php
@@ -0,0 +1,59 @@
+<?php
+
+/**
+ * webtrees: online genealogy
+ * Copyright (C) 2022 webtrees development team
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+declare(strict_types=1);
+
+namespace Fisharebest\Webtrees\CustomTags;
+
+use Fisharebest\Webtrees\Contracts\CustomTagInterface;
+use Fisharebest\Webtrees\Contracts\ElementInterface;
+use Fisharebest\Webtrees\Elements\TimeValue;
+use Fisharebest\Webtrees\Elements\UserReferenceNumber;
+use Fisharebest\Webtrees\I18N;
+
+/**
+ * GEDCOM files created by Pro-Gen
+ *
+ * @see https://www.pro-gen.nl
+ */
+class ProGen implements CustomTagInterface
+{
+ /**
+ * The name of the application.
+ *
+ * @return string
+ */
+ public function name(): string
+ {
+ return 'Pro-Gen';
+ }
+
+ /**
+ * Tags created by this application.
+ *
+ * @return array<string,ElementInterface>
+ */
+ public function tags(): array
+ {
+ return [
+ 'FAM:*:SOUR:REFN' => new UserReferenceNumber(I18N::translate('Reference number')),
+ 'FAM:RFN' => new UserReferenceNumber(I18N::translate('Reference number')),
+ 'INDI:*:SOUR:REFN' => new UserReferenceNumber(I18N::translate('Reference number')),
+ 'INDI:BIRT:TIME' => new TimeValue(I18N::translate('Time of birth')),
+ ];
+ }
+}
diff --git a/app/CustomTags/Reunion.php b/app/CustomTags/Reunion.php
new file mode 100644
index 0000000000..026909a27f
--- /dev/null
+++ b/app/CustomTags/Reunion.php
@@ -0,0 +1,67 @@
+<?php
+
+/**
+ * webtrees: online genealogy
+ * Copyright (C) 2022 webtrees development team
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+declare(strict_types=1);
+
+namespace Fisharebest\Webtrees\CustomTags;
+
+use Fisharebest\Webtrees\Contracts\CustomTagInterface;
+use Fisharebest\Webtrees\Contracts\ElementInterface;
+use Fisharebest\Webtrees\Elements\AddressEmail;
+use Fisharebest\Webtrees\Elements\CustomElement;
+use Fisharebest\Webtrees\Elements\PafUid;
+use Fisharebest\Webtrees\I18N;
+
+/**
+ * GEDCOM files created by Reunion
+ *
+ * @see https://www.leisterpro.com
+ */
+class Reunion implements CustomTagInterface
+{
+ /**
+ * The name of the application.
+ *
+ * @return string
+ */
+ public function name(): string
+ {
+ return 'Reunion';
+ }
+
+ /**
+ * Tags created by this application.
+ *
+ * @return array<string,ElementInterface>
+ */
+ public function tags(): array
+ {
+ return [
+ 'FAM:_UID' => new PafUid(I18N::translate('Unique identifier')),
+ 'INDI:CITN' => new CustomElement(I18N::translate('Citizenship')),
+ 'INDI:EMAL' => new AddressEmail(I18N::translate('Email address')),
+ 'INDI:_LEGA' => new CustomElement(I18N::translate('Legatee')),
+ 'INDI:_MDCL' => new CustomElement(I18N::translate('Medical')),
+ 'INDI:_PURC' => /* I18N: GEDCOM tag _PURC */ new CustomElement(I18N::translate('Land purchase')),
+ 'INDI:_SALE' => /* I18N: GEDCOM tag _SALE */ new CustomElement(I18N::translate('Land sale')),
+ 'INDI:_UID' => new PafUid(I18N::translate('Unique identifier')),
+ 'OBJE:_UID' => new PafUid(I18N::translate('Unique identifier')),
+ 'REPO:_UID' => new PafUid(I18N::translate('Unique identifier')),
+ 'SOUR:_UID' => new PafUid(I18N::translate('Unique identifier')),
+ ];
+ }
+}
diff --git a/app/CustomTags/RootsMagic.php b/app/CustomTags/RootsMagic.php
new file mode 100644
index 0000000000..0423ce82a4
--- /dev/null
+++ b/app/CustomTags/RootsMagic.php
@@ -0,0 +1,67 @@
+<?php
+
+/**
+ * webtrees: online genealogy
+ * Copyright (C) 2022 webtrees development team
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+declare(strict_types=1);
+
+namespace Fisharebest\Webtrees\CustomTags;
+
+use Fisharebest\Webtrees\Contracts\CustomTagInterface;
+use Fisharebest\Webtrees\Contracts\ElementInterface;
+use Fisharebest\Webtrees\Elements\AddressWebPage;
+use Fisharebest\Webtrees\Elements\CustomElement;
+use Fisharebest\Webtrees\Elements\PafUid;
+use Fisharebest\Webtrees\I18N;
+
+/**
+ * GEDCOM files created by Roots Magic
+ *
+ * @see https://www.rootsmagic.com/
+ */
+class RootsMagic implements CustomTagInterface
+{
+ /**
+ * The name of the application.
+ *
+ * @return string
+ */
+ public function name(): string
+ {
+ return 'RootsMagic';
+ }
+
+ /**
+ * Tags created by this application.
+ *
+ * @return array<string,ElementInterface>
+ */
+ public function tags(): array
+ {
+ return [
+ 'FAM:_UID' => new PafUid(I18N::translate('Unique identifier')),
+ 'INDI:_DNA' => new CustomElement(I18N::translate('DNA markers')),
+ 'INDI:_UID' => new PafUid(I18N::translate('Unique identifier')),
+ 'INDI:_WEBTAG' => new CustomElement(I18N::translate('External link')),
+ 'INDI:_WEBTAG:NAME' => new CustomElement(I18N::translate('Text')),
+ 'INDI:_WEBTAG:URL' => new AddressWebPage(I18N::translate('URL')),
+ 'OBJE:_UID' => new PafUid(I18N::translate('Unique identifier')),
+ 'REPO:_UID' => new PafUid(I18N::translate('Unique identifier')),
+ 'SOUR:_BIBL' => new CustomElement(I18N::translate('Bibliography')),
+ 'SOUR:_SUBQ' => new CustomElement(I18N::translate('Abbreviation')),
+ 'SOUR:_UID' => new PafUid(I18N::translate('Unique identifier')),
+ ];
+ }
+}
diff --git a/app/CustomTags/TheMasterGenealogist.php b/app/CustomTags/TheMasterGenealogist.php
new file mode 100644
index 0000000000..6f611b746e
--- /dev/null
+++ b/app/CustomTags/TheMasterGenealogist.php
@@ -0,0 +1,56 @@
+<?php
+
+/**
+ * webtrees: online genealogy
+ * Copyright (C) 2022 webtrees development team
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+declare(strict_types=1);
+
+namespace Fisharebest\Webtrees\CustomTags;
+
+use Fisharebest\Webtrees\Contracts\CustomTagInterface;
+use Fisharebest\Webtrees\Contracts\ElementInterface;
+use Fisharebest\Webtrees\Elements\DateValue;
+use Fisharebest\Webtrees\I18N;
+
+/**
+ * GEDCOM files created by TheMasterGenealogist
+ *
+ * @see https://www.twrcomputing.co.uk/acatalog/The_Master_Genealogist.html
+ */
+class TheMasterGenealogist implements CustomTagInterface
+{
+ /**
+ * The name of the application.
+ *
+ * @return string
+ */
+ public function name(): string
+ {
+ return 'TheMasterGenealogist';
+ }
+
+ /**
+ * Tags created by this application.
+ *
+ * @return array<string,ElementInterface>
+ */
+ public function tags(): array
+ {
+ return [
+ 'INDI:*:_SDATE' => new DateValue(I18N::translate('Sort date')),
+ 'INDI:NAME:_DATE' => new DateValue(I18N::translate('Date')),
+ ];
+ }
+}
diff --git a/app/Gedcom.php b/app/Gedcom.php
index 609ae29eaa..499f9939f7 100644
--- a/app/Gedcom.php
+++ b/app/Gedcom.php
@@ -21,6 +21,24 @@ namespace Fisharebest\Webtrees;
use Fisharebest\Webtrees\Contracts\ElementFactoryInterface;
use Fisharebest\Webtrees\Contracts\ElementInterface;
+use Fisharebest\Webtrees\CustomTags\Aldfaer;
+use Fisharebest\Webtrees\CustomTags\Ancestry;
+use Fisharebest\Webtrees\CustomTags\BrothersKeeper;
+use Fisharebest\Webtrees\CustomTags\FamilySearch;
+use Fisharebest\Webtrees\CustomTags\FamilyTreeBuilder;
+use Fisharebest\Webtrees\CustomTags\FamilyTreeMaker;
+use Fisharebest\Webtrees\CustomTags\Gedcom7;
+use Fisharebest\Webtrees\CustomTags\GedcomL;
+use Fisharebest\Webtrees\CustomTags\Geneatique;
+use Fisharebest\Webtrees\CustomTags\GenPlusWin;
+use Fisharebest\Webtrees\CustomTags\Heredis;
+use Fisharebest\Webtrees\CustomTags\Legacy;
+use Fisharebest\Webtrees\CustomTags\MyHeritage;
+use Fisharebest\Webtrees\CustomTags\PersonalAncestralFile;
+use Fisharebest\Webtrees\CustomTags\PhpGedView;
+use Fisharebest\Webtrees\CustomTags\ProGen;
+use Fisharebest\Webtrees\CustomTags\Reunion;
+use Fisharebest\Webtrees\CustomTags\RootsMagic;
use Fisharebest\Webtrees\Elements\AddressCity;
use Fisharebest\Webtrees\Elements\AddressCountry;
use Fisharebest\Webtrees\Elements\AddressEmail;
@@ -898,982 +916,6 @@ class Gedcom
}
/**
- * Definitions for GEDCOM 7.
- *
- * @return array<string,ElementInterface>
- */
- private function gedcom7Tags(): array
- {
- return [
- 'FAM:NO' => new NonEvent('Event did not happen'),
- 'INDI:NO' => new NonEvent('Event did not happen'),
- 'FAM:*:ASSO' => new XrefAssociate(I18N::translate('Associate')),
- 'FAM:*:ASSO:PHRASE' => new CustomElement(I18N::translate('Phrase')),
- 'FAM:*:ASSO:ROLE' => new RoleInEvent(I18N::translate('Role')),
- 'FAM:*:ASSO:ROLE:PHRASE' => new CustomElement(I18N::translate('Phrase')),
- 'FAM:*:DATE:TIME' => new TimeValue(I18N::translate('Time')),
- 'FAM:*:PLAC:EXID' => new ExternalIdentifier(I18N::translate('External identifier')),
- 'FAM:*:PLAC:EXID:TYPE' => new ExternalIdentifierType(I18N::translate('Type')),
- 'FAM:*:SDATE' => new CustomElement(I18N::translate('Sort date')),
- 'FAM:*:SDATE:PHRASE' => new CustomElement(I18N::translate('Phrase')),
- 'FAM:*:SDATE:TIME' => new CustomElement(I18N::translate('Sort time')),
- 'FAM:*:SNOTE' => new XrefSharedNote(I18N::translate('Shared note')),
- 'FAM:*:UID' => new Uid(I18N::translate('Unique identifier')),
- 'FAM:ASSO' => new XrefAssociate(I18N::translate('Associate')),
- 'FAM:ASSO:PHRASE' => new CustomElement(I18N::translate('Phrase')),
- 'FAM:ASSO:ROLE' => new RoleInEvent(I18N::translate('Role')),
- 'FAM:ASSO:ROLE:PHRASE' => new CustomElement(I18N::translate('Phrase')),
- 'FAM:CREA' => new Creation(I18N::translate('Created at')),
- 'FAM:CREA:DATE' => new DateValueToday(I18N::translate('Creation date')),
- 'FAM:CREA:DATE:TIME' => new TimeValueNow(I18N::translate('Creation time')),
- 'FAM:EXID' => new ExternalIdentifier(I18N::translate('External identifier')),
- 'FAM:EXID:TYPE' => new ExternalIdentifierType(I18N::translate('Type')),
- 'FAM:FACT' => new FamilyFact(I18N::translate('Fact')),
- 'FAM:REFN' => new UserReferenceNumber(I18N::translate('Reference number')),
- 'FAM:REFN:TYPE' => new UserReferenceType(I18N::translate('Type')),
- 'FAM:SNOTE' => new XrefSharedNote(I18N::translate('Shared note')),
- 'FAM:UID' => new Uid(I18N::translate('Unique identifier')),
- 'INDI:*:ASSO' => new XrefAssociate(I18N::translate('Associate')),
- 'INDI:*:ASSO:PHRASE' => new CustomElement(I18N::translate('Phrase')),
- 'INDI:*:ASSO:ROLE' => new RoleInEvent(I18N::translate('Role')),
- 'INDI:*:ASSO:ROLE:PHRASE' => new CustomElement(I18N::translate('Phrase')),
- 'INDI:*:DATE:TIME' => new TimeValue(I18N::translate('Time')),
- 'INDI:*:PLAC:EXID' => new ExternalIdentifier(I18N::translate('External identifier')),
- 'INDI:*:PLAC:EXID:TYPE' => new ExternalIdentifierType(I18N::translate('Type')),
- 'INDI:*:SDATE' => new CustomElement(I18N::translate('Sort date')),
- 'INDI:*:SDATE:PHRASE' => new CustomElement(I18N::translate('Phrase')),
- 'INDI:*:SDATE:TIME' => new CustomElement(I18N::translate('Sort time')),
- 'INDI:*:SNOTE' => new XrefSharedNote(I18N::translate('Shared note')),
- 'INDI:*:UID' => new Uid(I18N::translate('Unique identifier')),
- 'INDI:ADOP:FAMC:ADOP:PHRASE' => new CustomElement(I18N::translate('Phrase')),
- 'INDI:ALIA:PHRASE' => new CustomElement(I18N::translate('Phrase')),
- 'INDI:ASSO' => new XrefAssociate(I18N::translate('Associate')),
- 'INDI:ASSO:PHRASE' => new CustomElement(I18N::translate('Phrase')),
- 'INDI:ASSO:ROLE' => new RoleInEvent(I18N::translate('Role')),
- 'INDI:ASSO:ROLE:PHRASE' => new CustomElement(I18N::translate('Phrase')),
- 'INDI:BIRT:DATE:TIME' => new TimeValue(I18N::translate('Time of birth')),
- 'INDI:CREA' => new Creation(I18N::translate('Created at')),
- 'INDI:CREA:DATE' => new DateValueToday(I18N::translate('Creation date')),
- 'INDI:CREA:DATE:TIME' => new TimeValueNow(I18N::translate('Creation time')),
- 'INDI:DEAT:DATE:TIME' => new TimeValue(I18N::translate('Time of death')),
- 'INDI:EXID' => new ExternalIdentifier(I18N::translate('External identifier')),
- 'INDI:EXID:TYPE' => new ExternalIdentifierType(I18N::translate('Type')),
- 'INDI:INIL' => /* I18N: GEDCOM tag INIL - an LDS ceremony */ new LdsInitiatory(I18N::translate('LDS initiatory')),
- 'INDI:INIL:STAT' => new LdsOrdinanceStatus(I18N::translate('Status')),
- 'INDI:INIL:STAT:DATE' => new DateValueExact(I18N::translate('Date of status change')),
- 'INDI:INIL:STAT:DATE:TIME' => new TimeValue(I18N::translate('Time of status change')),
- 'INDI:INIL:TEMP' => new TempleCode(I18N::translate('Temple')),
- 'INDI:REFN' => new UserReferenceNumber(I18N::translate('Reference number')),
- 'INDI:REFN:TYPE' => new UserReferenceType(I18N::translate('Type')),
- 'INDI:SNOTE' => new XrefSharedNote(I18N::translate('Shared note')),
- 'INDI:UID' => new Uid(I18N::translate('Unique identifier')),
- 'OBJE:CREA' => new Creation(I18N::translate('Created at')),
- 'OBJE:CREA:DATE' => new DateValueToday(I18N::translate('Creation date')),
- 'OBJE:CREA:DATE:TIME' => new TimeValueNow(I18N::translate('Creation time')),
- 'OBJE:SNOTE' => new XrefSharedNote(I18N::translate('Shared note')),
- 'REPO:CREA' => new Creation(I18N::translate('Created at')),
- 'REPO:CREA:DATE' => new DateValueToday(I18N::translate('Creation date')),
- 'REPO:CREA:DATE:TIME' => new TimeValueNow(I18N::translate('Creation time')),
- 'REPO:EXID' => new ExternalIdentifier(I18N::translate('External identifier')),
- 'REPO:EXID:TYPE' => new ExternalIdentifierType(I18N::translate('Type')),
- 'REPO:REFN' => new UserReferenceNumber(I18N::translate('Reference number')),
- 'REPO:REFN:TYPE' => new UserReferenceType(I18N::translate('Type')),
- 'REPO:SNOTE' => new XrefSharedNote(I18N::translate('Shared note')),
- 'REPO:UID' => new Uid(I18N::translate('Unique identifier')),
- 'SNOTE:CREA' => new Creation(I18N::translate('Created at')),
- 'SNOTE:CREA:DATE' => new DateValueToday(I18N::translate('Creation date')),
- 'SNOTE:CREA:DATE:TIME' => new TimeValueNow(I18N::translate('Creation time')),
- 'SNOTE:EXID' => new ExternalIdentifier(I18N::translate('External identifier')),
- 'SNOTE:EXID:TYPE' => new ExternalIdentifierType(I18N::translate('Type')),
- 'SNOTE:REFN' => new UserReferenceNumber(I18N::translate('Reference number')),
- 'SNOTE:REFN:TYPE' => new UserReferenceType(I18N::translate('Type')),
- 'SNOTE:UID' => new Uid(I18N::translate('Unique identifier')),
- 'SOUR:CREA' => new Creation(I18N::translate('Created at')),
- 'SOUR:CREA:DATE' => new DateValueToday(I18N::translate('Creation date')),
- 'SOUR:CREA:DATE:TIME' => new TimeValueNow(I18N::translate('Creation time')),
- 'SOUR:EXID' => new ExternalIdentifier(I18N::translate('External identifier')),
- 'SOUR:EXID:TYPE' => new ExternalIdentifierType(I18N::translate('Type')),
- 'SOUR:REFN' => new UserReferenceNumber(I18N::translate('Reference number')),
- 'SOUR:REFN:TYPE' => new UserReferenceType(I18N::translate('Type')),
- 'SOUR:SNOTE' => new XrefSharedNote(I18N::translate('Shared note')),
- 'SOUR:UID' => new Uid(I18N::translate('Unique identifier')),
- 'SUBM:CREA' => new Creation(I18N::translate('Created at')),
- 'SUBM:CREA:DATE' => new DateValueToday(I18N::translate('Creation date')),
- 'SUBM:CREA:DATE:TIME' => new TimeValueNow(I18N::translate('Creation time')),
- 'SUBM:EXID' => new ExternalIdentifier(I18N::translate('External identifier')),
- 'SUBM:EXID:TYPE' => new ExternalIdentifierType(I18N::translate('Type')),
- 'SUBM:REFN' => new UserReferenceNumber(I18N::translate('Reference number')),
- 'SUBM:REFN:TYPE' => new UserReferenceType(I18N::translate('Type')),
- 'SUBM:SNOTE' => new XrefSharedNote(I18N::translate('Shared note')),
- 'SUBM:UID' => new Uid(I18N::translate('Unique identifier')),
- ];
- }
-
- /**
- * Aldfaer
- *
- * @return array<string,ElementInterface>
- */
- private function aldfaerTags(): array
- {
- return [
- 'FAM:MARR_CIVIL' => new Marriage(I18N::translate('Civil marriage')),
- 'FAM:MARR_PARTNERS' => new Marriage(I18N::translate('Registered partnership')),
- 'FAM:MARR_RELIGIOUS' => new Marriage(I18N::translate('Religious marriage')),
- 'FAM:MARR_UNKNOWN' => new Marriage(I18N::translate('Marriage')),
- 'FAM:_ALDFAER_NOREL' => new EmptyElement('No relation'), // What is this?
- 'HEAD:SUBM:ADDR' => new AddressLine(I18N::translate('Address')),
- 'HEAD:SUBM:PHON' => new PhoneNumber(I18N::translate('Phone')),
- 'HEAD:SUBM:_EMAI' => new AddressEmail(I18N::translate('Email')),
- 'HEAD:SUBM:_FAX' => new AddressFax(I18N::translate('Fax')),
- 'HEAD:SUBM:_WWW' => new AddressWebPage(I18N::translate('URL')),
- 'INDI:BIRT:_ALDFAER_TIME' => new TimeValue(I18N::translate('Time of birth')),
- 'INDI:BIRT:_LENGTH' => new CustomElement(I18N::translate('Length')),
- 'INDI:BIRT:_WEIGHT' => new CustomElement(I18N::translate('Weight')),
- 'INDI:DEAT:_ALDFAER_TIME' => new TimeValue(I18N::translate('Time of death')),
- 'INDI:_REFERENCE' => new CustomElement(''),
- 'INDI:_PRIVACY' => new CustomElement(''),
- 'INDI:_PRIVACY:_OBJECTION' => new CustomElement(''),
- 'INDI:_PRIVACY:_PUBLISH' => new CustomElement(''),
- 'INDI:NAME:_SURNAS' => new CustomElement(I18N::translate('Alternative spelling of surname')),
- 'INDI:DEAT:_DATE' => new DateValue(I18N::translate('Date')),
- 'INDI:_INQUBIRT' => new CustomElement(''),
- 'INDI:_INQUCHIL' => new CustomElement(''),
- 'INDI:_INQURELA' => new CustomElement(''),
- 'INDI:_INQUDEAT' => new CustomElement(''),
- 'INDI:_INQUVAR1' => new CustomElement(''),
- 'INDI:_INQUVAR1CAT' => new CustomElement(''),
- 'INDI:_INQUVAR2' => new CustomElement(''),
- 'INDI:_INQUVAR2CAT' => new CustomElement(''),
- 'INDI:_INQUVAR3' => new CustomElement(''),
- 'INDI:_INQUVAR3CAT' => new CustomElement(''),
- 'INDI:_NOPARTNER' => new CustomElement(''),
- 'INDI:_NEW' => new CustomElement(''),
- 'INDI:_BOLD' => new CustomElement(''),
- 'INDI:_ITALIC' => new CustomElement(''),
- 'INDI:_UNDERLINE' => new CustomElement(''),
- 'INDI:_COLOR' => new CustomElement(''),
- ];
- }
-
- /**
- * @return array<string,ElementInterface>
- *
- * @see https://www.webtrees.net/index.php/en/forum/help-for-release-2-1-x/36664-2-1-beta-support-for-indi-even-sour-data-note-and-the-like
- */
- private function ancestryTags(): array
- {
- return [
- 'HEAD:SOUR:_TREE' => new CustomElement(I18N::translate('Family tree')),
- 'HEAD:SOUR:_TREE:NOTE' => new SubmitterText(I18N::translate('Note')),
- 'HEAD:SOUR:_TREE:RIN' => new AutomatedRecordId(I18N::translate('Record ID number')),
- 'INDI:*:SOUR:_APID' => /* I18N: GEDCOM tag _APID */ new CustomElement(I18N::translate('Ancestry PID')),
- 'INDI:*:SOUR:DATA:NOTE' => new SubmitterText(I18N::translate('Note')),
- 'INDI:_EMPLOY' => new CustomFact(I18N::translate('Occupation')),
- 'INDI:_FUN' => new CustomEvent(I18N::translate('Funeral')),
- 'INDI:_INIT' => new LdsInitiatory(I18N::translate('LDS initiatory')),
- 'INDI:_ORDI' => new CustomEvent(I18N::translate('Ordination')),
- 'INDI:_ORIG' => new CustomFact(I18N::translate('Origin')),
- 'INDI:_DEST' => new CustomFact(I18N::translate('Destination')),
- 'OBJE:DATE' => new DateValue(I18N::translate('Date')),
- 'OBJE:PLAC' => new PlaceName(I18N::translate('Place')),
- 'OBJE:_CREA' => /* I18N: GEDCOM tag _CREA */ new CustomElement(I18N::translate('Created at')),
- 'OBJE:_ORIG' => /* I18N: GEDCOM tag _ORIG */ new CustomElement(I18N::translate('Original text')),
- 'OBJE:_ORIG:_URL' => new AddressWebPage(I18N::translate('URL')),
- ];
- }
-
- /**
- * @return array<string,ElementInterface>
- *
- * @see https://wiki-de.genealogy.net/GEDCOM/_Nutzerdef-Tag
- */
- private function brothersKeeperTags(): array
- {
- return [
- 'FAM:*:_EVN' => new CustomElement('Event number'),
- 'FAM:CHIL:_FREL' => new CustomElement(I18N::translate('Relationship to father')),
- 'FAM:CHIL:_MREL' => new CustomElement(I18N::translate('Relationship to mother')),
- 'FAM:_COML' => new CustomFamilyEvent(I18N::translate('Common law marriage')),
- 'FAM:_MARI' => new CustomFamilyEvent(I18N::translate('Marriage intention')),
- 'FAM:_MBON' => new CustomFamilyEvent(I18N::translate('Marriage bond')),
- 'FAM:_NMR' => new CustomFamilyEvent(I18N::translate('Not married'), ['NOTE' => '0:M', 'SOUR' => '0:M']),
- 'FAM:_PRMN' => new CustomElement(I18N::translate('Permanent number')),
- 'FAM:_SEPR' => new CustomFamilyEvent(I18N::translate('Separated')),
- 'FAM:_TODO' => new CustomElement(I18N::translate('Research task')),
- 'INDI:*:_EVN' => new CustomElement('Event number'),
- 'INDI:NAME:_ADPN' => new NamePersonal(I18N::translate('Adopted name'), []),
- 'INDI:NAME:_AKAN' => new NamePersonal(I18N::translate('Also known as'), []),
- 'INDI:NAME:_BIRN' => new NamePersonal(I18N::translate('Birth name'), []),
- 'INDI:NAME:_CALL' => new NamePersonal('Called name', []),
- 'INDI:NAME:_CENN' => new NamePersonal('Census name', []),
- 'INDI:NAME:_CURN' => new NamePersonal('Current name', []),
- 'INDI:NAME:_FARN' => new NamePersonal(I18N::translate('Estate name'), []),
- 'INDI:NAME:_FKAN' => new NamePersonal('Formal name', []),
- 'INDI:NAME:_FRKA' => new NamePersonal('Formerly known as', []),
- 'INDI:NAME:_GERN' => new NamePersonal('German name', []),
- 'INDI:NAME:_HEBN' => new NamePersonal(I18N::translate('Hebrew name'), []),
- 'INDI:NAME:_HNM' => new NamePersonal(I18N::translate('Hebrew name'), []),
- 'INDI:NAME:_INDG' => new NamePersonal('Indigenous name', []),
- 'INDI:NAME:_INDN' => new NamePersonal('Indian name', []),
- 'INDI:NAME:_LNCH' => new NamePersonal('Legal name change', []),
- 'INDI:NAME:_MARN' => new NamePersonal('Married name', []),
- 'INDI:NAME:_MARNM' => new NamePersonal('Married name', []),
- 'INDI:NAME:_OTHN' => new NamePersonal('Other name', []),
- 'INDI:NAME:_RELN' => new NamePersonal('Religious name', []),
- 'INDI:NAME:_SHON' => new NamePersonal('Short name', []),
- 'INDI:NAME:_SLDN' => new NamePersonal('Soldier name', []),
- 'INDI:_ADPF' => new CustomElement(I18N::translate('Adopted by father')),
- 'INDI:_ADPM' => new CustomElement(I18N::translate('Adopted by mother')),
- 'INDI:_BRTM' => new CustomIndividualEvent(I18N::translate('Brit milah')),
- 'INDI:_BRTM:DATE' => new DateValue(I18N::translate('Date of brit milah')),
- 'INDI:_BRTM:PLAC' => new PlaceName(I18N::translate('Place of brit milah')),
- 'INDI:_EMAIL' => new AddressEmail(I18N::translate('Email address')),
- 'INDI:_EYEC' => new CustomFact(I18N::translate('Eye color')),
- 'INDI:_FNRL' => new CustomElement(I18N::translate('Funeral')),
- 'INDI:_HAIR' => new CustomFact(I18N::translate('Hair color')),
- 'INDI:_HEIG' => new CustomFact(I18N::translate('Height')),
- 'INDI:_INTE' => new CustomElement(I18N::translate('Interment')),
- 'INDI:_MEDC' => new CustomFact(I18N::translate('Medical')),
- 'INDI:_MILT' => new CustomElement(I18N::translate('Military service')),
- 'INDI:_NLIV' => new CustomFact(I18N::translate('Not living')),
- 'INDI:_NMAR' => new CustomEvent(I18N::translate('Never married'), ['NOTE' => '0:M', 'SOUR' => '0:M']),
- 'INDI:_PRMN' => new CustomElement(I18N::translate('Permanent number')),
- 'INDI:_TODO' => new CustomElement(I18N::translate('Research task')),
- 'INDI:_WEIG' => new CustomFact(I18N::translate('Weight')),
- 'INDI:_YART' => new CustomIndividualEvent(I18N::translate('Yahrzeit')),
- // 1 XXXX
- // 2 _EVN ##
- // 1 ASSO @Xnnn@
- // 2 RELA Witness at event _EVN ##
- ];
- }
-
- /**
- * @return array<string,ElementInterface>
- */
- private function familySearchTags(): array
- {
- return [
- 'INDI:_FSFTID' => /* I18N: familysearch.org */ new FamilySearchFamilyTreeId(I18N::translate('FamilySearch ID')),
- ];
- }
-
- /**
- * @return array<string,ElementInterface>
- */
- private function familyTreeBuilderTags(): array
- {
- return [
- '*:_UPD' => /* I18N: GEDCOM tag _UPD */ new CustomElement(I18N::translate('Updated at')), // e.g. "1 _UPD 14 APR 2012 00:14:10 GMT-5"
- 'INDI:NAME:_AKA' => new NamePersonal(I18N::translate('Also known as'), []),
- 'OBJE:_ALBUM' => new CustomElement(I18N::translate('Album')), // XREF to an album
- 'OBJE:_DATE' => new DateValue(I18N::translate('Date')),
- 'OBJE:_FILESIZE' => new CustomElement(I18N::translate('File size')),
- 'OBJE:_PHOTO_RIN' => new CustomElement(I18N::translate('Record ID number')),
- 'OBJE:_PLACE' => new PlaceName(I18N::translate('Place')),
- '_ALBUM:_PHOTO' => new CustomElement(I18N::translate('Photo')),
- '_ALBUM:_PHOTO:_PRIN' => new CustomElement(I18N::translate('Highlighted image')),
- ];
- }
-
- /**
- * @return array<string,ElementInterface>
- *
- * @see https://wiki-de.genealogy.net/GEDCOM/_Nutzerdef-Tag
- */
- private function familyTreeMakerTags(): array
- {
- return [
- 'FAM:CHIL:_FREL' => new CustomElement(I18N::translate('Relationship to father')),
- 'FAM:CHIL:_MREL' => new CustomElement(I18N::translate('Relationship to mother')),
- 'FAM:_DETS' => new CustomElement(I18N::translate('Death of one spouse')),
- 'FAM:_FA1' => new CustomElement(I18N::translate('Fact 1')),
- 'FAM:_FA10' => new CustomElement(I18N::translate('Fact 10')),
- 'FAM:_FA11' => new CustomElement(I18N::translate('Fact 11')),
- 'FAM:_FA12' => new CustomElement(I18N::translate('Fact 12')),
- 'FAM:_FA13' => new CustomElement(I18N::translate('Fact 13')),
- 'FAM:_FA2' => new CustomElement(I18N::translate('Fact 2')),
- 'FAM:_FA3' => new CustomElement(I18N::translate('Fact 3')),
- 'FAM:_FA4' => new CustomElement(I18N::translate('Fact 4')),
- 'FAM:_FA5' => new CustomElement(I18N::translate('Fact 5')),
- 'FAM:_FA6' => new CustomElement(I18N::translate('Fact 6')),
- 'FAM:_FA7' => new CustomElement(I18N::translate('Fact 7')),
- 'FAM:_FA8' => new CustomElement(I18N::translate('Fact 8')),
- 'FAM:_FA9' => new CustomElement(I18N::translate('Fact 9')),
- 'FAM:_MEND' => new CustomElement(I18N::translate('Marriage ending status')),
- 'FAM:_MSTAT' => new CustomElement(I18N::translate('Marriage beginning status')),
- 'FAM:_SEPR' => new CustomElement(I18N::translate('Separation')),
- 'HEAD:_SCHEMA' => new CustomElement(I18N::translate('Schema')),
- 'HEAD:_SCHEMA:FAM' => new CustomElement(I18N::translate('Family')),
- 'HEAD:_SCHEMA:FAM:_FA*:LABL' => new CustomElement(I18N::translate('Label')),
- 'HEAD:_SCHEMA:FAM:_FA1' => new CustomElement(I18N::translate('Fact 1')),
- 'HEAD:_SCHEMA:FAM:_FA10' => new CustomElement(I18N::translate('Fact 10')),
- 'HEAD:_SCHEMA:FAM:_FA11' => new CustomElement(I18N::translate('Fact 11')),
- 'HEAD:_SCHEMA:FAM:_FA12' => new CustomElement(I18N::translate('Fact 12')),
- 'HEAD:_SCHEMA:FAM:_FA13' => new CustomElement(I18N::translate('Fact 13')),
- 'HEAD:_SCHEMA:FAM:_FA2' => new CustomElement(I18N::translate('Fact 2')),
- 'HEAD:_SCHEMA:FAM:_FA3' => new CustomElement(I18N::translate('Fact 3')),
- 'HEAD:_SCHEMA:FAM:_FA4' => new CustomElement(I18N::translate('Fact 4')),
- 'HEAD:_SCHEMA:FAM:_FA5' => new CustomElement(I18N::translate('Fact 5')),
- 'HEAD:_SCHEMA:FAM:_FA6' => new CustomElement(I18N::translate('Fact 6')),
- 'HEAD:_SCHEMA:FAM:_FA7' => new CustomElement(I18N::translate('Fact 7')),
- 'HEAD:_SCHEMA:FAM:_FA8' => new CustomElement(I18N::translate('Fact 8')),
- 'HEAD:_SCHEMA:FAM:_FA9' => new CustomElement(I18N::translate('Fact 9')),
- 'HEAD:_SCHEMA:FAM:_M*:LABL' => new CustomElement(I18N::translate('Label')),
- 'HEAD:_SCHEMA:FAM:_MEND' => new CustomElement(I18N::translate('Marriage ending status')),
- 'HEAD:_SCHEMA:FAM:_MSTAT' => new CustomElement(I18N::translate('Marriage beginning status')),
- 'HEAD:_SCHEMA:INDI' => new CustomElement(I18N::translate('Individual')),
- 'HEAD:_SCHEMA:INDI:_FA*:LABL' => new CustomElement(I18N::translate('Label')),
- 'HEAD:_SCHEMA:INDI:_FA1' => new CustomElement(I18N::translate('Fact 1')),
- 'HEAD:_SCHEMA:INDI:_FA10' => new CustomElement(I18N::translate('Fact 10')),
- 'HEAD:_SCHEMA:INDI:_FA11' => new CustomElement(I18N::translate('Fact 11')),
- 'HEAD:_SCHEMA:INDI:_FA12' => new CustomElement(I18N::translate('Fact 12')),
- 'HEAD:_SCHEMA:INDI:_FA13' => new CustomElement(I18N::translate('Fact 13')),
- 'HEAD:_SCHEMA:INDI:_FA2' => new CustomElement(I18N::translate('Fact 2')),
- 'HEAD:_SCHEMA:INDI:_FA3' => new CustomElement(I18N::translate('Fact 3')),
- 'HEAD:_SCHEMA:INDI:_FA4' => new CustomElement(I18N::translate('Fact 4')),
- 'HEAD:_SCHEMA:INDI:_FA5' => new CustomElement(I18N::translate('Fact 5')),
- 'HEAD:_SCHEMA:INDI:_FA6' => new CustomElement(I18N::translate('Fact 6')),
- 'HEAD:_SCHEMA:INDI:_FA7' => new CustomElement(I18N::translate('Fact 7')),
- 'HEAD:_SCHEMA:INDI:_FA8' => new CustomElement(I18N::translate('Fact 8')),
- 'HEAD:_SCHEMA:INDI:_FA9' => new CustomElement(I18N::translate('Fact 9')),
- 'HEAD:_SCHEMA:INDI:_FREL' => new CustomElement(I18N::translate('Relationship to father')),
- 'HEAD:_SCHEMA:INDI:_M*:LABL' => new CustomElement(I18N::translate('Label')),
- 'HEAD:_SCHEMA:INDI:_MREL' => new CustomElement(I18N::translate('Relationship to mother')),
- 'INDI:*:SOUR:_APID' => /* I18N: GEDCOM tag _APID */ new CustomElement(I18N::translate('Ancestry.com source identifier')),
- 'INDI:*:SOUR:_LINK' => new CustomElement(I18N::translate('External link')),
- 'INDI:NAME:_AKA' => new NamePersonal(I18N::translate('Also known as'), []),
- 'INDI:NAME:_MARNM' => new NamePersonal(I18N::translate('Married name'), []),
- 'INDI:_CIRC' => new CustomElement(I18N::translate('Circumcision')),
- 'INDI:_DCAUSE' => new CustomElement(I18N::translate('Cause of death')),
- 'INDI:_DEG' => new CustomElement(I18N::translate('Degree')),
- 'INDI:_DNA' => new CustomElement(I18N::translate('DNA markers')),
- 'INDI:_ELEC' => new CustomElement('Elected'),
- 'INDI:_EMPLOY' => new CustomElement('Employment'),
- 'INDI:_EXCM' => new CustomElement('Excommunicated'),
- 'INDI:_FA1' => new CustomElement(I18N::translate('Fact 1')),
- 'INDI:_FA10' => new CustomElement(I18N::translate('Fact 10')),
- 'INDI:_FA11' => new CustomElement(I18N::translate('Fact 11')),
- 'INDI:_FA12' => new CustomElement(I18N::translate('Fact 12')),
- 'INDI:_FA13' => new CustomElement(I18N::translate('Fact 13')),
- 'INDI:_FA2' => new CustomElement(I18N::translate('Fact 2')),
- 'INDI:_FA3' => new CustomElement(I18N::translate('Fact 3')),
- 'INDI:_FA4' => new CustomElement(I18N::translate('Fact 4')),
- 'INDI:_FA5' => new CustomElement(I18N::translate('Fact 5')),
- 'INDI:_FA6' => new CustomElement(I18N::translate('Fact 6')),
- 'INDI:_FA7' => new CustomElement(I18N::translate('Fact 7')),
- 'INDI:_FA8' => new CustomElement(I18N::translate('Fact 8')),
- 'INDI:_FA9' => new CustomElement(I18N::translate('Fact 9')),
- 'INDI:_MDCL' => new CustomElement(I18N::translate('Medical')),
- 'INDI:_MILT' => new CustomElement(I18N::translate('Military service')),
- 'INDI:_MILTID' => new CustomElement('Military ID number'),
- 'INDI:_MISN' => new CustomElement('Mission'),
- 'INDI:_NAMS' => new CustomElement(I18N::translate('Namesake')),
- 'INDI:_UNKN' => new CustomElement(I18N::translate('Unknown')), // Special individual ID code for later file comparisons
- ];
- }
-
- /**
- * @return array<string,ElementInterface>
- */
- private function gedcomLTags(): array
- {
- return [
- 'FAM:*:ADDR:_NAME' => new CustomElement(I18N::translate('Name of addressee')),
- // I18N: https://gov.genealogy.net
- 'FAM:*:PLAC:_GOV' => new GovIdentifier(I18N::translate('GOV identifier')),
- 'FAM:*:PLAC:_LOC' => new XrefLocation(I18N::translate('Location')),
- // I18N: https://en.wikipedia.org/wiki/Maidenhead_Locator_System
- 'FAM:*:PLAC:_MAIDENHEAD' => new MaidenheadLocator(I18N::translate('Maidenhead location code')),
- 'FAM:*:PLAC:_POST' => new AddressPostalCode(I18N::translate('Postal code')),
- 'FAM:*:PLAC:_POST:DATE' => new DateValue(I18N::translate('Date')),
- 'FAM:*:_ASSO' => new XrefAssociate(I18N::translate('Associate')),
- 'FAM:*:_ASSO:NOTE' => new NoteStructure(I18N::translate('Note on association')),
- 'FAM:*:_ASSO:RELA' => new RelationIsDescriptor(I18N::translate('Relationship')),
- 'FAM:*:_ASSO:SOUR' => new XrefSource(I18N::translate('Source citation')),
- 'FAM:*:_ASSO:SOUR:DATA' => new SourceData(I18N::translate('Data')),
- 'FAM:*:_ASSO:SOUR:DATA:DATE' => new DateValue(I18N::translate('Date of entry in original source')),
- 'FAM:*:_ASSO:SOUR:DATA:TEXT' => new TextFromSource(I18N::translate('Text')),
- 'FAM:*:_ASSO:SOUR:EVEN' => new EventTypeCitedFrom(I18N::translate('Event')),
- 'FAM:*:_ASSO:SOUR:EVEN:ROLE' => new RoleInEvent(I18N::translate('Role')),
- 'FAM:*:_ASSO:SOUR:NOTE' => new NoteStructure(I18N::translate('Note on source citation')),
- 'FAM:*:_ASSO:SOUR:OBJE' => new XrefMedia(I18N::translate('Media object')),
- 'FAM:*:_ASSO:SOUR:PAGE' => new WhereWithinSource(I18N::translate('Citation details')),
- 'FAM:*:_ASSO:SOUR:QUAY' => new CertaintyAssessment(I18N::translate('Quality of data')),
- 'FAM:*:_WITN' => new CustomElement(I18N::translate('Witnesses')),
- 'FAM:_ASSO' => new XrefAssociate(I18N::translate('Associate')),
- 'FAM:_ASSO:RELA' => new RelationIsDescriptor(I18N::translate('Relationship')),
- 'FAM:_STAT' => new FamilyStatusText(I18N::translate('Family status')),
- 'FAM:_TODO' => new ResearchTask(I18N::translate('Research task'), ['DESC' => '1:1', '_CAT' => '0:1', '_PRTY' => '0:1', 'TYPE' => '0:1', 'NOTE' => '0:M', 'DATA' => '0:1', 'STAT' => '0:1', '_CDATE' => '0:1', '_RDATE' => '0:1', 'REPO' => '0:1', '_UID' => '0:M']),
- 'FAM:_TODO:DATA' => new SubmitterText(I18N::translate('The solution')),
- 'FAM:_TODO:DATE' => new DateValueToday(I18N::translate('Creation date')),
- 'FAM:_TODO:DESC' => new CustomElement(I18N::translate('Description')),
- 'FAM:_TODO:NOTE' => new NoteStructure(I18N::translate('Note')),
- 'FAM:_TODO:REPO' => new XrefRepository(I18N::translate('Repository'), []),
- 'FAM:_TODO:STAT' => new ResearchTaskStatus(I18N::translate('Status')),
- 'FAM:_TODO:TYPE' => new ResearchTaskType(I18N::translate('Type of research task')),
- 'FAM:_TODO:_CAT' => new CustomElement(I18N::translate('Category')),
- 'FAM:_TODO:_CDATE' => new DateValue(I18N::translate('Completion date')),
- 'FAM:_TODO:_PRTY' => new ResearchTaskPriority(I18N::translate('Priority')),
- 'FAM:_TODO:_RDATE' => new DateValue(I18N::translate('Reminder date')),
- 'FAM:_UID' => new PafUid(I18N::translate('Unique identifier')),
- 'HEAD:GEDC:VERS:_ADDENDUM' => new EmptyElement(I18N::translate('GEDCOM-L')),
- 'HEAD:GEDC:VERS:_ADDENDUM:VERS' => new VersionNumber(I18N::translate('Version')),
- 'HEAD:GEDC:VERS:_ADDENDUM:WWW' => new AddressWebPage(I18N::translate('URL')),
- 'HEAD:SOUR:CORP:ADDR:_NAME' => new CustomElement(I18N::translate('Name of addressee')),
- 'HEAD:_SCHEMA' => new EmptyElement(I18N::translate('Schema')),
- 'HEAD:_SCHEMA:*' => new EmptyElement(I18N::translate('Base GEDCOM tag')),
- 'HEAD:_SCHEMA:*:*' => new EmptyElement(I18N::translate('New GEDCOM tag')),
- 'HEAD:_SCHEMA:*:*:*' => new EmptyElement(I18N::translate('New GEDCOM tag')),
- 'HEAD:_SCHEMA:*:*:*:*' => new EmptyElement(I18N::translate('New GEDCOM tag')),
- 'HEAD:_SCHEMA:*:*:*:*:*' => new EmptyElement(I18N::translate('New GEDCOM tag')),
- 'HEAD:_SCHEMA:*:*:*:*:*:*' => new EmptyElement(I18N::translate('New GEDCOM tag')),
- 'HEAD:_SCHEMA:*:*:*:*:*:*:_DEFN' => new EmptyElement(I18N::translate('Definition')),
- 'HEAD:_SCHEMA:*:*:*:*:*:_DEFN' => new EmptyElement(I18N::translate('Definition')),
- 'HEAD:_SCHEMA:*:*:*:*:_DEFN' => new EmptyElement(I18N::translate('Definition')),
- 'HEAD:_SCHEMA:*:*:*:_DEFN' => new EmptyElement(I18N::translate('Definition')),
- 'HEAD:_SCHEMA:*:*:_DEFN' => new EmptyElement(I18N::translate('Definition')),
- 'INDI:*:ADDR:_NAME' => new CustomElement(I18N::translate('Name of addressee')),
- // I18N: https://gov.genealogy.net
- 'INDI:*:PLAC:_GOV' => new GovIdentifier(I18N::translate('GOV identifier')),
- 'INDI:*:PLAC:_LOC' => new XrefLocation(I18N::translate('Location')),
- // I18N: https://en.wikipedia.org/wiki/Maidenhead_Locator_System
- 'INDI:*:PLAC:_MAIDENHEAD' => new MaidenheadLocator(I18N::translate('Maidenhead location code')),
- 'INDI:*:PLAC:_POST' => new AddressPostalCode(I18N::translate('Postal code')),
- 'INDI:*:PLAC:_POST:DATE' => new DateValue(I18N::translate('Date')),
- 'INDI:*:_ASSO' => new XrefAssociate(I18N::translate('Associate')),
- 'INDI:*:_ASSO:NOTE' => new NoteStructure(I18N::translate('Note on association')),
- 'INDI:*:_ASSO:RELA' => new RelationIsDescriptor(I18N::translate('Relationship')),
- 'INDI:*:_ASSO:SOUR' => new XrefSource(I18N::translate('Source citation')),
- 'INDI:*:_ASSO:SOUR:DATA' => new SourceData(I18N::translate('Data')),
- 'INDI:*:_ASSO:SOUR:DATA:DATE' => new DateValue(I18N::translate('Date of entry in original source')),
- 'INDI:*:_ASSO:SOUR:DATA:TEXT' => new TextFromSource(I18N::translate('Text')),
- 'INDI:*:_ASSO:SOUR:EVEN' => new EventTypeCitedFrom(I18N::translate('Event')),
- 'INDI:*:_ASSO:SOUR:EVEN:ROLE' => new RoleInEvent(I18N::translate('Role')),
- 'INDI:*:_ASSO:SOUR:NOTE' => new NoteStructure(I18N::translate('Note on source citation')),
- 'INDI:*:_ASSO:SOUR:OBJE' => new XrefMedia(I18N::translate('Media object')),
- 'INDI:*:_ASSO:SOUR:PAGE' => new WhereWithinSource(I18N::translate('Citation details')),
- 'INDI:*:_ASSO:SOUR:QUAY' => new CertaintyAssessment(I18N::translate('Quality of data')),
- 'INDI:*:_WITN' => new CustomElement(I18N::translate('Witnesses')),
- 'INDI:BAPM:_GODP' => new CustomElement(I18N::translate('Godparents')),
- 'INDI:CHR:_GODP' => new CustomElement(I18N::translate('Godparents')),
- 'INDI:NAME:_RUFNAME' => new NamePieceGiven(I18N::translate('Rufname')),
- 'INDI:OBJE:_PRIM' => new CustomElement(I18N::translate('Highlighted image')),
- 'INDI:SEX' => new SexXValue(I18N::translate('Gender')),
- 'INDI:_TODO' => new ResearchTask(I18N::translate('Research task')),
- 'INDI:_TODO:DATA' => new SubmitterText(I18N::translate('The solution')),
- 'INDI:_TODO:DATE' => new DateValueToday(I18N::translate('Creation date')),
- 'INDI:_TODO:DESC' => new CustomElement(I18N::translate('Description')),
- 'INDI:_TODO:NOTE' => new NoteStructure(I18N::translate('Note')),
- 'INDI:_TODO:REPO' => new XrefRepository(I18N::translate('Repository'), []),
- 'INDI:_TODO:STAT' => new ResearchTaskStatus(I18N::translate('Status')),
- 'INDI:_TODO:TYPE' => new ResearchTaskType(I18N::translate('Type of research task')),
- 'INDI:_TODO:_CAT' => new CustomElement(I18N::translate('Category')),
- 'INDI:_TODO:_CDATE' => new DateValue(I18N::translate('Completion date')),
- 'INDI:_TODO:_PRTY' => new ResearchTaskPriority(I18N::translate('Priority')),
- 'INDI:_TODO:_RDATE' => new DateValue(I18N::translate('Reminder date')),
- 'INDI:_UID' => new PafUid(I18N::translate('Unique identifier')),
- 'NOTE:_UID' => new PafUid(I18N::translate('Unique identifier')),
- 'OBJE:FILE:_PRIM' => new CustomElement(I18N::translate('Highlighted image')),
- 'OBJE:_UID' => new PafUid(I18N::translate('Unique identifier')),
- 'REPO:ADDR:_NAME' => new CustomElement(I18N::translate('Name of addressee')),
- 'REPO:_UID' => new PafUid(I18N::translate('Unique identifier')),
- 'SOUR:_UID' => new PafUid(I18N::translate('Unique identifier')),
- 'SOUR:DATA:EVEN:PLAC:_LOC' => new XrefLocation(I18N::translate('Location')),
- // I18N: https://en.wikipedia.org/wiki/Maidenhead_Locator_System
- 'SOUR:DATA:EVEN:PLAC:_MAIDENHEAD' => new MaidenheadLocator(I18N::translate('Maidenhead location code')),
- 'SOUR:DATA:EVEN:PLAC:_POST' => new AddressPostalCode(I18N::translate('Postal code')),
- 'SOUR:DATA:EVEN:PLAC:_POST:DATE' => new DateValue(I18N::translate('Date')),
- 'SUBM:ADDR:_NAME' => new CustomElement(I18N::translate('Name of addressee')),
- 'SUBM:_UID' => new PafUid(I18N::translate('Unique identifier')),
- 'SUBN:_UID' => new PafUid(I18N::translate('Unique identifier')),
- '_LOC' => new LocationRecord(I18N::translate('Location')),
- '_LOC:CHAN' => new Change(I18N::translate('Last change')),
- '_LOC:CHAN:DATE' => new ChangeDate(I18N::translate('Date of last change')),
- '_LOC:CHAN:DATE:TIME' => new TimeValueNow(I18N::translate('Time of last change')),
- '_LOC:CHAN:NOTE' => new NoteStructure(I18N::translate('Note on last change')),
- '_LOC:EVEN' => new CustomElement(I18N::translate('Event'), ['TYPE' => '0:1', 'DATE' => '0:1', 'PLAC' => '0:1', 'ADDR' => '0:1', 'EMAIL' => '0:1:?', 'WWW' => '0:1:?', 'PHON' => '0:1:?', 'FAX' => '0:1:?', 'CAUS' => '0:1', 'AGNC' => '0:1', 'RELI' => '0:1', 'NOTE' => '0:M', 'OBJE' => '0:M', 'SOUR' => '0:M', 'RESN' => '0:1']),
- '_LOC:EVEN:ADDR' => new AddressLine(I18N::translate('Address')),
- '_LOC:EVEN:ADDR:ADR1' => new AddressLine1(I18N::translate('Address line 1')),
- '_LOC:EVEN:ADDR:ADR2' => new AddressLine2(I18N::translate('Address line 2')),
- '_LOC:EVEN:ADDR:ADR3' => new AddressLine3(I18N::translate('Address line 3')),
- '_LOC:EVEN:ADDR:CITY' => new AddressCity(I18N::translate('City')),
- '_LOC:EVEN:ADDR:CTRY' => new AddressCountry(I18N::translate('Country')),
- '_LOC:EVEN:ADDR:POST' => new AddressPostalCode(I18N::translate('Postal code')),
- '_LOC:EVEN:ADDR:STAE' => new AddressState(I18N::translate('State')),
- '_LOC:EVEN:AGNC' => new ResponsibleAgency(I18N::translate('Agency')),
- '_LOC:EVEN:CAUS' => new CauseOfEvent(I18N::translate('Cause')),
- '_LOC:EVEN:DATE' => new DateValue(I18N::translate('Date of event')),
- '_LOC:EVEN:EMAIL' => new AddressEmail(I18N::translate('Email address')),
- '_LOC:EVEN:FAX' => new AddressFax(I18N::translate('Fax')),
- '_LOC:EVEN:NOTE' => new NoteStructure(I18N::translate('Note')),
- '_LOC:EVEN:OBJE' => new XrefMedia(I18N::translate('Media object')),
- '_LOC:EVEN:PHON' => new PhoneNumber(I18N::translate('Phone')),
- '_LOC:EVEN:PLAC' => new PlaceName(I18N::translate('Place of event')),
- '_LOC:EVEN:PLAC:FONE' => new PlacePhoneticVariation(I18N::translate('Phonetic place')),
- '_LOC:EVEN:PLAC:FONE:TYPE' => new PhoneticType(I18N::translate('Type')),
- '_LOC:EVEN:PLAC:FORM' => new PlaceHierarchy(I18N::translate('Format')),
- '_LOC:EVEN:PLAC:MAP' => new EmptyElement(I18N::translate('Coordinates'), ['LATI' => '1:1', 'LONG' => '1:1']),
- '_LOC:EVEN:PLAC:MAP:LATI' => new PlaceLatitude(I18N::translate('Latitude')),
- '_LOC:EVEN:PLAC:MAP:LONG' => new PlaceLongtitude(I18N::translate('Longitude')),
- '_LOC:EVEN:PLAC:NOTE' => new NoteStructure(I18N::translate('Note on place')),
- '_LOC:EVEN:PLAC:ROMN' => new PlaceRomanizedVariation(I18N::translate('Romanized place')),
- '_LOC:EVEN:PLAC:ROMN:TYPE' => new RomanizedType(I18N::translate('Type')),
- '_LOC:EVEN:PLAC:_LOC' => new XrefLocation(I18N::translate('Location')),
- '_LOC:EVEN:RELI' => new ReligiousAffiliation(I18N::translate('Religion'), []),
- '_LOC:EVEN:RESN' => new RestrictionNotice(I18N::translate('Restriction')),
- '_LOC:EVEN:SOUR' => new XrefSource(I18N::translate('Source citation')),
- '_LOC:EVEN:TYPE' => new EventAttributeType(I18N::translate('Type of event')),
- '_LOC:EVEN:WWW' => new CustomElement(I18N::translate('URL')),
- '_LOC:MAP' => new EmptyElement(I18N::translate('Coordinates'), ['LATI' => '1:1', 'LONG' => '1:1']),
- '_LOC:MAP:LATI' => new PlaceLatitude(I18N::translate('Latitude')),
- '_LOC:MAP:LONG' => new PlaceLongtitude(I18N::translate('Longitude')),
- '_LOC:NAME' => new PlaceName(I18N::translate('Place'), ['ABBR' => '0:1', 'DATE' => '0:1', 'LANG' => '0:1', 'SOUR' => '0:M']),
- '_LOC:NAME:ABBR' => new CustomElement(I18N::translate('Abbreviation')),
- '_LOC:NAME:ABBR:TYPE' => new CustomElement(I18N::translate('Type of abbreviation')),
- '_LOC:NAME:DATE' => new DateValue(I18N::translate('Date')),
- '_LOC:NAME:LANG' => new LanguageId(I18N::translate('Language')),
- '_LOC:NAME:SOUR' => new XrefSource(I18N::translate('Source')),
- '_LOC:NOTE' => new NoteStructure(I18N::translate('Note')),
- '_LOC:OBJE' => new XrefMedia(I18N::translate('Media')),
- '_LOC:RELI' => new ReligiousAffiliation(I18N::translate('Religion'), []),
- '_LOC:SOUR' => new XrefSource(I18N::translate('Source')),
- '_LOC:SOUR:DATA' => new SourceData(I18N::translate('Data')),
- '_LOC:SOUR:DATA:DATE' => new DateValue(I18N::translate('Date of entry in original source')),
- '_LOC:SOUR:DATA:TEXT' => new TextFromSource(I18N::translate('Text')),
- '_LOC:SOUR:EVEN' => new EventTypeCitedFrom(I18N::translate('Event')),
- '_LOC:SOUR:EVEN:ROLE' => new RoleInEvent(I18N::translate('Role')),
- '_LOC:SOUR:NOTE' => new NoteStructure(I18N::translate('Note on source citation')),
- '_LOC:SOUR:OBJE' => new XrefMedia(I18N::translate('Media object')),
- '_LOC:SOUR:PAGE' => new WhereWithinSource(I18N::translate('Citation details')),
- '_LOC:SOUR:QUAY' => new CertaintyAssessment(I18N::translate('Quality of data')),
- '_LOC:TYPE' => new CustomElement(I18N::translate('Type of location'), ['DATE' => '0:1', '_GOVTYPE' => '0:1', 'SOUR' => '0:M']),
- '_LOC:TYPE:DATE' => new DateValue(I18N::translate('Date')),
- '_LOC:TYPE:SOUR' => new XrefSource(I18N::translate('Source')),
- '_LOC:TYPE:_GOVTYPE' => new CustomElement(I18N::translate('GOV identifier type')),
- '_LOC:_AIDN' => new CustomElement(I18N::translate('Administrative ID')),
- '_LOC:_AIDN:DATE' => new DateValue(I18N::translate('Date')),
- '_LOC:_AIDN:SOUR' => new XrefSource(I18N::translate('Source')),
- '_LOC:_AIDN:TYPE' => new CustomElement(I18N::translate('Type of administrative ID')),
- '_LOC:_DMGD' => new CustomElement(I18N::translate('Demographic data')),
- '_LOC:_DMGD:DATE' => new DateValue(I18N::translate('Date')),
- '_LOC:_DMGD:SOUR' => new XrefSource(I18N::translate('Source')),
- '_LOC:_DMGD:TYPE' => new CustomElement(I18N::translate('Type of demographic data')),
- // I18N: https://gov.genealogy.net
- '_LOC:_GOV' => new GovIdentifier(I18N::translate('GOV identifier')),
- '_LOC:_LOC' => new XrefLocation(I18N::translate('Parent location'), ['DATE' => '0:1', 'SOUR' => '0:M', 'TYPE' => '0:1']),
- '_LOC:_LOC:DATE' => new DateValue(I18N::translate('Date')),
- '_LOC:_LOC:SOUR' => new XrefSource(I18N::translate('Source')),
- '_LOC:_LOC:TYPE' => new HierarchicalRelationship(I18N::translate('Hierarchical relationship')),
- // I18N: https://en.wikipedia.org/wiki/Maidenhead_Locator_System
- '_LOC:_MAIDENHEAD' => new MaidenheadLocator(I18N::translate('Maidenhead location code')),
- '_LOC:_POST' => new AddressPostalCode(I18N::translate('Postal code')),
- '_LOC:_POST:DATE' => new DateValue(I18N::translate('Date')),
- '_LOC:_POST:SOUR' => new XrefSource(I18N::translate('Source')),
- '_LOC:_UID' => new PafUid(I18N::translate('Unique identifier')),
- '_LOC:*:SOUR:DATA' => new SourceData(I18N::translate('Data')),
- '_LOC:*:SOUR:DATA:DATE' => new DateValue(I18N::translate('Date of entry in original source')),
- '_LOC:*:SOUR:DATA:TEXT' => new TextFromSource(I18N::translate('Text')),
- '_LOC:*:SOUR:EVEN' => new EventTypeCitedFrom(I18N::translate('Event')),
- '_LOC:*:SOUR:EVEN:ROLE' => new RoleInEvent(I18N::translate('Role')),
- '_LOC:*:SOUR:NOTE' => new NoteStructure(I18N::translate('Note on source citation')),
- '_LOC:*:SOUR:OBJE' => new XrefMedia(I18N::translate('Media object')),
- '_LOC:*:SOUR:PAGE' => new WhereWithinSource(I18N::translate('Citation details')),
- '_LOC:*:SOUR:QUAY' => new CertaintyAssessment(I18N::translate('Quality of data')),
- ];
- }
-
- /**
- * @return array<string,ElementInterface>
- */
- private function geneatique(): array
- {
- return [
- 'INDI:DEAT:DATE:TIME' => new TimeValue(I18N::translate('Time of death')),
- 'OBJE:FORM' => new MultimediaFormat(I18N::translate('Format')),
- 'OBJE:TITL' => new DescriptiveTitle(I18N::translate('Title')),
- 'INDI:NAME:_AKA' => new NamePersonal(I18N::translate('Also known as'), []),
- 'INDI:NAME:_MARNM' => new NamePersonal(I18N::translate('Also known as'), []),
-
- /*
- Pour déclarer les témoins dans les actes de naissance
-
- Balise GEDCOM non valide. INDI:BIRT:ASSO
- INDI:BIRT:ASSO:TYPE
- INDI:BIRT:ASSO:RELA
- INDI:DEAT:PLAC:QUAY
- INDI:BIRT:OBJE:QUAY
- INDI:BIRT:SOUR:TEXT
-
- Dans les mariages
-
- FAM:MARR:ASSO
- FAM:MARR:ASSO:TYPE
- FAM:MARR:ASSO:RELA
- FAM:MARR:WWW:QUAY
- OBJE:WWW
- OBJE:SOUR:TEXTHTTPS
- OBJE:NOTE:WWW
- SOUR:QUAY
- SOUR:TYPE
- */
- ];
- }
-
- /**
- * @return array<string,ElementInterface>
- */
- private function genPlusWinTags(): array
- {
- return [
- 'FAM:*:ADDR:_NUM' => new CustomElement(I18N::translate('House number')),
- 'FAM:*:ADDR:_STRASSE' => new CustomElement(I18N::translate('Street name')),
- 'FAM:*:DATE:_ZUS' => new CustomElement(I18N::translate('Additional information')),
- 'FAM:*:OBJE:_PRIM' => new CustomElement(I18N::translate('Highlighted image')),
- 'FAM:*:PLAC:_AON' => new CustomElement(I18N::translate('Alternative place name')),
- // I18N: https://foko.genealogy.net
- 'FAM:*:PLAC:_FCTRY' => new CustomElement(I18N::translate('FOKO country')),
- // I18N: https://foko.genealogy.net
- 'FAM:*:PLAC:_FSTAE' => new CustomElement(I18N::translate('FOKO country')),
- // I18N: https://gov.genealogy.net
- 'FAM:*:PLAC:_GOV' => new GovIdentifier(I18N::translate('GOV identifier')),
- // I18N: https://en.wikipedia.org/wiki/Maidenhead_Locator_System
- 'FAM:*:PLAC:_MAIDENHEAD' => new MaidenheadLocator(I18N::translate('Maidenhead location code')),
- 'FAM:*:PLAC:_POST' => new AddressPostalCode(I18N::translate('Postal code')),
- 'FAM:*:PLAC:_SIC' => new CustomElement(I18N::translate('Reliability of the information')),
- 'FAM:*:PLAC:_ZUS' => new CustomElement(I18N::translate('Additional information')),
- 'FAM:*:SOUR:_ORI' => new TextFromSource(I18N::translate('Original text')),
- 'FAM:*:SOUR:_ZUS' => new CustomElement(I18N::translate('Additional information')),
- 'FAM:*:SOUR:PAGE:_ZUS' => new CustomElement(I18N::translate('Additional information')),
- 'FAM:*:_ASSO' => new XrefAssociate(I18N::translate('Associate')),
- 'FAM:*:_CERT' => new CustomElement(I18N::translate('Certificate number')),
- 'FAM:*:_COM' => new CustomElement(I18N::translate('Comment')),
- 'FAM:*:_SITE' => new CustomElement(I18N::translate('Extra information')),
- 'FAM:*:_WITN' => new CustomElement(I18N::translate('Witnesses')),
- 'FAM:OBJE:_PRIM' => new CustomElement(I18N::translate('Highlighted image')),
- 'FAM:SOUR:_ORI' => new TextFromSource(I18N::translate('Original text')),
- 'FAM:SOUR:_ZUS' => new CustomElement(I18N::translate('Additional information')),
- 'FAM:SOUR:PAGE:_ZUS' => new CustomElement(I18N::translate('Additional information')),
- 'FAM:_CREAT' => new DateValue(I18N::translate('Creation date')),
- 'FAM:_LIV' => new CustomElement(I18N::translate('Cohabitation')),
- 'FAM:_NAME' => new CustomElement(I18N::translate('Joint family name')),
- 'FAM:_UID' => new PafUid(I18N::translate('Unique identifier')),
- 'INDI:*:ADDR:_NUM' => new CustomElement(I18N::translate('House number')),
- 'INDI:*:ADDR:_STRASSE' => new CustomElement(I18N::translate('Street name')),
- 'INDI:*:DATE:_ZUS' => new CustomElement(I18N::translate('Additional information')),
- 'INDI:*:OBJE:_PRIM' => new CustomElement(I18N::translate('Highlighted image')),
- 'INDI:*:PLAC:_AON' => new CustomElement(I18N::translate('Alternative place name')),
- // I18N: https://foko.genealogy.net
- 'INDI:*:PLAC:_FCTRY' => new CustomElement(I18N::translate('FOKO country')),
- // I18N: https://foko.genealogy.net
- 'INDI:*:PLAC:_FSTAE' => new CustomElement(I18N::translate('FOKO country')),
- // I18N: https://gov.genealogy.net
- 'INDI:*:PLAC:_GOV' => new GovIdentifier(I18N::translate('GOV identifier')),
- // I18N: https://en.wikipedia.org/wiki/Maidenhead_Locator_System
- 'INDI:*:PLAC:_MAIDENHEAD' => new MaidenheadLocator(I18N::translate('Maidenhead location code')),
- 'INDI:*:PLAC:_POST' => new AddressPostalCode(I18N::translate('Postal code')),
- 'INDI:*:PLAC:_SIC' => new CustomElement(I18N::translate('Reliability of the information')),
- 'INDI:*:PLAC:_ZUS' => new CustomElement(I18N::translate('Additional information')),
- 'INDI:*:SOUR:_ORI' => new TextFromSource(I18N::translate('Original text')),
- 'INDI:*:SOUR:_ZUS' => new CustomElement(I18N::translate('Additional information')),
- 'INDI:*:SOUR:PAGE:_ZUS' => new CustomElement(I18N::translate('Additional information')),
- 'INDI:*:_ASSO' => new XrefAssociate(I18N::translate('Associate')),
- 'INDI:*:_CERT' => new CustomElement(I18N::translate('Certificate number')),
- 'INDI:*:_COM' => new CustomElement(I18N::translate('Comment')),
- 'INDI:*:_SITE' => new CustomElement(I18N::translate('Extra information')),
- 'INDI:*:_WITN' => new CustomElement(I18N::translate('Witnesses')),
- 'INDI:BAPM:_GODP' => new CustomElement(I18N::translate('Godparents')),
- 'INDI:CHR:_GODP' => new CustomElement(I18N::translate('Godparents')),
- 'INDI:OBJE:_PRIM' => new CustomElement(I18N::translate('Highlighted image')),
- 'INDI:SOUR:_ORI' => new TextFromSource(I18N::translate('Original text')),
- 'INDI:SOUR:_ZUS' => new CustomElement(I18N::translate('Additional information')),
- 'INDI:SOUR:PAGE:_ZUS' => new CustomElement(I18N::translate('Additional information')),
- 'INDI:NAME:_AKA' => new CustomElement(I18N::translate('Also known as')),
- // https://en.wikipedia.org/wiki/Rufname
- 'INDI:NAME:RUFN' => new CustomElement(I18N::translate('Rufname')),
- 'INDI:_CREAT' => new CustomElement(I18N::translate('Creation date')),
- 'INDI:_HEIM' => new CustomElement(/* I18N: German Bürgerort */ I18N::translate('Place of citizenship')),
- 'INDI:_UID' => new PafUid(I18N::translate('Unique identifier')),
- 'NOTE:_CREAT' => new DateValue(I18N::translate('Creation date')),
- 'NOTE:_UID' => new PafUid(I18N::translate('Unique identifier')),
- 'OBJE:_CREAT' => new DateValue(I18N::translate('Creation date')),
- 'OBJE:_UID' => new PafUid(I18N::translate('Unique identifier')),
- 'REPO:_CREAT' => new DateValue(I18N::translate('Creation date')),
- 'REPO:_UID' => new PafUid(I18N::translate('Unique identifier')),
- 'SOUR:_CREAT' => new DateValue(I18N::translate('Creation date')),
- 'SOUR:_KTIT' => new SourceFiledByEntry(I18N::translate('Abbreviation')),
- 'SOUR:_UID' => new PafUid(I18N::translate('Unique identifier')),
- ];
- }
-
- /**
- * @return array<string,ElementInterface>
- */
- private function heredis(): array
- {
- return [
- 'INDI:SIGN' => new CustomElement(I18N::translate('Signature')),
- /* Reported on the forum - but what do they mean?
- 'INDI:_FIL' => new CustomElement(I18N::translate('???')),
- 'INDI:*:_FNA' => new CustomElement(I18N::translate('???')),
- 'INDI:????:????:_SUBMAP' => new EmptyElement(I18N::translate('Coordinates'), ['INDI' => '1:1', 'LONG' => '1:1']),
- 'INDI:????:????:_SUBMAP:LATI' => new PlaceLatitude(I18N::translate('Latitude')),
- 'INDI:????:????:_SUBMAP:LONG' => new PlaceLongtitude(I18N::translate('Longitude')),
- */
- ];
- }
-
- /**
- * @see http://support.legacyfamilytree.com/article/AA-00520/0/GEDCOM-Files-custom-tags-in-Legacy.html
- *
- * @return array<string,ElementInterface>
- */
- private function legacyTags(): array
- {
- return [
- 'FAM:*:ADDR:_PRIV' => new CustomElement(I18N::translate('Private')),
- 'FAM:*:PLAC:_VERI' => new CustomElement(I18N::translate('Verified')),
- 'FAM:*:SOUR:DATE' => new DateValue(I18N::translate('Date')),
- 'FAM:*:SOUR:_VERI' => new CustomElement(I18N::translate('Verified')),
- 'FAM:*:_PRIV' => new CustomElement(I18N::translate('Private')),
- 'FAM:CHIL:_FREL' => new CustomElement(I18N::translate('Relationship to father')),
- 'FAM:CHIL:_MREL' => new CustomElement(I18N::translate('Relationship to mother')),
- 'FAM:CHIL:_STAT' => new CustomElement(I18N::translate('Status')),
- 'FAM:EVEN:_OVER' => new CustomElement('Event sentence override'),
- 'FAM:MARR:_HTITL' => new CustomElement(I18N::translate('Label for husband')),
- 'FAM:MARR:_RPT_PHRS' => /* I18N: ''GEDCOM tag _RPT_PHRS */ new CustomElement(I18N::translate('Report phrase')),
- 'FAM:MARR:_RPT_PHRS2' => /* I18N: ''GEDCOM tag _RPT_PHRS */ new CustomElement(I18N::translate('Report phrase')),
- 'FAM:MARR:_STAT' => new CustomElement(I18N::translate('Status')),
- 'FAM:MARR:_WTITL' => new CustomElement(I18N::translate('Label for wife')),
- 'FAM:_NONE' => new CustomElement(I18N::translate('No children')),
- 'FAM:_TAG' => new CustomElement('Tag'),
- 'FAM:_TAG2' => new CustomElement('Tag #2'),
- 'FAM:_TAG3' => new CustomElement('Tag #3'),
- 'FAM:_TAG4' => new CustomElement('Tag #4'),
- 'FAM:_TAG5' => new CustomElement('Tag #5'),
- 'FAM:_TAG6' => new CustomElement('Tag #6'),
- 'FAM:_TAG7' => new CustomElement('Tag #7'),
- 'FAM:_TAG8' => new CustomElement('Tag #8'),
- 'FAM:_TAG9' => new CustomElement('Tag #9'),
- 'FAM:_UID' => new PafUid(I18N::translate('Unique identifier')),
- 'HEAD:_EVENT_DEFN' => new CustomElement('Event definition'),
- 'HEAD:_EVENT_DEFN:_CONF_FLAG' => new CustomElement(I18N::translate('Private')),
- 'HEAD:_EVENT_DEFN:_DATE_TYPE' => new CustomElement(I18N::translate('Date')),
- 'HEAD:_EVENT_DEFN:_DESC_FLAG' => new CustomElement(I18N::translate('Description')),
- 'HEAD:_EVENT_DEFN:_PLACE_TYPE' => new CustomElement(I18N::translate('Place')),
- 'HEAD:_EVENT_DEFN:_PP_EXCLUDE' => new CustomElement('Exclude event from potential problems report'),
- 'HEAD:_EVENT_DEFN:_SEN1' => new CustomElement('Event sentence definition'),
- 'HEAD:_EVENT_DEFN:_SEN2' => new CustomElement('Event sentence definition'),
- 'HEAD:_EVENT_DEFN:_SEN3' => new CustomElement('Event sentence definition'),
- 'HEAD:_EVENT_DEFN:_SEN4' => new CustomElement('Event sentence definition'),
- 'HEAD:_EVENT_DEFN:_SEN5' => new CustomElement('Event sentence definition'),
- 'HEAD:_EVENT_DEFN:_SEN6' => new CustomElement('Event sentence definition'),
- 'HEAD:_EVENT_DEFN:_SEN7' => new CustomElement('Event sentence definition'),
- 'HEAD:_EVENT_DEFN:_SEN8' => new CustomElement('Event sentence definition'),
- 'HEAD:_EVENT_DEFN:_SENDOF' => new CustomElement('Event sentence, female, date only'),
- 'HEAD:_EVENT_DEFN:_SENDOM' => new CustomElement('Event sentence, male, date only'),
- 'HEAD:_EVENT_DEFN:_SENDOU' => new CustomElement('Event sentence, unknown sex, date only'),
- 'HEAD:_EVENT_DEFN:_SENDPF' => new CustomElement('Event sentence, female, date and place'),
- 'HEAD:_EVENT_DEFN:_SENDPM' => new CustomElement('Event sentence, male, date and place'),
- 'HEAD:_EVENT_DEFN:_SENDPU' => new CustomElement('Event sentence, unknown sex, date and place'),
- 'HEAD:_EVENT_DEFN:_SENF' => new CustomElement('Event sentence, female'),
- 'HEAD:_EVENT_DEFN:_SENM' => new CustomElement('Event sentence, male'),
- 'HEAD:_EVENT_DEFN:_SENPOF' => new CustomElement('Event sentence, unknown sex'),
- 'HEAD:_EVENT_DEFN:_SENPOM' => new CustomElement('Event sentence, female, place only'),
- 'HEAD:_EVENT_DEFN:_SENPOU' => new CustomElement('Event sentence, male, place only'),
- 'HEAD:_EVENT_DEFN:_SENU' => new CustomElement('Event sentence, unknown sex, place only'),
- 'HEAD:_PLAC_DEFN' => new CustomElement('Place definition'),
- 'HEAD:_PLAC_DEFN:_PREP' => new CustomElement('Place preposition'),
- 'INDI:*:ADDR:_EMAIL' => new CustomElement(I18N::translate('Email')),
- 'INDI:*:ADDR:_LIST1' => new CustomElement('Include in the “newsletter” group'),
- 'INDI:*:ADDR:_LIST2' => new CustomElement('Include in the “family association” group'),
- 'INDI:*:ADDR:_LIST3' => new CustomElement('Include in the “birthday” group'),
- 'INDI:*:ADDR:_LIST4' => new CustomElement('Include in the “research” group'),
- 'INDI:*:ADDR:_LIST5' => new CustomElement('Include in the “christmas” group'),
- 'INDI:*:ADDR:_LIST6' => new CustomElement('Include in the “holiday” group'),
- 'INDI:*:ADDR:_NAME' => new CustomElement(I18N::translate('Name of addressee')),
- 'INDI:*:ADDR:_PRIV' => new CustomElement(I18N::translate('Private')),
- 'INDI:*:ADDR:_SORT' => new CustomElement('The spelling of a name to be used when sorting addresses for a report'),
- 'INDI:*:ADDR:_TAG' => new CustomElement('Tag'),
- 'INDI:*:PLAC:_TAG' => new CustomElement('Tag'),
- 'INDI:*:PLAC:_VERI' => new CustomElement(I18N::translate('Verified')),
- 'INDI:*:SOUR:DATE' => new DateValue(I18N::translate('Date')),
- 'INDI:*:SOUR:_VERI' => new CustomElement(I18N::translate('Verified')),
- 'INDI:*:_PRIV' => new CustomElement(I18N::translate('Private')),
- 'INDI:EVEN:_OVER' => new CustomElement('Event sentence override'),
- 'INDI:SOUR:_VERI' => new CustomElement(I18N::translate('Verified')),
- 'INDI:_TAG' => new CustomElement('Tag'),
- 'INDI:_TAG2' => new CustomElement('Tag #2'),
- 'INDI:_TAG3' => new CustomElement('Tag #3'),
- 'INDI:_TAG4' => new CustomElement('Tag #4'),
- 'INDI:_TAG5' => new CustomElement('Tag #5'),
- 'INDI:_TAG6' => new CustomElement('Tag #6'),
- 'INDI:_TAG7' => new CustomElement('Tag #7'),
- 'INDI:_TAG8' => new CustomElement('Tag #8'),
- 'INDI:_TAG9' => new CustomElement('Tag #9'),
- 'INDI:_TODO' => new CustomElement(I18N::translate('Research task')),
- 'INDI:_TODO:PRTY' => new CustomElement(I18N::translate('Priority')),
- 'INDI:_TODO:_CAT' => new CustomElement(I18N::translate('Category')),
- 'INDI:_TODO:_CDATE' => new CustomElement(I18N::translate('Completion date')),
- 'INDI:_TODO:_LOCL' => new CustomElement(I18N::translate('Location')),
- 'INDI:_TODO:_RDATE' => new CustomElement(I18N::translate('Reminder date')),
- 'INDI:_UID' => new PafUid(I18N::translate('Unique identifier')),
- 'INDI:_URL' => new AddressWebPage(I18N::translate('URL')),
- 'OBJE:_DATE' => new CustomElement(I18N::translate('Date')),
- 'OBJE:_PRIM' => new CustomElement(I18N::translate('Highlighted image')),
- 'OBJE:_SCBK' => new CustomElement(I18N::translate('Scrapbook')),
- 'OBJE:_SOUND' => new CustomElement(I18N::translate('Audio')),
- 'OBJE:_TYPE' => new CustomElement(I18N::translate('Type')),
- 'OBJE:_UID' => new PafUid(I18N::translate('Unique identifier')),
- 'REPO:_UID' => new PafUid(I18N::translate('Unique identifier')),
- 'SOUR:_ITALIC' => new CustomElement('The source title should be printed in italic on reports'),
- 'SOUR:_PAREN' => new CustomElement('The source title should be printed within parentheses on reports'),
- 'SOUR:_QUOTED' => new CustomElement('The source title should be printed within quotes on reports'),
- 'SOUR:_TAG' => new CustomElement('Exclude the source citation detail on reports'),
- 'SOUR:_TAG2' => new CustomElement('Exclude the source citation on reports'),
- 'SOUR:_TAG3' => new CustomElement('Include the source citation detail text on reports'),
- 'SOUR:_TAG4' => new CustomElement('Include the source citation detail notes on reports'),
- 'SOUR:_UID' => new PafUid(I18N::translate('Unique identifier')),
- ];
- }
-
- /**
- * @return array<string,ElementInterface>
- */
- private function myHeritageTags(): array
- {
- return [
- 'FAM:*:_UID' => new PafUid(I18N::translate('Unique identifier')),
- 'FAM:*:RIN' => new AutomatedRecordId(I18N::translate('Record ID number')),
- 'HEAD:DATE:_TIMEZONE' => new CustomElement(I18N::translate('Time zone')),
- 'HEAD:SOUR:_RTLSAVE' => new CustomElement(I18N::translate('Text direction')), // ?
- 'HEAD:_RINS' => new CustomElement(I18N::translate('Record ID number')), // ?
- 'HEAD:_UID' => new PafUid(I18N::translate('Unique identifier')),
- 'HEAD:_PROJECT_GUID' => new PafUid(I18N::translate('Unique identifier')),
- 'HEAD:_EXPORTED_FROM_SITE_ID' => new CustomElement(I18N::translate('Site identification code')),
- 'HEAD:_DESCRIPTION_AWARE' => new CustomElement(I18N::translate('Description')), // ?
- 'INDI:*:_UID' => new PafUid(I18N::translate('Unique identifier')),
- 'INDI:*:RIN' => new AutomatedRecordId(I18N::translate('Record ID number')),
- '*:_UPD' => new CustomElement(I18N::translate('Updated at')),
- ];
- }
-
- /**
- * @return array<string,ElementInterface>
- */
- private function personalAncestralFileTags(): array
- {
- return [
- 'FAM:_UID' => new PafUid(I18N::translate('Unique identifier')),
- 'INDI:NAME:_ADPN' => new NamePersonal(I18N::translate('Adopted name'), []),
- 'INDI:NAME:_AKA' => new NamePersonal(I18N::translate('Also known as'), []),
- 'INDI:NAME:_AKAN' => new NamePersonal(I18N::translate('Also known as'), []),
- 'INDI:ADDR' => new AddressLine(I18N::translate('Address')),
- 'INDI:ADDR:ADR1' => new AddressLine1(I18N::translate('Address line 1')),
- 'INDI:ADDR:ADR2' => new AddressLine2(I18N::translate('Address line 2')),
- 'INDI:ADDR:CITY' => new AddressCity(I18N::translate('City')),
- 'INDI:ADDR:CTRY' => new AddressCountry(I18N::translate('Country')),
- 'INDI:ADDR:POST' => new AddressPostalCode(I18N::translate('Postal code')),
- 'INDI:ADDR:STAE' => new AddressState(I18N::translate('State')),
- 'INDI:ADDR:_NAME' => new CustomElement(I18N::translate('Name of addressee')),
- 'INDI:EMAIL' => new AddressEmail(I18N::translate('Email address')),
- 'INDI:FAX' => new AddressFax(I18N::translate('Fax')),
- 'INDI:PHON' => new PhoneNumber(I18N::translate('Phone')),
- 'INDI:URL' => new CustomElement(I18N::translate('URL')),
- 'INDI:_UID' => new PafUid(I18N::translate('Unique identifier')),
- 'OBJE:_UID' => new PafUid(I18N::translate('Unique identifier')),
- 'REPO:_UID' => new PafUid(I18N::translate('Unique identifier')),
- 'SOUR:_UID' => new PafUid(I18N::translate('Unique identifier')),
- ];
- }
-
- /**
- * @return array<string,ElementInterface>
- */
- private function phpGedViewTags(): array
- {
- return [
- 'FAM:CHAN:_PGVU' => new WebtreesUser(I18N::translate('Author of last change')),
- 'FAM:COMM' => new CustomElement(I18N::translate('Comment')),
- 'INDI:*:ASSO' => new XrefAssociate(I18N::translate('Associate')),
- 'INDI:*:ASSO:RELA' => new RelationIsDescriptor(I18N::translate('Relationship')),
- 'INDI:*:PLAC:_HEB' => new NoteStructure(I18N::translate('Place in Hebrew')),
- 'INDI:BURI:CEME' => new CustomElement(I18N::translate('Cemetery')),
- 'INDI:CHAN:_PGVU' => new WebtreesUser(I18N::translate('Author of last change')),
- 'INDI:COMM' => new CustomElement(I18N::translate('Comment')),
- 'INDI:NAME:_HEB' => new NamePersonal(I18N::translate('Name in Hebrew'), []),
- 'INDI:_HOL' => new CustomIndividualEvent(I18N::translate('Holocaust')),
- 'INDI:_MILI' => new CustomIndividualEvent(I18N::translate('Military')),
- 'INDI:_PGV_OBJS' => new XrefMedia(I18N::translate('Re-order media')),
- 'NOTE:CHAN:_PGVU' => new WebtreesUser(I18N::translate('Author of last change')),
- 'OBJE:CHAN:_PGVU' => new WebtreesUser(I18N::translate('Author of last change')),
- 'OBJE:_THUM' => new CustomElement(I18N::translate('Thumbnail image')),
- 'REPO:CHAN:_PGVU' => new WebtreesUser(I18N::translate('Author of last change')),
- 'SOUR:CHAN:_PGVU' => new WebtreesUser(I18N::translate('Author of last change')),
- 'SOUR:SERV' => new CustomElement(I18N::translate('Remote server')),
- 'SOUR:URL' => new AddressWebPage(I18N::translate('URL')),
- 'SOUR:URL:TYPE' => new CustomElement(I18N::translate('Type')), // e.g. "FamilySearch"
- 'SOUR:URL:_BLOCK' => new CustomElement(I18N::translate('Block')), // "e.g. "false"
- 'SOUR:_DBID' => new CustomElement(I18N::translate('Database name')),
- 'SOUR:_DBID:_PASS' => new CustomElement(I18N::translate('Database password')),
- 'SOUR:_DBID:_PASS:RESN' => new RestrictionNotice(I18N::translate('Restriction')),
- 'SOUR:_DBID:_USER' => new CustomElement(I18N::translate('Database user account')),
- ];
- }
-
- /**
- * @return array<string,ElementInterface>
- */
- private function reunionTags(): array
- {
- return [
- 'FAM:_UID' => new PafUid(I18N::translate('Unique identifier')),
- 'INDI:CITN' => new CustomElement(I18N::translate('Citizenship')),
- 'INDI:EMAL' => new AddressEmail(I18N::translate('Email address')),
- 'INDI:_LEGA' => new CustomElement(I18N::translate('Legatee')),
- 'INDI:_MDCL' => new CustomElement(I18N::translate('Medical')),
- 'INDI:_PURC' => /* I18N: GEDCOM tag _PURC */ new CustomElement(I18N::translate('Land purchase')),
- 'INDI:_SALE' => /* I18N: GEDCOM tag _SALE */ new CustomElement(I18N::translate('Land sale')),
- 'INDI:_UID' => new PafUid(I18N::translate('Unique identifier')),
- 'OBJE:_UID' => new PafUid(I18N::translate('Unique identifier')),
- 'REPO:_UID' => new PafUid(I18N::translate('Unique identifier')),
- 'SOUR:_UID' => new PafUid(I18N::translate('Unique identifier')),
- ];
- }
-
- /**
- * @return array<string,ElementInterface>
- */
- private function rootsMagicTags(): array
- {
- return [
- 'FAM:_UID' => new PafUid(I18N::translate('Unique identifier')),
- 'INDI:_DNA' => new CustomElement(I18N::translate('DNA markers')),
- 'INDI:_UID' => new PafUid(I18N::translate('Unique identifier')),
- 'INDI:_WEBTAG' => new CustomElement(I18N::translate('External link')),
- 'INDI:_WEBTAG:NAME' => new CustomElement(I18N::translate('Text')),
- 'INDI:_WEBTAG:URL' => new AddressWebPage(I18N::translate('URL')),
- 'OBJE:_UID' => new PafUid(I18N::translate('Unique identifier')),
- 'REPO:_UID' => new PafUid(I18N::translate('Unique identifier')),
- 'SOUR:_BIBL' => new CustomElement(I18N::translate('Bibliography')),
- 'SOUR:_SUBQ' => new CustomElement(I18N::translate('Abbreviation')),
- 'SOUR:_UID' => new PafUid(I18N::translate('Unique identifier')),
- ];
- }
-
- /**
- * @return array<string,ElementInterface>
- */
- private function theMasterGenealogistTags(): array
- {
- return [
- 'INDI:*:_SDATE' => new DateValue(I18N::translate('Sort date')),
- 'INDI:NAME:_DATE' => new DateValue(I18N::translate('Date')),
- ];
- }
-
- /**
* Custom tags for webtrees.
*
* @return array<string,ElementInterface>
@@ -2087,25 +1129,30 @@ class Gedcom
// webtrees extensions.
$element_factory->registerSubTags($this->webtreesSubTags());
- // Third-party extensions.
- $element_factory->registerTags($this->aldfaerTags());
- $element_factory->registerTags($this->ancestryTags());
- $element_factory->registerTags($this->brothersKeeperTags());
- $element_factory->registerTags($this->familySearchTags());
- $element_factory->registerTags($this->familyTreeBuilderTags());
- $element_factory->registerTags($this->familyTreeMakerTags());
- $element_factory->registerTags($this->gedcom7Tags());
- $element_factory->registerTags($this->gedcomLTags());
- $element_factory->registerTags($this->geneatique());
- $element_factory->registerTags($this->genPlusWinTags());
- $element_factory->registerTags($this->heredis());
- $element_factory->registerTags($this->legacyTags());
- $element_factory->registerTags($this->myHeritageTags());
- $element_factory->registerTags($this->personalAncestralFileTags());
- $element_factory->registerTags($this->phpGedViewTags());
- $element_factory->registerTags($this->reunionTags());
- $element_factory->registerTags($this->rootsMagicTags());
- $element_factory->registerTags($this->theMasterGenealogistTags());
+ $custom_tags = [
+ new Aldfaer(),
+ new Ancestry(),
+ new BrothersKeeper(),
+ new FamilySearch(),
+ new FamilyTreeBuilder(),
+ new FamilyTreeMaker(),
+ new Gedcom7(),
+ new GedcomL(),
+ new Geneatique(),
+ new GenPlusWin(),
+ new Heredis(),
+ new Legacy(),
+ new MyHeritage(),
+ new PersonalAncestralFile(),
+ new PhpGedView(),
+ new ProGen(),
+ new Reunion(),
+ new RootsMagic(),
+ ];
+
+ foreach ($custom_tags as $custom_tag) {
+ $element_factory->registerTags($custom_tag->tags());
+ }
// Creating tags from all the above are grouped into one place
$element_factory->registerSubTags($this->customSubTags());