Completed
Push — develop ( d8b18f...6eb969 )
by Greg
09:07
created

ElementFactory::elements()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 7
Code Lines 3

Duplication

Lines 0
Ratio 0 %

Importance

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