1<?php
2/**
3 * webtrees: online genealogy
4 * Copyright (C) 2019 webtrees development team
5 * This program is free software: you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation, either version 3 of the License, or
8 * (at your option) any later version.
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
13 * You should have received a copy of the GNU General Public License
14 * along with this program. If not, see <http://www.gnu.org/licenses/>.
15 */
16namespace Fisharebest\Webtrees;
17
18use Rhumsaa\Uuid\Uuid;
19
20/**
21 * Static GEDCOM data for tags
22 */
23class GedcomTag
24{
25    /** @var string[] All tags that webtrees knows how to translate - including special/internal tags */
26    private static $ALL_TAGS = array(
27        'ABBR', 'ADDR', 'ADR1', 'ADR2', 'ADOP', 'ADOP:DATE', 'ADOP:PLAC',
28        'AFN', 'AGE', 'AGNC', 'ALIA', 'ANCE', 'ANCI', 'ANUL', 'ASSO', 'AUTH', 'BAPL',
29        'BAPL:DATE', 'BAPL:PLAC', 'BAPM', 'BAPM:DATE', 'BAPM:PLAC', 'BARM',
30        'BARM:DATE', 'BARM:PLAC', 'BASM', 'BASM:DATE', 'BASM:PLAC',
31        'BIRT', 'BIRT:DATE', 'BIRT:PLAC', 'BLES', 'BLES:DATE',
32        'BLES:PLAC', 'BLOB', 'BURI', 'BURI:DATE', 'BURI:PLAC',
33        'CALN', 'CAST', 'CAUS', 'CEME', 'CENS', 'CENS:DATE', 'CENS:PLAC', 'CHAN', 'CHAN:DATE', 'CHAN:_WT_USER', 'CHAR',
34        'CHIL', 'CHR', 'CHR:DATE', 'CHR:PLAC', 'CHRA', 'CITN', 'CITY',
35        'COMM', 'CONC', 'CONT', 'CONF', 'CONF:DATE', 'CONF:PLAC', 'CONL',
36        'COPR', 'CORP', 'CREM', 'CREM:DATE', 'CREM:PLAC', 'CTRY', 'DATA',
37        'DATA:DATE', 'DATE', 'DEAT', 'DEAT:CAUS', 'DEAT:DATE', 'DEAT:PLAC',
38        'DESC', 'DESI', 'DEST', 'DIV', 'DIVF', 'DSCR', 'EDUC', 'EDUC:AGNC', 'EMAI',
39        'EMAIL', 'EMAL', 'EMIG', 'EMIG:DATE', 'EMIG:PLAC', 'ENDL', 'ENDL:DATE',
40        'ENDL:PLAC', 'ENGA', 'ENGA:DATE', 'ENGA:PLAC', 'EVEN', 'EVEN:DATE',
41        'EVEN:PLAC', 'EVEN:TYPE', 'FACT', 'FACT:TYPE', 'FAM', 'FAMC', 'FAMF', 'FAMS', 'FAMS:CENS:DATE', 'FAMS:CENS:PLAC',
42        'FAMS:DIV:DATE', 'FAMS:MARR:DATE', 'FAMS:MARR:PLAC', 'FAMS:NOTE',
43        'FAX', 'FCOM', 'FCOM:DATE',
44        'FCOM:PLAC', 'FILE', 'FONE', 'FORM', 'GEDC', 'GIVN', 'GRAD',
45        'HEAD', 'HUSB', 'IDNO', 'IMMI', 'IMMI:DATE', 'IMMI:PLAC', 'INDI', 'INFL',
46        'LANG', 'LATI', 'LEGA', 'LONG', 'MAP', 'MARB', 'MARB:DATE', 'MARB:PLAC',
47        'MARC', 'MARL', 'MARR', 'MARR:DATE', 'MARR:PLAC',
48        'MARR_CIVIL', 'MARR_PARTNERS', 'MARR_RELIGIOUS', 'MARR_UNKNOWN', 'MARS',
49        'MEDI', 'NAME', 'NAME:FONE', 'NAME:_HEB', 'NATI', 'NATU', 'NATU:DATE', 'NATU:PLAC',
50        'NCHI', 'NICK', 'NMR', 'NOTE', 'NPFX', 'NSFX', 'OBJE', 'OCCU', 'OCCU:AGNC',
51        'ORDI', 'ORDN', 'ORDN:AGNC', 'ORDN:DATE', 'ORDN:PLAC', 'PAGE', 'PEDI', 'PHON',
52        'PLAC', 'PLAC:FONE', 'PLAC:ROMN', 'PLAC:_HEB', 'POST', 'PROB', 'PROP', 'PUBL',
53        'QUAY', 'REFN', 'RELA', 'RELI', 'REPO', 'RESI', 'RESI:DATE', 'RESI:PLAC', 'RESN',
54        'RETI', 'RETI:AGNC', 'RFN', 'RIN', 'ROLE', 'ROMN', 'SERV', 'SEX', 'SHARED_NOTE',
55        'SLGC', 'SLGC:DATE', 'SLGC:PLAC', 'SLGS', 'SLGS:DATE', 'SLGS:PLAC', 'SOUR',
56        'SPFX', 'SSN', 'STAE', 'STAT', 'STAT:DATE', 'SUBM', 'SUBN', 'SURN', 'TEMP',
57        'TEXT', 'TIME', 'TITL', 'TITL:FONE', 'TITL:ROMN', 'TITL:_HEB', 'TRLR', 'TYPE',
58        'URL', 'VERS', 'WIFE', 'WILL', 'WWW', '_ADOP_CHIL', '_ADOP_GCHI', '_ADOP_GCH1',
59        '_ADOP_GCH2', '_ADOP_HSIB', '_ADOP_SIBL', '_ADPF', '_ADPM', '_AKA', '_AKAN', '_ASSO',
60        '_BAPM_CHIL', '_BAPM_GCHI', '_BAPM_GCH1', '_BAPM_GCH2', '_BAPM_HSIB', '_BAPM_SIBL',
61        '_BIBL', '_BIRT_CHIL', '_BIRT_GCHI', '_BIRT_GCH1', '_BIRT_GCH2', '_BIRT_HSIB', '_BIRT_SIBL',
62        '_BRTM', '_BRTM:DATE', '_BRTM:PLAC', '_BURI_CHIL',
63        '_BURI_GCHI', '_BURI_GCH1', '_BURI_GCH2', '_BURI_GPAR', '_BURI_HSIB', '_BURI_SIBL', '_BURI_SPOU',
64        '_CHR_CHIL', '_CHR_GCHI', '_CHR_GCH1', '_CHR_GCH2', '_CHR_HSIB', '_CHR_SIBL', '_COML',
65        '_CREM_CHIL', '_CREM_GCHI', '_CREM_GCH1', '_CREM_GCH2', '_CREM_GPAR', '_CREM_HSIB', '_CREM_SIBL', '_CREM_SPOU',
66        '_DBID', '_DEAT_CHIL', '_DEAT_GCHI', '_DEAT_GCH1', '_DEAT_GCH2', '_DEAT_GPAR', '_DEAT_GPA1', '_DEAT_GPA2',
67        '_DEAT_HSIB', '_DEAT_PARE', '_DEAT_SIBL', '_DEAT_SPOU', '_DEG', '_DETS', '_DNA',
68        '_EMAIL', '_EYEC', '_FA1', '_FA2', '_FA3', '_FA4', '_FA5', '_FA6', '_FA7', '_FA8',
69        '_FA9', '_FA10', '_FA11', '_FA12', '_FA13', '_FNRL', '_FREL', '_GEDF', '_GODP', '_HAIR',
70        '_HEB', '_HEIG', '_HNM', '_HOL', '_INTE', '_LOC', '_MARI',
71        '_MARNM', '_PRIM', '_MARNM_SURN', '_MARR_CHIL', '_MARR_FAMC', '_MARR_GCHI',
72        '_MARR_GCH1', '_MARR_GCH2', '_MARR_HSIB', '_MARR_PARE', '_MARR_SIBL', '_MBON',
73        '_MDCL', '_MEDC', '_MEND', '_MILI', '_MILT', '_MREL', '_MSTAT', '_NAME', '_NAMS',
74        '_NLIV', '_NMAR', '_NMR', '_WT_USER', '_PRMN', '_SCBK', '_SEPR', '_SSHOW', '_STAT',
75        '_SUBQ', '_TODO', '_TYPE', '_UID', '_URL', '_WEIG', '_WITN', '_YART', '__BRTM_CHIL',
76        '__BRTM_GCHI', '__BRTM_GCH1', '__BRTM_GCH2', '__BRTM_HSIB', '__BRTM_SIBL',
77        // These pseudo-tags are generated dynamically to display media object attributes
78        '__FILE_SIZE__', '__IMAGE_SIZE__',
79    );
80
81    /** @var string[] Possible values for the Object-File-Format types */
82    private static $OBJE_FILE_FORM_TYPE = array(
83        'audio', 'book', 'card', 'certificate', 'coat', 'document', 'electronic',
84        'fiche', 'film', 'magazine', 'manuscript', 'map', 'newspaper', 'photo',
85        'tombstone', 'video', 'painting', 'other',
86    );
87
88    /**
89     * Is $tag one of our known tags?
90     *
91     * @param string $tag
92     *
93     * @return bool
94     */
95    public static function isTag($tag)
96    {
97        return in_array($tag, self::$ALL_TAGS);
98    }
99
100    /**
101     * Translate a tag, for an (optional) record
102     *
103     * @param string               $tag
104     * @param GedcomRecord|null $record
105     *
106     * @return string
107     */
108    public static function getLabel($tag, GedcomRecord $record = null)
109    {
110        if ($record instanceof Individual) {
111            $sex = $record->getSex();
112        } else {
113            $sex = 'U';
114        }
115
116        switch ($tag) {
117            case 'ABBR':
118                return
119                /* I18N: gedcom tag ABBR */
120                I18N::translate('Abbreviation');
121            case 'ADDR':
122                return
123                /* I18N: gedcom tag ADDR */
124                I18N::translate('Address');
125            case 'ADR1':
126                return I18N::translate('Address line 1');
127            case 'ADR2':
128                return I18N::translate('Address line 2');
129            case 'ADOP':
130                return
131                /* I18N: gedcom tag ADOP */
132                I18N::translate('Adoption');
133            case 'ADOP:DATE':
134                return I18N::translate('Date of adoption');
135            case 'ADOP:PLAC':
136                return I18N::translate('Place of adoption');
137            case 'AFN':
138                return
139                /* I18N: gedcom tag AFN */
140                I18N::translate('Ancestral file number');
141            case 'AGE':
142                return
143                /* I18N: gedcom tag AGE */
144                I18N::translate('Age');
145            case 'AGNC':
146                return
147                /* I18N: gedcom tag AGNC */
148                I18N::translate('Agency');
149            case 'ALIA':
150                return
151                /* I18N: gedcom tag ALIA */
152                I18N::translate('Alias');
153            case 'ANCE':
154                return
155                /* I18N: gedcom tag ANCE */
156                I18N::translate('Generations of ancestors');
157            case 'ANCI':
158                return
159                /* I18N: gedcom tag ANCI */
160                I18N::translate('Ancestors interest');
161            case 'ANUL':
162                return
163                /* I18N: gedcom tag ANUL */
164                I18N::translate('Annulment');
165            case 'ASSO':
166                return
167                /* I18N: gedcom tag ASSO */
168                I18N::translate('Associate'); /* see also _ASSO */
169            case 'AUTH':
170                return
171                /* I18N: gedcom tag AUTH */
172                I18N::translate('Author');
173            case 'BAPL':
174                return
175                /* I18N: gedcom tag BAPL. LDS = Church of Latter Day Saints. */
176                I18N::translate('LDS baptism');
177            case 'BAPL:DATE':
178                return /* I18N: LDS = Church of Latter Day Saints. */ I18N::translate('Date of LDS baptism');
179            case 'BAPL:PLAC':
180                return /* I18N: LDS = Church of Latter Day Saints. */ I18N::translate('Place of LDS baptism');
181            case 'BAPM':
182                return
183                /* I18N: gedcom tag BAPM */
184                I18N::translate('Baptism');
185            case 'BAPM:DATE':
186                return I18N::translate('Date of baptism');
187            case 'BAPM:PLAC':
188                return I18N::translate('Place of baptism');
189            case 'BARM':
190                return
191                /* I18N: gedcom tag BARM */
192                I18N::translate('Bar mitzvah');
193            case 'BARM:DATE':
194                return I18N::translate('Date of bar mitzvah');
195            case 'BARM:PLAC':
196                return I18N::translate('Place of bar mitzvah');
197            case 'BASM':
198                return
199                /* I18N: gedcom tag BASM */
200                I18N::translate('Bat mitzvah');
201            case 'BASM:DATE':
202                return I18N::translate('Date of bat mitzvah');
203            case 'BASM:PLAC':
204                return I18N::translate('Place of bat mitzvah');
205            case 'BIRT':
206                return
207                /* I18N: gedcom tag BIRT */
208                I18N::translate('Birth');
209            case 'BIRT:DATE':
210                return I18N::translate('Date of birth');
211            case 'BIRT:PLAC':
212                return I18N::translate('Place of birth');
213            case 'BLES':
214                return
215                /* I18N: gedcom tag BLES */
216                I18N::translate('Blessing');
217            case 'BLES:DATE':
218                return I18N::translate('Date of blessing');
219            case 'BLES:PLAC':
220                return I18N::translate('Place of blessing');
221            case 'BLOB':
222                return
223                /* I18N: gedcom tag BLOB */
224                I18N::translate('Binary data object');
225            case 'BURI':
226                return
227                /* I18N: gedcom tag BURI */
228                I18N::translate('Burial');
229            case 'BURI:DATE':
230                return I18N::translate('Date of burial');
231            case 'BURI:PLAC':
232                return I18N::translate('Place of burial');
233            case 'CALN':
234                return
235                /* I18N: gedcom tag CALN */
236                I18N::translate('Call number');
237            case 'CAST':
238                return
239                /* I18N: gedcom tag CAST */
240                I18N::translate('Caste');
241            case 'CAUS':
242                return
243                /* I18N: gedcom tag CAUS */
244                I18N::translate('Cause');
245            case 'CEME':
246                return
247                /* I18N: gedcom tag CEME */
248                I18N::translate('Cemetery');
249            case 'CENS':
250                return
251                /* I18N: gedcom tag CENS */
252                I18N::translate('Census');
253            case 'CENS:DATE':
254                return I18N::translate('Census date');
255            case 'CENS:PLAC':
256                return I18N::translate('Census place');
257            case 'CHAN':
258                return
259                /* I18N: gedcom tag CHAN */
260                I18N::translate('Last change');
261            case 'CHAN:DATE':
262                return
263                /* I18N: gedcom tag CHAN:DATE */
264                I18N::translate('Date of last change');
265            case 'CHAN:_WT_USER':
266                return
267                /* I18N: gedcom tag CHAN:_WT_USER */
268                I18N::translate('Author of last change');
269            case 'CHAR':
270                return
271                /* I18N: gedcom tag CHAR */
272                I18N::translate('Character set');
273            case 'CHIL':
274                return
275                /* I18N: gedcom tag CHIL */
276                I18N::translate('Child');
277            case 'CHR':
278                return
279                /* I18N: gedcom tag CHR */
280                I18N::translate('Christening');
281            case 'CHR:DATE':
282                return I18N::translate('Date of christening');
283            case 'CHR:PLAC':
284                return I18N::translate('Place of christening');
285            case 'CHRA':
286                return
287                /* I18N: gedcom tag CHRA */
288                I18N::translate('Adult christening');
289            case 'CITN':
290                return
291                /* I18N: gedcom tag CITN */
292                I18N::translate('Citizenship');
293            case 'CITY':
294                return
295                /* I18N: gedcom tag CITY */
296                I18N::translate('City');
297            case 'COMM':
298                return
299                /* I18N: gedcom tag COMM */
300                I18N::translate('Comment');
301            case 'CONC':
302                return
303                /* I18N: gedcom tag CONC */
304                I18N::translate('Concatenation');
305            case 'CONT':
306                return
307                /* I18N: gedcom tag CONT */
308                I18N::translate('Continued');
309            case 'CONF':
310                return
311                /* I18N: gedcom tag CONF */
312                I18N::translate('Confirmation');
313            case 'CONF:DATE':
314                return I18N::translate('Date of confirmation');
315            case 'CONF:PLAC':
316                return I18N::translate('Place of confirmation');
317            case 'CONL':
318                return
319                /* I18N: gedcom tag CONL. LDS = Church of Latter Day Saints. */
320                I18N::translate('LDS confirmation');
321            case 'COPR':
322                return
323                /* I18N: gedcom tag COPR */
324                I18N::translate('Copyright');
325            case 'CORP':
326                return
327                /* I18N: gedcom tag CORP */
328                I18N::translate('Corporation');
329            case 'CREM':
330                return
331                /* I18N: gedcom tag CREM */
332                I18N::translate('Cremation');
333            case 'CREM:DATE':
334                return I18N::translate('Date of cremation');
335            case 'CREM:PLAC':
336                return I18N::translate('Place of cremation');
337            case 'CTRY':
338                return
339                /* I18N: gedcom tag CTRY */
340                I18N::translate('Country');
341            case 'DATA':
342                return
343                /* I18N: gedcom tag DATA */
344                I18N::translate('Data');
345            case 'DATA:DATE':
346                return I18N::translate('Date of entry in original source');
347            case 'DATE':
348                return
349                /* I18N: gedcom tag DATE */
350                I18N::translate('Date');
351            case 'DEAT':
352                return
353                /* I18N: gedcom tag DEAT */
354                I18N::translate('Death');
355            case 'DEAT:CAUS':
356                return I18N::translate('Cause of death');
357            case 'DEAT:DATE':
358                return I18N::translate('Date of death');
359            case 'DEAT:PLAC':
360                return I18N::translate('Place of death');
361            case 'DESC':
362                return
363                /* I18N: gedcom tag DESC */
364                I18N::translate('Descendants');
365            case 'DESI':
366                return
367                /* I18N: gedcom tag DESI */
368                I18N::translate('Descendants interest');
369            case 'DEST':
370                return
371                /* I18N: gedcom tag DEST */
372                I18N::translate('Destination');
373            case 'DIV':
374                return
375                /* I18N: gedcom tag DIV */
376                I18N::translate('Divorce');
377            case 'DIVF':
378                return
379                /* I18N: gedcom tag DIVF */
380                I18N::translate('Divorce filed');
381            case 'DSCR':
382                return
383                /* I18N: gedcom tag DSCR */
384                I18N::translate('Description');
385            case 'EDUC':
386                return
387                /* I18N: gedcom tag EDUC */
388                I18N::translate('Education');
389            case 'EDUC:AGNC':
390                return I18N::translate('School or college');
391            case 'EMAI':
392                return
393                /* I18N: gedcom tag EMAI */
394                I18N::translate('Email address');
395            case 'EMAIL':
396                return
397                /* I18N: gedcom tag EMAIL */
398                I18N::translate('Email address');
399            case 'EMAL':
400                return
401                /* I18N: gedcom tag EMAL */
402                I18N::translate('Email address');
403            case 'EMIG':
404                return
405                /* I18N: gedcom tag EMIG */
406                I18N::translate('Emigration');
407            case 'EMIG:DATE':
408                return I18N::translate('Date of emigration');
409            case 'EMIG:PLAC':
410                return I18N::translate('Place of emigration');
411            case 'ENDL':
412                return
413                /* I18N: gedcom tag ENDL. LDS = Church of Latter Day Saints. */
414                I18N::translate('LDS endowment');
415            case 'ENDL:DATE':
416                return /* I18N: LDS = Church of Latter Day Saints. */ I18N::translate('Date of LDS endowment');
417            case 'ENDL:PLAC':
418                return /* I18N: LDS = Church of Latter Day Saints. */ I18N::translate('Place of LDS endowment');
419            case 'ENGA':
420                return
421                /* I18N: gedcom tag ENGA */
422                I18N::translate('Engagement');
423            case 'ENGA:DATE':
424                return I18N::translate('Date of engagement');
425            case 'ENGA:PLAC':
426                return I18N::translate('Place of engagement');
427            case 'EVEN':
428                return
429                /* I18N: gedcom tag EVEN */
430                I18N::translate('Event');
431            case 'EVEN:DATE':
432                return I18N::translate('Date of event');
433            case 'EVEN:PLAC':
434                return I18N::translate('Place of event');
435            case 'EVEN:TYPE':
436                return I18N::translate('Type of event');
437            case 'FACT':
438                return
439                /* I18N: gedcom tag FACT */
440                I18N::translate('Fact');
441            case 'FACT:TYPE':
442                return I18N::translate('Type of fact');
443            case 'FAM':
444                return
445                /* I18N: gedcom tag FAM */
446                I18N::translate('Family');
447            case 'FAMC':
448                return
449                /* I18N: gedcom tag FAMC */
450                I18N::translate('Family as a child');
451            case 'FAMF':
452                return
453                /* I18N: gedcom tag FAMF */
454                I18N::translate('Family file');
455            case 'FAMS':
456                return
457                /* I18N: gedcom tag FAMS */
458                I18N::translate('Family as a spouse');
459            case 'FAMS:CENS:DATE':
460                return I18N::translate('Spouse census date');
461            case 'FAMS:CENS:PLAC':
462                return I18N::translate('Spouse census place');
463            case 'FAMS:DIV:DATE':
464                return I18N::translate('Date of divorce');
465            case 'FAMS:MARR:DATE':
466                return I18N::translate('Date of marriage');
467            case 'FAMS:MARR:PLAC':
468                return I18N::translate('Place of marriage');
469            case 'FAMS:NOTE':
470                return I18N::translate('Spouse note');
471            case 'FAMS:SLGS:DATE':
472                return /* I18N: LDS = Church of Latter Day Saints. */ I18N::translate('Date of LDS spouse sealing');
473            case 'FAMS:SLGS:PLAC':
474                return /* I18N: LDS = Church of Latter Day Saints. */ I18N::translate('Place of LDS spouse sealing');
475            case 'FAX':
476                return
477                /* I18N: gedcom tag FAX */
478                I18N::translate('Fax');
479            case 'FCOM':
480                return
481                /* I18N: gedcom tag FCOM */
482                I18N::translate('First communion');
483            case 'FCOM:DATE':
484                return I18N::translate('Date of first communion');
485            case 'FCOM:PLAC':
486                return I18N::translate('Place of first communion');
487            case 'FILE':
488                return
489                /* I18N: gedcom tag FILE */
490                I18N::translate('Filename');
491            case 'FONE':
492                return
493                /* I18N: gedcom tag FONE */
494                I18N::translate('Phonetic');
495            case 'FORM':
496                return
497                /* I18N: gedcom tag FORM */
498                I18N::translate('Format');
499            case 'GEDC':
500                return
501                /* I18N: gedcom tag GEDC */
502                I18N::translate('GEDCOM file');
503            case 'GIVN':
504                return
505                /* I18N: gedcom tag GIVN */
506                I18N::translate('Given names');
507            case 'GRAD':
508                return
509                /* I18N: gedcom tag GRAD */
510                I18N::translate('Graduation');
511            case 'HEAD':
512                return
513                /* I18N: gedcom tag HEAD */
514                I18N::translate('Header');
515            case 'HUSB':
516                return
517                /* I18N: gedcom tag HUSB */
518                I18N::translate('Husband');
519            case 'IDNO':
520                return
521                /* I18N: gedcom tag IDNO */
522                I18N::translate('Identification number');
523            case 'IMMI':
524                return
525                /* I18N: gedcom tag IMMI */
526                I18N::translate('Immigration');
527            case 'IMMI:DATE':
528                return I18N::translate('Date of immigration');
529            case 'IMMI:PLAC':
530                return I18N::translate('Place of immigration');
531            case 'INDI':
532                return
533                /* I18N: gedcom tag INDI */
534                I18N::translate('Individual');
535            case 'INFL':
536                return
537                /* I18N: gedcom tag INFL */
538                I18N::translate('Infant');
539            case 'LANG':
540                return
541                /* I18N: gedcom tag LANG */
542                I18N::translate('Language');
543            case 'LATI':
544                return
545                /* I18N: gedcom tag LATI */
546                I18N::translate('Latitude');
547            case 'LEGA':
548                return
549                /* I18N: gedcom tag LEGA */
550                I18N::translate('Legatee');
551            case 'LONG':
552                return
553                /* I18N: gedcom tag LONG */
554                I18N::translate('Longitude');
555            case 'MAP':
556                return
557                /* I18N: gedcom tag MAP */
558                I18N::translate('Map');
559            case 'MARB':
560                return
561                /* I18N: gedcom tag MARB */
562                I18N::translate('Marriage banns');
563            case 'MARB:DATE':
564                return I18N::translate('Date of marriage banns');
565            case 'MARB:PLAC':
566                return I18N::translate('Place of marriage banns');
567            case 'MARC':
568                return
569                /* I18N: gedcom tag MARC */
570                I18N::translate('Marriage contract');
571            case 'MARL':
572                return
573                /* I18N: gedcom tag MARL */
574                I18N::translate('Marriage license');
575            case 'MARR':
576                return
577                /* I18N: gedcom tag MARR */
578                I18N::translate('Marriage');
579            case 'MARR:DATE':
580                return I18N::translate('Date of marriage');
581            case 'MARR:PLAC':
582                return I18N::translate('Place of marriage');
583            case 'MARR_CIVIL':
584                return I18N::translate('Civil marriage');
585            case 'MARR_PARTNERS':
586                return I18N::translate('Registered partnership');
587            case 'MARR_RELIGIOUS':
588                return I18N::translate('Religious marriage');
589            case 'MARR_UNKNOWN':
590                return I18N::translate('Marriage type unknown');
591            case 'MARS':
592                return
593                /* I18N: gedcom tag MARS */
594                I18N::translate('Marriage settlement');
595            case 'MEDI':
596                return
597                /* I18N: gedcom tag MEDI */
598                I18N::translate('Media type');
599            case 'NAME':
600                if ($record instanceof Repository) {
601                    return
602                    /* I18N: gedcom tag REPO:NAME */
603                    I18N::translateContext('Repository', 'Name');
604                } else {
605                    return
606                    /* I18N: gedcom tag NAME */
607                    I18N::translate('Name');
608                }
609            case 'NAME:FONE':
610                return I18N::translate('Phonetic name');
611            case 'NAME:_HEB':
612                return I18N::translate('Name in Hebrew');
613            case 'NATI':
614                return
615                /* I18N: gedcom tag NATI */
616                I18N::translate('Nationality');
617            case 'NATU':
618                return
619                /* I18N: gedcom tag NATU */
620                I18N::translate('Naturalization');
621            case 'NATU:DATE':
622                return I18N::translate('Date of naturalization');
623            case 'NATU:PLAC':
624                return I18N::translate('Place of naturalization');
625            case 'NCHI':
626                return
627                /* I18N: gedcom tag NCHI */
628                I18N::translate('Number of children');
629            case 'NICK':
630                return
631                /* I18N: gedcom tag NICK */
632                I18N::translate('Nickname');
633            case 'NMR':
634                return
635                /* I18N: gedcom tag NMR */
636                I18N::translate('Number of marriages');
637            case 'NOTE':
638                return
639                /* I18N: gedcom tag NOTE */
640                I18N::translate('Note');
641            case 'NPFX':
642                return
643                /* I18N: gedcom tag NPFX */
644                I18N::translate('Name prefix');
645            case 'NSFX':
646                return
647                /* I18N: gedcom tag NSFX */
648                I18N::translate('Name suffix');
649            case 'OBJE':
650                return
651                /* I18N: gedcom tag OBJE */
652                I18N::translate('Media object');
653            case 'OCCU':
654                return
655                /* I18N: gedcom tag OCCU */
656                I18N::translate('Occupation');
657            case 'OCCU:AGNC':
658                return I18N::translate('Employer');
659            case 'ORDI':
660                return
661                /* I18N: gedcom tag ORDI */
662                I18N::translate('Ordinance');
663            case 'ORDN':
664                return
665                /* I18N: gedcom tag ORDN */
666                I18N::translate('Ordination');
667            case 'ORDN:AGNC':
668                return I18N::translate('Religious institution');
669            case 'ORDN:DATE':
670                return I18N::translate('Date of ordination');
671            case 'ORDN:PLAC':
672                return I18N::translate('Place of ordination');
673            case 'PAGE':
674                return
675                /* I18N: gedcom tag PAGE */
676                I18N::translate('Citation details');
677            case 'PEDI':
678                return
679                /* I18N: gedcom tag PEDI */
680                I18N::translate('Relationship to parents');
681            case 'PHON':
682                return
683                /* I18N: gedcom tag PHON */
684                I18N::translate('Phone');
685            case 'PLAC':
686                return
687                /* I18N: gedcom tag PLAC */
688                I18N::translate('Place');
689            case 'PLAC:FONE':
690                return I18N::translate('Phonetic place');
691            case 'PLAC:ROMN':
692                return I18N::translate('Romanized place');
693            case 'PLAC:_HEB':
694                return I18N::translate('Place in Hebrew');
695            case 'POST':
696                return
697                /* I18N: gedcom tag POST */
698                I18N::translate('Postal code');
699            case 'PROB':
700                return
701                /* I18N: gedcom tag PROB */
702                I18N::translate('Probate');
703            case 'PROP':
704                return
705                /* I18N: gedcom tag PROP */
706                I18N::translate('Property');
707            case 'PUBL':
708                return
709                /* I18N: gedcom tag PUBL */
710                I18N::translate('Publication');
711            case 'QUAY':
712                return
713                /* I18N: gedcom tag QUAY */
714                I18N::translate('Quality of data');
715            case 'REFN':
716                return
717                /* I18N: gedcom tag REFN */
718                I18N::translate('Reference number');
719            case 'RELA':
720                return
721                /* I18N: gedcom tag RELA */
722                I18N::translate('Relationship');
723            case 'RELI':
724                return
725                /* I18N: gedcom tag RELI */
726                I18N::translate('Religion');
727            case 'REPO':
728                return
729                /* I18N: gedcom tag REPO */
730                I18N::translate('Repository');
731            case 'RESI':
732                return
733                /* I18N: gedcom tag RESI */
734                I18N::translate('Residence');
735            case 'RESI:DATE':
736                return I18N::translate('Date of residence');
737            case 'RESI:PLAC':
738                return I18N::translate('Place of residence');
739            case 'RESN':
740                return
741                /* I18N: gedcom tag RESN */
742                I18N::translate('Restriction');
743            case 'RETI':
744                return
745                /* I18N: gedcom tag RETI */
746                I18N::translate('Retirement');
747            case 'RETI:AGNC':
748                return I18N::translate('Employer');
749            case 'RFN':
750                return
751                /* I18N: gedcom tag RFN */
752                I18N::translate('Record file number');
753            case 'RIN':
754                return
755                /* I18N: gedcom tag RIN */
756                I18N::translate('Record ID number');
757            case 'ROLE':
758                return
759                /* I18N: gedcom tag ROLE */
760                I18N::translate('Role');
761            case 'ROMN':
762                return
763                /* I18N: gedcom tag ROMN */
764                I18N::translate('Romanized');
765            case 'SERV':
766                return
767                /* I18N: gedcom tag SERV */
768                I18N::translate('Remote server');
769            case 'SEX':
770                return
771                /* I18N: gedcom tag SEX */
772                I18N::translate('Gender');
773            case 'SHARED_NOTE':
774                return I18N::translate('Shared note');
775            case 'SLGC':
776                return
777                /* I18N: gedcom tag SLGC. LDS = Church of Latter Day Saints. */
778                I18N::translate('LDS child sealing');
779            case 'SLGC:DATE':
780                return /* I18N: LDS = Church of Latter Day Saints. */ I18N::translate('Date of LDS child sealing');
781            case 'SLGC:PLAC':
782                return /* I18N: LDS = Church of Latter Day Saints. */ I18N::translate('Place of LDS child sealing');
783            case 'SLGS':
784                return
785                /* I18N: gedcom tag SLGS. LDS = Church of Latter Day Saints. */
786                I18N::translate('LDS spouse sealing');
787            case 'SOUR':
788                return
789                /* I18N: gedcom tag SOUR */
790                I18N::translate('Source');
791            case 'SPFX':
792                return
793                /* I18N: gedcom tag SPFX */
794                I18N::translate('Surname prefix');
795            case 'SSN':
796                return
797                /* I18N: gedcom tag SSN */
798                I18N::translate('Social security number');
799            case 'STAE':
800                return
801                /* I18N: gedcom tag STAE */
802                I18N::translate('State');
803            case 'STAT':
804                return
805                /* I18N: gedcom tag STAT */
806                I18N::translate('Status');
807            case 'STAT:DATE':
808                return I18N::translate('Status change date');
809            case 'SUBM':
810                return
811                /* I18N: gedcom tag SUBM */
812                I18N::translate('Submitter');
813            case 'SUBN':
814                return
815                /* I18N: gedcom tag SUBN */
816                I18N::translate('Submission');
817            case 'SURN':
818                return
819                /* I18N: gedcom tag SURN */
820                I18N::translate('Surname');
821            case 'TEMP':
822                return
823                /* I18N: gedcom tag TEMP */
824                I18N::translate('Temple');
825            case 'TEXT':
826                return
827                /* I18N: gedcom tag TEXT */
828                I18N::translate('Text');
829            case 'TIME':
830                return
831                /* I18N: gedcom tag TIME */
832                I18N::translate('Time');
833            case 'TITL':
834                return
835                /* I18N: gedcom tag TITL */
836                I18N::translate('Title');
837            case 'TITL:FONE':
838                return I18N::translate('Phonetic title');
839            case 'TITL:ROMN':
840                return I18N::translate('Romanized title');
841            case 'TITL:_HEB':
842                return I18N::translate('Title in Hebrew');
843            case 'TRLR':
844                return
845                /* I18N: gedcom tag TRLR */
846                I18N::translate('Trailer');
847            case 'TYPE':
848                return
849                /* I18N: gedcom tag TYPE */
850                I18N::translate('Type');
851            case 'URL':
852                return
853                /* I18N: gedcom tag URL (A web address / URL) */
854                I18N::translate('URL');
855            case 'VERS':
856                return
857                /* I18N: gedcom tag VERS */
858                I18N::translate('Version');
859            case 'WIFE':
860                return
861                /* I18N: gedcom tag WIFE */
862                I18N::translate('Wife');
863            case 'WILL':
864                return
865                /* I18N: gedcom tag WILL */
866                I18N::translate('Will');
867            case 'WWW':
868                return
869                /* I18N: gedcom tag WWW (A web address / URL) */
870                I18N::translate('URL');
871            case '_ADOP_CHIL':
872                switch ($sex) {
873                    case 'M':
874                        return I18N::translate('Adoption of a son');
875                    case 'F':
876                    return I18N::translate('Adoption of a daughter');
877                    default:
878                    return I18N::translate('Adoption of a child');
879                }
880            case '_ADOP_GCHI':
881                switch ($sex) {
882                    case 'M':
883                        return I18N::translate('Adoption of a grandson');
884                    case 'F':
885                    return I18N::translate('Adoption of a granddaughter');
886                    default:
887                    return I18N::translate('Adoption of a grandchild');
888                }
889            case '_ADOP_GCH1':
890                switch ($sex) {
891                    case 'M':
892                        return I18N::translateContext('daughter’s son', 'Adoption of a grandson');
893                    case 'F':
894                    return I18N::translateContext('daughter’s daughter', 'Adoption of a granddaughter');
895                    default:
896                    return I18N::translate('Adoption of a grandchild');
897                }
898            case '_ADOP_GCH2':
899                switch ($sex) {
900                    case 'M':
901                        return I18N::translateContext('son’s son', 'Adoption of a grandson');
902                    case 'F':
903                    return I18N::translateContext('son’s daughter', 'Adoption of a granddaughter');
904                    default:
905                    return I18N::translate('Adoption of a grandchild');
906                }
907            case '_ADOP_HSIB':
908                switch ($sex) {
909                    case 'M':
910                        return I18N::translate('Adoption of a half-brother');
911                    case 'F':
912                    return I18N::translate('Adoption of a half-sister');
913                    default:
914                    return I18N::translate('Adoption of a half-sibling');
915                }
916            case '_ADOP_SIBL':
917                switch ($sex) {
918                    case 'M':
919                        return I18N::translate('Adoption of a brother');
920                    case 'F':
921                    return I18N::translate('Adoption of a sister');
922                    default:
923                    return I18N::translate('Adoption of a sibling');
924                }
925            case '_ADPF':
926                switch ($sex) {
927                    case 'M':
928                        return
929                    /* I18N: gedcom tag _ADPF */
930                    I18N::translateContext('MALE', 'Adopted by father');
931                    case 'F':
932                    return
933                    /* I18N: gedcom tag _ADPF */
934                    I18N::translateContext('FEMALE', 'Adopted by father');
935                    default:
936                    return
937                    /* I18N: gedcom tag _ADPF */
938                    I18N::translate('Adopted by father');
939                }
940            case '_ADPM':
941                switch ($sex) {
942                    case 'M':
943                        return
944                    /* I18N: gedcom tag _ADPM */
945                    I18N::translateContext('MALE', 'Adopted by mother');
946                    case 'F':
947                    return
948                    /* I18N: gedcom tag _ADPM */
949                    I18N::translateContext('FEMALE', 'Adopted by mother');
950                    default:
951                    return
952                    /* I18N: gedcom tag _ADPM */
953                    I18N::translate('Adopted by mother');
954                }
955            case '_AKA':
956            case '_AKAN':
957                switch ($sex) {
958                    case 'M':
959                        return
960                    /* I18N: gedcom tag _AKA */
961                    I18N::translateContext('MALE', 'Also known as');
962                    case 'F':
963                    return
964                    /* I18N: gedcom tag _AKA */
965                    I18N::translateContext('FEMALE', 'Also known as');
966                    default:
967                    return
968                    /* I18N: gedcom tag _AKA */
969                    I18N::translate('Also known as');
970                }
971            case '_ASSO':
972                return
973                /* I18N: gedcom tag _ASSO */
974                I18N::translate('Associate'); /* see also ASSO */
975            case '_BAPM_CHIL':
976                switch ($sex) {
977                    case 'M':
978                        return I18N::translate('Baptism of a son');
979                    case 'F':
980                    return I18N::translate('Baptism of a daughter');
981                    default:
982                    return I18N::translate('Baptism of a child');
983                }
984            case '_BAPM_GCHI':
985                switch ($sex) {
986                    case 'M':
987                        return I18N::translate('Baptism of a grandson');
988                    case 'F':
989                    return I18N::translate('Baptism of a granddaughter');
990                    default:
991                    return I18N::translate('Baptism of a grandchild');
992                }
993            case '_BAPM_GCH1':
994                switch ($sex) {
995                    case 'M':
996                        return I18N::translateContext('daughter’s son', 'Baptism of a grandson');
997                    case 'F':
998                    return I18N::translateContext('daughter’s daughter', 'Baptism of a granddaughter');
999                    default:
1000                    return I18N::translate('Baptism of a grandchild');
1001                }
1002            case '_BAPM_GCH2':
1003                switch ($sex) {
1004                    case 'M':
1005                        return I18N::translateContext('son’s son', 'Baptism of a grandson');
1006                    case 'F':
1007                    return I18N::translateContext('son’s daughter', 'Baptism of a granddaughter');
1008                    default:
1009                    return I18N::translate('Baptism of a grandchild');
1010                }
1011            case '_BAPM_HSIB':
1012                switch ($sex) {
1013                    case 'M':
1014                        return I18N::translate('Baptism of a half-brother');
1015                    case 'F':
1016                    return I18N::translate('Baptism of a half-sister');
1017                    default:
1018                    return I18N::translate('Baptism of a half-sibling');
1019                }
1020            case '_BAPM_SIBL':
1021                switch ($sex) {
1022                    case 'M':
1023                        return I18N::translate('Baptism of a brother');
1024                    case 'F':
1025                    return I18N::translate('Baptism of a sister');
1026                    default:
1027                    return I18N::translate('Baptism of a sibling');
1028                }
1029            case '_BIBL':
1030                return
1031                /* I18N: gedcom tag _BIBL */
1032                I18N::translate('Bibliography');
1033            case '_BIRT_CHIL':
1034                switch ($sex) {
1035                    case 'M':
1036                        return I18N::translate('Birth of a son');
1037                    case 'F':
1038                    return I18N::translate('Birth of a daughter');
1039                    default:
1040                    return I18N::translate('Birth of a child');
1041                }
1042            case '_BIRT_GCHI':
1043                switch ($sex) {
1044                    case 'M':
1045                        return I18N::translate('Birth of a grandson');
1046                    case 'F':
1047                    return I18N::translate('Birth of a granddaughter');
1048                    default:
1049                    return I18N::translate('Birth of a grandchild');
1050                }
1051            case '_BIRT_GCH1':
1052                switch ($sex) {
1053                    case 'M':
1054                        return I18N::translateContext('daughter’s son', 'Birth of a grandson');
1055                    case 'F':
1056                    return I18N::translateContext('daughter’s daughter', 'Birth of a granddaughter');
1057                    default:
1058                    return I18N::translate('Birth of a grandchild');
1059                }
1060            case '_BIRT_GCH2':
1061                switch ($sex) {
1062                    case 'M':
1063                        return I18N::translateContext('son’s son', 'Birth of a grandson');
1064                    case 'F':
1065                    return I18N::translateContext('son’s daughter', 'Birth of a granddaughter');
1066                    default:
1067                    return I18N::translate('Birth of a grandchild');
1068                }
1069            case '_BIRT_HSIB':
1070                switch ($sex) {
1071                    case 'M':
1072                        return I18N::translate('Birth of a half-brother');
1073                    case 'F':
1074                    return I18N::translate('Birth of a half-sister');
1075                    default:
1076                    return I18N::translate('Birth of a half-sibling');
1077                }
1078            case '_BIRT_SIBL':
1079                switch ($sex) {
1080                    case 'M':
1081                        return I18N::translate('Birth of a brother');
1082                    case 'F':
1083                    return I18N::translate('Birth of a sister');
1084                    default:
1085                    return I18N::translate('Birth of a sibling');
1086                }
1087            case '_BRTM':
1088                return
1089                /* I18N: gedcom tag _BRTM */
1090                I18N::translate('Brit milah');
1091            case '_BRTM:DATE':
1092                return I18N::translate('Date of brit milah');
1093            case '_BRTM:PLAC':
1094                return I18N::translate('Place of brit milah');
1095            case '_BURI_CHIL':
1096                switch ($sex) {
1097                    case 'M':
1098                        return I18N::translate('Burial of a son');
1099                    case 'F':
1100                    return I18N::translate('Burial of a daughter');
1101                    default:
1102                    return I18N::translate('Burial of a child');
1103                }
1104            case '_BURI_GCHI':
1105                switch ($sex) {
1106                    case 'M':
1107                        return I18N::translate('Burial of a grandson');
1108                    case 'F':
1109                    return I18N::translate('Burial of a granddaughter');
1110                    default:
1111                    return I18N::translate('Burial of a grandchild');
1112                }
1113            case '_BURI_GCH1':
1114                switch ($sex) {
1115                    case 'M':
1116                        return I18N::translateContext('daughter’s son', 'Burial of a grandson');
1117                    case 'F':
1118                    return I18N::translateContext('daughter’s daughter', 'Burial of a granddaughter');
1119                    default:
1120                    return I18N::translate('Burial of a grandchild');
1121                }
1122            case '_BURI_GCH2':
1123                switch ($sex) {
1124                    case 'M':
1125                        return I18N::translateContext('son’s son', 'Burial of a grandson');
1126                    case 'F':
1127                    return I18N::translateContext('son’s daughter', 'Burial of a granddaughter');
1128                    default:
1129                    return I18N::translate('Burial of a grandchild');
1130                }
1131            case '_BURI_GPAR':
1132                switch ($sex) {
1133                    case 'M':
1134                        return I18N::translate('Burial of a grandfather');
1135                    case 'F':
1136                    return I18N::translate('Burial of a grandmother');
1137                    default:
1138                    return I18N::translate('Burial of a grandparent');
1139                }
1140            case '_BURI_GPA1':
1141                switch ($sex) {
1142                    case 'M':
1143                        return I18N::translate('Burial of a paternal grandfather');
1144                    case 'F':
1145                    return I18N::translate('Burial of a paternal grandmother');
1146                    default:
1147                    return I18N::translate('Burial of a paternal grandparent');
1148                }
1149            case '_BURI_GPA2':
1150                switch ($sex) {
1151                    case 'M':
1152                        return I18N::translate('Burial of a maternal grandfather');
1153                    case 'F':
1154                    return I18N::translate('Burial of a maternal grandmother');
1155                    default:
1156                    return I18N::translate('Burial of a maternal grandparent');
1157                }
1158            case '_BURI_HSIB':
1159                switch ($sex) {
1160                    case 'M':
1161                        return I18N::translate('Burial of a half-brother');
1162                    case 'F':
1163                    return I18N::translate('Burial of a half-sister');
1164                    default:
1165                    return I18N::translate('Burial of a half-sibling');
1166                }
1167            case '_BURI_PARE':
1168                switch ($sex) {
1169                    case 'M':
1170                        return I18N::translate('Burial of a father');
1171                    case 'F':
1172                    return I18N::translate('Burial of a mother');
1173                    default:
1174                    return I18N::translate('Burial of a parent');
1175                }
1176            case '_BURI_SIBL':
1177                switch ($sex) {
1178                    case 'M':
1179                        return I18N::translate('Burial of a brother');
1180                    case 'F':
1181                    return I18N::translate('Burial of a sister');
1182                    default:
1183                    return I18N::translate('Burial of a sibling');
1184                }
1185            case '_BURI_SPOU':
1186                switch ($sex) {
1187                    case 'M':
1188                        return I18N::translate('Burial of a husband');
1189                    case 'F':
1190                    return I18N::translate('Burial of a wife');
1191                    default:
1192                    return I18N::translate('Burial of a spouse');
1193                }
1194            case '_CHR_CHIL':
1195                switch ($sex) {
1196                    case 'M':
1197                        return I18N::translate('Christening of a son');
1198                    case 'F':
1199                    return I18N::translate('Christening of a daughter');
1200                    default:
1201                    return I18N::translate('Christening of a child');
1202                }
1203            case '_CHR_GCHI':
1204                switch ($sex) {
1205                    case 'M':
1206                        return I18N::translate('Christening of a grandson');
1207                    case 'F':
1208                    return I18N::translate('Christening of a granddaughter');
1209                    default:
1210                    return I18N::translate('Christening of a grandchild');
1211                }
1212            case '_CHR_GCH1':
1213                switch ($sex) {
1214                    case 'M':
1215                        return I18N::translateContext('daughter’s son', 'Christening of a grandson');
1216                    case 'F':
1217                    return I18N::translateContext('daughter’s daughter', 'Christening of a granddaughter');
1218                    default:
1219                    return I18N::translate('Christening of a grandchild');
1220                }
1221            case '_CHR_GCH2':
1222                switch ($sex) {
1223                    case 'M':
1224                        return I18N::translateContext('son’s son', 'Christening of a grandson');
1225                    case 'F':
1226                    return I18N::translateContext('son’s daughter', 'Christening of a granddaughter');
1227                    default:
1228                    return I18N::translate('Christening of a grandchild');
1229                }
1230            case '_CHR_HSIB':
1231                switch ($sex) {
1232                    case 'M':
1233                        return I18N::translate('Christening of a half-brother');
1234                    case 'F':
1235                    return I18N::translate('Christening of a half-sister');
1236                    default:
1237                    return I18N::translate('Christening of a half-sibling');
1238                }
1239            case '_CHR_SIBL':
1240                switch ($sex) {
1241                    case 'M':
1242                        return I18N::translate('Christening of a brother');
1243                    case 'F':
1244                    return I18N::translate('Christening of a sister');
1245                    default:
1246                    return I18N::translate('Christening of a sibling');
1247                }
1248            case '_COML':
1249                return
1250                /* I18N: gedcom tag _COML */
1251                I18N::translate('Common law marriage');
1252            case '_CREM_CHIL':
1253                switch ($sex) {
1254                    case 'M':
1255                        return I18N::translate('Cremation of a son');
1256                    case 'F':
1257                    return I18N::translate('Cremation of a daughter');
1258                    default:
1259                    return I18N::translate('Cremation of a child');
1260                }
1261            case '_CREM_GCHI':
1262                switch ($sex) {
1263                    case 'M':
1264                        return I18N::translate('Cremation of a grandson');
1265                    case 'F':
1266                    return I18N::translate('Cremation of a granddaughter');
1267                    default:
1268                    return I18N::translate('Cremation of a grandchild');
1269                }
1270            case '_CREM_GCH1':
1271                switch ($sex) {
1272                    case 'M':
1273                        return I18N::translateContext('daughter’s son', 'Cremation of a grandson');
1274                    case 'F':
1275                    return I18N::translateContext('daughter’s daughter', 'Cremation of a granddaughter');
1276                    default:
1277                    return I18N::translate('Cremation of a grandchild');
1278                }
1279            case '_CREM_GCH2':
1280                switch ($sex) {
1281                    case 'M':
1282                        return I18N::translateContext('son’s son', 'Cremation of a grandson');
1283                    case 'F':
1284                    return I18N::translateContext('son’s daughter', 'Cremation of a granddaughter');
1285                    default:
1286                    return I18N::translate('Cremation of a grandchild');
1287                }
1288            case '_CREM_GPAR':
1289                switch ($sex) {
1290                    case 'M':
1291                        return I18N::translate('Cremation of a grandfather');
1292                    case 'F':
1293                    return I18N::translate('Cremation of a grandmother');
1294                    default:
1295                    return I18N::translate('Cremation of a grand-parent');
1296                }
1297            case '_CREM_GPA1':
1298                switch ($sex) {
1299                    case 'M':
1300                        return I18N::translate('Cremation of a paternal grandfather');
1301                    case 'F':
1302                    return I18N::translate('Cremation of a paternal grandmother');
1303                    default:
1304                    return I18N::translate('Cremation of a grand-parent');
1305                }
1306            case '_CREM_GPA2':
1307                switch ($sex) {
1308                    case 'M':
1309                        return I18N::translate('Cremation of a maternal grandfather');
1310                    case 'F':
1311                    return I18N::translate('Cremation of a maternal grandmother');
1312                    default:
1313                    return I18N::translate('Cremation of a grand-parent');
1314                }
1315            case '_CREM_HSIB':
1316                switch ($sex) {
1317                    case 'M':
1318                        return I18N::translate('Cremation of a half-brother');
1319                    case 'F':
1320                    return I18N::translate('Cremation of a half-sister');
1321                    default:
1322                    return I18N::translate('Cremation of a half-sibling');
1323                }
1324            case '_CREM_PARE':
1325                switch ($sex) {
1326                    case 'M':
1327                        return I18N::translate('Cremation of a father');
1328                    case 'F':
1329                    return I18N::translate('Cremation of a mother');
1330                    default:
1331                    return I18N::translate('Cremation of a parent');
1332                }
1333            case '_CREM_SIBL':
1334                switch ($sex) {
1335                    case 'M':
1336                        return I18N::translate('Cremation of a brother');
1337                    case 'F':
1338                    return I18N::translate('Cremation of a sister');
1339                    default:
1340                    return I18N::translate('Cremation of a sibling');
1341                }
1342            case '_CREM_SPOU':
1343                switch ($sex) {
1344                    case 'M':
1345                        return I18N::translate('Cremation of a husband');
1346                    case 'F':
1347                    return I18N::translate('Cremation of a wife');
1348                    default:
1349                    return I18N::translate('Cremation of a spouse');
1350                }
1351            case '_DBID':
1352                return
1353                /* I18N: gedcom tag _DBID */
1354                I18N::translate('Linked database ID');
1355            case '_DEAT_CHIL':
1356                switch ($sex) {
1357                    case 'M':
1358                        return I18N::translate('Death of a son');
1359                    case 'F':
1360                    return I18N::translate('Death of a daughter');
1361                    default:
1362                    return I18N::translate('Death of a child');
1363                }
1364            case '_DEAT_GCHI':
1365                switch ($sex) {
1366                    case 'M':
1367                        return I18N::translate('Death of a grandson');
1368                    case 'F':
1369                    return I18N::translate('Death of a granddaughter');
1370                    default:
1371                    return I18N::translate('Death of a grandchild');
1372                }
1373            case '_DEAT_GCH1':
1374                switch ($sex) {
1375                    case 'M':
1376                        return I18N::translateContext('daughter’s son', 'Death of a grandson');
1377                    case 'F':
1378                    return I18N::translateContext('daughter’s daughter', 'Death of a granddaughter');
1379                    default:
1380                    return I18N::translate('Death of a grandchild');
1381                }
1382            case '_DEAT_GCH2':
1383                switch ($sex) {
1384                    case 'M':
1385                        return I18N::translateContext('son’s son', 'Death of a grandson');
1386                    case 'F':
1387                    return I18N::translateContext('son’s daughter', 'Death of a granddaughter');
1388                    default:
1389                    return I18N::translate('Death of a grandchild');
1390                }
1391            case '_DEAT_GPAR':
1392                switch ($sex) {
1393                    case 'M':
1394                        return I18N::translate('Death of a grandfather');
1395                    case 'F':
1396                    return I18N::translate('Death of a grandmother');
1397                    default:
1398                    return I18N::translate('Death of a grand-parent');
1399                }
1400            case '_DEAT_GPA1':
1401                switch ($sex) {
1402                    case 'M':
1403                        return I18N::translate('Death of a paternal grandfather');
1404                    case 'F':
1405                    return I18N::translate('Death of a paternal grandmother');
1406                    default:
1407                    return I18N::translate('Death of a grand-parent');
1408                }
1409            case '_DEAT_GPA2':
1410                switch ($sex) {
1411                    case 'M':
1412                        return I18N::translate('Death of a maternal grandfather');
1413                    case 'F':
1414                    return I18N::translate('Death of a maternal grandmother');
1415                    default:
1416                    return I18N::translate('Death of a grand-parent');
1417                }
1418            case '_DEAT_HSIB':
1419                switch ($sex) {
1420                    case 'M':
1421                        return I18N::translate('Death of a half-brother');
1422                    case 'F':
1423                    return I18N::translate('Death of a half-sister');
1424                    default:
1425                    return I18N::translate('Death of a half-sibling');
1426                }
1427            case '_DEAT_PARE':
1428                switch ($sex) {
1429                    case 'M':
1430                        return I18N::translate('Death of a father');
1431                    case 'F':
1432                    return I18N::translate('Death of a mother');
1433                    default:
1434                    return I18N::translate('Death of a parent');
1435                }
1436            case '_DEAT_SIBL':
1437                switch ($sex) {
1438                    case 'M':
1439                        return I18N::translate('Death of a brother');
1440                    case 'F':
1441                    return I18N::translate('Death of a sister');
1442                    default:
1443                    return I18N::translate('Death of a sibling');
1444                }
1445            case '_DEAT_SPOU':
1446                switch ($sex) {
1447                    case 'M':
1448                        return I18N::translate('Death of a husband');
1449                    case 'F':
1450                    return I18N::translate('Death of a wife');
1451                    default:
1452                    return I18N::translate('Death of a spouse');
1453                }
1454            case '_DEG':
1455                return
1456                /* I18N: gedcom tag _DEG */
1457                I18N::translate('Degree');
1458            case '_DETS':
1459                return
1460                /* I18N: gedcom tag _DETS */
1461                I18N::translate('Death of one spouse');
1462            case '_DNA':
1463                return
1464                /* I18N: gedcom tag _DNA (from FTM 2010) */
1465                I18N::translate('DNA markers');
1466            case '_EMAIL':
1467                return
1468                /* I18N: gedcom tag _EMAIL */
1469                I18N::translate('Email address');
1470            case '_EYEC':
1471                return
1472                /* I18N: gedcom tag _EYEC */
1473                I18N::translate('Eye color');
1474            case '_FA1':
1475                return I18N::translate('Fact 1');
1476            case '_FA2':
1477                return I18N::translate('Fact 2');
1478            case '_FA3':
1479                return I18N::translate('Fact 3');
1480            case '_FA4':
1481                return I18N::translate('Fact 4');
1482            case '_FA5':
1483                return I18N::translate('Fact 5');
1484            case '_FA6':
1485                return I18N::translate('Fact 6');
1486            case '_FA7':
1487                return I18N::translate('Fact 7');
1488            case '_FA8':
1489                return I18N::translate('Fact 8');
1490            case '_FA9':
1491                return I18N::translate('Fact 9');
1492            case '_FA10':
1493                return I18N::translate('Fact 10');
1494            case '_FA11':
1495                return I18N::translate('Fact 11');
1496            case '_FA12':
1497                return I18N::translate('Fact 12');
1498            case '_FA13':
1499                return I18N::translate('Fact 13');
1500            case '_FNRL':
1501                return
1502                /* I18N: gedcom tag _FNRL */
1503                I18N::translate('Funeral');
1504            case '_FREL':
1505                return
1506                /* I18N: gedcom tag _FREL */
1507                I18N::translate('Relationship to father');
1508            case '_GEDF':
1509                return
1510                /* I18N: gedcom tag _GEDF */
1511                I18N::translate('GEDCOM file');
1512            case '_GODP':
1513                return
1514                /* I18N: gedcom tag _GODP */
1515                I18N::translate('Godparent');
1516            case '_HAIR':
1517                return
1518                /* I18N: gedcom tag _HAIR */
1519                I18N::translate('Hair color');
1520            case '_HEB':
1521                return
1522                /* I18N: gedcom tag _HEB */
1523                I18N::translate('Hebrew');
1524            case '_HEIG':
1525                return
1526                /* I18N: gedcom tag _HEIG */
1527                I18N::translate('Height');
1528            case '_HNM':
1529                return
1530                /* I18N: gedcom tag _HNM */
1531                I18N::translate('Hebrew name');
1532            case '_HOL':
1533                return
1534                /* I18N: gedcom tag _HOL */
1535                I18N::translate('Holocaust');
1536            case '_INTE':
1537                switch ($sex) {
1538                    case 'M':
1539                        return
1540                    /* I18N: gedcom tag _INTE */
1541                    I18N::translateContext('MALE', 'Interred');
1542                    case 'F':
1543                    return
1544                    /* I18N: gedcom tag _INTE */
1545                    I18N::translateContext('FEMALE', 'Interred');
1546                    default:
1547                    return
1548                    /* I18N: gedcom tag _INTE */
1549                    I18N::translate('Interred');
1550                }
1551            case '_LOC':
1552                return
1553                /* I18N: gedcom tag _LOC */
1554                I18N::translate('Location');
1555            case '_MARI':
1556                return
1557                /* I18N: gedcom tag _MARI */
1558                I18N::translate('Marriage intention');
1559            case '_MARNM':
1560                return
1561                /* I18N: gedcom tag _MARNM */
1562                I18N::translate('Married name');
1563            case '_PRIM':
1564                return
1565                /* I18N: gedcom tag _PRIM */
1566                I18N::translate('Highlighted image');
1567            case '_MARNM_SURN':
1568                return I18N::translate('Married surname');
1569            case '_MARR_CHIL':
1570                switch ($sex) {
1571                    case 'M':
1572                        return I18N::translate('Marriage of a son');
1573                    case 'F':
1574                    return I18N::translate('Marriage of a daughter');
1575                    default:
1576                    return I18N::translate('Marriage of a child');
1577                }
1578            case '_MARR_FAMC':
1579                return
1580                /* I18N: ...to each other */
1581                I18N::translate('Marriage of parents');
1582            case '_MARR_GCHI':
1583                switch ($sex) {
1584                    case 'M':
1585                        return I18N::translate('Marriage of a grandson');
1586                    case 'F':
1587                    return I18N::translate('Marriage of a granddaughter');
1588                    default:
1589                    return I18N::translate('Marriage of a grandchild');
1590                }
1591            case '_MARR_GCH1':
1592                switch ($sex) {
1593                    case 'M':
1594                        return I18N::translateContext('daughter’s son', 'Marriage of a grandson');
1595                    case 'F':
1596                    return I18N::translateContext('daughter’s daughter', 'Marriage of a granddaughter');
1597                    default:
1598                    return I18N::translate('Marriage of a grandchild');
1599                }
1600            case '_MARR_GCH2':
1601                switch ($sex) {
1602                    case 'M':
1603                        return I18N::translateContext('son’s son', 'Marriage of a grandson');
1604                    case 'F':
1605                    return I18N::translateContext('son’s daughter', 'Marriage of a granddaughter');
1606                    default:
1607                    return I18N::translate('Marriage of a grandchild');
1608                }
1609            case '_MARR_HSIB':
1610                switch ($sex) {
1611                    case 'M':
1612                        return I18N::translate('Marriage of a half-brother');
1613                    case 'F':
1614                    return I18N::translate('Marriage of a half-sister');
1615                    default:
1616                    return I18N::translate('Marriage of a half-sibling');
1617                }
1618            case '_MARR_PARE':
1619                switch ($sex) {
1620                    case 'M':
1621                        return
1622                    /* I18N: ...to another spouse */
1623                    I18N::translate('Marriage of a father');
1624                    case 'F':
1625                    return
1626                    /* I18N: ...to another spouse */
1627                    I18N::translate('Marriage of a mother');
1628                    default:
1629                    return
1630                    /* I18N: ...to another spouse */
1631                    I18N::translate('Marriage of a parent');
1632                }
1633            case '_MARR_SIBL':
1634                switch ($sex) {
1635                    case 'M':
1636                        return I18N::translate('Marriage of a brother');
1637                    case 'F':
1638                    return I18N::translate('Marriage of a sister');
1639                    default:
1640                    return I18N::translate('Marriage of a sibling');
1641                }
1642            case '_MBON':
1643                return
1644                /* I18N: gedcom tag _MBON */
1645                I18N::translate('Marriage bond');
1646            case '_MDCL':
1647                return
1648                /* I18N: gedcom tag _MDCL */
1649                I18N::translate('Medical');
1650            case '_MEDC':
1651                return
1652                /* I18N: gedcom tag _MEDC */
1653                I18N::translate('Medical condition');
1654            case '_MEND':
1655                return
1656                /* I18N: gedcom tag _MEND */
1657                I18N::translate('Marriage ending status');
1658            case '_MILI':
1659                return
1660                /* I18N: gedcom tag _MILI */
1661                I18N::translate('Military');
1662            case '_MILT':
1663                return
1664                /* I18N: gedcom tag _MILT */
1665                I18N::translate('Military service');
1666            case '_MREL':
1667                return
1668                /* I18N: gedcom tag _MREL */
1669                I18N::translate('Relationship to mother');
1670            case '_MSTAT':
1671                return
1672                /* I18N: gedcom tag _MSTAT */
1673                I18N::translate('Marriage beginning status');
1674            case '_NAME':
1675                return
1676                /* I18N: gedcom tag _NAME */
1677                I18N::translate('Mailing name');
1678            case '_NAMS':
1679                return
1680                /* I18N: gedcom tag _NAMS */
1681                I18N::translate('Namesake');
1682            case '_NLIV':
1683                return
1684                /* I18N: gedcom tag _NLIV */
1685                I18N::translate('Not living');
1686            case '_NMAR':
1687                switch ($sex) {
1688                    case 'M':
1689                        return
1690                    /* I18N: gedcom tag _NMAR */
1691                    I18N::translateContext('MALE', 'Never married');
1692                    case 'F':
1693                    return
1694                    /* I18N: gedcom tag _NMAR */
1695                    I18N::translateContext('FEMALE', 'Never married');
1696                    default:
1697                    return
1698                    /* I18N: gedcom tag _NMAR */
1699                    I18N::translate('Never married');
1700                }
1701            case '_NMR':
1702                switch ($sex) {
1703                    case 'M':
1704                        return
1705                    /* I18N: gedcom tag _NMR */
1706                    I18N::translateContext('MALE', 'Not married');
1707                    case 'F':
1708                    return
1709                    /* I18N: gedcom tag _NMR */
1710                    I18N::translateContext('FEMALE', 'Not married');
1711                    default:
1712                    return
1713                    /* I18N: gedcom tag _NMR */
1714                    I18N::translate('Not married');
1715                }
1716            case '_WT_USER':
1717                return I18N::translate('by');
1718            case '_PRMN':
1719                return
1720                /* I18N: gedcom tag _PRMN */
1721                I18N::translate('Permanent number');
1722            case '_SCBK':
1723                return
1724                /* I18N: gedcom tag _SCBK */
1725                I18N::translate('Scrapbook');
1726            case '_SEPR':
1727                return
1728                /* I18N: gedcom tag _SEPR */
1729                I18N::translate('Separated');
1730            case '_SSHOW':
1731                return
1732                /* I18N: gedcom tag _SSHOW */
1733                I18N::translate('Slide show');
1734            case '_STAT':
1735                return
1736                /* I18N: gedcom tag _STAT */
1737                I18N::translate('Marriage status');
1738            case '_SUBQ':
1739                return
1740                /* I18N: gedcom tag _SUBQ */
1741                I18N::translate('Short version');
1742            case '_TODO':
1743                return
1744                /* I18N: gedcom tag _TODO */
1745                I18N::translate('Research task');
1746            case '_TYPE':
1747                return
1748                /* I18N: gedcom tag _TYPE */
1749                I18N::translate('Media type');
1750            case '_UID':
1751                return
1752                /* I18N: gedcom tag _UID */
1753                I18N::translate('Unique identifier');
1754            case '_URL':
1755                return
1756                /* I18N: gedcom tag _URL */
1757                I18N::translate('URL');
1758            case '_WEIG':
1759                return
1760                /* I18N: gedcom tag _WEIG */
1761                I18N::translate('Weight');
1762            case '_WITN':
1763                return
1764                /* I18N: gedcom tag _WITN */
1765                I18N::translate('Witness');
1766            case '_WT_OBJE_SORT':
1767                return
1768                /* I18N: gedcom tag _WT_OBJE_SORT */
1769                I18N::translate('Re-order media');
1770            case '_YART':
1771                return /* I18N: gedcom tag _YART - A yahrzeit is a special anniversary of death in the Hebrew faith/calendar. */ I18N::translate('Yahrzeit');
1772            // Brit milah applies only to males, no need for male/female translations
1773            case '__BRTM_CHIL':
1774                return I18N::translate('Brit milah of a son');
1775            case '__BRTM_GCHI':
1776                return I18N::translate('Brit milah of a grandson');
1777            case '__BRTM_GCH1':
1778                return I18N::translateContext('daughter’s son', 'Brit milah of a grandson');
1779            case '__BRTM_GCH2':
1780                return I18N::translateContext('son’s son', 'Brit milah of a grandson');
1781            case '__BRTM_HSIB':
1782                return I18N::translate('Brit milah of a half-brother');
1783            case '__BRTM_SIBL':
1784                return I18N::translate('Brit milah of a brother');
1785            // These "pseudo" tags are generated internally to present information about a media object
1786            case '__FILE_SIZE__':
1787                return I18N::translate('File size');
1788            case '__IMAGE_SIZE__':
1789                return I18N::translate('Image dimensions');
1790            default:
1791                // If no specialisation exists (e.g. DEAT:CAUS), then look for the general (CAUS)
1792                if (strpos($tag, ':')) {
1793                    list(, $tag) = explode(':', $tag, 2);
1794
1795                    return self::getLabel($tag, $record);
1796                }
1797
1798                // Still no translation? Highlight this as an error
1799                return '<span class="error" title="' . I18N::translate('Unrecognized GEDCOM code') . '">' . Filter::escapeHtml($tag) . '</span>';
1800        }
1801    }
1802
1803    /**
1804     * Translate a label/value pair, such as “Occupation: Farmer”
1805     *
1806     * @param string            $tag
1807     * @param string            $value
1808     * @param GedcomRecord|null $record
1809     * @param string|null       $element
1810     *
1811     * @return string
1812     */
1813    public static function getLabelValue($tag, $value, GedcomRecord $record = null, $element = 'div')
1814    {
1815        return
1816            '<' . $element . ' class="fact_' . $tag . '">' .
1817            /* I18N: a label/value pair, such as “Occupation: Farmer”. Some languages may need to change the punctuation. */
1818            I18N::translate('<span class="label">%1$s:</span> <span class="field" dir="auto">%2$s</span>', self::getLabel($tag, $record), $value) .
1819            '</' . $element . '>';
1820    }
1821
1822    /**
1823     * Get a list of facts, for use in the "fact picker" edit control
1824     *
1825     * @param string $fact_type
1826     *
1827     * @return string[]
1828     */
1829    public static function getPicklistFacts($fact_type)
1830    {
1831        switch ($fact_type) {
1832            case 'INDI':
1833                $tags = array(
1834                // Facts, attributes for individuals (no links to FAMs)
1835                'RESN', 'NAME', 'SEX', 'BIRT', 'CHR', 'DEAT', 'BURI', 'CREM',
1836                'ADOP', 'BAPM', 'BARM', 'BASM', 'BLES', 'CHRA', 'CONF', 'FCOM', 'ORDN',
1837                'NATU', 'EMIG', 'IMMI', 'CENS', 'PROB', 'WILL', 'GRAD', 'RETI', 'EVEN',
1838                'CAST', 'DSCR', 'EDUC', 'IDNO', 'NATI', 'NCHI', 'NMR',
1839                'OCCU', 'PROP', 'RELI', 'RESI', 'SSN', 'TITL', 'FACT',
1840                'BAPL', 'CONL', 'ENDL', 'SLGC',
1841                'SUBM', 'ASSO', 'ALIA', 'ANCI', 'DESI', 'RFN', 'AFN',
1842                'REFN', 'RIN', 'CHAN', 'NOTE', 'SHARED_NOTE', 'SOUR', 'OBJE',
1843                // non standard tags
1844                '_BRTM', '_DEG', '_DNA', '_EYEC', '_FNRL', '_HAIR', '_HEIG', '_HNM',
1845                '_HOL', '_INTE', '_MDCL', '_MEDC', '_MILI', '_MILT', '_NAME', '_NAMS',
1846                '_NLIV', '_NMAR', '_PRMN', '_TODO', '_UID', '_WEIG', '_YART',
1847                );
1848                break;
1849            case 'FAM':
1850                $tags = array(
1851                // Facts for families, left out HUSB, WIFE & CHIL links
1852                'RESN', 'ANUL', 'CENS', 'DIV', 'DIVF', 'ENGA', 'MARB', 'MARC',
1853                'MARR', 'MARL', 'MARS', 'RESI', 'EVEN', 'NCHI', 'SUBM', 'SLGS',
1854                'REFN', 'RIN', 'CHAN', 'NOTE', 'SHARED_NOTE', 'SOUR', 'OBJE',
1855                // non standard tags
1856                '_NMR', 'MARR_CIVIL', 'MARR_RELIGIOUS', 'MARR_PARTNERS', 'MARR_UNKNOWN',
1857                '_COML', '_MBON', '_MARI', '_SEPR', '_TODO',
1858                );
1859                break;
1860            case 'SOUR':
1861                $tags = array(
1862                // Facts for sources
1863                'DATA', 'AUTH', 'TITL', 'ABBR', 'PUBL', 'TEXT', 'REPO', 'REFN', 'RIN',
1864                'CHAN', 'NOTE', 'SHARED_NOTE', 'OBJE',
1865                'RESN',
1866                );
1867                break;
1868            case 'REPO':
1869                $tags = array(
1870                // Facts for repositories
1871                'NAME', 'ADDR', 'PHON', 'EMAIL', 'FAX', 'WWW',
1872                'NOTE', 'SHARED_NOTE', 'REFN', 'RIN', 'CHAN',
1873                'RESN',
1874                );
1875                break;
1876            case 'PLAC':
1877                $tags = array(
1878                // Facts for places
1879                'FONE', 'ROMN',
1880                // non standard tags
1881                '_HEB',
1882                );
1883                break;
1884            case 'NAME':
1885                $tags = array(
1886                // Facts subordinate to NAME
1887                'NICK', 'FONE', 'ROMN',
1888                // non standard tags
1889                '_HEB', '_AKA',
1890                );
1891                break;
1892            default:
1893                $tags = array();
1894                break;
1895        }
1896
1897        $facts = array();
1898        foreach ($tags as $tag) {
1899            $facts[$tag] = self::getLabel($tag, null);
1900        }
1901        uasort($facts, '\Fisharebest\Webtrees\I18N::strcasecmp');
1902
1903        return $facts;
1904    }
1905
1906    /**
1907     * Translate the value for 1 FILE/2 FORM/3 TYPE
1908     *
1909     * @param string $type
1910     *
1911     * @return string
1912     */
1913    public static function getFileFormTypeValue($type)
1914    {
1915        switch (strtolower($type)) {
1916            case 'audio':
1917                return /* I18N: Type of media object */ I18N::translate('Audio');
1918            case 'book':
1919                return /* I18N: Type of media object */ I18N::translate('Book');
1920            case 'card':
1921                return /* I18N: Type of media object */ I18N::translate('Card');
1922            case 'certificate':
1923                return /* I18N: Type of media object */ I18N::translate('Certificate');
1924            case 'coat':
1925                return /* I18N: Type of media object */ I18N::translate('Coat of arms');
1926            case 'document':
1927                return /* I18N: Type of media object */ I18N::translate('Document');
1928            case 'electronic':
1929                return /* I18N: Type of media object */ I18N::translate('Electronic');
1930            case 'fiche':
1931                return /* I18N: Type of media object */ I18N::translate('Microfiche');
1932            case 'film':
1933                return /* I18N: Type of media object */ I18N::translate('Microfilm');
1934            case 'magazine':
1935                return /* I18N: Type of media object */ I18N::translate('Magazine');
1936            case 'manuscript':
1937                return /* I18N: Type of media object */ I18N::translate('Manuscript');
1938            case 'map':
1939                return /* I18N: Type of media object */ I18N::translate('Map');
1940            case 'newspaper':
1941                return /* I18N: Type of media object */ I18N::translate('Newspaper');
1942            case 'photo':
1943                return /* I18N: Type of media object */ I18N::translate('Photo');
1944            case 'tombstone':
1945                return /* I18N: Type of media object */ I18N::translate('Tombstone');
1946            case 'video':
1947                return /* I18N: Type of media object */ I18N::translate('Video');
1948            case 'painting':
1949                return /* I18N: Type of media object */ I18N::translate('Painting');
1950            default:
1951                return /* I18N: Type of media object */ I18N::translate('Other');
1952        }
1953    }
1954
1955    /**
1956     * A list of all possible values for 1 FILE/2 FORM/3 TYPE
1957     *
1958     * @return string[]
1959     */
1960    public static function getFileFormTypes()
1961    {
1962        $values = array();
1963        foreach (self::$OBJE_FILE_FORM_TYPE as $type) {
1964            $values[$type] = self::getFileFormTypeValue($type);
1965        }
1966        uasort($values, '\Fisharebest\Webtrees\I18N::strcasecmp');
1967
1968        return $values;
1969    }
1970
1971    /**
1972     * Generate a value for a new _UID field.
1973     * Instead of RFC4122-compatible UUIDs, generate ones that
1974     * are compatible with PAF, Legacy, RootsMagic, etc.
1975     * In these, the string is upper-cased, dashes are removed,
1976     * and a two-byte checksum is added.
1977     *
1978     * @return string
1979     */
1980    public static function createUid()
1981    {
1982        $uid = str_replace('-', '', Uuid::uuid4());
1983
1984        $checksum_a = 0; // a sum of the bytes
1985        $checksum_b = 0; // a sum of the incremental values of $checksum_a
1986
1987        // Compute checksums
1988        for ($i = 0; $i < 32; $i += 2) {
1989            $checksum_a += hexdec(substr($uid, $i, 2));
1990            $checksum_b += $checksum_a & 0xff;
1991        }
1992
1993        return strtoupper($uid . substr(dechex($checksum_a), -2) . substr(dechex($checksum_b), -2));
1994    }
1995}
1996