xref: /webtrees/app/Factories/ElementFactory.php (revision f7c88e25d07f4e1800cd7cf6aaec3ec4130a2211)
1c2ed51d1SGreg Roach<?php
2c2ed51d1SGreg Roach
3c2ed51d1SGreg Roach/**
4c2ed51d1SGreg Roach * webtrees: online genealogy
5c2ed51d1SGreg Roach * Copyright (C) 2021 webtrees development team
6c2ed51d1SGreg Roach * This program is free software: you can redistribute it and/or modify
7c2ed51d1SGreg Roach * it under the terms of the GNU General Public License as published by
8c2ed51d1SGreg Roach * the Free Software Foundation, either version 3 of the License, or
9c2ed51d1SGreg Roach * (at your option) any later version.
10c2ed51d1SGreg Roach * This program is distributed in the hope that it will be useful,
11c2ed51d1SGreg Roach * but WITHOUT ANY WARRANTY; without even the implied warranty of
12c2ed51d1SGreg Roach * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13c2ed51d1SGreg Roach * GNU General Public License for more details.
14c2ed51d1SGreg Roach * You should have received a copy of the GNU General Public License
15c2ed51d1SGreg Roach * along with this program. If not, see <https://www.gnu.org/licenses/>.
16c2ed51d1SGreg Roach */
17c2ed51d1SGreg Roach
18c2ed51d1SGreg Roachdeclare(strict_types=1);
19c2ed51d1SGreg Roach
20c2ed51d1SGreg Roachnamespace Fisharebest\Webtrees\Factories;
21c2ed51d1SGreg Roach
22c2ed51d1SGreg Roachuse Fisharebest\Webtrees\Contracts\ElementFactoryInterface;
23c2ed51d1SGreg Roachuse Fisharebest\Webtrees\Contracts\ElementInterface;
24c2ed51d1SGreg Roachuse Fisharebest\Webtrees\Elements\AddressCity;
25c2ed51d1SGreg Roachuse Fisharebest\Webtrees\Elements\AddressCountry;
26c2ed51d1SGreg Roachuse Fisharebest\Webtrees\Elements\AddressEmail;
27c2ed51d1SGreg Roachuse Fisharebest\Webtrees\Elements\AddressFax;
28c2ed51d1SGreg Roachuse Fisharebest\Webtrees\Elements\AddressLine;
29c2ed51d1SGreg Roachuse Fisharebest\Webtrees\Elements\AddressLine1;
30c2ed51d1SGreg Roachuse Fisharebest\Webtrees\Elements\AddressLine2;
31c2ed51d1SGreg Roachuse Fisharebest\Webtrees\Elements\AddressLine3;
32c2ed51d1SGreg Roachuse Fisharebest\Webtrees\Elements\AddressPostalCode;
33c2ed51d1SGreg Roachuse Fisharebest\Webtrees\Elements\AddressState;
34c2ed51d1SGreg Roachuse Fisharebest\Webtrees\Elements\AddressWebPage;
35c2ed51d1SGreg Roachuse Fisharebest\Webtrees\Elements\AdoptedByWhichParent;
36c2ed51d1SGreg Roachuse Fisharebest\Webtrees\Elements\Adoption;
37c2ed51d1SGreg Roachuse Fisharebest\Webtrees\Elements\AdultChristening;
38c2ed51d1SGreg Roachuse Fisharebest\Webtrees\Elements\AgeAtEvent;
39c2ed51d1SGreg Roachuse Fisharebest\Webtrees\Elements\AncestralFileNumber;
40c2ed51d1SGreg Roachuse Fisharebest\Webtrees\Elements\Annulment;
41c2ed51d1SGreg Roachuse Fisharebest\Webtrees\Elements\ApprovedSystemId;
42c2ed51d1SGreg Roachuse Fisharebest\Webtrees\Elements\AttributeDescriptor;
43c2ed51d1SGreg Roachuse Fisharebest\Webtrees\Elements\AutomatedRecordId;
44c2ed51d1SGreg Roachuse Fisharebest\Webtrees\Elements\Baptism;
45c2ed51d1SGreg Roachuse Fisharebest\Webtrees\Elements\BasMitzvah;
46c2ed51d1SGreg Roachuse Fisharebest\Webtrees\Elements\Birth;
47c2ed51d1SGreg Roachuse Fisharebest\Webtrees\Elements\Blessing;
48c2ed51d1SGreg Roachuse Fisharebest\Webtrees\Elements\Burial;
49c2ed51d1SGreg Roachuse Fisharebest\Webtrees\Elements\CasteName;
50c2ed51d1SGreg Roachuse Fisharebest\Webtrees\Elements\CauseOfEvent;
51c2ed51d1SGreg Roachuse Fisharebest\Webtrees\Elements\Census;
52c2ed51d1SGreg Roachuse Fisharebest\Webtrees\Elements\CertaintyAssessment;
53c2ed51d1SGreg Roachuse Fisharebest\Webtrees\Elements\Change;
54c2ed51d1SGreg Roachuse Fisharebest\Webtrees\Elements\ChangeDate;
55c2ed51d1SGreg Roachuse Fisharebest\Webtrees\Elements\CharacterSet;
56c2ed51d1SGreg Roachuse Fisharebest\Webtrees\Elements\ChildLinkageStatus;
57c2ed51d1SGreg Roachuse Fisharebest\Webtrees\Elements\Christening;
58c2ed51d1SGreg Roachuse Fisharebest\Webtrees\Elements\Confirmation;
59c2ed51d1SGreg Roachuse Fisharebest\Webtrees\Elements\ContentDescription;
60c2ed51d1SGreg Roachuse Fisharebest\Webtrees\Elements\CopyrightFile;
61c2ed51d1SGreg Roachuse Fisharebest\Webtrees\Elements\CopyrightSourceData;
62c2ed51d1SGreg Roachuse Fisharebest\Webtrees\Elements\CountOfChildren;
63c2ed51d1SGreg Roachuse Fisharebest\Webtrees\Elements\CountOfMarriages;
64c2ed51d1SGreg Roachuse Fisharebest\Webtrees\Elements\Cremation;
65c2ed51d1SGreg Roachuse Fisharebest\Webtrees\Elements\DateLdsOrd;
66c2ed51d1SGreg Roachuse Fisharebest\Webtrees\Elements\DateValue;
67c2ed51d1SGreg Roachuse Fisharebest\Webtrees\Elements\Death;
68c2ed51d1SGreg Roachuse Fisharebest\Webtrees\Elements\DescriptiveTitle;
69c2ed51d1SGreg Roachuse Fisharebest\Webtrees\Elements\Divorce;
70c2ed51d1SGreg Roachuse Fisharebest\Webtrees\Elements\DivorceFiled;
71c2ed51d1SGreg Roachuse Fisharebest\Webtrees\Elements\Emigration;
72c2ed51d1SGreg Roachuse Fisharebest\Webtrees\Elements\EmptyElement;
73c2ed51d1SGreg Roachuse Fisharebest\Webtrees\Elements\Engagement;
74c2ed51d1SGreg Roachuse Fisharebest\Webtrees\Elements\EntryRecordingDate;
75c2ed51d1SGreg Roachuse Fisharebest\Webtrees\Elements\EventAttributeType;
76c2ed51d1SGreg Roachuse Fisharebest\Webtrees\Elements\EventDescriptor;
77c2ed51d1SGreg Roachuse Fisharebest\Webtrees\Elements\EventOrFactClassification;
78c2ed51d1SGreg Roachuse Fisharebest\Webtrees\Elements\EventsRecorded;
79c2ed51d1SGreg Roachuse Fisharebest\Webtrees\Elements\EventTypeCitedFrom;
80e7e5b015SGreg Roachuse Fisharebest\Webtrees\Elements\FamilyRecord;
81c2ed51d1SGreg Roachuse Fisharebest\Webtrees\Elements\FileName;
82c2ed51d1SGreg Roachuse Fisharebest\Webtrees\Elements\FirstCommunion;
83c2ed51d1SGreg Roachuse Fisharebest\Webtrees\Elements\Form;
8490288370SGreg Roachuse Fisharebest\Webtrees\Elements\GedcomElement;
85c2ed51d1SGreg Roachuse Fisharebest\Webtrees\Elements\GenerationsOfAncestors;
86c2ed51d1SGreg Roachuse Fisharebest\Webtrees\Elements\GenerationsOfDescendants;
87c2ed51d1SGreg Roachuse Fisharebest\Webtrees\Elements\Graduation;
88e7e5b015SGreg Roachuse Fisharebest\Webtrees\Elements\HeaderRecord;
89c2ed51d1SGreg Roachuse Fisharebest\Webtrees\Elements\Immigration;
90e7e5b015SGreg Roachuse Fisharebest\Webtrees\Elements\IndividualRecord;
91c2ed51d1SGreg Roachuse Fisharebest\Webtrees\Elements\LanguageId;
92c2ed51d1SGreg Roachuse Fisharebest\Webtrees\Elements\LdsBaptism;
93c2ed51d1SGreg Roachuse Fisharebest\Webtrees\Elements\LdsBaptismDateStatus;
94c2ed51d1SGreg Roachuse Fisharebest\Webtrees\Elements\LdsChildSealing;
95c2ed51d1SGreg Roachuse Fisharebest\Webtrees\Elements\LdsChildSealingDateStatus;
96c2ed51d1SGreg Roachuse Fisharebest\Webtrees\Elements\LdsConfirmation;
97c2ed51d1SGreg Roachuse Fisharebest\Webtrees\Elements\LdsEndowment;
98c2ed51d1SGreg Roachuse Fisharebest\Webtrees\Elements\LdsEndowmentDateStatus;
99c2ed51d1SGreg Roachuse Fisharebest\Webtrees\Elements\LdsSpouseSealing;
100c2ed51d1SGreg Roachuse Fisharebest\Webtrees\Elements\LdsSpouseSealingDateStatus;
101c2ed51d1SGreg Roachuse Fisharebest\Webtrees\Elements\Marriage;
102c2ed51d1SGreg Roachuse Fisharebest\Webtrees\Elements\MarriageBanns;
103c2ed51d1SGreg Roachuse Fisharebest\Webtrees\Elements\MarriageContract;
104c2ed51d1SGreg Roachuse Fisharebest\Webtrees\Elements\MarriageLicence;
105c2ed51d1SGreg Roachuse Fisharebest\Webtrees\Elements\MarriageSettlement;
106c2ed51d1SGreg Roachuse Fisharebest\Webtrees\Elements\MarriageType;
107c2ed51d1SGreg Roachuse Fisharebest\Webtrees\Elements\MediaRecord;
108c2ed51d1SGreg Roachuse Fisharebest\Webtrees\Elements\MultimediaFileReference;
109c2ed51d1SGreg Roachuse Fisharebest\Webtrees\Elements\MultimediaFormat;
110c2ed51d1SGreg Roachuse Fisharebest\Webtrees\Elements\NameOfBusiness;
111c2ed51d1SGreg Roachuse Fisharebest\Webtrees\Elements\NameOfFamilyFile;
112c2ed51d1SGreg Roachuse Fisharebest\Webtrees\Elements\NameOfProduct;
113c2ed51d1SGreg Roachuse Fisharebest\Webtrees\Elements\NameOfRepository;
114c2ed51d1SGreg Roachuse Fisharebest\Webtrees\Elements\NameOfSourceData;
115c2ed51d1SGreg Roachuse Fisharebest\Webtrees\Elements\NamePersonal;
116c2ed51d1SGreg Roachuse Fisharebest\Webtrees\Elements\NamePhoneticVariation;
117c2ed51d1SGreg Roachuse Fisharebest\Webtrees\Elements\NamePieceGiven;
118c2ed51d1SGreg Roachuse Fisharebest\Webtrees\Elements\NamePieceNickname;
119c2ed51d1SGreg Roachuse Fisharebest\Webtrees\Elements\NamePiecePrefix;
120c2ed51d1SGreg Roachuse Fisharebest\Webtrees\Elements\NamePieceSuffix;
121c2ed51d1SGreg Roachuse Fisharebest\Webtrees\Elements\NamePieceSurname;
122c2ed51d1SGreg Roachuse Fisharebest\Webtrees\Elements\NamePieceSurnamePrefix;
123c2ed51d1SGreg Roachuse Fisharebest\Webtrees\Elements\NameRomanizedVariation;
124c2ed51d1SGreg Roachuse Fisharebest\Webtrees\Elements\NameType;
125c2ed51d1SGreg Roachuse Fisharebest\Webtrees\Elements\NationalIdNumber;
126c2ed51d1SGreg Roachuse Fisharebest\Webtrees\Elements\NationOrTribalOrigin;
127c2ed51d1SGreg Roachuse Fisharebest\Webtrees\Elements\Naturalization;
128c2ed51d1SGreg Roachuse Fisharebest\Webtrees\Elements\NobilityTypeTitle;
129c2ed51d1SGreg Roachuse Fisharebest\Webtrees\Elements\NoteRecord;
130c2ed51d1SGreg Roachuse Fisharebest\Webtrees\Elements\NoteStructure;
131c2ed51d1SGreg Roachuse Fisharebest\Webtrees\Elements\Occupation;
132c2ed51d1SGreg Roachuse Fisharebest\Webtrees\Elements\OrdinanceProcessFlag;
133c2ed51d1SGreg Roachuse Fisharebest\Webtrees\Elements\Ordination;
134c2ed51d1SGreg Roachuse Fisharebest\Webtrees\Elements\PedigreeLinkageType;
135c2ed51d1SGreg Roachuse Fisharebest\Webtrees\Elements\PermanentRecordFileNumber;
136c2ed51d1SGreg Roachuse Fisharebest\Webtrees\Elements\PhoneNumber;
137c2ed51d1SGreg Roachuse Fisharebest\Webtrees\Elements\PhoneticType;
138c2ed51d1SGreg Roachuse Fisharebest\Webtrees\Elements\PhysicalDescription;
139c2ed51d1SGreg Roachuse Fisharebest\Webtrees\Elements\PlaceHierarchy;
140c2ed51d1SGreg Roachuse Fisharebest\Webtrees\Elements\PlaceLatitude;
141c2ed51d1SGreg Roachuse Fisharebest\Webtrees\Elements\PlaceLivingOrdinance;
142c2ed51d1SGreg Roachuse Fisharebest\Webtrees\Elements\PlaceLongtitude;
143c2ed51d1SGreg Roachuse Fisharebest\Webtrees\Elements\PlaceName;
144c2ed51d1SGreg Roachuse Fisharebest\Webtrees\Elements\PlacePhoneticVariation;
145c2ed51d1SGreg Roachuse Fisharebest\Webtrees\Elements\PlaceRomanizedVariation;
146c2ed51d1SGreg Roachuse Fisharebest\Webtrees\Elements\Possessions;
147c2ed51d1SGreg Roachuse Fisharebest\Webtrees\Elements\Probate;
148c2ed51d1SGreg Roachuse Fisharebest\Webtrees\Elements\PublicationDate;
149c2ed51d1SGreg Roachuse Fisharebest\Webtrees\Elements\ReceivingSystemName;
150c2ed51d1SGreg Roachuse Fisharebest\Webtrees\Elements\RelationIsDescriptor;
151c2ed51d1SGreg Roachuse Fisharebest\Webtrees\Elements\ReligiousAffiliation;
152c2ed51d1SGreg Roachuse Fisharebest\Webtrees\Elements\RepositoryRecord;
153c2ed51d1SGreg Roachuse Fisharebest\Webtrees\Elements\Residence;
154c2ed51d1SGreg Roachuse Fisharebest\Webtrees\Elements\ResponsibleAgency;
155c2ed51d1SGreg Roachuse Fisharebest\Webtrees\Elements\RestrictionNotice;
156c2ed51d1SGreg Roachuse Fisharebest\Webtrees\Elements\Retirement;
157c2ed51d1SGreg Roachuse Fisharebest\Webtrees\Elements\RoleInEvent;
158c2ed51d1SGreg Roachuse Fisharebest\Webtrees\Elements\RomanizedType;
159c2ed51d1SGreg Roachuse Fisharebest\Webtrees\Elements\ScholasticAchievement;
160c2ed51d1SGreg Roachuse Fisharebest\Webtrees\Elements\SexValue;
161c2ed51d1SGreg Roachuse Fisharebest\Webtrees\Elements\SocialSecurityNumber;
162c2ed51d1SGreg Roachuse Fisharebest\Webtrees\Elements\SourceCallNumber;
163c2ed51d1SGreg Roachuse Fisharebest\Webtrees\Elements\SourceData;
164c2ed51d1SGreg Roachuse Fisharebest\Webtrees\Elements\SourceFiledByEntry;
165c2ed51d1SGreg Roachuse Fisharebest\Webtrees\Elements\SourceJurisdictionPlace;
166c2ed51d1SGreg Roachuse Fisharebest\Webtrees\Elements\SourceMediaType;
167c2ed51d1SGreg Roachuse Fisharebest\Webtrees\Elements\SourceOriginator;
168c2ed51d1SGreg Roachuse Fisharebest\Webtrees\Elements\SourcePublicationFacts;
169c2ed51d1SGreg Roachuse Fisharebest\Webtrees\Elements\SourceRecord;
170c2ed51d1SGreg Roachuse Fisharebest\Webtrees\Elements\SubmissionRecord;
171c2ed51d1SGreg Roachuse Fisharebest\Webtrees\Elements\SubmitterName;
172c2ed51d1SGreg Roachuse Fisharebest\Webtrees\Elements\SubmitterRecord;
173c2ed51d1SGreg Roachuse Fisharebest\Webtrees\Elements\SubmitterRegisteredRfn;
174c2ed51d1SGreg Roachuse Fisharebest\Webtrees\Elements\SubmitterText;
175c2ed51d1SGreg Roachuse Fisharebest\Webtrees\Elements\TempleCode;
176c2ed51d1SGreg Roachuse Fisharebest\Webtrees\Elements\TextFromSource;
177c2ed51d1SGreg Roachuse Fisharebest\Webtrees\Elements\TimeValue;
178c2ed51d1SGreg Roachuse Fisharebest\Webtrees\Elements\TransmissionDate;
179c2ed51d1SGreg Roachuse Fisharebest\Webtrees\Elements\UnknownElement;
180c2ed51d1SGreg Roachuse Fisharebest\Webtrees\Elements\UserReferenceNumber;
181c2ed51d1SGreg Roachuse Fisharebest\Webtrees\Elements\UserReferenceType;
182c2ed51d1SGreg Roachuse Fisharebest\Webtrees\Elements\VersionNumber;
183c2ed51d1SGreg Roachuse Fisharebest\Webtrees\Elements\WhereWithinSource;
184c2ed51d1SGreg Roachuse Fisharebest\Webtrees\Elements\Will;
1857b542389SGreg Roachuse Fisharebest\Webtrees\Elements\XrefAssociate;
186c2ed51d1SGreg Roachuse Fisharebest\Webtrees\Elements\XrefFamily;
187c2ed51d1SGreg Roachuse Fisharebest\Webtrees\Elements\XrefIndividual;
188c2ed51d1SGreg Roachuse Fisharebest\Webtrees\Elements\XrefMedia;
189c2ed51d1SGreg Roachuse Fisharebest\Webtrees\Elements\XrefRepository;
190c2ed51d1SGreg Roachuse Fisharebest\Webtrees\Elements\XrefSource;
191c2ed51d1SGreg Roachuse Fisharebest\Webtrees\Elements\XrefSubmission;
192c2ed51d1SGreg Roachuse Fisharebest\Webtrees\Elements\XrefSubmitter;
193c2ed51d1SGreg Roachuse Fisharebest\Webtrees\I18N;
194472ace44SGreg Roach
195c2ed51d1SGreg Roachuse function preg_match;
196c2ed51d1SGreg Roachuse function strpos;
197c2ed51d1SGreg Roach
198c2ed51d1SGreg Roach/**
199c2ed51d1SGreg Roach * Make a GEDCOM element.
200c2ed51d1SGreg Roach */
201c2ed51d1SGreg Roachclass ElementFactory implements ElementFactoryInterface
202c2ed51d1SGreg Roach{
2033d2c98d1SGreg Roach    /** @var array<string,ElementInterface> */
2044dbb2a39SGreg Roach    private array $elements = [];
205c2ed51d1SGreg Roach
206c2ed51d1SGreg Roach    /**
207c2ed51d1SGreg Roach     * Create a GEDCOM element that corresponds to a GEDCOM tag.
208c2ed51d1SGreg Roach     * Finds the correct element for all valid tags.
209c2ed51d1SGreg Roach     * Finds a likely element for custom tags.
210c2ed51d1SGreg Roach     *
211c2ed51d1SGreg Roach     * @param string $tag - Colon delimited hierarchy, e.g. 'INDI:BIRT:PLAC'
212c2ed51d1SGreg Roach     *
213c2ed51d1SGreg Roach     * @return ElementInterface
214c2ed51d1SGreg Roach     */
215c2ed51d1SGreg Roach    public function make(string $tag): ElementInterface
216c2ed51d1SGreg Roach    {
217c2ed51d1SGreg Roach        return $this->elements()[$tag] ?? $this->findElementByWildcard($tag) ?? new UnknownElement($tag);
218c2ed51d1SGreg Roach    }
219c2ed51d1SGreg Roach
220c2ed51d1SGreg Roach    /**
221c2ed51d1SGreg Roach     * Association between GEDCOM tags and GEDCOM elements.
222c2ed51d1SGreg Roach     * We can't initialise this in the constructor, as the I18N package isn't available then.
223c2ed51d1SGreg Roach     *
224c2ed51d1SGreg Roach     * @return array<string,ElementInterface>
225c2ed51d1SGreg Roach     */
226c2ed51d1SGreg Roach    private function elements(): array
227c2ed51d1SGreg Roach    {
2283d2c98d1SGreg Roach        if ($this->elements === []) {
2294ab8e344SGreg Roach            $this->elements = $this->gedcom551();
2304ab8e344SGreg Roach        }
2314ab8e344SGreg Roach
2324ab8e344SGreg Roach        return $this->elements;
2334ab8e344SGreg Roach    }
2344ab8e344SGreg Roach
2354ab8e344SGreg Roach    /**
2364ab8e344SGreg Roach     * Register more elements.
2374ab8e344SGreg Roach     *
2384ab8e344SGreg Roach     * @param array<string,ElementInterface> $elements
2394ab8e344SGreg Roach     */
2404ab8e344SGreg Roach    public function register(array $elements): void
2414ab8e344SGreg Roach    {
2424ab8e344SGreg Roach        $this->elements = array_merge($this->elements(), $elements);
2434ab8e344SGreg Roach    }
2444ab8e344SGreg Roach
2454ab8e344SGreg Roach    /**
2464ab8e344SGreg Roach     * @param string $tag
2474ab8e344SGreg Roach     *
2484ab8e344SGreg Roach     * @return ElementInterface|null
2494ab8e344SGreg Roach     */
2504ab8e344SGreg Roach    private function findElementByWildcard(string $tag): ?ElementInterface
2514ab8e344SGreg Roach    {
2524ab8e344SGreg Roach        foreach ($this->elements() as $tags => $element) {
2534ab8e344SGreg Roach            if (strpos($tags, '*') !== false) {
2544ab8e344SGreg Roach                $regex = '/^' . strtr($tags, ['*' => '[^:]+']) . '$/';
2554ab8e344SGreg Roach
2564ab8e344SGreg Roach                if (preg_match($regex, $tag)) {
2574ab8e344SGreg Roach                    return $element;
2584ab8e344SGreg Roach                }
2594ab8e344SGreg Roach            }
2604ab8e344SGreg Roach        }
2614ab8e344SGreg Roach
2624ab8e344SGreg Roach        return null;
2634ab8e344SGreg Roach    }
2644ab8e344SGreg Roach
2654ab8e344SGreg Roach    /**
2664ab8e344SGreg Roach     * Definitions for GEDCOM 5.5.1.
2674ab8e344SGreg Roach     *
2684ab8e344SGreg Roach     * @return array<string,ElementInterface>
2694ab8e344SGreg Roach     */
2704ab8e344SGreg Roach    private function gedcom551(): array
2714ab8e344SGreg Roach    {
2724ab8e344SGreg Roach        return [
273e7e5b015SGreg Roach            'FAM'                      => new FamilyRecord(I18N::translate('Family')),
274c2ed51d1SGreg Roach            'FAM:*:ADDR'               => new AddressLine(I18N::translate('Address')),
275c2ed51d1SGreg Roach            'FAM:*:ADDR:ADR1'          => new AddressLine1(I18N::translate('Address line 1')),
276c2ed51d1SGreg Roach            'FAM:*:ADDR:ADR2'          => new AddressLine2(I18N::translate('Address line 2')),
277c2ed51d1SGreg Roach            'FAM:*:ADDR:ADR3'          => new AddressLine3(I18N::translate('Address line 3')),
278c2ed51d1SGreg Roach            'FAM:*:ADDR:CITY'          => new AddressCity(I18N::translate('City')),
279c2ed51d1SGreg Roach            'FAM:*:ADDR:CTRY'          => new AddressCountry(I18N::translate('Country')),
280c2ed51d1SGreg Roach            'FAM:*:ADDR:POST'          => new AddressPostalCode(I18N::translate('Postal code')),
281c2ed51d1SGreg Roach            'FAM:*:ADDR:STAE'          => new AddressState(I18N::translate('State')),
282c2ed51d1SGreg Roach            'FAM:*:AGNC'               => new ResponsibleAgency(I18N::translate('Agency')),
283c2ed51d1SGreg Roach            'FAM:*:CAUS'               => new CauseOfEvent(I18N::translate('Cause')),
284c2ed51d1SGreg Roach            'FAM:*:DATE'               => new DateValue(I18N::translate('Date')),
285c2ed51d1SGreg Roach            'FAM:*:EMAIL'              => new AddressEmail(I18N::translate('Email address')),
286c2ed51d1SGreg Roach            'FAM:*:FAX'                => new AddressFax(I18N::translate('Fax')),
287c2ed51d1SGreg Roach            'FAM:*:HUSB'               => new EmptyElement(I18N::translate('Husband'), ['AGE' => '0:1']),
288c2ed51d1SGreg Roach            'FAM:*:HUSB:AGE'           => new AgeAtEvent(I18N::translate('Husband’s age')),
289c2ed51d1SGreg Roach            'FAM:*:NOTE'               => new NoteStructure(I18N::translate('Note')),
290c2ed51d1SGreg Roach            'FAM:*:OBJE'               => new XrefMedia(I18N::translate('Media object')),
291c2ed51d1SGreg Roach            'FAM:*:PHON'               => new PhoneNumber(I18N::translate('Phone')),
292c2ed51d1SGreg Roach            'FAM:*:PLAC'               => new PlaceName(I18N::translate('Place')),
293c2ed51d1SGreg Roach            'FAM:*:PLAC:FONE'          => new PlacePhoneticVariation(I18N::translate('Phonetic place')),
294c2ed51d1SGreg Roach            'FAM:*:PLAC:FONE:TYPE'     => new PhoneticType(I18N::translate('Type')),
295c2ed51d1SGreg Roach            'FAM:*:PLAC:FORM'          => new PlaceHierarchy(I18N::translate('Format')),
296*f7c88e25SGreg Roach            'FAM:*:PLAC:MAP'           => new EmptyElement(I18N::translate('Coordinates'), ['LATI' => '1:1', 'LONG' => '1:1']),
297c2ed51d1SGreg Roach            'FAM:*:PLAC:MAP:LATI'      => new PlaceLatitude(I18N::translate('Latitude')),
298c2ed51d1SGreg Roach            'FAM:*:PLAC:MAP:LONG'      => new PlaceLongtitude(I18N::translate('Longitude')),
299c2ed51d1SGreg Roach            'FAM:*:PLAC:NOTE'          => new NoteStructure(I18N::translate('Note')),
300c2ed51d1SGreg Roach            'FAM:*:PLAC:ROMN'          => new PlaceRomanizedVariation(I18N::translate('Romanized place')),
301c2ed51d1SGreg Roach            'FAM:*:PLAC:ROMN:TYPE'     => new RomanizedType(I18N::translate('Type')),
302c2ed51d1SGreg Roach            'FAM:*:RELI'               => new ReligiousAffiliation(I18N::translate('Religion')),
303c2ed51d1SGreg Roach            'FAM:*:RESN'               => new RestrictionNotice(I18N::translate('Restriction')),
304c2ed51d1SGreg Roach            'FAM:*:SOUR'               => new XrefSource(I18N::translate('Source')),
305c2ed51d1SGreg Roach            'FAM:*:SOUR:DATA'          => new SourceData(I18N::translate('Data')),
306c2ed51d1SGreg Roach            'FAM:*:SOUR:DATA:DATE'     => new EntryRecordingDate(I18N::translate('Date of entry in original source')),
307c2ed51d1SGreg Roach            'FAM:*:SOUR:DATA:TEXT'     => new TextFromSource(I18N::translate('Text')),
308c2ed51d1SGreg Roach            'FAM:*:SOUR:EVEN'          => new EventTypeCitedFrom(I18N::translate('Event')),
309c2ed51d1SGreg Roach            'FAM:*:SOUR:EVEN:ROLE'     => new RoleInEvent(I18N::translate('Role')),
310c2ed51d1SGreg Roach            'FAM:*:SOUR:NOTE'          => new NoteStructure(I18N::translate('Note')),
311c2ed51d1SGreg Roach            'FAM:*:SOUR:OBJE'          => new XrefMedia(I18N::translate('Media object')),
312c2ed51d1SGreg Roach            'FAM:*:SOUR:PAGE'          => new WhereWithinSource(I18N::translate('Citation details')),
313c2ed51d1SGreg Roach            'FAM:*:SOUR:QUAY'          => new CertaintyAssessment(I18N::translate('Quality of data')),
314c2ed51d1SGreg Roach            'FAM:*:TYPE'               => new EventOrFactClassification(I18N::translate('Type')),
315c2ed51d1SGreg Roach            'FAM:*:WIFE'               => new EmptyElement(I18N::translate('Wife'), ['AGE' => '0:1']),
316c2ed51d1SGreg Roach            'FAM:*:WIFE:AGE'           => new AgeAtEvent(I18N::translate('Wife’s age')),
317c2ed51d1SGreg Roach            'FAM:*:WWW'                => new AddressWebPage(I18N::translate('URL')),
318c2ed51d1SGreg Roach            'FAM:ANUL'                 => new Annulment(I18N::translate('Annulment')),
319c2ed51d1SGreg Roach            'FAM:CENS'                 => new Census(I18N::translate('Census')),
320c2ed51d1SGreg Roach            'FAM:CHAN'                 => new Change(I18N::translate('Last change')),
321c2ed51d1SGreg Roach            'FAM:CHAN:DATE'            => new ChangeDate(I18N::translate('Date of last change')),
322c2ed51d1SGreg Roach            'FAM:CHAN:DATE:TIME'       => new TimeValue(I18N::translate('Time')),
323c2ed51d1SGreg Roach            'FAM:CHIL'                 => new XrefIndividual(I18N::translate('Child')),
324c2ed51d1SGreg Roach            'FAM:DIV'                  => new Divorce(I18N::translate('Divorce')),
325c2ed51d1SGreg Roach            'FAM:DIVF'                 => new DivorceFiled(I18N::translate('Divorce filed')),
326c2ed51d1SGreg Roach            'FAM:ENGA'                 => new Engagement(I18N::translate('Engagement')),
327c2ed51d1SGreg Roach            'FAM:ENGA:DATE'            => new DateValue(I18N::translate('Date of engagement')),
328c2ed51d1SGreg Roach            'FAM:ENGA:PLACE'           => new PlaceName(I18N::translate('Place of engagement')),
329c2ed51d1SGreg Roach            'FAM:EVEN'                 => new EventDescriptor(I18N::translate('Event')),
330c2ed51d1SGreg Roach            'FAM:EVEN:TYPE'            => new EventAttributeType(I18N::translate('Type of event')),
331c2ed51d1SGreg Roach            'FAM:HUSB'                 => new XrefIndividual(I18N::translate('Husband')),
332c2ed51d1SGreg Roach            'FAM:MARB'                 => new MarriageBanns(I18N::translate('Marriage banns')),
333c2ed51d1SGreg Roach            'FAM:MARB:DATE'            => new DateValue(I18N::translate('Date of marriage banns')),
334c2ed51d1SGreg Roach            'FAM:MARB:PLAC'            => new PlaceName(I18N::translate('Place of marriage banns')),
335c2ed51d1SGreg Roach            'FAM:MARC'                 => new MarriageContract(I18N::translate('Marriage contract')),
336c2ed51d1SGreg Roach            'FAM:MARL'                 => new MarriageLicence(I18N::translate('Marriage license')),
337c2ed51d1SGreg Roach            'FAM:MARR'                 => new Marriage(I18N::translate('Marriage')),
338c2ed51d1SGreg Roach            'FAM:MARR:DATE'            => new DateValue(I18N::translate('Date of marriage')),
339c2ed51d1SGreg Roach            'FAM:MARR:PLAC'            => new PlaceName(I18N::translate('Place of marriage')),
340c2ed51d1SGreg Roach            'FAM:MARR:TYPE'            => new MarriageType(I18N::translate('Type of marriage')),
341c2ed51d1SGreg Roach            'FAM:MARS'                 => new MarriageSettlement(I18N::translate('Marriage settlement')),
342c2ed51d1SGreg Roach            'FAM:NCHI'                 => new CountOfChildren(I18N::translate('Number of children')),
343c2ed51d1SGreg Roach            'FAM:NOTE'                 => new NoteStructure(I18N::translate('Note')),
344c2ed51d1SGreg Roach            'FAM:OBJE'                 => new XrefMedia(I18N::translate('Media object')),
345c2ed51d1SGreg Roach            'FAM:REFN'                 => new UserReferenceNumber(I18N::translate('Reference number')),
346c2ed51d1SGreg Roach            'FAM:REFN:TYPE'            => new UserReferenceType(I18N::translate('Type')),
347c2ed51d1SGreg Roach            'FAM:RESI'                 => new Residence(I18N::translate('Residence')),
348c2ed51d1SGreg Roach            'FAM:RESN'                 => new RestrictionNotice(I18N::translate('Restriction')),
349c2ed51d1SGreg Roach            'FAM:RIN'                  => new AutomatedRecordId(I18N::translate('Record ID number')),
350c2ed51d1SGreg Roach            'FAM:SLGS'                 => new LdsSpouseSealing(I18N::translate('LDS spouse sealing')),
351c2ed51d1SGreg Roach            'FAM:SLGS:DATE'            => new DateLdsOrd(I18N::translate('Date')),
352c2ed51d1SGreg Roach            'FAM:SLGS:PLAC'            => new PlaceLivingOrdinance(I18N::translate('Place')),
353c2ed51d1SGreg Roach            'FAM:SLGS:STAT'            => new LdsSpouseSealingDateStatus(I18N::translate('Status')),
354c2ed51d1SGreg Roach            'FAM:SLGS:STAT:DATE'       => new ChangeDate(I18N::translate('Status change date')),
3553d2c98d1SGreg Roach            'FAM:SLGS:TEMP'            => new TempleCode(I18N::translate('Temple')),
356c2ed51d1SGreg Roach            'FAM:SOUR'                 => new XrefSource(I18N::translate('Source')),
357c2ed51d1SGreg Roach            'FAM:SOUR:DATA'            => new SourceData(I18N::translate('Data')),
358c2ed51d1SGreg Roach            'FAM:SOUR:DATA:DATE'       => new EntryRecordingDate(I18N::translate('Date of entry in original source')),
359c2ed51d1SGreg Roach            'FAM:SOUR:DATA:TEXT'       => new TextFromSource(I18N::translate('Text')),
360c2ed51d1SGreg Roach            'FAM:SOUR:EVEN'            => new EventTypeCitedFrom(I18N::translate('Event')),
361c2ed51d1SGreg Roach            'FAM:SOUR:EVEN:ROLE'       => new RoleInEvent(I18N::translate('Role')),
362c2ed51d1SGreg Roach            'FAM:SOUR:OBJE'            => new XrefMedia(I18N::translate('Media object')),
363c2ed51d1SGreg Roach            'FAM:SOUR:PAGE'            => new WhereWithinSource(I18N::translate('Citation details')),
364c2ed51d1SGreg Roach            'FAM:SOUR:QUAY'            => new CertaintyAssessment(I18N::translate('Quality of data')),
365c2ed51d1SGreg Roach            'FAM:SUBM'                 => new XrefSubmitter(I18N::translate('Submitter')),
366c2ed51d1SGreg Roach            'FAM:WIFE'                 => new XrefIndividual(I18N::translate('Wife')),
367e7e5b015SGreg Roach            'HEAD'                     => new HeaderRecord(I18N::translate('Header')),
368c2ed51d1SGreg Roach            'HEAD:CHAR'                => new CharacterSet(I18N::translate('Character set')),
369c2ed51d1SGreg Roach            'HEAD:CHAR:VERS'           => new VersionNumber(I18N::translate('Version')),
370c2ed51d1SGreg Roach            'HEAD:COPR'                => new CopyrightFile(I18N::translate('Copyright')),
371c2ed51d1SGreg Roach            'HEAD:DATE'                => new TransmissionDate(I18N::translate('Date')),
372c2ed51d1SGreg Roach            'HEAD:DATE:TIME'           => new TimeValue(I18N::translate('Time')),
373c2ed51d1SGreg Roach            'HEAD:DEST'                => new ReceivingSystemName(I18N::translate('Destination')),
374c2ed51d1SGreg Roach            'HEAD:FILE'                => new FileName(I18N::translate('Filename')),
37590288370SGreg Roach            'HEAD:GEDC'                => new GedcomElement(I18N::translate('GEDCOM')),
376c2ed51d1SGreg Roach            'HEAD:GEDC:FORM'           => new Form(I18N::translate('Format')),
377c2ed51d1SGreg Roach            'HEAD:GEDC:VERS'           => new VersionNumber(I18N::translate('Version')),
378e7e5b015SGreg Roach            'HEAD:LANG'                => new LanguageId(I18N::translate('Language')),
379c2ed51d1SGreg Roach            'HEAD:NOTE'                => new ContentDescription(I18N::translate('Note')),
38052c65005SGreg Roach            'HEAD:PLAC'                => new EmptyElement(I18N::translate('Place hierarchy'), ['FORM' => '1:1']),
381c2ed51d1SGreg Roach            'HEAD:PLAC:FORM'           => new PlaceHierarchy(I18N::translate('Format')),
382c2ed51d1SGreg Roach            'HEAD:SOUR'                => new ApprovedSystemId('Genealogy software'),
383c2ed51d1SGreg Roach            'HEAD:SOUR:CORP'           => new NameOfBusiness(I18N::translate('Corporation')),
384c2ed51d1SGreg Roach            'HEAD:SOUR:CORP:ADDR'      => new AddressLine(I18N::translate('Address')),
385c2ed51d1SGreg Roach            'HEAD:SOUR:CORP:ADDR:ADR1' => new AddressLine1(I18N::translate('Address line 1')),
386c2ed51d1SGreg Roach            'HEAD:SOUR:CORP:ADDR:ADR2' => new AddressLine2(I18N::translate('Address line 2')),
387c2ed51d1SGreg Roach            'HEAD:SOUR:CORP:ADDR:ADR3' => new AddressLine3(I18N::translate('Address line 3')),
388c2ed51d1SGreg Roach            'HEAD:SOUR:CORP:ADDR:CITY' => new AddressCity(I18N::translate('City')),
389c2ed51d1SGreg Roach            'HEAD:SOUR:CORP:ADDR:CTRY' => new AddressCountry(I18N::translate('Country')),
390c2ed51d1SGreg Roach            'HEAD:SOUR:CORP:ADDR:POST' => new AddressPostalCode(I18N::translate('Postal code')),
391c2ed51d1SGreg Roach            'HEAD:SOUR:CORP:ADDR:STAE' => new AddressState(I18N::translate('State')),
392c2ed51d1SGreg Roach            'HEAD:SOUR:CORP:EMAIL'     => new AddressEmail(I18N::translate('Email address')),
393c2ed51d1SGreg Roach            'HEAD:SOUR:CORP:FAX'       => new AddressFax(I18N::translate('Fax')),
394c2ed51d1SGreg Roach            'HEAD:SOUR:CORP:PHON'      => new PhoneNumber(I18N::translate('Phone')),
395c2ed51d1SGreg Roach            'HEAD:SOUR:CORP:WWW'       => new AddressWebPage(I18N::translate('URL')),
396c2ed51d1SGreg Roach            'HEAD:SOUR:DATA'           => new NameOfSourceData('Data'),
397c2ed51d1SGreg Roach            'HEAD:SOUR:DATA:COPR'      => new CopyrightSourceData(I18N::translate('Copyright')),
398c2ed51d1SGreg Roach            'HEAD:SOUR:DATA:DATE'      => new PublicationDate(I18N::translate('Date')),
399c2ed51d1SGreg Roach            'HEAD:SOUR:NAME'           => new NameOfProduct('Software product'),
400c2ed51d1SGreg Roach            'HEAD:SOUR:VERS'           => new VersionNumber(I18N::translate('Version')),
401c2ed51d1SGreg Roach            'HEAD:SUBM'                => new XrefSubmitter(I18N::translate('Submitter')),
402c2ed51d1SGreg Roach            'HEAD:SUBN'                => new XrefSubmission(I18N::translate('Submission')),
403e7e5b015SGreg Roach            'INDI'                     => new IndividualRecord(I18N::translate('Individual')),
404c2ed51d1SGreg Roach            'INDI:*:ADDR'              => new AddressLine(I18N::translate('Address')),
405c2ed51d1SGreg Roach            'INDI:*:ADDR:ADR1'         => new AddressLine1(I18N::translate('Address line 1')),
406c2ed51d1SGreg Roach            'INDI:*:ADDR:ADR2'         => new AddressLine2(I18N::translate('Address line 2')),
407c2ed51d1SGreg Roach            'INDI:*:ADDR:ADR3'         => new AddressLine3(I18N::translate('Address line 3')),
408c2ed51d1SGreg Roach            'INDI:*:ADDR:CITY'         => new AddressCity(I18N::translate('City')),
409c2ed51d1SGreg Roach            'INDI:*:ADDR:CTRY'         => new AddressCountry(I18N::translate('Country')),
410c2ed51d1SGreg Roach            'INDI:*:ADDR:POST'         => new AddressPostalCode(I18N::translate('Postal code')),
411c2ed51d1SGreg Roach            'INDI:*:ADDR:STAE'         => new AddressState(I18N::translate('State')),
412c2ed51d1SGreg Roach            'INDI:*:AGE'               => new AgeAtEvent(I18N::translate('Age')),
413c2ed51d1SGreg Roach            'INDI:*:AGNC'              => new ResponsibleAgency(I18N::translate('Agency')),
414c2ed51d1SGreg Roach            'INDI:*:CAUS'              => new CauseOfEvent(I18N::translate('Cause')),
415c2ed51d1SGreg Roach            'INDI:*:DATE'              => new DateValue(I18N::translate('Date')),
416c2ed51d1SGreg Roach            'INDI:*:EMAIL'             => new AddressEmail(I18N::translate('Email address')),
417c2ed51d1SGreg Roach            'INDI:*:FAX'               => new AddressFax(I18N::translate('Fax')),
418c2ed51d1SGreg Roach            'INDI:*:NOTE'              => new NoteStructure(I18N::translate('Note')),
419c2ed51d1SGreg Roach            'INDI:*:OBJE'              => new XrefMedia(I18N::translate('Media object')),
420c2ed51d1SGreg Roach            'INDI:*:PHON'              => new PhoneNumber(I18N::translate('Phone')),
421c2ed51d1SGreg Roach            'INDI:*:PLAC'              => new PlaceName(I18N::translate('Place')),
422c2ed51d1SGreg Roach            'INDI:*:PLAC:FONE'         => new PlacePhoneticVariation(I18N::translate('Phonetic place')),
423c2ed51d1SGreg Roach            'INDI:*:PLAC:FONE:TYPE'    => new PhoneticType(I18N::translate('Type')),
424c2ed51d1SGreg Roach            'INDI:*:PLAC:FORM'         => new PlaceHierarchy(I18N::translate('Format')),
425*f7c88e25SGreg Roach            'INDI:*:PLAC:MAP'          => new EmptyElement(I18N::translate('Coordinates'), ['LATI' => '1:1', 'LONG' => '1:1']),
426c2ed51d1SGreg Roach            'INDI:*:PLAC:MAP:LATI'     => new PlaceLatitude(I18N::translate('Latitude')),
427c2ed51d1SGreg Roach            'INDI:*:PLAC:MAP:LONG'     => new PlaceLongtitude(I18N::translate('Longitude')),
428c2ed51d1SGreg Roach            'INDI:*:PLAC:NOTE'         => new NoteStructure(I18N::translate('Note')),
429c2ed51d1SGreg Roach            'INDI:*:PLAC:ROMN'         => new PlaceRomanizedVariation(I18N::translate('Romanized place')),
430c2ed51d1SGreg Roach            'INDI:*:PLAC:ROMN:TYPE'    => new RomanizedType(I18N::translate('Type')),
431c2ed51d1SGreg Roach            'INDI:*:RELI'              => new ReligiousAffiliation(I18N::translate('Religion')),
432c2ed51d1SGreg Roach            'INDI:*:RESN'              => new RestrictionNotice(I18N::translate('Restriction')),
433c2ed51d1SGreg Roach            'INDI:*:SOUR'              => new XrefSource(I18N::translate('Source')),
434c2ed51d1SGreg Roach            'INDI:*:SOUR:DATA'         => new SourceData(I18N::translate('Data')),
435c2ed51d1SGreg Roach            'INDI:*:SOUR:DATA:DATE'    => new EntryRecordingDate(I18N::translate('Date of entry in original source')),
436c2ed51d1SGreg Roach            'INDI:*:SOUR:DATA:TEXT'    => new TextFromSource(I18N::translate('Text')),
437c2ed51d1SGreg Roach            'INDI:*:SOUR:EVEN'         => new EventTypeCitedFrom(I18N::translate('Event')),
438c2ed51d1SGreg Roach            'INDI:*:SOUR:EVEN:ROLE'    => new RoleInEvent(I18N::translate('Role')),
439c2ed51d1SGreg Roach            'INDI:*:SOUR:NOTE'         => new NoteStructure(I18N::translate('Note')),
440c2ed51d1SGreg Roach            'INDI:*:SOUR:OBJE'         => new XrefMedia(I18N::translate('Media object')),
441c2ed51d1SGreg Roach            'INDI:*:SOUR:PAGE'         => new WhereWithinSource(I18N::translate('Citation details')),
442c2ed51d1SGreg Roach            'INDI:*:SOUR:QUAY'         => new CertaintyAssessment(I18N::translate('Quality of data')),
443c2ed51d1SGreg Roach            'INDI:*:TYPE'              => new EventOrFactClassification(I18N::translate('Type')),
444c2ed51d1SGreg Roach            'INDI:*:WWW'               => new AddressWebPage(I18N::translate('URL')),
445c2ed51d1SGreg Roach            'INDI:ADOP'                => new Adoption(I18N::translate('Adoption')),
446c2ed51d1SGreg Roach            'INDI:ADOP:DATE'           => new DateValue(I18N::translate('Date of adoption')),
447c2ed51d1SGreg Roach            'INDI:ADOP:FAMC'           => new XrefFamily(I18N::translate('Adoptive parents')),
448c2ed51d1SGreg Roach            'INDI:ADOP:FAMC:ADOP'      => new AdoptedByWhichParent(I18N::translate('Adoption')),
449c2ed51d1SGreg Roach            'INDI:ADOP:PLAC'           => new PlaceName(I18N::translate('Place of adoption')),
450c2ed51d1SGreg Roach            'INDI:AFN'                 => new AncestralFileNumber(I18N::translate('Ancestral file number')),
451c2ed51d1SGreg Roach            'INDI:ALIA'                => new XrefIndividual(I18N::translate('Alias')),
452c2ed51d1SGreg Roach            'INDI:ANCI'                => new XrefSubmitter(I18N::translate('Ancestors interest')),
4537b542389SGreg Roach            'INDI:ASSO'                => new XrefAssociate(I18N::translate('Associate')),
454c2ed51d1SGreg Roach            'INDI:ASSO:RELA'           => new RelationIsDescriptor(I18N::translate('Relationship')),
455c2ed51d1SGreg Roach            'INDI:BAPL'                => new LdsBaptism(I18N::translate('LDS baptism')),
456c2ed51d1SGreg Roach            'INDI:BAPL:DATE'           => new DateLdsOrd(I18N::translate('Date of LDS baptism')),
457c2ed51d1SGreg Roach            'INDI:BAPL:PLAC'           => new PlaceLivingOrdinance(I18N::translate('Place of LDS baptism')),
458c2ed51d1SGreg Roach            'INDI:BAPL:STAT'           => new LdsBaptismDateStatus(I18N::translate('Status')),
459c2ed51d1SGreg Roach            'INDI:BAPL:STAT:DATE'      => new ChangeDate(I18N::translate('Status change date')),
4603d2c98d1SGreg Roach            'INDI:BAPL:TEMP'           => new TempleCode(I18N::translate('Temple')),
461c2ed51d1SGreg Roach            'INDI:BAPM'                => new Baptism(I18N::translate('Baptism')),
462c2ed51d1SGreg Roach            'INDI:BAPM:DATE'           => new DateValue(I18N::translate('Date of baptism')),
463c2ed51d1SGreg Roach            'INDI:BAPM:PLAC'           => new PlaceName(I18N::translate('Place of baptism')),
464c2ed51d1SGreg Roach            'INDI:BARM'                => new PlaceName(I18N::translate('Bar mitzvah')),
465c2ed51d1SGreg Roach            'INDI:BARM:DATE'           => new DateValue(I18N::translate('Date of bar mitzvah')),
466c2ed51d1SGreg Roach            'INDI:BARM:PLAC'           => new PlaceName(I18N::translate('Place of bar mitzvah')),
467c2ed51d1SGreg Roach            'INDI:BASM'                => new BasMitzvah(I18N::translate('Bat mitzvah')),
468c2ed51d1SGreg Roach            'INDI:BASM:DATE'           => new BasMitzvah(I18N::translate('Date of bat mitzvah')),
469c2ed51d1SGreg Roach            'INDI:BASM:PLAC'           => new DateValue(I18N::translate('Place of bat mitzvah')),
470c2ed51d1SGreg Roach            'INDI:BIRT'                => new Birth(I18N::translate('Birth')),
471c2ed51d1SGreg Roach            'INDI:BIRT:DATE'           => new DateValue(I18N::translate('Date of birth')),
472c2ed51d1SGreg Roach            'INDI:BIRT:FAMC'           => new XrefFamily(I18N::translate('Birth parents')),
473c2ed51d1SGreg Roach            'INDI:BIRT:PLAC'           => new PlaceName(I18N::translate('Place of birth')),
474c2ed51d1SGreg Roach            'INDI:BLES'                => new Blessing(I18N::translate('Blessing')),
475c2ed51d1SGreg Roach            'INDI:BLES:DATE'           => new DateValue(I18N::translate('Date of blessing')),
476c2ed51d1SGreg Roach            'INDI:BLES:PLAC'           => new PlaceName(I18N::translate('Place of blessing')),
477c2ed51d1SGreg Roach            'INDI:BURI'                => new Burial(I18N::translate('Burial')),
478c2ed51d1SGreg Roach            'INDI:BURI:DATE'           => new DateValue(I18N::translate('Date of burial')),
479c2ed51d1SGreg Roach            'INDI:BURI:PLAC'           => new PlaceName(I18N::translate('Place of burial')),
480c2ed51d1SGreg Roach            'INDI:CAST'                => new CasteName(I18N::translate('Caste')),
481c2ed51d1SGreg Roach            'INDI:CENS'                => new Census(I18N::translate('Census')),
482c2ed51d1SGreg Roach            'INDI:CENS:DATE'           => new DateValue(I18N::translate('Census date')),
483c2ed51d1SGreg Roach            'INDI:CENS:PLAC'           => new PlaceName(I18N::translate('Census place')),
484c2ed51d1SGreg Roach            'INDI:CHAN'                => new Change(I18N::translate('Last change')),
485c2ed51d1SGreg Roach            'INDI:CHAN:DATE'           => new ChangeDate(I18N::translate('Date of last change')),
486c2ed51d1SGreg Roach            'INDI:CHAN:DATE:TIME'      => new TimeValue(I18N::translate('Time')),
487c2ed51d1SGreg Roach            'INDI:CHR'                 => new Christening(I18N::translate('Christening')),
488c2ed51d1SGreg Roach            'INDI:CHR:DATE'            => new DateValue(I18N::translate('Date of christening')),
489c2ed51d1SGreg Roach            'INDI:CHR:FAMC'            => new XrefFamily(I18N::translate('Godparents')),
490c2ed51d1SGreg Roach            'INDI:CHR:PLAC'            => new PlaceName(I18N::translate('Place of christening')),
491c2ed51d1SGreg Roach            'INDI:CHRA'                => new AdultChristening(I18N::translate('Adult christening')),
492c2ed51d1SGreg Roach            'INDI:CONF'                => new Confirmation(I18N::translate('Confirmation')),
493c2ed51d1SGreg Roach            'INDI:CONF:DATE'           => new DateValue(I18N::translate('Date of confirmation')),
494c2ed51d1SGreg Roach            'INDI:CONF:PLAC'           => new PlaceName(I18N::translate('Place of confirmation')),
495c2ed51d1SGreg Roach            'INDI:CONL'                => new LdsConfirmation(I18N::translate('LDS confirmation')),
496c2ed51d1SGreg Roach            'INDI:CONL:DATE'           => new DateLdsOrd(I18N::translate('Date of LDS confirmation')),
497c2ed51d1SGreg Roach            'INDI:CONL:PLAC'           => new PlaceLivingOrdinance(I18N::translate('Place of LDS confirmation')),
498c2ed51d1SGreg Roach            'INDI:CONL:STAT'           => new LdsSpouseSealingDateStatus(I18N::translate('Status')),
499c2ed51d1SGreg Roach            'INDI:CONL:STAT:DATE'      => new ChangeDate(I18N::translate('Status change date')),
5003d2c98d1SGreg Roach            'INDI:CONL:TEMP'           => new TempleCode(I18N::translate('Temple')),
501c2ed51d1SGreg Roach            'INDI:CREM'                => new Cremation(I18N::translate('Cremation')),
502c2ed51d1SGreg Roach            'INDI:CREM:DATE'           => new Cremation(I18N::translate('Date of cremation')),
503c2ed51d1SGreg Roach            'INDI:CREM:PLAC'           => new Cremation(I18N::translate('Place of cremation')),
504c2ed51d1SGreg Roach            'INDI:DEAT'                => new Death(I18N::translate('Death')),
505c2ed51d1SGreg Roach            'INDI:DEAT:CAUS'           => new CauseOfEvent(I18N::translate('Cause of death')),
506c2ed51d1SGreg Roach            'INDI:DEAT:DATE'           => new DateValue(I18N::translate('Date of death')),
507c2ed51d1SGreg Roach            'INDI:DEAT:PLAC'           => new PlaceName(I18N::translate('Place of death')),
508c2ed51d1SGreg Roach            'INDI:DESI'                => new XrefSubmitter(I18N::translate('Descendants interest')),
509c2ed51d1SGreg Roach            'INDI:DSCR'                => new PhysicalDescription(I18N::translate('Description')),
510c2ed51d1SGreg Roach            'INDI:EDUC'                => new ScholasticAchievement(I18N::translate('Education')),
511c2ed51d1SGreg Roach            'INDI:EDUC:AGNC'           => new ResponsibleAgency(I18N::translate('School or college')),
512c2ed51d1SGreg Roach            'INDI:EMIG'                => new Emigration(I18N::translate('Emigration')),
513c2ed51d1SGreg Roach            'INDI:EMIG:DATE'           => new DateValue(I18N::translate('Date of emigration')),
514c2ed51d1SGreg Roach            'INDI:EMIG:PLAC'           => new PlaceName(I18N::translate('Place of emigration')),
515c2ed51d1SGreg Roach            'INDI:ENDL'                => new LdsEndowment(I18N::translate('LDS endowment')),
516c2ed51d1SGreg Roach            'INDI:ENDL:DATE'           => new DateLdsOrd(I18N::translate('Date of LDS endowment')),
517c2ed51d1SGreg Roach            'INDI:ENDL:PLAC'           => new PlaceLivingOrdinance(I18N::translate('Place of LDS endowment')),
518c2ed51d1SGreg Roach            'INDI:ENDL:STAT'           => new LdsEndowmentDateStatus(I18N::translate('Status')),
519c2ed51d1SGreg Roach            'INDI:ENDL:STAT:DATE'      => new ChangeDate(I18N::translate('Status change date')),
5203d2c98d1SGreg Roach            'INDI:ENDL:TEMP'           => new TempleCode(I18N::translate('Temple')),
521c2ed51d1SGreg Roach            'INDI:EVEN'                => new EventDescriptor(I18N::translate('Event')),
522c2ed51d1SGreg Roach            'INDI:EVEN:DATE'           => new DateValue(I18N::translate('Date of event')),
523c2ed51d1SGreg Roach            'INDI:EVEN:PLAC'           => new PlaceName(I18N::translate('Place of event')),
524c2ed51d1SGreg Roach            'INDI:EVEN:TYPE'           => new EventAttributeType(I18N::translate('Type of event')),
525c2ed51d1SGreg Roach            'INDI:FACT'                => new AttributeDescriptor(I18N::translate('Fact')),
526c2ed51d1SGreg Roach            'INDI:FACT:TYPE'           => new EventAttributeType(I18N::translate('Type of fact')),
5277b542389SGreg Roach            'INDI:FAMC'                => new XrefFamily(I18N::translate('Family as a child'), ['NOTE' => '0:1', 'PEDI' => '0:1', 'STAT' => '0:1']),
528c2ed51d1SGreg Roach            'INDI:FAMC:PEDI'           => new PedigreeLinkageType(I18N::translate('Relationship to parents')),
529c2ed51d1SGreg Roach            'INDI:FAMC:STAT'           => new ChildLinkageStatus(I18N::translate('Status')),
530c2ed51d1SGreg Roach            'INDI:FAMS'                => new XrefFamily(I18N::translate('Family as a spouse')),
531c2ed51d1SGreg Roach            'INDI:FCOM'                => new FirstCommunion(I18N::translate('First communion')),
532c2ed51d1SGreg Roach            'INDI:FCOM:DATE'           => new DateValue(I18N::translate('Date of first communion')),
533c2ed51d1SGreg Roach            'INDI:FCOM:PLAC'           => new PlaceName(I18N::translate('Place of first communion')),
534c2ed51d1SGreg Roach            'INDI:GRAD'                => new Graduation(I18N::translate('Graduation')),
535c2ed51d1SGreg Roach            'INDI:GRAD:AGNC'           => new ResponsibleAgency(I18N::translate('School or college')),
536c2ed51d1SGreg Roach            'INDI:IDNO'                => new NationalIdNumber(I18N::translate('Identification number')),
537c2ed51d1SGreg Roach            'INDI:IMMI'                => new Immigration(I18N::translate('Immigration')),
538c2ed51d1SGreg Roach            'INDI:IMMI:DATE'           => new DateValue(I18N::translate('Date of immigration')),
539c2ed51d1SGreg Roach            'INDI:IMMI:PLAC'           => new PlaceName(I18N::translate('Place of immigration')),
540c2ed51d1SGreg Roach            'INDI:NAME'                => new NamePersonal(I18N::translate('Name')),
541*f7c88e25SGreg Roach            'INDI:NAME:FONE'           => new NamePhoneticVariation(I18N::translate('Phonetic name')),
542c2ed51d1SGreg Roach            'INDI:NAME:FONE:GIVN'      => new NamePieceGiven(I18N::translate('Given names')),
543c2ed51d1SGreg Roach            'INDI:NAME:FONE:NICK'      => new NamePieceNickname(I18N::translate('Nickname')),
544c2ed51d1SGreg Roach            'INDI:NAME:FONE:NPFX'      => new NamePiecePrefix(I18N::translate('Name prefix')),
545c2ed51d1SGreg Roach            'INDI:NAME:FONE:NSFX'      => new NamePieceSuffix(I18N::translate('Name suffix')),
546c2ed51d1SGreg Roach            'INDI:NAME:FONE:SPFX'      => new NamePieceSurnamePrefix(I18N::translate('Surname prefix')),
547c2ed51d1SGreg Roach            'INDI:NAME:FONE:SURN'      => new NamePieceSurname(I18N::translate('Surname')),
5487c51ee86SGreg Roach            'INDI:NAME:FONE:TYPE'      => new PhoneticType(I18N::translate('Phonetic type')),
549c2ed51d1SGreg Roach            'INDI:NAME:GIVN'           => new NamePieceGiven(I18N::translate('Given names')),
550c2ed51d1SGreg Roach            'INDI:NAME:NICK'           => new NamePieceNickname(I18N::translate('Nickname')),
551c2ed51d1SGreg Roach            'INDI:NAME:NPFX'           => new NamePiecePrefix(I18N::translate('Name prefix')),
552c2ed51d1SGreg Roach            'INDI:NAME:NSFX'           => new NamePieceSuffix(I18N::translate('Name suffix')),
553*f7c88e25SGreg Roach            'INDI:NAME:ROMN'           => new NameRomanizedVariation(I18N::translate('Romanized name')),
554c2ed51d1SGreg Roach            'INDI:NAME:ROMN:GIVN'      => new NamePieceGiven(I18N::translate('Given names')),
555c2ed51d1SGreg Roach            'INDI:NAME:ROMN:NICK'      => new NamePieceNickname(I18N::translate('Nickname')),
556c2ed51d1SGreg Roach            'INDI:NAME:ROMN:NPFX'      => new NamePiecePrefix(I18N::translate('Name prefix')),
557c2ed51d1SGreg Roach            'INDI:NAME:ROMN:NSFX'      => new NamePieceSuffix(I18N::translate('Name suffix')),
558c2ed51d1SGreg Roach            'INDI:NAME:ROMN:SPFX'      => new NamePieceSurnamePrefix(I18N::translate('Surname prefix')),
559c2ed51d1SGreg Roach            'INDI:NAME:ROMN:SURN'      => new NamePieceSurname(I18N::translate('Surname')),
5607c51ee86SGreg Roach            'INDI:NAME:ROMN:TYPE'      => new RomanizedType(I18N::translate('Romanized type')),
561c2ed51d1SGreg Roach            'INDI:NAME:SPFX'           => new NamePieceSurnamePrefix(I18N::translate('Surname prefix')),
562c2ed51d1SGreg Roach            'INDI:NAME:SURN'           => new NamePieceSurname(I18N::translate('Surname')),
563c2ed51d1SGreg Roach            'INDI:NAME:TYPE'           => new NameType(I18N::translate('Type of name')),
564c2ed51d1SGreg Roach            'INDI:NATI'                => new NationOrTribalOrigin(I18N::translate('Nationality')),
565c2ed51d1SGreg Roach            'INDI:NATU'                => new Naturalization(I18N::translate('Naturalization')),
566c2ed51d1SGreg Roach            'INDI:NATU:DATE'           => new DateValue(I18N::translate('Date of naturalization')),
567c2ed51d1SGreg Roach            'INDI:NATU:PLAC'           => new PlaceName(I18N::translate('Place of naturalization')),
568c2ed51d1SGreg Roach            'INDI:NCHI'                => new CountOfChildren(I18N::translate('Number of children')),
569c2ed51d1SGreg Roach            'INDI:NMR'                 => new CountOfMarriages(I18N::translate('Number of marriages')),
570c2ed51d1SGreg Roach            'INDI:NOTE'                => new NoteStructure(I18N::translate('Note')),
571c2ed51d1SGreg Roach            'INDI:OBJE'                => new XrefMedia(I18N::translate('Media object')),
572c2ed51d1SGreg Roach            'INDI:OCCU'                => new Occupation(I18N::translate('Occupation')),
573c2ed51d1SGreg Roach            'INDI:OCCU:AGNC'           => new ResponsibleAgency(I18N::translate('Employer')),
574c2ed51d1SGreg Roach            'INDI:ORDN'                => new Ordination(I18N::translate('Ordination')),
575c2ed51d1SGreg Roach            'INDI:ORDN:AGNC'           => new Ordination(I18N::translate('Religious institution')),
576c2ed51d1SGreg Roach            'INDI:ORDN:DATE'           => new Ordination(I18N::translate('Date of ordination')),
577c2ed51d1SGreg Roach            'INDI:ORDN:PLAC'           => new Ordination(I18N::translate('Place of ordination')),
578c2ed51d1SGreg Roach            'INDI:PROB'                => new Probate(I18N::translate('Probate')),
579c2ed51d1SGreg Roach            'INDI:PROP'                => new Possessions(I18N::translate('Property')),
580c2ed51d1SGreg Roach            'INDI:REFN'                => new UserReferenceNumber(I18N::translate('Reference number')),
581c2ed51d1SGreg Roach            'INDI:REFN:TYPE'           => new UserReferenceType(I18N::translate('Type')),
582c2ed51d1SGreg Roach            'INDI:RELI'                => new ReligiousAffiliation(I18N::translate('Religion')),
583c2ed51d1SGreg Roach            'INDI:RESI'                => new Residence(I18N::translate('Residence')),
584c2ed51d1SGreg Roach            'INDI:RESI:DATE'           => new DateValue(I18N::translate('Date of residence')),
585c2ed51d1SGreg Roach            'INDI:RESI:PLAC'           => new PlaceName(I18N::translate('Place of residence')),
586c2ed51d1SGreg Roach            'INDI:RESN'                => new RestrictionNotice(I18N::translate('Restriction')),
587c2ed51d1SGreg Roach            'INDI:RETI'                => new Retirement(I18N::translate('Retirement')),
588c2ed51d1SGreg Roach            'INDI:RETI:AGNC'           => new ResponsibleAgency(I18N::translate('Employer')),
589c2ed51d1SGreg Roach            'INDI:RFN'                 => new PermanentRecordFileNumber(I18N::translate('Record file number')),
590c2ed51d1SGreg Roach            'INDI:RIN'                 => new AutomatedRecordId(I18N::translate('Record ID number')),
591c2ed51d1SGreg Roach            'INDI:SEX'                 => new SexValue(I18N::translate('Gender')),
592c2ed51d1SGreg Roach            'INDI:SLGC'                => new LdsChildSealing(I18N::translate('LDS child sealing')),
593c2ed51d1SGreg Roach            'INDI:SLGC:DATE'           => new DateLdsOrd(I18N::translate('Date of LDS child sealing')),
594c2ed51d1SGreg Roach            'INDI:SLGC:FAMC'           => new XrefFamily(I18N::translate('Parents')),
595c2ed51d1SGreg Roach            'INDI:SLGC:PLAC'           => new PlaceLivingOrdinance(I18N::translate('Place of LDS child sealing')),
596c2ed51d1SGreg Roach            'INDI:SLGC:STAT'           => new LdsChildSealingDateStatus(I18N::translate('Status')),
597c2ed51d1SGreg Roach            'INDI:SLGC:STAT:DATE'      => new ChangeDate(I18N::translate('Status change date')),
5983d2c98d1SGreg Roach            'INDI:SLGC:TEMP'           => new TempleCode(I18N::translate('Temple')),
599c2ed51d1SGreg Roach            'INDI:SOUR'                => new XrefSource(I18N::translate('Source')),
600c2ed51d1SGreg Roach            'INDI:SOUR:DATA'           => new SourceData(I18N::translate('Data')),
601c2ed51d1SGreg Roach            'INDI:SOUR:DATA:DATE'      => new EntryRecordingDate(I18N::translate('Date of entry in original source')),
602c2ed51d1SGreg Roach            'INDI:SOUR:DATA:TEXT'      => new TextFromSource(I18N::translate('Text')),
603c2ed51d1SGreg Roach            'INDI:SOUR:EVEN'           => new EventTypeCitedFrom(I18N::translate('Event')),
604c2ed51d1SGreg Roach            'INDI:SOUR:EVEN:ROLE'      => new RoleInEvent(I18N::translate('Role')),
605c2ed51d1SGreg Roach            'INDI:SOUR:OBJE'           => new XrefMedia(I18N::translate('Media object')),
606c2ed51d1SGreg Roach            'INDI:SOUR:PAGE'           => new WhereWithinSource(I18N::translate('Citation details')),
607c2ed51d1SGreg Roach            'INDI:SOUR:QUAY'           => new CertaintyAssessment(I18N::translate('Quality of data')),
608c2ed51d1SGreg Roach            'INDI:SSN'                 => new SocialSecurityNumber(I18N::translate('Social security number')),
609c2ed51d1SGreg Roach            'INDI:SUBM'                => new XrefSubmitter(I18N::translate('Submitter')),
610c2ed51d1SGreg Roach            'INDI:TITL'                => new NobilityTypeTitle(I18N::translate('Title')),
611c2ed51d1SGreg Roach            'INDI:WILL'                => new Will(I18N::translate('Will')),
612c2ed51d1SGreg Roach            'NOTE'                     => new NoteRecord(I18N::translate('Note')),
613c2ed51d1SGreg Roach            'NOTE:CHAN'                => new Change(I18N::translate('Last change')),
614c2ed51d1SGreg Roach            'NOTE:CHAN:DATE'           => new ChangeDate(I18N::translate('Date of last change')),
615c2ed51d1SGreg Roach            'NOTE:CHAN:DATE:TIME'      => new TimeValue(I18N::translate('Time')),
616c2ed51d1SGreg Roach            'NOTE:CHAN:NOTE'           => new NoteStructure(I18N::translate('Note')),
617c2ed51d1SGreg Roach            'NOTE:CONC'                => new SubmitterText(I18N::translate('Note')),
618c2ed51d1SGreg Roach            'NOTE:REFN'                => new UserReferenceNumber(I18N::translate('Reference number')),
619c2ed51d1SGreg Roach            'NOTE:REFN:TYPE'           => new UserReferenceType(I18N::translate('Type')),
620c2ed51d1SGreg Roach            'NOTE:RIN'                 => new AutomatedRecordId(I18N::translate('Record ID number')),
621c2ed51d1SGreg Roach            'NOTE:SOUR'                => new XrefSource(I18N::translate('Source')),
622c2ed51d1SGreg Roach            'NOTE:SOUR:DATA'           => new SourceData(I18N::translate('Data')),
623c2ed51d1SGreg Roach            'NOTE:SOUR:DATA:DATE'      => new EntryRecordingDate(I18N::translate('Date of entry in original source')),
624c2ed51d1SGreg Roach            'NOTE:SOUR:DATA:TEXT'      => new TextFromSource(I18N::translate('Text')),
625c2ed51d1SGreg Roach            'NOTE:SOUR:EVEN'           => new EventTypeCitedFrom(I18N::translate('Event')),
626c2ed51d1SGreg Roach            'NOTE:SOUR:EVEN:ROLE'      => new RoleInEvent(I18N::translate('Role')),
627c2ed51d1SGreg Roach            'NOTE:SOUR:NOTE'           => new NoteStructure(I18N::translate('Note')),
628c2ed51d1SGreg Roach            'NOTE:SOUR:OBJE'           => new XrefMedia(I18N::translate('Media object')),
629c2ed51d1SGreg Roach            'NOTE:SOUR:PAGE'           => new WhereWithinSource(I18N::translate('Citation details')),
630c2ed51d1SGreg Roach            'NOTE:SOUR:QUAY'           => new CertaintyAssessment(I18N::translate('Quality of data')),
631c2ed51d1SGreg Roach            'OBJE'                     => new MediaRecord(I18N::translate('Media object')),
632c2ed51d1SGreg Roach            'OBJE:CHAN'                => new Change(I18N::translate('Last change')),
633c2ed51d1SGreg Roach            'OBJE:CHAN:DATE'           => new ChangeDate(I18N::translate('Date of last change')),
634c2ed51d1SGreg Roach            'OBJE:CHAN:DATE:TIME'      => new TimeValue(I18N::translate('Time')),
635c2ed51d1SGreg Roach            'OBJE:CHAN:NOTE'           => new NoteStructure(I18N::translate('Note')),
636c2ed51d1SGreg Roach            'OBJE:FILE'                => new MultimediaFileReference(I18N::translate('Filename')),
637c2ed51d1SGreg Roach            'OBJE:FILE:FORM'           => new MultimediaFormat(I18N::translate('Format')),
638c2ed51d1SGreg Roach            'OBJE:FILE:FORM:TYPE'      => new SourceMediaType(I18N::translate('Media type')),
639c2ed51d1SGreg Roach            'OBJE:FILE:TITL'           => new DescriptiveTitle(I18N::translate('Title')),
640c2ed51d1SGreg Roach            'OBJE:NOTE'                => new NoteStructure(I18N::translate('Note')),
641c2ed51d1SGreg Roach            'OBJE:REFN'                => new UserReferenceNumber(I18N::translate('Reference number')),
642c2ed51d1SGreg Roach            'OBJE:REFN:TYPE'           => new UserReferenceType(I18N::translate('Type')),
643c2ed51d1SGreg Roach            'OBJE:RIN'                 => new AutomatedRecordId(I18N::translate('Record ID number')),
644c2ed51d1SGreg Roach            'OBJE:SOUR'                => new XrefSource(I18N::translate('Source')),
645c2ed51d1SGreg Roach            'OBJE:SOUR:DATA'           => new SourceData(I18N::translate('Data')),
646c2ed51d1SGreg Roach            'OBJE:SOUR:DATA:DATE'      => new EntryRecordingDate(I18N::translate('Date of entry in original source')),
647c2ed51d1SGreg Roach            'OBJE:SOUR:DATA:TEXT'      => new TextFromSource(I18N::translate('Text')),
648c2ed51d1SGreg Roach            'OBJE:SOUR:EVEN'           => new EventTypeCitedFrom(I18N::translate('Event')),
649c2ed51d1SGreg Roach            'OBJE:SOUR:EVEN:ROLE'      => new RoleInEvent(I18N::translate('Role')),
650c2ed51d1SGreg Roach            'OBJE:SOUR:NOTE'           => new NoteStructure(I18N::translate('Note')),
651c2ed51d1SGreg Roach            'OBJE:SOUR:OBJE'           => new XrefMedia(I18N::translate('Media object')),
652c2ed51d1SGreg Roach            'OBJE:SOUR:PAGE'           => new WhereWithinSource(I18N::translate('Citation details')),
653c2ed51d1SGreg Roach            'OBJE:SOUR:QUAY'           => new CertaintyAssessment(I18N::translate('Quality of data')),
654c2ed51d1SGreg Roach            'REPO'                     => new RepositoryRecord(I18N::translate('Repository')),
655c2ed51d1SGreg Roach            'REPO:ADDR'                => new AddressLine(I18N::translate('Address')),
656c2ed51d1SGreg Roach            'REPO:ADDR:ADR1'           => new AddressLine1(I18N::translate('Address line 1')),
657c2ed51d1SGreg Roach            'REPO:ADDR:ADR2'           => new AddressLine2(I18N::translate('Address line 2')),
658c2ed51d1SGreg Roach            'REPO:ADDR:ADR3'           => new AddressLine3(I18N::translate('Address line 3')),
659c2ed51d1SGreg Roach            'REPO:ADDR:CITY'           => new AddressCity(I18N::translate('City')),
660c2ed51d1SGreg Roach            'REPO:ADDR:CTRY'           => new AddressCountry(I18N::translate('Country')),
661c2ed51d1SGreg Roach            'REPO:ADDR:POST'           => new AddressPostalCode(I18N::translate('Postal code')),
662c2ed51d1SGreg Roach            'REPO:ADDR:STAE'           => new AddressState(I18N::translate('State')),
663c2ed51d1SGreg Roach            'REPO:CHAN'                => new Change(I18N::translate('Last change')),
664c2ed51d1SGreg Roach            'REPO:CHAN:DATE'           => new ChangeDate(I18N::translate('Date of last change')),
665c2ed51d1SGreg Roach            'REPO:CHAN:DATE:TIME'      => new TimeValue(I18N::translate('Time')),
666c2ed51d1SGreg Roach            'REPO:CHAN:NOTE'           => new NoteStructure(I18N::translate('Note')),
667c2ed51d1SGreg Roach            'REPO:EMAIL'               => new AddressEmail(I18N::translate('Email address')),
668c2ed51d1SGreg Roach            'REPO:FAX'                 => new AddressFax(I18N::translate('Fax')),
669c2ed51d1SGreg Roach            'REPO:NAME'                => new NameOfRepository(I18N::translateContext('Repository', 'Name')),
670c2ed51d1SGreg Roach            'REPO:NOTE'                => new NoteStructure(I18N::translate('Note')),
671c2ed51d1SGreg Roach            'REPO:PHON'                => new PhoneNumber(I18N::translate('Phone')),
672c2ed51d1SGreg Roach            'REPO:REFN'                => new UserReferenceNumber(I18N::translate('Reference number')),
673c2ed51d1SGreg Roach            'REPO:REFN:TYPE'           => new UserReferenceType(I18N::translate('Type')),
674c2ed51d1SGreg Roach            'REPO:RIN'                 => new AutomatedRecordId(I18N::translate('Record ID number')),
675c2ed51d1SGreg Roach            'REPO:WWW'                 => new AddressWebPage(I18N::translate('URL')),
676c2ed51d1SGreg Roach            'SOUR'                     => new SourceRecord(I18N::translate('Source')),
677c2ed51d1SGreg Roach            'SOUR:ABBR'                => new SourceFiledByEntry(I18N::translate('Abbreviation')),
678c2ed51d1SGreg Roach            'SOUR:AUTH'                => new SourceOriginator(I18N::translate('Author')),
679c2ed51d1SGreg Roach            'SOUR:CHAN'                => new Change(I18N::translate('Last change')),
680c2ed51d1SGreg Roach            'SOUR:CHAN:DATE'           => new ChangeDate(I18N::translate('Date of last change')),
681c2ed51d1SGreg Roach            'SOUR:CHAN:DATE:TIME'      => new TimeValue(I18N::translate('Time')),
682c2ed51d1SGreg Roach            'SOUR:CHAN:NOTE'           => new NoteStructure(I18N::translate('Note')),
683c2ed51d1SGreg Roach            'SOUR:DATA'                => new EmptyElement(I18N::translate('Data'), ['EVEN' => '0:M', 'AGNC' => '0:1', 'NOTE' => '0:M']),
684c2ed51d1SGreg Roach            'SOUR:DATA:AGNC'           => new ResponsibleAgency(I18N::translate('Agency')),
685c2ed51d1SGreg Roach            'SOUR:DATA:EVEN'           => new EventsRecorded(I18N::translate('Events')),
686c2ed51d1SGreg Roach            'SOUR:DATA:EVEN:DATE'      => new DateValue(I18N::translate('Date range')),
687c2ed51d1SGreg Roach            'SOUR:DATA:EVEN:PLAC'      => new SourceJurisdictionPlace(I18N::translate('Place')),
688c2ed51d1SGreg Roach            'SOUR:DATA:NOTE'           => new NoteStructure(I18N::translate('Note')),
689c2ed51d1SGreg Roach            'SOUR:NOTE'                => new NoteStructure(I18N::translate('Note')),
690c2ed51d1SGreg Roach            'SOUR:OBJE'                => new XrefMedia(I18N::translate('Media object')),
691c2ed51d1SGreg Roach            'SOUR:PUBL'                => new SourcePublicationFacts(I18N::translate('Publication')),
692c2ed51d1SGreg Roach            'SOUR:REFN'                => new UserReferenceNumber(I18N::translate('Reference number')),
693c2ed51d1SGreg Roach            'SOUR:REFN:TYPE'           => new UserReferenceType(I18N::translate('Type')),
694c2ed51d1SGreg Roach            'SOUR:REPO'                => new XrefRepository(I18N::translate('Repository')),
695c2ed51d1SGreg Roach            'SOUR:REPO:CALN'           => new SourceCallNumber(I18N::translate('Call number')),
696c2ed51d1SGreg Roach            'SOUR:REPO:CALN:MEDI'      => new SourceMediaType(I18N::translate('Media type')),
697c2ed51d1SGreg Roach            'SOUR:REPO:NOTE'           => new NoteStructure(I18N::translate('Note')),
698c2ed51d1SGreg Roach            'SOUR:RIN'                 => new AutomatedRecordId(I18N::translate('Record ID number')),
699c2ed51d1SGreg Roach            'SOUR:TEXT'                => new TextFromSource(I18N::translate('Text')),
700c2ed51d1SGreg Roach            'SOUR:TITL'                => new DescriptiveTitle(I18N::translate('Title')),
701c2ed51d1SGreg Roach            'SUBM'                     => new SubmitterRecord(I18N::translate('Submitter')),
702c2ed51d1SGreg Roach            'SUBM:ADDR'                => new AddressLine(I18N::translate('Address')),
703c2ed51d1SGreg Roach            'SUBM:ADDR:ADR1'           => new AddressLine1(I18N::translate('Address line 1')),
704c2ed51d1SGreg Roach            'SUBM:ADDR:ADR2'           => new AddressLine2(I18N::translate('Address line 2')),
705c2ed51d1SGreg Roach            'SUBM:ADDR:ADR3'           => new AddressLine3(I18N::translate('Address line 3')),
706c2ed51d1SGreg Roach            'SUBM:ADDR:CITY'           => new AddressCity(I18N::translate('City')),
707c2ed51d1SGreg Roach            'SUBM:ADDR:CTRY'           => new AddressCountry(I18N::translate('Country')),
708c2ed51d1SGreg Roach            'SUBM:ADDR:POST'           => new AddressPostalCode(I18N::translate('Postal code')),
709c2ed51d1SGreg Roach            'SUBM:ADDR:STAE'           => new AddressState(I18N::translate('State')),
710c2ed51d1SGreg Roach            'SUBM:CHAN'                => new Change(I18N::translate('Last change')),
711c2ed51d1SGreg Roach            'SUBM:CHAN:DATE'           => new ChangeDate(I18N::translate('Date of last change')),
712c2ed51d1SGreg Roach            'SUBM:CHAN:DATE:TIME'      => new TimeValue(I18N::translate('Time')),
713c2ed51d1SGreg Roach            'SUBM:CHAN:NOTE'           => new NoteStructure(I18N::translate('Note')),
714c2ed51d1SGreg Roach            'SUBM:EMAIL'               => new AddressEmail(I18N::translate('Email address')),
715c2ed51d1SGreg Roach            'SUBM:FAX'                 => new AddressFax(I18N::translate('Fax')),
716c2ed51d1SGreg Roach            'SUBM:LANG'                => new LanguageId(I18N::translate('Language')),
717c2ed51d1SGreg Roach            'SUBM:NAME'                => new SubmitterName(I18N::translate('Name')),
718c2ed51d1SGreg Roach            'SUBM:NOTE'                => new NoteStructure(I18N::translate('Note')),
719c2ed51d1SGreg Roach            'SUBM:OBJE'                => new XrefMedia(I18N::translate('Media object')),
720c2ed51d1SGreg Roach            'SUBM:PHON'                => new PhoneNumber(I18N::translate('Phone')),
721c2ed51d1SGreg Roach            'SUBM:RFN'                 => new SubmitterRegisteredRfn(I18N::translate('Record file number')),
722c2ed51d1SGreg Roach            'SUBM:RIN'                 => new AutomatedRecordId(I18N::translate('Record ID number')),
723c2ed51d1SGreg Roach            'SUBM:WWW'                 => new AddressWebPage(I18N::translate('URL')),
724c2ed51d1SGreg Roach            'SUBN'                     => new SubmissionRecord(I18N::translate('Submission')),
725c2ed51d1SGreg Roach            'SUBN:ANCE'                => new GenerationsOfAncestors(I18N::translate('Generations of ancestors')),
726c2ed51d1SGreg Roach            'SUBN:CHAN'                => new Change(I18N::translate('Last change')),
727c2ed51d1SGreg Roach            'SUBN:CHAN:DATE'           => new ChangeDate(I18N::translate('Date of last change')),
728c2ed51d1SGreg Roach            'SUBN:CHAN:DATE:TIME'      => new TimeValue(I18N::translate('Time')),
729c2ed51d1SGreg Roach            'SUBN:CHAN:NOTE'           => new NoteStructure(I18N::translate('Note')),
730c2ed51d1SGreg Roach            'SUBN:DESC'                => new GenerationsOfDescendants(I18N::translate('Generations of descendants')),
731c2ed51d1SGreg Roach            'SUBN:FAMF'                => new NameOfFamilyFile(I18N::translate('Family file')),
732c2ed51d1SGreg Roach            'SUBN:NOTE'                => new NoteStructure(I18N::translate('Note')),
733c2ed51d1SGreg Roach            'SUBN:ORDI'                => new OrdinanceProcessFlag(I18N::translate('Ordinance')),
734c2ed51d1SGreg Roach            'SUBN:RIN'                 => new AutomatedRecordId(I18N::translate('Record ID number')),
735c2ed51d1SGreg Roach            'SUBN:SUBM'                => new XrefSubmitter(I18N::translate('Submitter')),
736c2ed51d1SGreg Roach            'SUBN:TEMP'                => new TempleCode(/* I18N: https://en.wikipedia.org/wiki/Temple_(LDS_Church)*/ I18N::translate('Temple')),
73772ef38edSGreg Roach            'TRLR'                     => new EmptyElement(I18N::translate('Trailer')),
738c2ed51d1SGreg Roach        ];
7393d2c98d1SGreg Roach    }
740c2ed51d1SGreg Roach}
741