GedcomTag::isTag()   A
last analyzed

Complexity

Conditions 1
Paths 1

Size

Total Lines 3
Code Lines 1

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 1
nc 1
nop 1
dl 0
loc 3
rs 10
c 0
b 0
f 0
1
<?php
2
3
/**
4
 * webtrees: online genealogy
5
 * Copyright (C) 2022 webtrees development team
6
 * This program is free software: you can redistribute it and/or modify
7
 * it under the terms of the GNU General Public License as published by
8
 * the Free Software Foundation, either version 3 of the License, or
9
 * (at your option) any later version.
10
 * This program is distributed in the hope that it will be useful,
11
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
 * GNU General Public License for more details.
14
 * You should have received a copy of the GNU General Public License
15
 * along with this program. If not, see <https://www.gnu.org/licenses/>.
16
 */
17
18
declare(strict_types=1);
19
20
namespace Fisharebest\Webtrees;
21
22
use Ramsey\Uuid\Uuid;
23
24
use function array_filter;
25
use function str_contains;
26
27
/**
28
 * Static GEDCOM data for tags
29
 */
30
class GedcomTag
31
{
32
    /** All tags that webtrees knows how to translate - including special/internal tags */
33
    private const ALL_TAGS = [
34
        'ABBR',
35
        'ADDR',
36
        'ADR1',
37
        'ADR2',
38
        'ADOP',
39
        'ADOP:DATE',
40
        'ADOP:PLAC',
41
        'AFN',
42
        'AGE',
43
        'AGNC',
44
        'ALIA',
45
        'ANCE',
46
        'ANCI',
47
        'ANUL',
48
        'ASSO',
49
        'AUTH',
50
        'BAPL',
51
        'BAPL:DATE',
52
        'BAPL:PLAC',
53
        'BAPM',
54
        'BAPM:DATE',
55
        'BAPM:PLAC',
56
        'BARM',
57
        'BARM:DATE',
58
        'BARM:PLAC',
59
        'BASM',
60
        'BASM:DATE',
61
        'BASM:PLAC',
62
        'BIRT',
63
        'BIRT:DATE',
64
        'BIRT:PLAC',
65
        'BLES',
66
        'BLES:DATE',
67
        'BLES:PLAC',
68
        'BLOB',
69
        'BURI',
70
        'BURI:DATE',
71
        'BURI:PLAC',
72
        'CALN',
73
        'CAST',
74
        'CAUS',
75
        'CEME',
76
        'CENS',
77
        'CENS:DATE',
78
        'CENS:PLAC',
79
        'CHAN',
80
        'CHAN:DATE',
81
        'CHAN:_WT_USER',
82
        'CHAR',
83
        'CHIL',
84
        'CHR',
85
        'CHR:DATE',
86
        'CHR:PLAC',
87
        'CHRA',
88
        'CITN',
89
        'CITY',
90
        'COMM',
91
        'CONC',
92
        'CONT',
93
        'CONF',
94
        'CONF:DATE',
95
        'CONF:PLAC',
96
        'CONL',
97
        'COPR',
98
        'CORP',
99
        'CREM',
100
        'CREM:DATE',
101
        'CREM:PLAC',
102
        'CTRY',
103
        'DATA',
104
        'DATA:DATE',
105
        'DATE',
106
        'DEAT',
107
        'DEAT:CAUS',
108
        'DEAT:DATE',
109
        'DEAT:PLAC',
110
        'DESC',
111
        'DESI',
112
        'DEST',
113
        'DIV',
114
        'DIVF',
115
        'DSCR',
116
        'EDUC',
117
        'EDUC:AGNC',
118
        'EMAI',
119
        'EMAIL',
120
        'EMAL',
121
        'EMIG',
122
        'EMIG:DATE',
123
        'EMIG:PLAC',
124
        'ENDL',
125
        'ENDL:DATE',
126
        'ENDL:PLAC',
127
        'ENGA',
128
        'ENGA:DATE',
129
        'ENGA:PLAC',
130
        'EVEN',
131
        'EVEN:DATE',
132
        'EVEN:PLAC',
133
        'EVEN:TYPE',
134
        'FACT',
135
        'FACT:TYPE',
136
        'FAM',
137
        'FAMC',
138
        'FAMF',
139
        'FAMS',
140
        'FAX',
141
        'FCOM',
142
        'FCOM:DATE',
143
        'FCOM:PLAC',
144
        'FILE',
145
        'FONE',
146
        'FORM',
147
        'GEDC',
148
        'GIVN',
149
        'GRAD',
150
        'HEAD',
151
        'HUSB',
152
        'IDNO',
153
        'IMMI',
154
        'IMMI:DATE',
155
        'IMMI:PLAC',
156
        'INDI',
157
        'INFL',
158
        'LANG',
159
        'LATI',
160
        'LEGA',
161
        'LONG',
162
        'MAP',
163
        'MARB',
164
        'MARB:DATE',
165
        'MARB:PLAC',
166
        'MARR_CIVIL',
167
        'MARR_PARTNERS',
168
        'MARR_RELIGIOUS',
169
        'MARR_UNKNOWN',
170
        'MARC',
171
        'MARL',
172
        'MARR',
173
        'MARR:DATE',
174
        'MARR:PLAC',
175
        'MARS',
176
        'MEDI',
177
        'NAME',
178
        'NAME:FONE',
179
        'NAME:_HEB',
180
        'NATI',
181
        'NATU',
182
        'NATU:DATE',
183
        'NATU:PLAC',
184
        'NCHI',
185
        'NICK',
186
        'NMR',
187
        'NOTE',
188
        'NPFX',
189
        'NSFX',
190
        'OBJE',
191
        'OCCU',
192
        'OCCU:AGNC',
193
        'ORDI',
194
        'ORDN',
195
        'ORDN:AGNC',
196
        'ORDN:DATE',
197
        'ORDN:PLAC',
198
        'PAGE',
199
        'PEDI',
200
        'PHON',
201
        'PLAC',
202
        'PLAC:FONE',
203
        'PLAC:ROMN',
204
        'PLAC:_HEB',
205
        'POST',
206
        'PROB',
207
        'PROP',
208
        'PUBL',
209
        'QUAY',
210
        'REFN',
211
        'RELA',
212
        'RELI',
213
        'REPO',
214
        'RESI',
215
        'RESI:DATE',
216
        'RESI:PLAC',
217
        'RESN',
218
        'RETI',
219
        'RETI:AGNC',
220
        'RFN',
221
        'RIN',
222
        'ROLE',
223
        'ROMN',
224
        'SERV',
225
        'SEX',
226
        'SHARED_NOTE',
227
        'SLGC',
228
        'SLGC:DATE',
229
        'SLGC:PLAC',
230
        'SLGS',
231
        'SLGS:DATE',
232
        'SLGS:PLAC',
233
        'SOUR',
234
        'SPFX',
235
        'SSN',
236
        'STAE',
237
        'STAT',
238
        'STAT:DATE',
239
        'SUBM',
240
        'SUBN',
241
        'SURN',
242
        'TEMP',
243
        'TEXT',
244
        'TIME',
245
        'TITL',
246
        'TITL:FONE',
247
        'TITL:ROMN',
248
        'TITL:_HEB',
249
        'TRLR',
250
        'TYPE',
251
        'URL',
252
        'VERS',
253
        'WIFE',
254
        'WILL',
255
        'WWW',
256
        '_ADOP_CHIL',
257
        '_ADOP_GCHI',
258
        '_ADOP_GCH1',
259
        '_ADOP_GCH2',
260
        '_ADOP_HSIB',
261
        '_ADOP_SIBL',
262
        '_ADPF',
263
        '_ADPM',
264
        '_AKA',
265
        '_AKAN',
266
        '_ASSO',
267
        '_BAPM_CHIL',
268
        '_BAPM_GCHI',
269
        '_BAPM_GCH1',
270
        '_BAPM_GCH2',
271
        '_BAPM_HSIB',
272
        '_BAPM_SIBL',
273
        '_BIBL',
274
        '_BIRT_CHIL',
275
        '_BIRT_GCHI',
276
        '_BIRT_GCH1',
277
        '_BIRT_GCH2',
278
        '_BIRT_HSIB',
279
        '_BIRT_SIBL',
280
        '_BRTM',
281
        '_BRTM:DATE',
282
        '_BRTM:PLAC',
283
        '_BURI_CHIL',
284
        '_BURI_GCHI',
285
        '_BURI_GCH1',
286
        '_BURI_GCH2',
287
        '_BURI_GPAR',
288
        '_BURI_HSIB',
289
        '_BURI_SIBL',
290
        '_BURI_SPOU',
291
        '_CHR_CHIL',
292
        '_CHR_GCHI',
293
        '_CHR_GCH1',
294
        '_CHR_GCH2',
295
        '_CHR_HSIB',
296
        '_CHR_SIBL',
297
        '_COML',
298
        '_CREM_CHIL',
299
        '_CREM_GCHI',
300
        '_CREM_GCH1',
301
        '_CREM_GCH2',
302
        '_CREM_GPAR',
303
        '_CREM_HSIB',
304
        '_CREM_SIBL',
305
        '_CREM_SPOU',
306
        '_DATE',
307
        '_DBID',
308
        '_DEAT_CHIL',
309
        '_DEAT_GCHI',
310
        '_DEAT_GCH1',
311
        '_DEAT_GCH2',
312
        '_DEAT_GPAR',
313
        '_DEAT_GPA1',
314
        '_DEAT_GPA2',
315
        '_DEAT_HSIB',
316
        '_DEAT_PARE',
317
        '_DEAT_SIBL',
318
        '_DEAT_SPOU',
319
        '_DEG',
320
        '_DETS',
321
        '_DNA',
322
        '_EMAIL',
323
        '_EYEC',
324
        '_FA1',
325
        '_FA2',
326
        '_FA3',
327
        '_FA4',
328
        '_FA5',
329
        '_FA6',
330
        '_FA7',
331
        '_FA8',
332
        '_FA9',
333
        '_FA10',
334
        '_FA11',
335
        '_FA12',
336
        '_FA13',
337
        '_FNRL',
338
        '_FREL',
339
        '_GEDF',
340
        '_GODP',
341
        '_GOV',
342
        '_HAIR',
343
        '_HEB',
344
        '_HEIG',
345
        '_HNM',
346
        '_HOL',
347
        '_INTE',
348
        '_LOC',
349
        '_MARI',
350
        '_MARNM',
351
        '_PRIM',
352
        '_MARNM_SURN',
353
        '_MARR_CHIL',
354
        '_MARR_FAMC',
355
        '_MARR_GCHI',
356
        '_MARR_GCH1',
357
        '_MARR_GCH2',
358
        '_MARR_HSIB',
359
        '_MARR_PARE',
360
        '_MARR_SIBL',
361
        '_MBON',
362
        '_MDCL',
363
        '_MEDC',
364
        '_MEND',
365
        '_MILI',
366
        '_MILT',
367
        '_MREL',
368
        '_MSTAT',
369
        '_NAME',
370
        '_NAMS',
371
        '_NLIV',
372
        '_NMAR',
373
        '_NMR',
374
        '_PLACE',
375
        '_WT_USER',
376
        '_PRMN',
377
        '_SCBK',
378
        '_SEPR',
379
        '_SSHOW',
380
        '_STAT',
381
        '_SUBQ',
382
        '_TODO',
383
        '_TYPE',
384
        '_UID',
385
        '_URL',
386
        '_WEIG',
387
        '_WITN',
388
        '_YART',
389
        '__BRTM_CHIL',
390
        '__BRTM_GCHI',
391
        '__BRTM_GCH1',
392
        '__BRTM_GCH2',
393
        '__BRTM_HSIB',
394
        '__BRTM_SIBL',
395
        // These pseudo-tags are generated dynamically to display media object attributes
396
        '__FILE_SIZE__',
397
        '__IMAGE_SIZE__',
398
    ];
399
400
    /**
401
     * Is $tag one of our known tags?
402
     *
403
     * @param string $tag
404
     *
405
     * @return bool
406
     */
407
    public static function isTag(string $tag): bool
408
    {
409
        return in_array($tag, self::ALL_TAGS, true);
410
    }
411
412
    /**
413
     * Translate a tag, for an (optional) record
414
     *
415
     * @param string $tag
416
     *
417
     * @return string
418
     */
419
    public static function getLabel(string $tag): string
420
    {
421
        switch ($tag) {
422
            case 'ABBR':
423
                /* I18N: gedcom tag ABBR */
424
                return I18N::translate('Abbreviation');
425
            case 'ADDR':
426
                /* I18N: gedcom tag ADDR */
427
                return I18N::translate('Address');
428
            case 'ADR1':
429
                /* I18N: gedcom tag ADR1 */
430
                return I18N::translate('Address line 1');
431
            case 'ADR2':
432
                /* I18N: gedcom tag ADR2 */
433
                return I18N::translate('Address line 2');
434
            case 'ADR3':
435
                /* I18N: gedcom tag ADR3 */
436
                return I18N::translate('Address line 3');
437
            case 'ADOP':
438
                /* I18N: gedcom tag ADOP */
439
                return I18N::translate('Adoption');
440
            case 'ADOP:DATE':
441
                return I18N::translate('Date of adoption');
442
            case 'ADOP:PLAC':
443
                return I18N::translate('Place of adoption');
444
            case 'AFN':
445
                /* I18N: gedcom tag AFN */
446
                return I18N::translate('Ancestral file number');
447
            case 'AGE':
448
                /* I18N: gedcom tag AGE */
449
                return I18N::translate('Age');
450
            case 'AGNC':
451
                /* I18N: gedcom tag AGNC */
452
                return I18N::translate('Agency');
453
            case 'ALIA':
454
                /* I18N: gedcom tag ALIA */
455
                return I18N::translate('Alias');
456
            case 'ANCE':
457
                /* I18N: gedcom tag ANCE */
458
                return I18N::translate('Generations of ancestors');
459
            case 'ANCI':
460
                /* I18N: gedcom tag ANCI */
461
                return I18N::translate('Ancestors interest');
462
            case 'ANUL':
463
                /* I18N: gedcom tag ANUL */
464
                return I18N::translate('Annulment');
465
            case 'ASSO':
466
                /* I18N: gedcom tag ASSO */
467
                return I18N::translate('Associate');
468
            case 'AUTH':
469
                /* I18N: gedcom tag AUTH */
470
                return I18N::translate('Author');
471
            case 'BAPL':
472
                /* I18N: gedcom tag BAPL. LDS = Church of Latter Day Saints. */
473
                return I18N::translate('LDS baptism');
474
            case 'BAPL:DATE':
475
                /* I18N: LDS = Church of Latter Day Saints. */
476
                return I18N::translate('Date of LDS baptism');
477
            case 'BAPL:PLAC':
478
                /* I18N: LDS = Church of Latter Day Saints. */
479
                return I18N::translate('Place of LDS baptism');
480
            case 'BAPM':
481
                /* I18N: gedcom tag BAPM */
482
                return I18N::translate('Baptism');
483
            case 'BAPM:DATE':
484
                return I18N::translate('Date of baptism');
485
            case 'BAPM:PLAC':
486
                return I18N::translate('Place of baptism');
487
            case 'BARM':
488
                /* I18N: gedcom tag BARM */
489
                return I18N::translate('Bar mitzvah');
490
            case 'BARM:DATE':
491
                return I18N::translate('Date of bar mitzvah');
492
            case 'BARM:PLAC':
493
                return I18N::translate('Place of bar mitzvah');
494
            case 'BASM':
495
                /* I18N: gedcom tag BASM */
496
                return I18N::translate('Bat mitzvah');
497
            case 'BASM:DATE':
498
                return I18N::translate('Date of bat mitzvah');
499
            case 'BASM:PLAC':
500
                return I18N::translate('Place of bat mitzvah');
501
            case 'BIRT':
502
                /* I18N: gedcom tag BIRT */
503
                return I18N::translate('Birth');
504
            case 'BIRT:DATE':
505
                return I18N::translate('Date of birth');
506
            case 'BIRT:PLAC':
507
                return I18N::translate('Place of birth');
508
            case 'BLES':
509
                /* I18N: gedcom tag BLES */
510
                return I18N::translate('Blessing');
511
            case 'BLES:DATE':
512
                return I18N::translate('Date of blessing');
513
            case 'BLES:PLAC':
514
                return I18N::translate('Place of blessing');
515
            case 'BLOB':
516
                /* I18N: gedcom tag BLOB */
517
                return I18N::translate('Binary data object');
518
            case 'BURI':
519
                /* I18N: gedcom tag BURI */
520
                return I18N::translate('Burial');
521
            case 'BURI:DATE':
522
                return I18N::translate('Date of burial');
523
            case 'BURI:PLAC':
524
                return I18N::translate('Place of burial');
525
            case 'CALN':
526
                /* I18N: gedcom tag CALN */
527
                return I18N::translate('Call number');
528
            case 'CAST':
529
                /* I18N: gedcom tag CAST */
530
                return I18N::translate('Caste');
531
            case 'CAUS':
532
                /* I18N: gedcom tag CAUS */
533
                return I18N::translate('Cause');
534
            case 'CEME':
535
                /* I18N: gedcom tag CEME */
536
                return I18N::translate('Cemetery');
537
            case 'CENS':
538
                /* I18N: gedcom tag CENS */
539
                return I18N::translate('Census');
540
            case 'CENS:DATE':
541
                return I18N::translate('Census date');
542
            case 'CENS:PLAC':
543
                return I18N::translate('Census place');
544
            case '_UPD': // Family Tree Builder uses "1 _UPD 14 APR 2012 00:14:10 GMT-5" instead of 1 CHAN/2 DATE/3 TIME
545
            case 'CHAN':
546
                /* I18N: gedcom tag CHAN */
547
                return I18N::translate('Last change');
548
            case 'CHAN:DATE':
549
                /* I18N: gedcom tag CHAN:DATE */
550
                return I18N::translate('Date of last change');
551
            case 'CHAN:_WT_USER':
552
                /* I18N: gedcom tag CHAN:_WT_USER */
553
                return I18N::translate('Author of last change');
554
            case 'CHAR':
555
                /* I18N: gedcom tag CHAR */
556
                return I18N::translate('Character set');
557
            case 'CHIL':
558
                /* I18N: gedcom tag CHIL */
559
                return I18N::translate('Child');
560
            case 'CHR':
561
                /* I18N: gedcom tag CHR */
562
                return I18N::translate('Christening');
563
            case 'CHR:DATE':
564
                return I18N::translate('Date of christening');
565
            case 'CHR:PLAC':
566
                return I18N::translate('Place of christening');
567
            case 'CHRA':
568
                /* I18N: gedcom tag CHRA */
569
                return I18N::translate('Adult christening');
570
            case 'CITN':
571
                /* I18N: gedcom tag CITN */
572
                return I18N::translate('Citizenship');
573
            case 'CITY':
574
                /* I18N: gedcom tag CITY */
575
                return I18N::translate('City');
576
            case 'COMM':
577
                /* I18N: gedcom tag COMM */
578
                return I18N::translate('Comment');
579
            case 'CONC':
580
                /* I18N: gedcom tag CONC */
581
                return I18N::translate('Concatenation');
582
            case 'CONT':
583
                /* I18N: gedcom tag CONT */
584
                return I18N::translate('Continued');
585
            case 'CONF':
586
                /* I18N: gedcom tag CONF */
587
                return I18N::translate('Confirmation');
588
            case 'CONF:DATE':
589
                return I18N::translate('Date of confirmation');
590
            case 'CONF:PLAC':
591
                return I18N::translate('Place of confirmation');
592
            case 'CONL':
593
                /* I18N: gedcom tag CONL. LDS = Church of Latter Day Saints. */
594
                return I18N::translate('LDS confirmation');
595
            case 'COPR':
596
                /* I18N: gedcom tag COPR */
597
                return I18N::translate('Copyright');
598
            case 'CORP':
599
                /* I18N: gedcom tag CORP */
600
                return I18N::translate('Corporation');
601
            case 'CREM':
602
                /* I18N: gedcom tag CREM */
603
                return I18N::translate('Cremation');
604
            case 'CREM:DATE':
605
                return I18N::translate('Date of cremation');
606
            case 'CREM:PLAC':
607
                return I18N::translate('Place of cremation');
608
            case 'CTRY':
609
                /* I18N: gedcom tag CTRY */
610
                return I18N::translate('Country');
611
            case 'DATA':
612
                /* I18N: gedcom tag DATA */
613
                return I18N::translate('Data');
614
            case 'DATA:DATE':
615
                return I18N::translate('Date of entry in original source');
616
            case '_DATE': // Family Tree Builder uses OBJE:_DATE
617
            case 'DATE':
618
                /* I18N: gedcom tag DATE */
619
                return I18N::translate('Date');
620
            case 'DEAT':
621
                /* I18N: gedcom tag DEAT */
622
                return I18N::translate('Death');
623
            case 'DEAT:CAUS':
624
                return I18N::translate('Cause of death');
625
            case 'DEAT:DATE':
626
                return I18N::translate('Date of death');
627
            case 'DEAT:PLAC':
628
                return I18N::translate('Place of death');
629
            case 'DESC':
630
                /* I18N: gedcom tag DESC */
631
                return I18N::translate('Descendants');
632
            case 'DESI':
633
                /* I18N: gedcom tag DESI */
634
                return I18N::translate('Descendants interest');
635
            case 'DEST':
636
                /* I18N: gedcom tag DEST */
637
                return I18N::translate('Destination');
638
            case 'DIV':
639
                /* I18N: gedcom tag DIV */
640
                return I18N::translate('Divorce');
641
            case 'DIVF':
642
                /* I18N: gedcom tag DIVF */
643
                return I18N::translate('Divorce filed');
644
            case 'DSCR':
645
                /* I18N: gedcom tag DSCR */
646
                return I18N::translate('Description');
647
            case 'EDUC':
648
                /* I18N: gedcom tag EDUC */
649
                return I18N::translate('Education');
650
            case 'EDUC:AGNC':
651
                return I18N::translate('School or college');
652
            case 'EMAI':
653
            case 'EMAL':
654
            case 'EMAIL':
655
                /* I18N: gedcom tag EMAIL */
656
                return I18N::translate('Email address');
657
            case 'EMIG':
658
                /* I18N: gedcom tag EMIG */
659
                return I18N::translate('Emigration');
660
            case 'EMIG:DATE':
661
                return I18N::translate('Date of emigration');
662
            case 'EMIG:PLAC':
663
                return I18N::translate('Place of emigration');
664
            case 'ENDL':
665
                /* I18N: gedcom tag ENDL. LDS = Church of Latter Day Saints. */
666
                return I18N::translate('LDS endowment');
667
            case 'ENDL:DATE':
668
                /* I18N: LDS = Church of Latter Day Saints. */
669
                return I18N::translate('Date of LDS endowment');
670
            case 'ENDL:PLAC':
671
                /* I18N: LDS = Church of Latter Day Saints. */
672
                return I18N::translate('Place of LDS endowment');
673
            case 'ENGA':
674
                /* I18N: gedcom tag ENGA */
675
                return I18N::translate('Engagement');
676
            case 'ENGA:DATE':
677
                return I18N::translate('Date of engagement');
678
            case 'ENGA:PLAC':
679
                return I18N::translate('Place of engagement');
680
            case 'EVEN':
681
                /* I18N: gedcom tag EVEN */
682
                return I18N::translate('Event');
683
            case 'EVEN:DATE':
684
                return I18N::translate('Date of event');
685
            case 'EVEN:PLAC':
686
                return I18N::translate('Place of event');
687
            case 'EVEN:TYPE':
688
                return I18N::translate('Type of event');
689
            case 'FACT':
690
                /* I18N: gedcom tag FACT */
691
                return I18N::translate('Fact');
692
            case 'FACT:TYPE':
693
                return I18N::translate('Type of fact');
694
            case 'FAM':
695
                /* I18N: gedcom tag FAM */
696
                return I18N::translate('Family');
697
            case 'FAMC':
698
                /* I18N: gedcom tag FAMC */
699
                return I18N::translate('Family as a child');
700
            case 'FAMF':
701
                /* I18N: gedcom tag FAMF */
702
                return I18N::translate('Family file');
703
            case 'FAMS':
704
                /* I18N: gedcom tag FAMS */
705
                return I18N::translate('Family as a spouse');
706
            case 'FAX':
707
                /* I18N: gedcom tag FAX */
708
                return I18N::translate('Fax');
709
            case 'FCOM':
710
                /* I18N: gedcom tag FCOM */
711
                return I18N::translate('First communion');
712
            case 'FCOM:DATE':
713
                return I18N::translate('Date of first communion');
714
            case 'FCOM:PLAC':
715
                return I18N::translate('Place of first communion');
716
            case 'FILE':
717
                /* I18N: gedcom tag FILE */
718
                return I18N::translate('Filename');
719
            case 'FONE':
720
                /* I18N: gedcom tag FONE */
721
                return I18N::translate('Phonetic');
722
            case 'FORM':
723
                /* I18N: gedcom tag FORM */
724
                return I18N::translate('Format');
725
            case 'GEDC':
726
                /* I18N: gedcom tag GEDC */
727
                return I18N::translate('GEDCOM file');
728
            case 'GIVN':
729
                /* I18N: gedcom tag GIVN */
730
                return I18N::translate('Given names');
731
            case 'GRAD':
732
                /* I18N: gedcom tag GRAD */
733
                return I18N::translate('Graduation');
734
            case 'HEAD':
735
                /* I18N: gedcom tag HEAD */
736
                return I18N::translate('Header');
737
            case 'HUSB':
738
                /* I18N: gedcom tag HUSB */
739
                return I18N::translate('Husband');
740
            case 'IDNO':
741
                /* I18N: gedcom tag IDNO */
742
                return I18N::translate('Identification number');
743
            case 'IMMI':
744
                /* I18N: gedcom tag IMMI */
745
                return I18N::translate('Immigration');
746
            case 'IMMI:DATE':
747
                return I18N::translate('Date of immigration');
748
            case 'IMMI:PLAC':
749
                return I18N::translate('Place of immigration');
750
            case 'INDI':
751
                /* I18N: gedcom tag INDI */
752
                return I18N::translate('Individual');
753
            case 'INFL':
754
                /* I18N: gedcom tag INFL */
755
                return I18N::translate('Infant');
756
            case 'LANG':
757
                /* I18N: gedcom tag LANG */
758
                return I18N::translate('Language');
759
            case 'LATI':
760
                /* I18N: gedcom tag LATI */
761
                return I18N::translate('Latitude');
762
            case 'LEGA':
763
                /* I18N: gedcom tag LEGA */
764
                return I18N::translate('Legatee');
765
            case 'LONG':
766
                /* I18N: gedcom tag LONG */
767
                return I18N::translate('Longitude');
768
            case 'MAP':
769
                /* I18N: gedcom tag MAP */
770
                return I18N::translate('Coordinates');
771
            case 'MARB':
772
                /* I18N: gedcom tag MARB */
773
                return I18N::translate('Marriage banns');
774
            case 'MARB:DATE':
775
                return I18N::translate('Date of marriage banns');
776
            case 'MARB:PLAC':
777
                return I18N::translate('Place of marriage banns');
778
            case 'MARC':
779
                /* I18N: gedcom tag MARC */
780
                return I18N::translate('Marriage contract');
781
            case 'MARL':
782
                /* I18N: gedcom tag MARL */
783
                return I18N::translate('Marriage license');
784
            case 'MARR':
785
                /* I18N: gedcom tag MARR */
786
                return I18N::translate('Marriage');
787
            case 'MARR:DATE':
788
                return I18N::translate('Date of marriage');
789
            case 'MARR:PLAC':
790
                return I18N::translate('Place of marriage');
791
            case 'MARR_CIVIL':
792
                return I18N::translate('Civil marriage');
793
            case 'MARR_PARTNERS':
794
                return I18N::translate('Registered partnership');
795
            case 'MARR_RELIGIOUS':
796
                return I18N::translate('Religious marriage');
797
            case 'MARR_UNKNOWN':
798
                return I18N::translate('Marriage type unknown');
799
            case 'MARS':
800
                /* I18N: gedcom tag MARS */
801
                return I18N::translate('Marriage settlement');
802
            case 'MEDI':
803
                /* I18N: gedcom tag MEDI */
804
                return I18N::translate('Media type');
805
            case 'NAME':
806
                /* I18N: gedcom tag NAME */
807
                return I18N::translate('Name');
808
            case 'NAME:FONE':
809
                return I18N::translate('Phonetic name');
810
            case 'NAME:_HEB':
811
                return I18N::translate('Name in Hebrew');
812
            case 'NATI':
813
                /* I18N: gedcom tag NATI */
814
                return I18N::translate('Nationality');
815
            case 'NATU':
816
                /* I18N: gedcom tag NATU */
817
                return I18N::translate('Naturalization');
818
            case 'NATU:DATE':
819
                return I18N::translate('Date of naturalization');
820
            case 'NATU:PLAC':
821
                return I18N::translate('Place of naturalization');
822
            case 'NCHI':
823
                /* I18N: gedcom tag NCHI */
824
                return I18N::translate('Number of children');
825
            case 'NICK':
826
                /* I18N: gedcom tag NICK */
827
                return I18N::translate('Nickname');
828
            case 'NMR':
829
                /* I18N: gedcom tag NMR */
830
                return I18N::translate('Number of marriages');
831
            case 'NOTE':
832
                /* I18N: gedcom tag NOTE */
833
                return I18N::translate('Note');
834
            case 'NPFX':
835
                /* I18N: gedcom tag NPFX */
836
                return I18N::translate('Name prefix');
837
            case 'NSFX':
838
                /* I18N: gedcom tag NSFX */
839
                return I18N::translate('Name suffix');
840
            case 'OBJE':
841
                /* I18N: gedcom tag OBJE */
842
                return I18N::translate('Media object');
843
            case 'OCCU':
844
                /* I18N: gedcom tag OCCU */
845
                return I18N::translate('Occupation');
846
            case 'OCCU:AGNC':
847
                return I18N::translate('Employer');
848
            case 'ORDI':
849
                /* I18N: gedcom tag ORDI */
850
                return I18N::translate('Ordinance');
851
            case 'ORDN':
852
                /* I18N: gedcom tag ORDN */
853
                return I18N::translate('Ordination');
854
            case 'ORDN:AGNC':
855
                return I18N::translate('Religious institution');
856
            case 'ORDN:DATE':
857
                return I18N::translate('Date of ordination');
858
            case 'ORDN:PLAC':
859
                return I18N::translate('Place of ordination');
860
            case 'PAGE':
861
                /* I18N: gedcom tag PAGE */
862
                return I18N::translate('Citation details');
863
            case 'PEDI':
864
                /* I18N: gedcom tag PEDI */
865
                return I18N::translate('Relationship to parents');
866
            case 'PHON':
867
                /* I18N: gedcom tag PHON */
868
                return I18N::translate('Phone');
869
            case '_PLACE': // Family Tree Builder uses OBJE:_PLACE
870
            case 'PLAC':
871
                /* I18N: gedcom tag PLAC */
872
                return I18N::translate('Place');
873
            case 'PLAC:FONE':
874
                return I18N::translate('Phonetic place');
875
            case 'PLAC:ROMN':
876
                return I18N::translate('Romanized place');
877
            case 'PLAC:_HEB':
878
                return I18N::translate('Place in Hebrew');
879
            case 'POST':
880
                /* I18N: gedcom tag POST */
881
                return I18N::translate('Postal code');
882
            case 'PROB':
883
                /* I18N: gedcom tag PROB */
884
                return I18N::translate('Probate');
885
            case 'PROP':
886
                /* I18N: gedcom tag PROP */
887
                return I18N::translate('Property');
888
            case 'PUBL':
889
                /* I18N: gedcom tag PUBL */
890
                return I18N::translate('Publication');
891
            case 'QUAY':
892
                /* I18N: gedcom tag QUAY */
893
                return I18N::translate('Quality of data');
894
            case 'REFN':
895
                /* I18N: gedcom tag REFN */
896
                return I18N::translate('Reference number');
897
            case 'RELA':
898
                /* I18N: gedcom tag RELA */
899
                return I18N::translate('Relationship');
900
            case 'RELI':
901
                /* I18N: gedcom tag RELI */
902
                return I18N::translate('Religion');
903
            case 'REPO':
904
                /* I18N: gedcom tag REPO */
905
                return I18N::translate('Repository');
906
            case 'REPO:NAME':
907
                return I18N::translateContext('Repository', 'Name');
908
            case 'RESI':
909
                /* I18N: gedcom tag RESI */
910
                return I18N::translate('Residence');
911
            case 'RESI:DATE':
912
                return I18N::translate('Date of residence');
913
            case 'RESI:PLAC':
914
                return I18N::translate('Place of residence');
915
            case 'RESN':
916
                /* I18N: gedcom tag RESN */
917
                return I18N::translate('Restriction');
918
            case 'RETI':
919
                /* I18N: gedcom tag RETI */
920
                return I18N::translate('Retirement');
921
            case 'RETI:AGNC':
922
                return I18N::translate('Employer');
923
            case 'RFN':
924
                /* I18N: gedcom tag RFN */
925
                return I18N::translate('Record file number');
926
            case '_PHOTO_RIN':
927
                // Family Tree Builder uses "0 OBJE/1 _PHOTO_RIN"
928
                // no  break
929
            case '_PRIN':// Family Tree Builder uses "0 _ALBUM/1 _PHOTO/2 _PRIN"
930
            case 'RIN':
931
                /* I18N: gedcom tag RIN */
932
                return I18N::translate('Record ID number');
933
            case 'ROLE':
934
                /* I18N: gedcom tag ROLE */
935
                return I18N::translate('Role');
936
            case 'ROMN':
937
                /* I18N: gedcom tag ROMN */
938
                return I18N::translate('Romanized');
939
            case 'SERV':
940
                /* I18N: gedcom tag SERV */
941
                return I18N::translate('Remote server');
942
            case 'SEX':
943
                /* I18N: gedcom tag SEX */
944
                return I18N::translate('Gender');
945
            case 'SHARED_NOTE':
946
                return I18N::translate('Shared note');
947
            case 'SLGC':
948
                /* I18N: gedcom tag SLGC. LDS = Church of Latter Day Saints. */
949
                return I18N::translate('LDS child sealing');
950
            case 'SLGC:DATE':
951
                /* I18N: LDS = Church of Latter Day Saints. */
952
                return I18N::translate('Date of LDS child sealing');
953
            case 'SLGC:PLAC':
954
                /* I18N: LDS = Church of Latter Day Saints. */
955
                return I18N::translate('Place of LDS child sealing');
956
            case 'SLGS':
957
                /* I18N: gedcom tag SLGS. LDS = Church of Latter Day Saints. */
958
                return I18N::translate('LDS spouse sealing');
959
            case 'SOUR':
960
                /* I18N: gedcom tag SOUR */
961
                return I18N::translate('Source');
962
            case 'SPFX':
963
                /* I18N: gedcom tag SPFX */
964
                return I18N::translate('Surname prefix');
965
            case 'SSN':
966
                /* I18N: gedcom tag SSN */
967
                return I18N::translate('Social security number');
968
            case 'STAE':
969
                /* I18N: gedcom tag STAE */
970
                return I18N::translate('State');
971
            case 'STAT':
972
                /* I18N: gedcom tag STAT */
973
                return I18N::translate('Status');
974
            case 'STAT:DATE':
975
                return I18N::translate('Status change date');
976
            case 'SUBM':
977
                /* I18N: gedcom tag SUBM */
978
                return I18N::translate('Submitter');
979
            case 'SUBN':
980
                /* I18N: gedcom tag SUBN */
981
                return I18N::translate('Submission');
982
            case 'SURN':
983
                /* I18N: gedcom tag SURN */
984
                return I18N::translate('Surname');
985
            case 'TEMP':
986
                /* I18N: gedcom tag TEMP */
987
                return I18N::translate('Temple');
988
            case 'TEXT':
989
                /* I18N: gedcom tag TEXT */
990
                return I18N::translate('Text');
991
            case 'TIME':
992
                /* I18N: gedcom tag TIME */
993
                return I18N::translate('Time');
994
            case 'TITL':
995
                /* I18N: gedcom tag TITL */
996
                return I18N::translate('Title');
997
            case 'TITL:FONE':
998
                return I18N::translate('Phonetic title');
999
            case 'TITL:ROMN':
1000
                return I18N::translate('Romanized title');
1001
            case 'TITL:_HEB':
1002
                return I18N::translate('Title in Hebrew');
1003
            case 'TRLR':
1004
                /* I18N: gedcom tag TRLR */
1005
                return I18N::translate('Trailer');
1006
            case 'TYPE':
1007
                /* I18N: gedcom tag TYPE */
1008
                return I18N::translate('Type');
1009
            case 'URL':
1010
                /* I18N: gedcom tag URL (A web address / URL) */
1011
                return I18N::translate('URL');
1012
            case 'VERS':
1013
                /* I18N: gedcom tag VERS */
1014
                return I18N::translate('Version');
1015
            case 'WIFE':
1016
                /* I18N: gedcom tag WIFE */
1017
                return I18N::translate('Wife');
1018
            case 'WILL':
1019
                /* I18N: gedcom tag WILL */
1020
                return I18N::translate('Will');
1021
            case 'WWW':
1022
                /* I18N: gedcom tag WWW (A web address / URL) */
1023
                return I18N::translate('URL');
1024
1025
            case '_ADPF':
1026
                /* I18N: gedcom tag _ADPF */
1027
                return I18N::translate('Adopted by father');
1028
1029
            case '_ADPM':
1030
                /* I18N: gedcom tag _ADPM */
1031
                return I18N::translate('Adopted by mother');
1032
1033
            case '_AKA':
1034
            case '_AKAN':
1035
                /* I18N: gedcom tag _AKA */
1036
                return I18N::translate('Also known as');
1037
1038
            case '_ALBUM':
1039
                // Family Tree Builder uses OBJE:_ALBUM
1040
                /* I18N: gedcom tag _ALBUM */
1041
                return I18N::translate('Album');
1042
            case '_ASSO':
1043
                /* I18N: gedcom tag _ASSO */
1044
                return I18N::translate('Associate');
1045
1046
            case '_BIBL':
1047
                /* I18N: gedcom tag _BIBL */
1048
                return I18N::translate('Bibliography');
1049
1050
            case '_BRTM':
1051
                /* I18N: gedcom tag _BRTM */
1052
                return I18N::translate('Brit milah');
1053
            case '_BRTM:DATE':
1054
                return I18N::translate('Date of brit milah');
1055
            case '_BRTM:PLAC':
1056
                return I18N::translate('Place of brit milah');
1057
1058
            case '_COML':
1059
                /* I18N: gedcom tag _COML */
1060
                return I18N::translate('Common law marriage');
1061
1062
            case '_DBID':
1063
                /* I18N: gedcom tag _DBID */
1064
                return I18N::translate('Linked database ID');
1065
1066
            case '_DEG':
1067
                /* I18N: gedcom tag _DEG */
1068
                return I18N::translate('Degree');
1069
            case '_DETS':
1070
                /* I18N: gedcom tag _DETS */
1071
                return I18N::translate('Death of one spouse');
1072
            case '_DNA':
1073
                /* I18N: gedcom tag _DNA (from FTM 2010) */
1074
                return I18N::translate('DNA markers');
1075
            case '_EMAIL':
1076
                /* I18N: gedcom tag _EMAIL */
1077
                return I18N::translate('Email address');
1078
            case '_EYEC':
1079
                /* I18N: gedcom tag _EYEC */
1080
                return I18N::translate('Eye color');
1081
            case '_FA1':
1082
                return I18N::translate('Fact 1');
1083
            case '_FA2':
1084
                return I18N::translate('Fact 2');
1085
            case '_FA3':
1086
                return I18N::translate('Fact 3');
1087
            case '_FA4':
1088
                return I18N::translate('Fact 4');
1089
            case '_FA5':
1090
                return I18N::translate('Fact 5');
1091
            case '_FA6':
1092
                return I18N::translate('Fact 6');
1093
            case '_FA7':
1094
                return I18N::translate('Fact 7');
1095
            case '_FA8':
1096
                return I18N::translate('Fact 8');
1097
            case '_FA9':
1098
                return I18N::translate('Fact 9');
1099
            case '_FA10':
1100
                return I18N::translate('Fact 10');
1101
            case '_FA11':
1102
                return I18N::translate('Fact 11');
1103
            case '_FA12':
1104
                return I18N::translate('Fact 12');
1105
            case '_FA13':
1106
                return I18N::translate('Fact 13');
1107
            case '_FNRL':
1108
                /* I18N: gedcom tag _FNRL */
1109
                return I18N::translate('Funeral');
1110
            case '_FREL':
1111
                /* I18N: gedcom tag _FREL */
1112
                return I18N::translate('Relationship to father');
1113
            case '_GEDF':
1114
                /* I18N: gedcom tag _GEDF */
1115
                return I18N::translate('GEDCOM file');
1116
            case '_GODP':
1117
                /* I18N: gedcom tag _GODP */
1118
                return I18N::translate('Godparent');
1119
            case '_GOV':
1120
                /* I18N: gedcom tag _GOV - see https://gov.genealogy.net */
1121
                return I18N::translate('GOV identifier');
1122
            case '_HAIR':
1123
                /* I18N: gedcom tag _HAIR */
1124
                return I18N::translate('Hair color');
1125
            case '_HEB':
1126
                /* I18N: gedcom tag _HEB */
1127
                return I18N::translate('Hebrew');
1128
            case '_HEIG':
1129
                /* I18N: gedcom tag _HEIG */
1130
                return I18N::translate('Height');
1131
            case '_HNM':
1132
                /* I18N: gedcom tag _HNM */
1133
                return I18N::translate('Hebrew name');
1134
            case '_HOL':
1135
                /* I18N: gedcom tag _HOL */
1136
                return I18N::translate('Holocaust');
1137
1138
            case '_INTE':
1139
                /* I18N: gedcom tag _INTE */
1140
                return I18N::translate('Interment');
1141
1142
            case '_LOC':
1143
                /* I18N: gedcom tag _LOC */
1144
                return I18N::translate('Location');
1145
            case '_MARI':
1146
                /* I18N: gedcom tag _MARI */
1147
                return I18N::translate('Marriage intention');
1148
            case '_MARNM':
1149
                /* I18N: gedcom tag _MARNM */
1150
                return I18N::translate('Married name');
1151
            case '_PRIM':
1152
                /* I18N: gedcom tag _PRIM */
1153
                return I18N::translate('Highlighted image');
1154
            case '_MARNM_SURN':
1155
                return I18N::translate('Married surname');
1156
1157
            case '_MBON':
1158
                /* I18N: gedcom tag _MBON */
1159
                return I18N::translate('Marriage bond');
1160
            case '_MDCL':
1161
                /* I18N: gedcom tag _MDCL */
1162
                return I18N::translate('Medical');
1163
            case '_MEDC':
1164
                /* I18N: gedcom tag _MEDC */
1165
                return I18N::translate('Medical condition');
1166
            case '_MEND':
1167
                /* I18N: gedcom tag _MEND */
1168
                return I18N::translate('Marriage ending status');
1169
            case '_MILI':
1170
                /* I18N: gedcom tag _MILI */
1171
                return I18N::translate('Military');
1172
            case '_MILT':
1173
                /* I18N: gedcom tag _MILT */
1174
                return I18N::translate('Military service');
1175
            case '_MREL':
1176
                /* I18N: gedcom tag _MREL */
1177
                return I18N::translate('Relationship to mother');
1178
            case '_MSTAT':
1179
                /* I18N: gedcom tag _MSTAT */
1180
                return I18N::translate('Marriage beginning status');
1181
            case '_NAME':
1182
                /* I18N: gedcom tag _NAME */
1183
                return I18N::translate('Mailing name');
1184
            case '_NAMS':
1185
                /* I18N: gedcom tag _NAMS */
1186
                return I18N::translate('Namesake');
1187
            case '_NLIV':
1188
                /* I18N: gedcom tag _NLIV */
1189
                return I18N::translate('Not living');
1190
            case '_NMAR':
1191
                /* I18N: gedcom tag _NMAR */
1192
                return I18N::translate('Never married');
1193
1194
            case '_NMR':
1195
                /* I18N: gedcom tag _NMR */
1196
                return I18N::translate('Not married');
1197
1198
            case '_PHOTO':
1199
                // Family Tree Builder uses "0 _ALBUM/1_PHOTO"
1200
                return I18N::translate('Photo');
1201
            case '_WT_USER':
1202
                return I18N::translate('by');
1203
            case '_PRMN':
1204
                /* I18N: gedcom tag _PRMN */
1205
                return I18N::translate('Permanent number');
1206
            case '_RNAME':
1207
                return I18N::translate('Religious name');
1208
1209
            case '_SCBK':
1210
                /* I18N: gedcom tag _SCBK */
1211
                return I18N::translate('Scrapbook');
1212
            case '_SEPR':
1213
                /* I18N: gedcom tag _SEPR */
1214
                return I18N::translate('Separation');
1215
            case '_SSHOW':
1216
                /* I18N: gedcom tag _SSHOW */
1217
                return I18N::translate('Slide show');
1218
            case '_STAT':
1219
                /* I18N: gedcom tag _STAT */
1220
                return I18N::translate('Marriage status');
1221
            case '_SUBQ':
1222
                /* I18N: gedcom tag _SUBQ */
1223
                return I18N::translate('Short version');
1224
            case '_TODO':
1225
                /* I18N: gedcom tag _TODO */
1226
                return I18N::translate('Research task');
1227
            case '_TYPE':
1228
                /* I18N: gedcom tag _TYPE */
1229
                return I18N::translate('Media type');
1230
            case '_UID':
1231
                /* I18N: gedcom tag _UID */
1232
                return I18N::translate('Unique identifier');
1233
            case '_URL':
1234
                /* I18N: gedcom tag _URL */
1235
                return I18N::translate('URL');
1236
            case '_WEIG':
1237
                /* I18N: gedcom tag _WEIG */
1238
                return I18N::translate('Weight');
1239
            case '_WITN':
1240
                /* I18N: gedcom tag _WITN */
1241
                return I18N::translate('Witness');
1242
            case '_WT_OBJE_SORT':
1243
                /* I18N: gedcom tag _WT_OBJE_SORT */
1244
                return I18N::translate('Re-order media');
1245
            case '_YART':
1246
                /* I18N: gedcom tag _YART - A yahrzeit is a special anniversary of death in the Hebrew faith/calendar. */
1247
                return I18N::translate('Yahrzeit');
1248
            case '_FILESIZE': // Family Tree Builder uses OBJE:_FILESIZE
1249
            case '__FILE_SIZE__':
1250
                // This pseudo-tag is generated internally to present information about a media object
1251
                return I18N::translate('File size');
1252
            case '__IMAGE_SIZE__':
1253
                // This pseudo-tag is generated internally to present information about a media object
1254
                return I18N::translate('Image dimensions');
1255
            default:
1256
                // If no specialisation exists (e.g. DEAT:CAUS), then look for the general (CAUS)
1257
                if (str_contains($tag, ':')) {
1258
                    [, $tag] = explode(':', $tag, 2);
1259
1260
                    return self::getLabel($tag);
1261
                }
1262
1263
                // Still no translation? Highlight this as an error
1264
                return '<span class="error" title="' . I18N::translate('Unrecognized GEDCOM code') . '">' . e($tag) . '</span>';
1265
        }
1266
    }
1267
1268
    /**
1269
     * Translate a label/value pair, such as “Occupation: Farmer”
1270
     *
1271
     * @param string            $tag
1272
     * @param string            $value
1273
     * @param GedcomRecord|null $record
1274
     * @param string|null       $element
1275
     *
1276
     * @return string
1277
     */
1278
    public static function getLabelValue(string $tag, string $value, GedcomRecord $record = null, $element = 'div'): string
0 ignored issues
show
Unused Code introduced by
The parameter $record is not used and could be removed. ( Ignorable by Annotation )

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

1278
    public static function getLabelValue(string $tag, string $value, /** @scrutinizer ignore-unused */ GedcomRecord $record = null, $element = 'div'): string

This check looks for parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
1279
    {
1280
        return
1281
            '<' . $element . ' class="fact_' . $tag . '">' .
1282
            /* I18N: a label/value pair, such as “Occupation: Farmer”. Some languages may need to change the punctuation. */
1283
            I18N::translate('<span class="label">%1$s:</span> <span class="field" dir="auto">%2$s</span>', self::getLabel($tag), $value) .
1284
            '</' . $element . '>';
1285
    }
1286
1287
    /**
1288
     * Get a list of facts, for use in the "fact picker" edit control
1289
     *
1290
     * @param string $fact_type
1291
     *
1292
     * @return array<string>
1293
     */
1294
    public static function getPicklistFacts(string $fact_type): array
1295
    {
1296
        switch ($fact_type) {
1297
            case Individual::RECORD_TYPE:
1298
                $tags = [
1299
                    // Facts, attributes for individuals (no links to FAMs)
1300
                    'RESN',
1301
                    'NAME',
1302
                    'SEX',
1303
                    'BIRT',
1304
                    'CHR',
1305
                    'DEAT',
1306
                    'BURI',
1307
                    'CREM',
1308
                    'ADOP',
1309
                    'BAPM',
1310
                    'BARM',
1311
                    'BASM',
1312
                    'BLES',
1313
                    'CHRA',
1314
                    'CONF',
1315
                    'FCOM',
1316
                    'ORDN',
1317
                    'NATU',
1318
                    'EMIG',
1319
                    'IMMI',
1320
                    'CENS',
1321
                    'PROB',
1322
                    'WILL',
1323
                    'GRAD',
1324
                    'RETI',
1325
                    'EVEN',
1326
                    'CAST',
1327
                    'DSCR',
1328
                    'EDUC',
1329
                    'IDNO',
1330
                    'NATI',
1331
                    'NCHI',
1332
                    'NMR',
1333
                    'OCCU',
1334
                    'PROP',
1335
                    'RELI',
1336
                    'RESI',
1337
                    'SSN',
1338
                    'TITL',
1339
                    'FACT',
1340
                    'BAPL',
1341
                    'CONL',
1342
                    'ENDL',
1343
                    'SLGC',
1344
                    'SUBM',
1345
                    'ASSO',
1346
                    'ALIA',
1347
                    'ANCI',
1348
                    'DESI',
1349
                    'RFN',
1350
                    'AFN',
1351
                    'REFN',
1352
                    'RIN',
1353
                    'CHAN',
1354
                    'NOTE',
1355
                    'SHARED_NOTE',
1356
                    'SOUR',
1357
                    'OBJE',
1358
                    // non standard tags
1359
                    '_BRTM',
1360
                    '_DEG',
1361
                    '_DNA',
1362
                    '_EYEC',
1363
                    '_FNRL',
1364
                    '_HAIR',
1365
                    '_HEIG',
1366
                    '_HNM',
1367
                    '_HOL',
1368
                    '_INTE',
1369
                    '_MDCL',
1370
                    '_MEDC',
1371
                    '_MILI',
1372
                    '_MILT',
1373
                    '_NAME',
1374
                    '_NAMS',
1375
                    '_NLIV',
1376
                    '_NMAR',
1377
                    '_PRMN',
1378
                    '_TODO',
1379
                    '_UID',
1380
                    '_WEIG',
1381
                    '_YART',
1382
                ];
1383
                break;
1384
1385
            case Family::RECORD_TYPE:
1386
                $tags = [
1387
                    // Facts for families, left out HUSB, WIFE & CHIL links
1388
                    'RESN',
1389
                    'ANUL',
1390
                    'CENS',
1391
                    'DIV',
1392
                    'DIVF',
1393
                    'ENGA',
1394
                    'MARB',
1395
                    'MARC',
1396
                    'MARR',
1397
                    'MARL',
1398
                    'MARS',
1399
                    'RESI',
1400
                    'EVEN',
1401
                    'NCHI',
1402
                    'SUBM',
1403
                    'SLGS',
1404
                    'REFN',
1405
                    'RIN',
1406
                    'CHAN',
1407
                    'NOTE',
1408
                    'SHARED_NOTE',
1409
                    'SOUR',
1410
                    'OBJE',
1411
                    // non standard tags
1412
                    '_NMR',
1413
                    'MARR_CIVIL',
1414
                    'MARR_RELIGIOUS',
1415
                    'MARR_PARTNERS',
1416
                    'MARR_UNKNOWN',
1417
                    '_COML',
1418
                    '_MBON',
1419
                    '_MARI',
1420
                    '_SEPR',
1421
                    '_TODO',
1422
                ];
1423
                break;
1424
1425
            case Source::RECORD_TYPE:
1426
                $tags = [
1427
                    // Facts for sources
1428
                    'DATA',
1429
                    'AUTH',
1430
                    'TITL',
1431
                    'ABBR',
1432
                    'PUBL',
1433
                    'TEXT',
1434
                    'REPO',
1435
                    'REFN',
1436
                    'RIN',
1437
                    'CHAN',
1438
                    'NOTE',
1439
                    'SHARED_NOTE',
1440
                    'OBJE',
1441
                    'RESN',
1442
                ];
1443
                break;
1444
1445
            case Repository::RECORD_TYPE:
1446
                $tags = [
1447
                    // Facts for repositories
1448
                    'NAME',
1449
                    'ADDR',
1450
                    'PHON',
1451
                    'EMAIL',
1452
                    'FAX',
1453
                    'WWW',
1454
                    'NOTE',
1455
                    'SHARED_NOTE',
1456
                    'REFN',
1457
                    'RIN',
1458
                    'CHAN',
1459
                    'RESN',
1460
                ];
1461
                break;
1462
1463
            case 'PLAC':
1464
                $tags = [
1465
                    // Facts for places
1466
                    'FONE',
1467
                    'ROMN',
1468
                    // non standard tags
1469
                    '_GOV',
1470
                    '_HEB',
1471
                ];
1472
                break;
1473
1474
            case 'NAME':
1475
                $tags = [
1476
                    // Facts subordinate to NAME
1477
                    'FONE',
1478
                    'ROMN',
1479
                    // non standard tags
1480
                    '_HEB',
1481
                    '_AKA',
1482
                    '_MARNM',
1483
                ];
1484
                break;
1485
1486
            default:
1487
                $tags = [];
1488
                break;
1489
        }
1490
1491
        $facts = [];
1492
        foreach ($tags as $tag) {
1493
            $facts[$tag] = self::getLabel($tag);
1494
        }
1495
        uasort($facts, '\Fisharebest\Webtrees\I18N::strcasecmp');
1496
1497
        return $facts;
1498
    }
1499
1500
    /**
1501
     * Translate the value for 1 FILE/2 FORM/3 TYPE
1502
     *
1503
     * @param string $type
1504
     *
1505
     * @return string
1506
     */
1507
    public static function getFileFormTypeValue(string $type): string
1508
    {
1509
        $element = Registry::elementFactory()->make('OBJE:FILE:FORM:TYPE');
1510
1511
        return $element->values()[$type] ?? $type;
1512
    }
1513
1514
    /**
1515
     * A list of all possible values for 1 FILE/2 FORM/3 TYPE
1516
     *
1517
     * @return array<string>
1518
     */
1519
    public static function getFileFormTypes(): array
1520
    {
1521
        $element = Registry::elementFactory()->make('OBJE:FILE:FORM:TYPE');
1522
1523
        return array_filter($element->values());
1524
    }
1525
1526
    /**
1527
     * Generate a value for a new _UID field.
1528
     * Instead of RFC4122-compatible UUIDs, generate ones that
1529
     * are compatible with PAF, Legacy, RootsMagic, etc.
1530
     * In these, the string is upper-cased, dashes are removed,
1531
     * and a two-byte checksum is added.
1532
     *
1533
     * @return string
1534
     */
1535
    public static function createUid(): string
1536
    {
1537
        $uid = str_replace('-', '', Uuid::uuid4()->toString());
1538
1539
        $checksum_a = 0; // a sum of the bytes
1540
        $checksum_b = 0; // a sum of the incremental values of $checksum_a
1541
1542
        // Compute checksums
1543
        for ($i = 0; $i < 32; $i += 2) {
1544
            $checksum_a += hexdec(substr($uid, $i, 2));
1545
            $checksum_b += $checksum_a & 0xff;
1546
        }
1547
1548
        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

1548
        return strtoupper($uid . substr(dechex(/** @scrutinizer ignore-type */ $checksum_a), -2) . substr(dechex($checksum_b), -2));
Loading history...
1549
    }
1550
}
1551