xref: /webtrees/app/CustomTags/GedcomL.php (revision fd1c8fe69a97241181daf775a96803cd785cf878)
1<?php
2
3/**
4 * webtrees: online genealogy
5 * Copyright (C) 2023 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
18declare(strict_types=1);
19
20namespace Fisharebest\Webtrees\CustomTags;
21
22use Fisharebest\Webtrees\Contracts\CustomTagInterface;
23use Fisharebest\Webtrees\Contracts\ElementInterface;
24use Fisharebest\Webtrees\Elements\AddressCity;
25use Fisharebest\Webtrees\Elements\AddressCountry;
26use Fisharebest\Webtrees\Elements\AddressEmail;
27use Fisharebest\Webtrees\Elements\AddressFax;
28use Fisharebest\Webtrees\Elements\AddressLine;
29use Fisharebest\Webtrees\Elements\AddressLine1;
30use Fisharebest\Webtrees\Elements\AddressLine2;
31use Fisharebest\Webtrees\Elements\AddressLine3;
32use Fisharebest\Webtrees\Elements\AddressPostalCode;
33use Fisharebest\Webtrees\Elements\AddressState;
34use Fisharebest\Webtrees\Elements\AddressWebPage;
35use Fisharebest\Webtrees\Elements\CauseOfEvent;
36use Fisharebest\Webtrees\Elements\CertaintyAssessment;
37use Fisharebest\Webtrees\Elements\Change;
38use Fisharebest\Webtrees\Elements\ChangeDate;
39use Fisharebest\Webtrees\Elements\CustomElement;
40use Fisharebest\Webtrees\Elements\DateValue;
41use Fisharebest\Webtrees\Elements\DateValueToday;
42use Fisharebest\Webtrees\Elements\EmptyElement;
43use Fisharebest\Webtrees\Elements\EventAttributeType;
44use Fisharebest\Webtrees\Elements\EventTypeCitedFrom;
45use Fisharebest\Webtrees\Elements\FamilyStatusText;
46use Fisharebest\Webtrees\Elements\GovIdentifier;
47use Fisharebest\Webtrees\Elements\HierarchicalRelationship;
48use Fisharebest\Webtrees\Elements\LanguageId;
49use Fisharebest\Webtrees\Elements\LocationRecord;
50use Fisharebest\Webtrees\Elements\MaidenheadLocator;
51use Fisharebest\Webtrees\Elements\NamePieceGiven;
52use Fisharebest\Webtrees\Elements\NoteStructure;
53use Fisharebest\Webtrees\Elements\PafUid;
54use Fisharebest\Webtrees\Elements\PhoneNumber;
55use Fisharebest\Webtrees\Elements\PhoneticType;
56use Fisharebest\Webtrees\Elements\PlaceHierarchy;
57use Fisharebest\Webtrees\Elements\PlaceLatitude;
58use Fisharebest\Webtrees\Elements\PlaceLongtitude;
59use Fisharebest\Webtrees\Elements\PlaceName;
60use Fisharebest\Webtrees\Elements\PlacePhoneticVariation;
61use Fisharebest\Webtrees\Elements\PlaceRomanizedVariation;
62use Fisharebest\Webtrees\Elements\RelationIsDescriptor;
63use Fisharebest\Webtrees\Elements\ReligiousAffiliation;
64use Fisharebest\Webtrees\Elements\ResearchTask;
65use Fisharebest\Webtrees\Elements\ResearchTaskPriority;
66use Fisharebest\Webtrees\Elements\ResearchTaskStatus;
67use Fisharebest\Webtrees\Elements\ResearchTaskType;
68use Fisharebest\Webtrees\Elements\ResponsibleAgency;
69use Fisharebest\Webtrees\Elements\RestrictionNotice;
70use Fisharebest\Webtrees\Elements\RoleInEvent;
71use Fisharebest\Webtrees\Elements\RomanizedType;
72use Fisharebest\Webtrees\Elements\SexXValue;
73use Fisharebest\Webtrees\Elements\SourceData;
74use Fisharebest\Webtrees\Elements\SubmitterText;
75use Fisharebest\Webtrees\Elements\TextFromSource;
76use Fisharebest\Webtrees\Elements\TimeValueNow;
77use Fisharebest\Webtrees\Elements\VersionNumber;
78use Fisharebest\Webtrees\Elements\WhereWithinSource;
79use Fisharebest\Webtrees\Elements\XrefAssociate;
80use Fisharebest\Webtrees\Elements\XrefLocation;
81use Fisharebest\Webtrees\Elements\XrefMedia;
82use Fisharebest\Webtrees\Elements\XrefRepository;
83use Fisharebest\Webtrees\Elements\XrefSource;
84use Fisharebest\Webtrees\I18N;
85
86/**
87 * GEDCOM files created by Gedcom-L
88 *
89 * @see https://www.genwiki.de/GEDCOM-L
90 */
91class GedcomL implements CustomTagInterface
92{
93    /**
94     * The name of the application.
95     *
96     * @return string
97     */
98    public function name(): string
99    {
100        return 'GEDCOM-L';
101    }
102
103    /**
104     * Tags created by this application.
105     *
106     * @return array<string,ElementInterface>
107     */
108    public function tags(): array
109    {
110        return [
111            'FAM:*:ADDR:_NAME'                => new CustomElement(I18N::translate('Name of addressee')),
112            // I18N: https://gov.genealogy.net
113            'FAM:*:PLAC:_GOV'                 => new GovIdentifier(I18N::translate('GOV identifier')),
114            'FAM:*:PLAC:_LOC'                 => new XrefLocation(I18N::translate('Location')),
115            // I18N: https://en.wikipedia.org/wiki/Maidenhead_Locator_System
116            'FAM:*:PLAC:_MAIDENHEAD'          => new MaidenheadLocator(I18N::translate('Maidenhead location code')),
117            'FAM:*:PLAC:_POST'                => new AddressPostalCode(I18N::translate('Postal code')),
118            'FAM:*:PLAC:_POST:DATE'           => new DateValue(I18N::translate('Date')),
119            'FAM:*:_ASSO'                     => new XrefAssociate(I18N::translate('Associate')),
120            'FAM:*:_ASSO:NOTE'                => new NoteStructure(I18N::translate('Note on association')),
121            'FAM:*:_ASSO:RELA'                => new RelationIsDescriptor(I18N::translate('Relationship')),
122            'FAM:*:_ASSO:SOUR'                => new XrefSource(I18N::translate('Source citation')),
123            'FAM:*:_ASSO:SOUR:DATA'           => new SourceData(I18N::translate('Data')),
124            'FAM:*:_ASSO:SOUR:DATA:DATE'      => new DateValue(I18N::translate('Date of entry in original source')),
125            'FAM:*:_ASSO:SOUR:DATA:TEXT'      => new TextFromSource(I18N::translate('Text')),
126            'FAM:*:_ASSO:SOUR:EVEN'           => new EventTypeCitedFrom(I18N::translate('Event')),
127            'FAM:*:_ASSO:SOUR:EVEN:ROLE'      => new RoleInEvent(I18N::translate('Role')),
128            'FAM:*:_ASSO:SOUR:NOTE'           => new NoteStructure(I18N::translate('Note on source citation')),
129            'FAM:*:_ASSO:SOUR:OBJE'           => new XrefMedia(I18N::translate('Media object')),
130            'FAM:*:_ASSO:SOUR:PAGE'           => new WhereWithinSource(I18N::translate('Citation details')),
131            'FAM:*:_ASSO:SOUR:QUAY'           => new CertaintyAssessment(I18N::translate('Quality of data')),
132            'FAM:*:_WITN'                     => new CustomElement(I18N::translate('Witnesses')),
133            'FAM:_ASSO'                       => new XrefAssociate(I18N::translate('Associate')),
134            'FAM:_ASSO:RELA'                  => new RelationIsDescriptor(I18N::translate('Relationship')),
135            'FAM:_STAT'                       => new FamilyStatusText(I18N::translate('Family status')),
136            'FAM:_TODO'                       => new ResearchTask(I18N::translate('Research task'), ['DESC' => '1:1', '_CAT' => '0:1', '_PRTY' => '0:1', 'TYPE' => '0:1', 'NOTE' => '0:M', 'DATA' => '0:1', 'STAT'  => '0:1', '_CDATE' => '0:1', '_RDATE' => '0:1', 'REPO' => '0:1', '_UID' => '0:M']),
137            'FAM:_TODO:DATA'                  => new SubmitterText(I18N::translate('The solution')),
138            'FAM:_TODO:DATE'                  => new DateValueToday(I18N::translate('Creation date')),
139            'FAM:_TODO:DESC'                  => new CustomElement(I18N::translate('Description')),
140            'FAM:_TODO:NOTE'                  => new NoteStructure(I18N::translate('Note')),
141            'FAM:_TODO:REPO'                  => new XrefRepository(I18N::translate('Repository'), []),
142            'FAM:_TODO:STAT'                  => new ResearchTaskStatus(I18N::translate('Status')),
143            'FAM:_TODO:TYPE'                  => new ResearchTaskType(I18N::translate('Type of research task')),
144            'FAM:_TODO:_CAT'                  => new CustomElement(I18N::translate('Category')),
145            'FAM:_TODO:_CDATE'                => new DateValue(I18N::translate('Completion date')),
146            'FAM:_TODO:_PRTY'                 => new ResearchTaskPriority(I18N::translate('Priority')),
147            'FAM:_TODO:_RDATE'                => new DateValue(I18N::translate('Reminder date')),
148            'FAM:_UID'                        => new PafUid(I18N::translate('Unique identifier')),
149            'HEAD:GEDC:VERS:_ADDENDUM'        => new EmptyElement(I18N::translate('GEDCOM-L')),
150            'HEAD:GEDC:VERS:_ADDENDUM:VERS'   => new VersionNumber(I18N::translate('Version')),
151            'HEAD:GEDC:VERS:_ADDENDUM:WWW'    => new AddressWebPage(I18N::translate('URL')),
152            'HEAD:SOUR:CORP:ADDR:_NAME'       => new CustomElement(I18N::translate('Name of addressee')),
153            'HEAD:_SCHEMA'                    => new EmptyElement(I18N::translate('Schema')),
154            'HEAD:_SCHEMA:*'                  => new EmptyElement(I18N::translate('Base GEDCOM tag')),
155            'HEAD:_SCHEMA:*:*'                => new EmptyElement(I18N::translate('New GEDCOM tag')),
156            'HEAD:_SCHEMA:*:*:*'              => new EmptyElement(I18N::translate('New GEDCOM tag')),
157            'HEAD:_SCHEMA:*:*:*:*'            => new EmptyElement(I18N::translate('New GEDCOM tag')),
158            'HEAD:_SCHEMA:*:*:*:*:*'          => new EmptyElement(I18N::translate('New GEDCOM tag')),
159            'HEAD:_SCHEMA:*:*:*:*:*:*'        => new EmptyElement(I18N::translate('New GEDCOM tag')),
160            'HEAD:_SCHEMA:*:*:*:*:*:*:_DEFN'  => new EmptyElement(I18N::translate('Definition')),
161            'HEAD:_SCHEMA:*:*:*:*:*:_DEFN'    => new EmptyElement(I18N::translate('Definition')),
162            'HEAD:_SCHEMA:*:*:*:*:_DEFN'      => new EmptyElement(I18N::translate('Definition')),
163            'HEAD:_SCHEMA:*:*:*:_DEFN'        => new EmptyElement(I18N::translate('Definition')),
164            'HEAD:_SCHEMA:*:*:_DEFN'          => new EmptyElement(I18N::translate('Definition')),
165            'INDI:*:ADDR:_NAME'               => new CustomElement(I18N::translate('Name of addressee')),
166            // I18N: https://gov.genealogy.net
167            'INDI:*:PLAC:_GOV'                => new GovIdentifier(I18N::translate('GOV identifier')),
168            'INDI:*:PLAC:_LOC'                => new XrefLocation(I18N::translate('Location')),
169            // I18N: https://en.wikipedia.org/wiki/Maidenhead_Locator_System
170            'INDI:*:PLAC:_MAIDENHEAD'         => new MaidenheadLocator(I18N::translate('Maidenhead location code')),
171            'INDI:*:PLAC:_POST'               => new AddressPostalCode(I18N::translate('Postal code')),
172            'INDI:*:PLAC:_POST:DATE'          => new DateValue(I18N::translate('Date')),
173            'INDI:*:_ASSO'                    => new XrefAssociate(I18N::translate('Associate')),
174            'INDI:*:_ASSO:NOTE'               => new NoteStructure(I18N::translate('Note on association')),
175            'INDI:*:_ASSO:RELA'               => new RelationIsDescriptor(I18N::translate('Relationship')),
176            'INDI:*:_ASSO:SOUR'               => new XrefSource(I18N::translate('Source citation')),
177            'INDI:*:_ASSO:SOUR:DATA'          => new SourceData(I18N::translate('Data')),
178            'INDI:*:_ASSO:SOUR:DATA:DATE'     => new DateValue(I18N::translate('Date of entry in original source')),
179            'INDI:*:_ASSO:SOUR:DATA:TEXT'     => new TextFromSource(I18N::translate('Text')),
180            'INDI:*:_ASSO:SOUR:EVEN'          => new EventTypeCitedFrom(I18N::translate('Event')),
181            'INDI:*:_ASSO:SOUR:EVEN:ROLE'     => new RoleInEvent(I18N::translate('Role')),
182            'INDI:*:_ASSO:SOUR:NOTE'          => new NoteStructure(I18N::translate('Note on source citation')),
183            'INDI:*:_ASSO:SOUR:OBJE'          => new XrefMedia(I18N::translate('Media object')),
184            'INDI:*:_ASSO:SOUR:PAGE'          => new WhereWithinSource(I18N::translate('Citation details')),
185            'INDI:*:_ASSO:SOUR:QUAY'          => new CertaintyAssessment(I18N::translate('Quality of data')),
186            'INDI:*:_WITN'                    => new CustomElement(I18N::translate('Witnesses')),
187            'INDI:BAPM:_GODP'                 => new CustomElement(I18N::translate('Godparents')),
188            'INDI:CHR:_GODP'                  => new CustomElement(I18N::translate('Godparents')),
189            'INDI:NAME:_RUFNAME'              => new NamePieceGiven(I18N::translate('Rufname')),
190            'INDI:OBJE:_PRIM'                 => new CustomElement(I18N::translate('Highlighted image')),
191            'INDI:SEX'                        => new SexXValue(I18N::translate('Gender')),
192            'INDI:_TODO'                      => new ResearchTask(I18N::translate('Research task')),
193            'INDI:_TODO:DATA'                 => new SubmitterText(I18N::translate('The solution')),
194            'INDI:_TODO:DATE'                 => new DateValueToday(I18N::translate('Creation date')),
195            'INDI:_TODO:DESC'                 => new CustomElement(I18N::translate('Description')),
196            'INDI:_TODO:NOTE'                 => new NoteStructure(I18N::translate('Note')),
197            'INDI:_TODO:REPO'                 => new XrefRepository(I18N::translate('Repository'), []),
198            'INDI:_TODO:STAT'                 => new ResearchTaskStatus(I18N::translate('Status')),
199            'INDI:_TODO:TYPE'                 => new ResearchTaskType(I18N::translate('Type of research task')),
200            'INDI:_TODO:_CAT'                 => new CustomElement(I18N::translate('Category')),
201            'INDI:_TODO:_CDATE'               => new DateValue(I18N::translate('Completion date')),
202            'INDI:_TODO:_PRTY'                => new ResearchTaskPriority(I18N::translate('Priority')),
203            'INDI:_TODO:_RDATE'               => new DateValue(I18N::translate('Reminder date')),
204            'INDI:_UID'                       => new PafUid(I18N::translate('Unique identifier')),
205            'NOTE:_UID'                       => new PafUid(I18N::translate('Unique identifier')),
206            'OBJE:FILE:_PRIM'                 => new CustomElement(I18N::translate('Highlighted image')),
207            'OBJE:_UID'                       => new PafUid(I18N::translate('Unique identifier')),
208            'REPO:ADDR:_NAME'                 => new CustomElement(I18N::translate('Name of addressee')),
209            'REPO:_UID'                       => new PafUid(I18N::translate('Unique identifier')),
210            'SOUR:_UID'                       => new PafUid(I18N::translate('Unique identifier')),
211            'SOUR:DATA:EVEN:PLAC:_LOC'        => new XrefLocation(I18N::translate('Location')),
212            // I18N: https://en.wikipedia.org/wiki/Maidenhead_Locator_System
213            'SOUR:DATA:EVEN:PLAC:_MAIDENHEAD' => new MaidenheadLocator(I18N::translate('Maidenhead location code')),
214            'SOUR:DATA:EVEN:PLAC:_POST'       => new AddressPostalCode(I18N::translate('Postal code')),
215            'SOUR:DATA:EVEN:PLAC:_POST:DATE'  => new DateValue(I18N::translate('Date')),
216            'SOUR:DATA:EVEN:PLAC:_GOV'        => new GovIdentifier(I18N::translate('GOV identifier')),
217            'SUBM:ADDR:_NAME'                 => new CustomElement(I18N::translate('Name of addressee')),
218            'SUBM:_UID'                       => new PafUid(I18N::translate('Unique identifier')),
219            'SUBN:_UID'                       => new PafUid(I18N::translate('Unique identifier')),
220            '_LOC'                            => new LocationRecord(I18N::translate('Location')),
221            '_LOC:CHAN'                       => new Change(I18N::translate('Last change')),
222            '_LOC:CHAN:DATE'                  => new ChangeDate(I18N::translate('Date of last change')),
223            '_LOC:CHAN:DATE:TIME'             => new TimeValueNow(I18N::translate('Time of last change')),
224            '_LOC:CHAN:NOTE'                  => new NoteStructure(I18N::translate('Note on last change')),
225            '_LOC:EVEN'                       => new CustomElement(I18N::translate('Event'), ['TYPE'  => '0:1', 'DATE'  => '0:1', 'PLAC'  => '0:1', 'ADDR'  => '0:1', 'EMAIL' => '0:1:?', 'WWW'   => '0:1:?', 'PHON'  => '0:1:?', 'FAX'   => '0:1:?', 'CAUS'  => '0:1', 'AGNC'  => '0:1', 'RELI'  => '0:1', 'NOTE'  => '0:M', 'OBJE'  => '0:M', 'SOUR'  => '0:M', 'RESN'  => '0:1']),
226            '_LOC:EVEN:ADDR'                  => new AddressLine(I18N::translate('Address')),
227            '_LOC:EVEN:ADDR:ADR1'             => new AddressLine1(I18N::translate('Address line 1')),
228            '_LOC:EVEN:ADDR:ADR2'             => new AddressLine2(I18N::translate('Address line 2')),
229            '_LOC:EVEN:ADDR:ADR3'             => new AddressLine3(I18N::translate('Address line 3')),
230            '_LOC:EVEN:ADDR:CITY'             => new AddressCity(I18N::translate('City')),
231            '_LOC:EVEN:ADDR:CTRY'             => new AddressCountry(I18N::translate('Country')),
232            '_LOC:EVEN:ADDR:POST'             => new AddressPostalCode(I18N::translate('Postal code')),
233            '_LOC:EVEN:ADDR:STAE'             => new AddressState(I18N::translate('State')),
234            '_LOC:EVEN:AGNC'                  => new ResponsibleAgency(I18N::translate('Agency')),
235            '_LOC:EVEN:CAUS'                  => new CauseOfEvent(I18N::translate('Cause')),
236            '_LOC:EVEN:DATE'                  => new DateValue(I18N::translate('Date of event')),
237            '_LOC:EVEN:EMAIL'                 => new AddressEmail(I18N::translate('Email address')),
238            '_LOC:EVEN:FAX'                   => new AddressFax(I18N::translate('Fax')),
239            '_LOC:EVEN:NOTE'                  => new NoteStructure(I18N::translate('Note')),
240            '_LOC:EVEN:OBJE'                  => new XrefMedia(I18N::translate('Media object')),
241            '_LOC:EVEN:PHON'                  => new PhoneNumber(I18N::translate('Phone')),
242            '_LOC:EVEN:PLAC'                  => new PlaceName(I18N::translate('Place of event')),
243            '_LOC:EVEN:PLAC:FONE'             => new PlacePhoneticVariation(I18N::translate('Phonetic place')),
244            '_LOC:EVEN:PLAC:FONE:TYPE'        => new PhoneticType(I18N::translate('Type')),
245            '_LOC:EVEN:PLAC:FORM'             => new PlaceHierarchy(I18N::translate('Format')),
246            '_LOC:EVEN:PLAC:MAP'              => new EmptyElement(I18N::translate('Coordinates'), ['LATI' => '1:1', 'LONG' => '1:1']),
247            '_LOC:EVEN:PLAC:MAP:LATI'         => new PlaceLatitude(I18N::translate('Latitude')),
248            '_LOC:EVEN:PLAC:MAP:LONG'         => new PlaceLongtitude(I18N::translate('Longitude')),
249            '_LOC:EVEN:PLAC:NOTE'             => new NoteStructure(I18N::translate('Note on place')),
250            '_LOC:EVEN:PLAC:ROMN'             => new PlaceRomanizedVariation(I18N::translate('Romanized place')),
251            '_LOC:EVEN:PLAC:ROMN:TYPE'        => new RomanizedType(I18N::translate('Type')),
252            '_LOC:EVEN:PLAC:_LOC'             => new XrefLocation(I18N::translate('Location')),
253            '_LOC:EVEN:RELI'                  => new ReligiousAffiliation(I18N::translate('Religion'), []),
254            '_LOC:EVEN:RESN'                  => new RestrictionNotice(I18N::translate('Restriction')),
255            '_LOC:EVEN:SOUR'                  => new XrefSource(I18N::translate('Source citation')),
256            '_LOC:EVEN:TYPE'                  => new EventAttributeType(I18N::translate('Type of event')),
257            '_LOC:EVEN:WWW'                   => new CustomElement(I18N::translate('URL')),
258            '_LOC:MAP'                        => new EmptyElement(I18N::translate('Coordinates'), ['LATI' => '1:1', 'LONG' => '1:1']),
259            '_LOC:MAP:LATI'                   => new PlaceLatitude(I18N::translate('Latitude')),
260            '_LOC:MAP:LONG'                   => new PlaceLongtitude(I18N::translate('Longitude')),
261            '_LOC:NAME'                       => new PlaceName(I18N::translate('Place'), ['ABBR' => '0:1', 'DATE' => '0:1', 'LANG' => '0:1', 'SOUR' => '0:M']),
262            '_LOC:NAME:ABBR'                  => new CustomElement(I18N::translate('Abbreviation'), ['TYPE' => '0:1']),
263            '_LOC:NAME:ABBR:TYPE'             => new CustomElement(I18N::translate('Type of abbreviation')),
264            '_LOC:NAME:DATE'                  => new DateValue(I18N::translate('Date')),
265            '_LOC:NAME:LANG'                  => new LanguageId(I18N::translate('Language')),
266            '_LOC:NAME:SOUR'                  => new XrefSource(I18N::translate('Source')),
267            '_LOC:NOTE'                       => new NoteStructure(I18N::translate('Note')),
268            '_LOC:OBJE'                       => new XrefMedia(I18N::translate('Media')),
269            '_LOC:RELI'                       => new ReligiousAffiliation(I18N::translate('Religion'), []),
270            '_LOC:SOUR'                       => new XrefSource(I18N::translate('Source')),
271            '_LOC:SOUR:DATA'                  => new SourceData(I18N::translate('Data')),
272            '_LOC:SOUR:DATA:DATE'             => new DateValue(I18N::translate('Date of entry in original source')),
273            '_LOC:SOUR:DATA:TEXT'             => new TextFromSource(I18N::translate('Text')),
274            '_LOC:SOUR:EVEN'                  => new EventTypeCitedFrom(I18N::translate('Event')),
275            '_LOC:SOUR:EVEN:ROLE'             => new RoleInEvent(I18N::translate('Role')),
276            '_LOC:SOUR:NOTE'                  => new NoteStructure(I18N::translate('Note on source citation')),
277            '_LOC:SOUR:OBJE'                  => new XrefMedia(I18N::translate('Media object')),
278            '_LOC:SOUR:PAGE'                  => new WhereWithinSource(I18N::translate('Citation details')),
279            '_LOC:SOUR:QUAY'                  => new CertaintyAssessment(I18N::translate('Quality of data')),
280            '_LOC:TYPE'                       => new CustomElement(I18N::translate('Type of location'), ['DATE' => '0:1', '_GOVTYPE' => '0:1', 'SOUR' => '0:M']),
281            '_LOC:TYPE:DATE'                  => new DateValue(I18N::translate('Date')),
282            '_LOC:TYPE:SOUR'                  => new XrefSource(I18N::translate('Source')),
283            '_LOC:TYPE:_GOVTYPE'              => new CustomElement(I18N::translate('GOV identifier type')),
284            '_LOC:_AIDN'                      => new CustomElement(I18N::translate('Administrative ID')),
285            '_LOC:_AIDN:DATE'                 => new DateValue(I18N::translate('Date')),
286            '_LOC:_AIDN:SOUR'                 => new XrefSource(I18N::translate('Source')),
287            '_LOC:_AIDN:TYPE'                 => new CustomElement(I18N::translate('Type of administrative ID')),
288            '_LOC:_DMGD'                      => new CustomElement(I18N::translate('Demographic data')),
289            '_LOC:_DMGD:DATE'                 => new DateValue(I18N::translate('Date')),
290            '_LOC:_DMGD:SOUR'                 => new XrefSource(I18N::translate('Source')),
291            '_LOC:_DMGD:TYPE'                 => new CustomElement(I18N::translate('Type of demographic data')),
292            // I18N: https://gov.genealogy.net
293            '_LOC:_GOV'                       => new GovIdentifier(I18N::translate('GOV identifier')),
294            '_LOC:_LOC'                       => new XrefLocation(I18N::translate('Parent location'), ['DATE' => '0:1', 'SOUR' => '0:M', 'TYPE' => '0:1']),
295            '_LOC:_LOC:DATE'                  => new DateValue(I18N::translate('Date')),
296            '_LOC:_LOC:SOUR'                  => new XrefSource(I18N::translate('Source')),
297            '_LOC:_LOC:TYPE'                  => new HierarchicalRelationship(I18N::translate('Hierarchical relationship')),
298            // I18N: https://en.wikipedia.org/wiki/Maidenhead_Locator_System
299            '_LOC:_MAIDENHEAD'                => new MaidenheadLocator(I18N::translate('Maidenhead location code')),
300            '_LOC:_POST'                      => new AddressPostalCode(I18N::translate('Postal code')),
301            '_LOC:_POST:DATE'                 => new DateValue(I18N::translate('Date')),
302            '_LOC:_POST:SOUR'                 => new XrefSource(I18N::translate('Source')),
303            '_LOC:_UID'                       => new PafUid(I18N::translate('Unique identifier')),
304            '_LOC:*:SOUR:DATA'                => new SourceData(I18N::translate('Data')),
305            '_LOC:*:SOUR:DATA:DATE'           => new DateValue(I18N::translate('Date of entry in original source')),
306            '_LOC:*:SOUR:DATA:TEXT'           => new TextFromSource(I18N::translate('Text')),
307            '_LOC:*:SOUR:EVEN'                => new EventTypeCitedFrom(I18N::translate('Event')),
308            '_LOC:*:SOUR:EVEN:ROLE'           => new RoleInEvent(I18N::translate('Role')),
309            '_LOC:*:SOUR:NOTE'                => new NoteStructure(I18N::translate('Note on source citation')),
310            '_LOC:*:SOUR:OBJE'                => new XrefMedia(I18N::translate('Media object')),
311            '_LOC:*:SOUR:PAGE'                => new WhereWithinSource(I18N::translate('Citation details')),
312            '_LOC:*:SOUR:QUAY'                => new CertaintyAssessment(I18N::translate('Quality of data')),
313        ];
314    }
315}
316