GedcomTag::getLabel()   F
last analyzed

Complexity

Conditions 517
Paths 1036

Size

Total Lines 1692
Code Lines 1394

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 517
eloc 1394
nc 1036
nop 2
dl 0
loc 1692
rs 0
c 0
b 0
f 0

How to fix   Long Method    Complexity   

Long Method

Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.

For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.

Commonly applied refactorings include:

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
 */
16
namespace Fisharebest\Webtrees;
17
18
use Rhumsaa\Uuid\Uuid;
19
20
/**
21
 * Static GEDCOM data for tags
22
 */
23
class 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));
0 ignored issues
show
Bug introduced by
It seems like $checksum_a can also be of type double; however, parameter $num of dechex() does only seem to accept integer, maybe add an additional type check? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

1993
        return strtoupper($uid . substr(dechex(/** @scrutinizer ignore-type */ $checksum_a), -2) . substr(dechex($checksum_b), -2));
Loading history...
1994
    }
1995
}
1996