Completed
Push — 1.7 ( c3b8e7...0a3d97 )
by
unknown
08:31
created
app/Module/FrequentlyAskedQuestionsModule.php 1 patch
Switch Indentation   +35 added lines, -35 removed lines patch added patch discarded remove patch
@@ -47,41 +47,41 @@
 block discarded – undo
47 47
 	 */
48 48
 	public function modAction($mod_action) {
49 49
 		switch ($mod_action) {
50
-		case 'admin_config':
51
-			$this->config();
52
-			break;
53
-		case 'admin_delete':
54
-			if (Auth::isAdmin()) {
55
-				$this->delete();
56
-			}
57
-			header('Location: ' . WT_BASE_URL . 'module.php?mod=faq&mod_action=admin_config');
58
-			break;
59
-		case 'admin_edit':
60
-			$this->edit();
61
-			break;
62
-		case 'admin_edit_save':
63
-			if (Auth::isAdmin()) {
64
-				$this->editSave();
65
-			}
66
-			header('Location: ' . WT_BASE_URL . 'module.php?mod=faq&mod_action=admin_config');
67
-			break;
68
-		case 'admin_movedown':
69
-			if (Auth::isAdmin()) {
70
-				$this->movedown();
71
-			}
72
-			header('Location: ' . WT_BASE_URL . 'module.php?mod=faq&mod_action=admin_config');
73
-			break;
74
-		case 'admin_moveup':
75
-			if (Auth::isAdmin()) {
76
-				$this->moveup();
77
-			}
78
-			header('Location: ' . WT_BASE_URL . 'module.php?mod=faq&mod_action=admin_config');
79
-			break;
80
-		case 'show':
81
-			$this->show();
82
-			break;
83
-		default:
84
-			http_response_code(404);
50
+			case 'admin_config':
51
+				$this->config();
52
+				break;
53
+			case 'admin_delete':
54
+				if (Auth::isAdmin()) {
55
+					$this->delete();
56
+				}
57
+				header('Location: ' . WT_BASE_URL . 'module.php?mod=faq&mod_action=admin_config');
58
+				break;
59
+			case 'admin_edit':
60
+				$this->edit();
61
+				break;
62
+			case 'admin_edit_save':
63
+				if (Auth::isAdmin()) {
64
+					$this->editSave();
65
+				}
66
+				header('Location: ' . WT_BASE_URL . 'module.php?mod=faq&mod_action=admin_config');
67
+				break;
68
+			case 'admin_movedown':
69
+				if (Auth::isAdmin()) {
70
+					$this->movedown();
71
+				}
72
+				header('Location: ' . WT_BASE_URL . 'module.php?mod=faq&mod_action=admin_config');
73
+				break;
74
+			case 'admin_moveup':
75
+				if (Auth::isAdmin()) {
76
+					$this->moveup();
77
+				}
78
+				header('Location: ' . WT_BASE_URL . 'module.php?mod=faq&mod_action=admin_config');
79
+				break;
80
+			case 'show':
81
+				$this->show();
82
+				break;
83
+			default:
84
+				http_response_code(404);
85 85
 		}
86 86
 	}
87 87
 
Please login to merge, or discard this patch.
app/Module/BatchUpdateModule.php 1 patch
Switch Indentation   +66 added lines, -66 removed lines patch added patch discarded remove patch
@@ -94,13 +94,13 @@  discard block
 block discarded – undo
94 94
 	 */
95 95
 	public function modAction($mod_action) {
96 96
 		switch ($mod_action) {
97
-		case 'admin_batch_update':
98
-			echo $this->main();
99
-			break;
97
+			case 'admin_batch_update':
98
+				echo $this->main();
99
+				break;
100 100
 
101
-		default:
102
-			http_response_code(404);
103
-			break;
101
+			default:
102
+				http_response_code(404);
103
+				break;
104 104
 		}
105 105
 	}
106 106
 
@@ -125,36 +125,36 @@  discard block
 block discarded – undo
125 125
 			$this->getAllXrefs();
126 126
 
127 127
 			switch ($this->action) {
128
-			case 'update':
129
-				$record = self::getLatestRecord($this->xref, $this->all_xrefs[$this->xref]);
130
-				if ($this->PLUGIN->doesRecordNeedUpdate($this->xref, $record)) {
131
-					$newrecord = $this->PLUGIN->updateRecord($this->xref, $record);
132
-					if ($newrecord != $record) {
133
-						if ($newrecord) {
134
-							GedcomRecord::getInstance($this->xref, $WT_TREE)->updateRecord($newrecord, !$this->PLUGIN->chan);
135
-						} else {
136
-							GedcomRecord::getInstance($this->xref, $WT_TREE)->deleteRecord();
137
-						}
138
-					}
139
-				}
140
-				$this->xref = $this->findNextXref($this->xref);
141
-				break;
142
-			case 'update_all':
143
-				foreach ($this->all_xrefs as $xref => $type) {
144
-					$record = self::getLatestRecord($xref, $type);
145
-					if ($this->PLUGIN->doesRecordNeedUpdate($xref, $record)) {
146
-						$newrecord = $this->PLUGIN->updateRecord($xref, $record);
128
+				case 'update':
129
+					$record = self::getLatestRecord($this->xref, $this->all_xrefs[$this->xref]);
130
+					if ($this->PLUGIN->doesRecordNeedUpdate($this->xref, $record)) {
131
+						$newrecord = $this->PLUGIN->updateRecord($this->xref, $record);
147 132
 						if ($newrecord != $record) {
148 133
 							if ($newrecord) {
149
-								GedcomRecord::getInstance($xref, $WT_TREE)->updateRecord($newrecord, !$this->PLUGIN->chan);
134
+								GedcomRecord::getInstance($this->xref, $WT_TREE)->updateRecord($newrecord, !$this->PLUGIN->chan);
150 135
 							} else {
151
-								GedcomRecord::getInstance($xref, $WT_TREE)->deleteRecord();
136
+								GedcomRecord::getInstance($this->xref, $WT_TREE)->deleteRecord();
152 137
 							}
153 138
 						}
154 139
 					}
155
-				}
156
-				$this->xref = '';
157
-				break;
140
+					$this->xref = $this->findNextXref($this->xref);
141
+					break;
142
+				case 'update_all':
143
+					foreach ($this->all_xrefs as $xref => $type) {
144
+						$record = self::getLatestRecord($xref, $type);
145
+						if ($this->PLUGIN->doesRecordNeedUpdate($xref, $record)) {
146
+							$newrecord = $this->PLUGIN->updateRecord($xref, $record);
147
+							if ($newrecord != $record) {
148
+								if ($newrecord) {
149
+									GedcomRecord::getInstance($xref, $WT_TREE)->updateRecord($newrecord, !$this->PLUGIN->chan);
150
+								} else {
151
+									GedcomRecord::getInstance($xref, $WT_TREE)->deleteRecord();
152
+								}
153
+							}
154
+						}
155
+					}
156
+					$this->xref = '';
157
+					break;
158 158
 			}
159 159
 
160 160
 			// Make sure that our requested record really does need updating.
@@ -313,28 +313,28 @@  discard block
 block discarded – undo
313 313
 		$vars = array();
314 314
 		foreach ($this->PLUGIN->getRecordTypesToUpdate() as $type) {
315 315
 			switch ($type) {
316
-			case 'INDI':
317
-				$sql[]  = "SELECT i_id, 'INDI' FROM `##individuals` WHERE i_file=?";
318
-				$vars[] = $WT_TREE->getTreeId();
319
-				break;
320
-			case 'FAM':
321
-				$sql[]  = "SELECT f_id, 'FAM' FROM `##families` WHERE f_file=?";
322
-				$vars[] = $WT_TREE->getTreeId();
323
-				break;
324
-			case 'SOUR':
325
-				$sql[]  = "SELECT s_id, 'SOUR' FROM `##sources` WHERE s_file=?";
326
-				$vars[] = $WT_TREE->getTreeId();
327
-				break;
328
-			case 'OBJE':
329
-				$sql[]  = "SELECT m_id, 'OBJE' FROM `##media` WHERE m_file=?";
330
-				$vars[] = $WT_TREE->getTreeId();
331
-				break;
332
-			default:
333
-				$sql[]  = "SELECT o_id, ? FROM `##other` WHERE o_type=? AND o_file=?";
334
-				$vars[] = $type;
335
-				$vars[] = $type;
336
-				$vars[] = $WT_TREE->getTreeId();
337
-				break;
316
+				case 'INDI':
317
+					$sql[]  = "SELECT i_id, 'INDI' FROM `##individuals` WHERE i_file=?";
318
+					$vars[] = $WT_TREE->getTreeId();
319
+					break;
320
+				case 'FAM':
321
+					$sql[]  = "SELECT f_id, 'FAM' FROM `##families` WHERE f_file=?";
322
+					$vars[] = $WT_TREE->getTreeId();
323
+					break;
324
+				case 'SOUR':
325
+					$sql[]  = "SELECT s_id, 'SOUR' FROM `##sources` WHERE s_file=?";
326
+					$vars[] = $WT_TREE->getTreeId();
327
+					break;
328
+				case 'OBJE':
329
+					$sql[]  = "SELECT m_id, 'OBJE' FROM `##media` WHERE m_file=?";
330
+					$vars[] = $WT_TREE->getTreeId();
331
+					break;
332
+				default:
333
+					$sql[]  = "SELECT o_id, ? FROM `##other` WHERE o_type=? AND o_file=?";
334
+					$vars[] = $type;
335
+					$vars[] = $type;
336
+					$vars[] = $WT_TREE->getTreeId();
337
+					break;
338 338
 			}
339 339
 		}
340 340
 		$this->all_xrefs =
@@ -411,20 +411,20 @@  discard block
 block discarded – undo
411 411
 		global $WT_TREE;
412 412
 
413 413
 		switch ($type) {
414
-		case 'INDI':
415
-			return Individual::getInstance($xref, $WT_TREE)->getGedcom();
416
-		case 'FAM':
417
-			return Family::getInstance($xref, $WT_TREE)->getGedcom();
418
-		case 'SOUR':
419
-			return Source::getInstance($xref, $WT_TREE)->getGedcom();
420
-		case 'REPO':
421
-			return Repository::getInstance($xref, $WT_TREE)->getGedcom();
422
-		case 'OBJE':
423
-			return Media::getInstance($xref, $WT_TREE)->getGedcom();
424
-		case 'NOTE':
425
-			return Note::getInstance($xref, $WT_TREE)->getGedcom();
426
-		default:
427
-			return GedcomRecord::getInstance($xref, $WT_TREE)->getGedcom();
414
+			case 'INDI':
415
+				return Individual::getInstance($xref, $WT_TREE)->getGedcom();
416
+			case 'FAM':
417
+				return Family::getInstance($xref, $WT_TREE)->getGedcom();
418
+			case 'SOUR':
419
+				return Source::getInstance($xref, $WT_TREE)->getGedcom();
420
+			case 'REPO':
421
+				return Repository::getInstance($xref, $WT_TREE)->getGedcom();
422
+			case 'OBJE':
423
+				return Media::getInstance($xref, $WT_TREE)->getGedcom();
424
+			case 'NOTE':
425
+				return Note::getInstance($xref, $WT_TREE)->getGedcom();
426
+			default:
427
+				return GedcomRecord::getInstance($xref, $WT_TREE)->getGedcom();
428 428
 		}
429 429
 	}
430 430
 
Please login to merge, or discard this patch.
app/Module/YahrzeitModule.php 1 patch
Switch Indentation   +60 added lines, -60 removed lines patch added patch discarded remove patch
@@ -119,24 +119,24 @@  discard block
 block discarded – undo
119 119
 		}
120 120
 
121 121
 		switch ($infoStyle) {
122
-		case 'list':
123
-			foreach ($yahrzeits as $yahrzeit) {
124
-				if ($yahrzeit->jd >= $startjd && $yahrzeit->jd < $startjd + $days) {
125
-					$ind = $yahrzeit->getParent();
126
-					$content .= "<a href=\"" . $ind->getHtmlUrl() . "\" class=\"list_item name2\">" . $ind->getFullName() . "</a>" . $ind->getSexImage();
127
-					$content .= "<div class=\"indent\">";
128
-					$content .= $yahrzeit->getDate()->display(true);
129
-					$content .= ', ' . I18N::translate('%s year anniversary', $yahrzeit->anniv);
130
-					$content .= "</div>";
122
+			case 'list':
123
+				foreach ($yahrzeits as $yahrzeit) {
124
+					if ($yahrzeit->jd >= $startjd && $yahrzeit->jd < $startjd + $days) {
125
+						$ind = $yahrzeit->getParent();
126
+						$content .= "<a href=\"" . $ind->getHtmlUrl() . "\" class=\"list_item name2\">" . $ind->getFullName() . "</a>" . $ind->getSexImage();
127
+						$content .= "<div class=\"indent\">";
128
+						$content .= $yahrzeit->getDate()->display(true);
129
+						$content .= ', ' . I18N::translate('%s year anniversary', $yahrzeit->anniv);
130
+						$content .= "</div>";
131
+					}
131 132
 				}
132
-			}
133
-			break;
134
-		case 'table':
135
-		default:
136
-			$table_id = Uuid::uuid4(); // table requires a unique ID
137
-			$controller
138
-				->addExternalJavascript(WT_JQUERY_DATATABLES_JS_URL)
139
-				->addInlineJavascript('
133
+				break;
134
+			case 'table':
135
+			default:
136
+				$table_id = Uuid::uuid4(); // table requires a unique ID
137
+				$controller
138
+					->addExternalJavascript(WT_JQUERY_DATATABLES_JS_URL)
139
+					->addInlineJavascript('
140 140
 					jQuery("#' . $table_id . '").dataTable({
141 141
 						dom: \'t\',
142 142
 						' . I18N::datatablesI18N() . ',
@@ -160,53 +160,53 @@  discard block
 block discarded – undo
160 160
 					jQuery("#' . $table_id . '").css("visibility", "visible");
161 161
 					jQuery(".loading-image").css("display", "none");
162 162
 				');
163
-			$content = '';
164
-			$content .= '<div class="loading-image">&nbsp;</div>';
165
-			$content .= '<table id="' . $table_id . '" class="width100" style="visibility:hidden;">';
166
-			$content .= '<thead><tr>';
167
-			$content .= '<th>' . GedcomTag::getLabel('NAME') . '</th>';
168
-			$content .= '<th>' . GedcomTag::getLabel('NAME') . '</th>';
169
-			$content .= '<th>' . GedcomTag::getLabel('DEAT') . '</th>';
170
-			$content .= '<th>DEAT</th>';
171
-			$content .= '<th><i class="icon-reminder" title="' . I18N::translate('Anniversary') . '"></i></th>';
172
-			$content .= '<th>' . GedcomTag::getLabel('_YART') . '</th>';
173
-			$content .= '<th>_YART</th>';
174
-			$content .= '</tr></thead><tbody>';
163
+				$content = '';
164
+				$content .= '<div class="loading-image">&nbsp;</div>';
165
+				$content .= '<table id="' . $table_id . '" class="width100" style="visibility:hidden;">';
166
+				$content .= '<thead><tr>';
167
+				$content .= '<th>' . GedcomTag::getLabel('NAME') . '</th>';
168
+				$content .= '<th>' . GedcomTag::getLabel('NAME') . '</th>';
169
+				$content .= '<th>' . GedcomTag::getLabel('DEAT') . '</th>';
170
+				$content .= '<th>DEAT</th>';
171
+				$content .= '<th><i class="icon-reminder" title="' . I18N::translate('Anniversary') . '"></i></th>';
172
+				$content .= '<th>' . GedcomTag::getLabel('_YART') . '</th>';
173
+				$content .= '<th>_YART</th>';
174
+				$content .= '</tr></thead><tbody>';
175 175
 
176
-			foreach ($yahrzeits as $yahrzeit) {
177
-				if ($yahrzeit->jd >= $startjd && $yahrzeit->jd < $startjd + $days) {
178
-					$content .= '<tr>';
179
-					$ind = $yahrzeit->getParent();
180
-					// Individual name(s)
181
-					$name = $ind->getFullName();
182
-					$url  = $ind->getHtmlUrl();
183
-					$content .= '<td>';
184
-					$content .= '<a href="' . $url . '">' . $name . '</a>';
185
-					$content .= $ind->getSexImage();
186
-					$addname = $ind->getAddName();
187
-					if ($addname) {
188
-						$content .= '<br><a href="' . $url . '">' . $addname . '</a>';
189
-					}
190
-					$content .= '</td>';
191
-					$content .= '<td>' . $ind->getSortName() . '</td>';
176
+				foreach ($yahrzeits as $yahrzeit) {
177
+					if ($yahrzeit->jd >= $startjd && $yahrzeit->jd < $startjd + $days) {
178
+						$content .= '<tr>';
179
+						$ind = $yahrzeit->getParent();
180
+						// Individual name(s)
181
+						$name = $ind->getFullName();
182
+						$url  = $ind->getHtmlUrl();
183
+						$content .= '<td>';
184
+						$content .= '<a href="' . $url . '">' . $name . '</a>';
185
+						$content .= $ind->getSexImage();
186
+						$addname = $ind->getAddName();
187
+						if ($addname) {
188
+							$content .= '<br><a href="' . $url . '">' . $addname . '</a>';
189
+						}
190
+						$content .= '</td>';
191
+						$content .= '<td>' . $ind->getSortName() . '</td>';
192 192
 
193
-					// death/yahrzeit event date
194
-					$content .= '<td>' . $yahrzeit->getDate()->display() . '</td>';
195
-					$content .= '<td>' . $yahrzeit->getDate()->julianDay() . '</td>'; // sortable date
193
+						// death/yahrzeit event date
194
+						$content .= '<td>' . $yahrzeit->getDate()->display() . '</td>';
195
+						$content .= '<td>' . $yahrzeit->getDate()->julianDay() . '</td>'; // sortable date
196 196
 
197
-					// Anniversary
198
-					$content .= '<td>' . $yahrzeit->anniv . '</td>';
197
+						// Anniversary
198
+						$content .= '<td>' . $yahrzeit->anniv . '</td>';
199 199
 
200
-					// upcomming yahrzeit dates
201
-					switch ($calendar) {
202
-					case 'gregorian':
203
-						$today = new GregorianDate($yahrzeit->jd);
204
-						break;
205
-					case 'jewish':
206
-					default:
207
-						$today = new JewishDate($yahrzeit->jd);
208
-						break;
209
-					}
200
+						// upcomming yahrzeit dates
201
+						switch ($calendar) {
202
+							case 'gregorian':
203
+								$today = new GregorianDate($yahrzeit->jd);
204
+								break;
205
+							case 'jewish':
206
+							default:
207
+								$today = new JewishDate($yahrzeit->jd);
208
+								break;
209
+						}
210 210
 					$td = new Date($today->format('%@ %A %O %E'));
211 211
 					$content .= '<td>' . $td->display() . '</td>';
212 212
 					$content .= '<td>' . $td->julianDay() . '</td>'; // sortable date
Please login to merge, or discard this patch.
app/Functions/FunctionsPrintLists.php 1 patch
Switch Indentation   +37 added lines, -37 removed lines patch added patch discarded remove patch
@@ -1572,37 +1572,37 @@  discard block
 block discarded – undo
1572 1572
 
1573 1573
 		}
1574 1574
 		switch ($style) {
1575
-		case 1:
1576
-			return '<ul><li>' . implode('</li><li>', $html) . '</li></ul>';
1577
-		case 2:
1578
-			return implode(I18N::$list_separator, $html);
1579
-		case 3:
1580
-			$i     = 0;
1581
-			$count = count($html);
1582
-			if ($count > 36) {
1583
-				$col = 4;
1584
-			} elseif ($count > 18) {
1585
-				$col = 3;
1586
-			} elseif ($count > 6) {
1587
-				$col = 2;
1588
-			} else {
1589
-				$col = 1;
1590
-			}
1591
-			$newcol = ceil($count / $col);
1592
-			$html2  = '<table class="list_table"><tr>';
1593
-			$html2 .= '<td class="list_value" style="padding: 14px;">';
1594
-
1595
-			foreach ($html as $surns) {
1596
-				$html2 .= $surns . '<br>';
1597
-				$i++;
1598
-				if ($i == $newcol && $i < $count) {
1599
-					$html2 .= '</td><td class="list_value" style="padding: 14px;">';
1600
-					$newcol = $i + ceil($count / $col);
1575
+			case 1:
1576
+				return '<ul><li>' . implode('</li><li>', $html) . '</li></ul>';
1577
+			case 2:
1578
+				return implode(I18N::$list_separator, $html);
1579
+			case 3:
1580
+				$i     = 0;
1581
+				$count = count($html);
1582
+				if ($count > 36) {
1583
+					$col = 4;
1584
+				} elseif ($count > 18) {
1585
+					$col = 3;
1586
+				} elseif ($count > 6) {
1587
+					$col = 2;
1588
+				} else {
1589
+					$col = 1;
1601 1590
 				}
1602
-			}
1603
-			$html2 .= '</td></tr></table>';
1591
+				$newcol = ceil($count / $col);
1592
+				$html2  = '<table class="list_table"><tr>';
1593
+				$html2 .= '<td class="list_value" style="padding: 14px;">';
1594
+
1595
+				foreach ($html as $surns) {
1596
+					$html2 .= $surns . '<br>';
1597
+					$i++;
1598
+					if ($i == $newcol && $i < $count) {
1599
+						$html2 .= '</td><td class="list_value" style="padding: 14px;">';
1600
+						$newcol = $i + ceil($count / $col);
1601
+					}
1602
+				}
1603
+				$html2 .= '</td></tr></table>';
1604 1604
 
1605
-			return $html2;
1605
+				return $html2;
1606 1606
 		}
1607 1607
 	}
1608 1608
 	/**
@@ -1783,14 +1783,14 @@  discard block
 block discarded – undo
1783 1783
 
1784 1784
 		// Now we've filtered the list, we can sort by event, if required
1785 1785
 		switch ($sort_by) {
1786
-		case 'anniv':
1787
-			// Data is already sorted by anniversary date
1788
-			break;
1789
-		case 'alpha':
1790
-			uasort($filtered_events, function (Fact $x, Fact $y) {
1791
-				return GedcomRecord::compare($x->getParent(), $y->getParent());
1792
-			});
1793
-			break;
1786
+			case 'anniv':
1787
+				// Data is already sorted by anniversary date
1788
+				break;
1789
+			case 'alpha':
1790
+				uasort($filtered_events, function (Fact $x, Fact $y) {
1791
+					return GedcomRecord::compare($x->getParent(), $y->getParent());
1792
+				});
1793
+				break;
1794 1794
 		}
1795 1795
 
1796 1796
 		foreach ($filtered_events as $fact) {
Please login to merge, or discard this patch.
app/Functions/Functions.php 1 patch
Switch Indentation   +1458 added lines, -1458 removed lines patch added patch discarded remove patch
@@ -65,29 +65,29 @@  discard block
 block discarded – undo
65 65
 	 */
66 66
 	public static function fileUploadErrorText($error_code) {
67 67
 		switch ($error_code) {
68
-		case UPLOAD_ERR_OK:
69
-			return I18N::translate('File successfully uploaded');
70
-		case UPLOAD_ERR_INI_SIZE:
71
-		case UPLOAD_ERR_FORM_SIZE:
72
-			// I18N: PHP internal error message - php.net/manual/en/features.file-upload.errors.php
73
-			return I18N::translate('The uploaded file exceeds the allowed size.');
74
-		case UPLOAD_ERR_PARTIAL:
75
-			// I18N: PHP internal error message - php.net/manual/en/features.file-upload.errors.php
76
-			return I18N::translate('The file was only partially uploaded. Please try again.');
77
-		case UPLOAD_ERR_NO_FILE:
78
-			// I18N: PHP internal error message - php.net/manual/en/features.file-upload.errors.php
79
-			return I18N::translate('No file was received. Please try again.');
80
-		case UPLOAD_ERR_NO_TMP_DIR:
81
-			// I18N: PHP internal error message - php.net/manual/en/features.file-upload.errors.php
82
-			return I18N::translate('The PHP temporary folder is missing.');
83
-		case UPLOAD_ERR_CANT_WRITE:
84
-			// I18N: PHP internal error message - php.net/manual/en/features.file-upload.errors.php
85
-			return I18N::translate('PHP failed to write to disk.');
86
-		case UPLOAD_ERR_EXTENSION:
87
-			// I18N: PHP internal error message - php.net/manual/en/features.file-upload.errors.php
88
-			return I18N::translate('PHP blocked the file because of its extension.');
89
-		default:
90
-			return 'Error: ' . $error_code;
68
+			case UPLOAD_ERR_OK:
69
+				return I18N::translate('File successfully uploaded');
70
+			case UPLOAD_ERR_INI_SIZE:
71
+			case UPLOAD_ERR_FORM_SIZE:
72
+				// I18N: PHP internal error message - php.net/manual/en/features.file-upload.errors.php
73
+				return I18N::translate('The uploaded file exceeds the allowed size.');
74
+			case UPLOAD_ERR_PARTIAL:
75
+				// I18N: PHP internal error message - php.net/manual/en/features.file-upload.errors.php
76
+				return I18N::translate('The file was only partially uploaded. Please try again.');
77
+			case UPLOAD_ERR_NO_FILE:
78
+				// I18N: PHP internal error message - php.net/manual/en/features.file-upload.errors.php
79
+				return I18N::translate('No file was received. Please try again.');
80
+			case UPLOAD_ERR_NO_TMP_DIR:
81
+				// I18N: PHP internal error message - php.net/manual/en/features.file-upload.errors.php
82
+				return I18N::translate('The PHP temporary folder is missing.');
83
+			case UPLOAD_ERR_CANT_WRITE:
84
+				// I18N: PHP internal error message - php.net/manual/en/features.file-upload.errors.php
85
+				return I18N::translate('PHP failed to write to disk.');
86
+			case UPLOAD_ERR_EXTENSION:
87
+				// I18N: PHP internal error message - php.net/manual/en/features.file-upload.errors.php
88
+				return I18N::translate('PHP blocked the file because of its extension.');
89
+			default:
90
+				return 'Error: ' . $error_code;
91 91
 		}
92 92
 	}
93 93
 
@@ -273,12 +273,12 @@  discard block
 block discarded – undo
273 273
 	 */
274 274
 	private static function reflexivePronoun(Individual $individual) {
275 275
 		switch ($individual->getSex()) {
276
-		case 'M':
277
-			return /* I18N: reflexive pronoun */ I18N::translate('himself');
278
-		case 'F':
279
-			return /* I18N: reflexive pronoun */ I18N::translate('herself');
280
-		default:
281
-			return /* I18N: reflexive pronoun - gender neutral version of himself/herself */ I18N::translate('themself');
276
+			case 'M':
277
+				return /* I18N: reflexive pronoun */ I18N::translate('himself');
278
+			case 'F':
279
+				return /* I18N: reflexive pronoun */ I18N::translate('herself');
280
+			default:
281
+				return /* I18N: reflexive pronoun - gender neutral version of himself/herself */ I18N::translate('themself');
282 282
 		}
283 283
 	}
284 284
 
@@ -463,127 +463,127 @@  discard block
 block discarded – undo
463 463
 	 */
464 464
 	public static function cousinName($n, $sex) {
465 465
 		switch ($sex) {
466
-		case 'M':
467
-			switch ($n) {
468
-			case  1:
469
-			/* I18N: Note that for Italian and Polish, “N’th cousins” are different from English “N’th cousins”, and the software has already generated the correct “N” for your language. You only need to translate - you do not need to convert. For other languages, if your cousin rules are different from English, please contact the developers. */
470
-			return I18N::translateContext('MALE', 'first cousin');
471
-			case  2:
472
-			/* I18N: Note that for Italian and Polish, “N’th cousins” are different from English “N’th cousins”, and the software has already generated the correct “N” for your language. You only need to translate - you do not need to convert. For other languages, if your cousin rules are different from English, please contact the developers. */
473
-			return I18N::translateContext('MALE', 'second cousin');
474
-			case  3:
475
-			/* I18N: Note that for Italian and Polish, “N’th cousins” are different from English “N’th cousins”, and the software has already generated the correct “N” for your language. You only need to translate - you do not need to convert. For other languages, if your cousin rules are different from English, please contact the developers. */
476
-			return I18N::translateContext('MALE', 'third cousin');
477
-			case  4:
478
-			/* I18N: Note that for Italian and Polish, “N’th cousins” are different from English “N’th cousins”, and the software has already generated the correct “N” for your language. You only need to translate - you do not need to convert. For other languages, if your cousin rules are different from English, please contact the developers. */
479
-			return I18N::translateContext('MALE', 'fourth cousin');
480
-			case  5:
481
-			/* I18N: Note that for Italian and Polish, “N’th cousins” are different from English “N’th cousins”, and the software has already generated the correct “N” for your language. You only need to translate - you do not need to convert. For other languages, if your cousin rules are different from English, please contact the developers. */
482
-			return I18N::translateContext('MALE', 'fifth cousin');
483
-			case  6:
484
-			/* I18N: Note that for Italian and Polish, “N’th cousins” are different from English “N’th cousins”, and the software has already generated the correct “N” for your language. You only need to translate - you do not need to convert. For other languages, if your cousin rules are different from English, please contact the developers. */
485
-			return I18N::translateContext('MALE', 'sixth cousin');
486
-			case  7:
487
-			/* I18N: Note that for Italian and Polish, “N’th cousins” are different from English “N’th cousins”, and the software has already generated the correct “N” for your language. You only need to translate - you do not need to convert. For other languages, if your cousin rules are different from English, please contact the developers. */
488
-			return I18N::translateContext('MALE', 'seventh cousin');
489
-			case  8:
490
-			/* I18N: Note that for Italian and Polish, “N’th cousins” are different from English “N’th cousins”, and the software has already generated the correct “N” for your language. You only need to translate - you do not need to convert. For other languages, if your cousin rules are different from English, please contact the developers. */
491
-			return I18N::translateContext('MALE', 'eighth cousin');
492
-			case  9:
493
-			/* I18N: Note that for Italian and Polish, “N’th cousins” are different from English “N’th cousins”, and the software has already generated the correct “N” for your language. You only need to translate - you do not need to convert. For other languages, if your cousin rules are different from English, please contact the developers. */
494
-			return I18N::translateContext('MALE', 'ninth cousin');
495
-			case 10:
496
-			/* I18N: Note that for Italian and Polish, “N’th cousins” are different from English “N’th cousins”, and the software has already generated the correct “N” for your language. You only need to translate - you do not need to convert. For other languages, if your cousin rules are different from English, please contact the developers. */
497
-			return I18N::translateContext('MALE', 'tenth cousin');
498
-			case 11:
499
-			/* I18N: Note that for Italian and Polish, “N’th cousins” are different from English “N’th cousins”, and the software has already generated the correct “N” for your language. You only need to translate - you do not need to convert. For other languages, if your cousin rules are different from English, please contact the developers. */
500
-			return I18N::translateContext('MALE', 'eleventh cousin');
501
-			case 12:
502
-			/* I18N: Note that for Italian and Polish, “N’th cousins” are different from English “N’th cousins”, and the software has already generated the correct “N” for your language. You only need to translate - you do not need to convert. For other languages, if your cousin rules are different from English, please contact the developers. */
503
-			return I18N::translateContext('MALE', 'twelfth cousin');
504
-			case 13:
505
-			/* I18N: Note that for Italian and Polish, “N’th cousins” are different from English “N’th cousins”, and the software has already generated the correct “N” for your language. You only need to translate - you do not need to convert. For other languages, if your cousin rules are different from English, please contact the developers. */
506
-			return I18N::translateContext('MALE', 'thirteenth cousin');
507
-			case 14:
508
-			/* I18N: Note that for Italian and Polish, “N’th cousins” are different from English “N’th cousins”, and the software has already generated the correct “N” for your language. You only need to translate - you do not need to convert. For other languages, if your cousin rules are different from English, please contact the developers. */
509
-			return I18N::translateContext('MALE', 'fourteenth cousin');
510
-			case 15:
511
-			/* I18N: Note that for Italian and Polish, “N’th cousins” are different from English “N’th cousins”, and the software has already generated the correct “N” for your language. You only need to translate - you do not need to convert. For other languages, if your cousin rules are different from English, please contact the developers. */
512
-			return I18N::translateContext('MALE', 'fifteenth cousin');
513
-			default:
514
-			/* I18N: Note that for Italian and Polish, “N’th cousins” are different from English “N’th cousins”, and the software has already generated the correct “N” for your language. You only need to translate - you do not need to convert. For other languages, if your cousin rules are different from English, please contact the developers. */
515
-			return I18N::translateContext('MALE', '%s × cousin', I18N::number($n));
516
-			}
517
-		case 'F':
518
-			switch ($n) {
519
-			case  1:
520
-			return I18N::translateContext('FEMALE', 'first cousin');
521
-			case  2:
522
-			return I18N::translateContext('FEMALE', 'second cousin');
523
-			case  3:
524
-			return I18N::translateContext('FEMALE', 'third cousin');
525
-			case  4:
526
-			return I18N::translateContext('FEMALE', 'fourth cousin');
527
-			case  5:
528
-			return I18N::translateContext('FEMALE', 'fifth cousin');
529
-			case  6:
530
-			return I18N::translateContext('FEMALE', 'sixth cousin');
531
-			case  7:
532
-			return I18N::translateContext('FEMALE', 'seventh cousin');
533
-			case  8:
534
-			return I18N::translateContext('FEMALE', 'eighth cousin');
535
-			case  9:
536
-			return I18N::translateContext('FEMALE', 'ninth cousin');
537
-			case 10:
538
-			return I18N::translateContext('FEMALE', 'tenth cousin');
539
-			case 11:
540
-			return I18N::translateContext('FEMALE', 'eleventh cousin');
541
-			case 12:
542
-			return I18N::translateContext('FEMALE', 'twelfth cousin');
543
-			case 13:
544
-			return I18N::translateContext('FEMALE', 'thirteenth cousin');
545
-			case 14:
546
-			return I18N::translateContext('FEMALE', 'fourteenth cousin');
547
-			case 15:
548
-			return I18N::translateContext('FEMALE', 'fifteenth cousin');
549
-			default:
550
-			return I18N::translateContext('FEMALE', '%s × cousin', I18N::number($n));
551
-			}
552
-		default:
553
-			switch ($n) {
554
-			case  1:
555
-			return I18N::translate('first cousin');
556
-			case  2:
557
-			return I18N::translate('second cousin');
558
-			case  3:
559
-			return I18N::translate('third cousin');
560
-			case  4:
561
-			return I18N::translate('fourth cousin');
562
-			case  5:
563
-			return I18N::translate('fifth cousin');
564
-			case  6:
565
-			return I18N::translate('sixth cousin');
566
-			case  7:
567
-			return I18N::translate('seventh cousin');
568
-			case  8:
569
-			return I18N::translate('eighth cousin');
570
-			case  9:
571
-			return I18N::translate('ninth cousin');
572
-			case 10:
573
-			return I18N::translate('tenth cousin');
574
-			case 11:
575
-			return I18N::translate('eleventh cousin');
576
-			case 12:
577
-			return I18N::translate('twelfth cousin');
578
-			case 13:
579
-			return I18N::translate('thirteenth cousin');
580
-			case 14:
581
-			return I18N::translate('fourteenth cousin');
582
-			case 15:
583
-			return I18N::translate('fifteenth cousin');
466
+			case 'M':
467
+				switch ($n) {
468
+					case  1:
469
+					/* I18N: Note that for Italian and Polish, “N’th cousins” are different from English “N’th cousins”, and the software has already generated the correct “N” for your language. You only need to translate - you do not need to convert. For other languages, if your cousin rules are different from English, please contact the developers. */
470
+					return I18N::translateContext('MALE', 'first cousin');
471
+					case  2:
472
+					/* I18N: Note that for Italian and Polish, “N’th cousins” are different from English “N’th cousins”, and the software has already generated the correct “N” for your language. You only need to translate - you do not need to convert. For other languages, if your cousin rules are different from English, please contact the developers. */
473
+					return I18N::translateContext('MALE', 'second cousin');
474
+					case  3:
475
+					/* I18N: Note that for Italian and Polish, “N’th cousins” are different from English “N’th cousins”, and the software has already generated the correct “N” for your language. You only need to translate - you do not need to convert. For other languages, if your cousin rules are different from English, please contact the developers. */
476
+					return I18N::translateContext('MALE', 'third cousin');
477
+					case  4:
478
+					/* I18N: Note that for Italian and Polish, “N’th cousins” are different from English “N’th cousins”, and the software has already generated the correct “N” for your language. You only need to translate - you do not need to convert. For other languages, if your cousin rules are different from English, please contact the developers. */
479
+					return I18N::translateContext('MALE', 'fourth cousin');
480
+					case  5:
481
+					/* I18N: Note that for Italian and Polish, “N’th cousins” are different from English “N’th cousins”, and the software has already generated the correct “N” for your language. You only need to translate - you do not need to convert. For other languages, if your cousin rules are different from English, please contact the developers. */
482
+					return I18N::translateContext('MALE', 'fifth cousin');
483
+					case  6:
484
+					/* I18N: Note that for Italian and Polish, “N’th cousins” are different from English “N’th cousins”, and the software has already generated the correct “N” for your language. You only need to translate - you do not need to convert. For other languages, if your cousin rules are different from English, please contact the developers. */
485
+					return I18N::translateContext('MALE', 'sixth cousin');
486
+					case  7:
487
+					/* I18N: Note that for Italian and Polish, “N’th cousins” are different from English “N’th cousins”, and the software has already generated the correct “N” for your language. You only need to translate - you do not need to convert. For other languages, if your cousin rules are different from English, please contact the developers. */
488
+					return I18N::translateContext('MALE', 'seventh cousin');
489
+					case  8:
490
+					/* I18N: Note that for Italian and Polish, “N’th cousins” are different from English “N’th cousins”, and the software has already generated the correct “N” for your language. You only need to translate - you do not need to convert. For other languages, if your cousin rules are different from English, please contact the developers. */
491
+					return I18N::translateContext('MALE', 'eighth cousin');
492
+					case  9:
493
+					/* I18N: Note that for Italian and Polish, “N’th cousins” are different from English “N’th cousins”, and the software has already generated the correct “N” for your language. You only need to translate - you do not need to convert. For other languages, if your cousin rules are different from English, please contact the developers. */
494
+					return I18N::translateContext('MALE', 'ninth cousin');
495
+					case 10:
496
+					/* I18N: Note that for Italian and Polish, “N’th cousins” are different from English “N’th cousins”, and the software has already generated the correct “N” for your language. You only need to translate - you do not need to convert. For other languages, if your cousin rules are different from English, please contact the developers. */
497
+					return I18N::translateContext('MALE', 'tenth cousin');
498
+					case 11:
499
+					/* I18N: Note that for Italian and Polish, “N’th cousins” are different from English “N’th cousins”, and the software has already generated the correct “N” for your language. You only need to translate - you do not need to convert. For other languages, if your cousin rules are different from English, please contact the developers. */
500
+					return I18N::translateContext('MALE', 'eleventh cousin');
501
+					case 12:
502
+					/* I18N: Note that for Italian and Polish, “N’th cousins” are different from English “N’th cousins”, and the software has already generated the correct “N” for your language. You only need to translate - you do not need to convert. For other languages, if your cousin rules are different from English, please contact the developers. */
503
+					return I18N::translateContext('MALE', 'twelfth cousin');
504
+					case 13:
505
+					/* I18N: Note that for Italian and Polish, “N’th cousins” are different from English “N’th cousins”, and the software has already generated the correct “N” for your language. You only need to translate - you do not need to convert. For other languages, if your cousin rules are different from English, please contact the developers. */
506
+					return I18N::translateContext('MALE', 'thirteenth cousin');
507
+					case 14:
508
+					/* I18N: Note that for Italian and Polish, “N’th cousins” are different from English “N’th cousins”, and the software has already generated the correct “N” for your language. You only need to translate - you do not need to convert. For other languages, if your cousin rules are different from English, please contact the developers. */
509
+					return I18N::translateContext('MALE', 'fourteenth cousin');
510
+					case 15:
511
+					/* I18N: Note that for Italian and Polish, “N’th cousins” are different from English “N’th cousins”, and the software has already generated the correct “N” for your language. You only need to translate - you do not need to convert. For other languages, if your cousin rules are different from English, please contact the developers. */
512
+					return I18N::translateContext('MALE', 'fifteenth cousin');
513
+					default:
514
+					/* I18N: Note that for Italian and Polish, “N’th cousins” are different from English “N’th cousins”, and the software has already generated the correct “N” for your language. You only need to translate - you do not need to convert. For other languages, if your cousin rules are different from English, please contact the developers. */
515
+					return I18N::translateContext('MALE', '%s × cousin', I18N::number($n));
516
+				}
517
+			case 'F':
518
+				switch ($n) {
519
+					case  1:
520
+					return I18N::translateContext('FEMALE', 'first cousin');
521
+					case  2:
522
+					return I18N::translateContext('FEMALE', 'second cousin');
523
+					case  3:
524
+					return I18N::translateContext('FEMALE', 'third cousin');
525
+					case  4:
526
+					return I18N::translateContext('FEMALE', 'fourth cousin');
527
+					case  5:
528
+					return I18N::translateContext('FEMALE', 'fifth cousin');
529
+					case  6:
530
+					return I18N::translateContext('FEMALE', 'sixth cousin');
531
+					case  7:
532
+					return I18N::translateContext('FEMALE', 'seventh cousin');
533
+					case  8:
534
+					return I18N::translateContext('FEMALE', 'eighth cousin');
535
+					case  9:
536
+					return I18N::translateContext('FEMALE', 'ninth cousin');
537
+					case 10:
538
+					return I18N::translateContext('FEMALE', 'tenth cousin');
539
+					case 11:
540
+					return I18N::translateContext('FEMALE', 'eleventh cousin');
541
+					case 12:
542
+					return I18N::translateContext('FEMALE', 'twelfth cousin');
543
+					case 13:
544
+					return I18N::translateContext('FEMALE', 'thirteenth cousin');
545
+					case 14:
546
+					return I18N::translateContext('FEMALE', 'fourteenth cousin');
547
+					case 15:
548
+					return I18N::translateContext('FEMALE', 'fifteenth cousin');
549
+					default:
550
+					return I18N::translateContext('FEMALE', '%s × cousin', I18N::number($n));
551
+				}
584 552
 			default:
585
-			return I18N::translate('%s × cousin', I18N::number($n));
586
-			}
553
+				switch ($n) {
554
+					case  1:
555
+					return I18N::translate('first cousin');
556
+					case  2:
557
+					return I18N::translate('second cousin');
558
+					case  3:
559
+					return I18N::translate('third cousin');
560
+					case  4:
561
+					return I18N::translate('fourth cousin');
562
+					case  5:
563
+					return I18N::translate('fifth cousin');
564
+					case  6:
565
+					return I18N::translate('sixth cousin');
566
+					case  7:
567
+					return I18N::translate('seventh cousin');
568
+					case  8:
569
+					return I18N::translate('eighth cousin');
570
+					case  9:
571
+					return I18N::translate('ninth cousin');
572
+					case 10:
573
+					return I18N::translate('tenth cousin');
574
+					case 11:
575
+					return I18N::translate('eleventh cousin');
576
+					case 12:
577
+					return I18N::translate('twelfth cousin');
578
+					case 13:
579
+					return I18N::translate('thirteenth cousin');
580
+					case 14:
581
+					return I18N::translate('fourteenth cousin');
582
+					case 15:
583
+					return I18N::translate('fifteenth cousin');
584
+					default:
585
+					return I18N::translate('%s × cousin', I18N::number($n));
586
+				}
587 587
 		}
588 588
 	}
589 589
 
@@ -599,51 +599,51 @@  discard block
 block discarded – undo
599 599
 	 */
600 600
 	public static function cousinName2($n, $sex, $relation) {
601 601
 		switch ($sex) {
602
-		case 'M':
603
-			switch ($n) {
604
-			case  1:
605
-				return /* I18N: A Spanish relationship name, such as third great-nephew */ I18N::translateContext('MALE', 'first %s', $relation);
606
-			case  2:
607
-				return I18N::translateContext('MALE', 'second %s', $relation);
608
-			case  3:
609
-				return I18N::translateContext('MALE', 'third %s', $relation);
610
-			case  4:
611
-				return I18N::translateContext('MALE', 'fourth %s', $relation);
612
-			case  5:
613
-				return I18N::translateContext('MALE', 'fifth %s', $relation);
614
-			default:
615
-				return /* I18N: A Spanish relationship name, such as third great-nephew */ I18N::translateContext('MALE', '%1$s × %2$s', I18N::number($n), $relation);
616
-			}
617
-		case 'F':
618
-			switch ($n) {
619
-			case  1:
620
-				return /* I18N: A Spanish relationship name, such as third great-nephew */ I18N::translateContext('FEMALE', 'first %s', $relation);
621
-			case  2:
622
-				return I18N::translateContext('FEMALE', 'second %s', $relation);
623
-			case  3:
624
-				return I18N::translateContext('FEMALE', 'third %s', $relation);
625
-			case  4:
626
-				return I18N::translateContext('FEMALE', 'fourth %s', $relation);
627
-			case  5:
628
-				return I18N::translateContext('FEMALE', 'fifth %s', $relation);
629
-			default: // I18N: A Spanish relationship name, such as third great-nephew
630
-				return I18N::translateContext('FEMALE', '%1$s × %2$s', I18N::number($n), $relation);
631
-			}
632
-		default:
633
-			switch ($n) {
634
-			case  1:
635
-				return /* I18N: A Spanish relationship name, such as first great-nephew */ I18N::translate('first %s', $relation);
636
-			case  2:
637
-				return /* I18N: A Spanish relationship name, such as second great-nephew */ I18N::translate('second %s', $relation);
638
-			case  3:
639
-				return /* I18N: A Spanish relationship name, such as third great-nephew */ I18N::translate('third %s', $relation);
640
-			case  4:
641
-				return /* I18N: A Spanish relationship name, such as fourth great-nephew */ I18N::translate('fourth %s', $relation);
642
-			case  5:
643
-				return /* I18N: A Spanish relationship name, such as fifth great-nephew */ I18N::translate('fifth %s', $relation);
602
+			case 'M':
603
+				switch ($n) {
604
+					case  1:
605
+						return /* I18N: A Spanish relationship name, such as third great-nephew */ I18N::translateContext('MALE', 'first %s', $relation);
606
+					case  2:
607
+						return I18N::translateContext('MALE', 'second %s', $relation);
608
+					case  3:
609
+						return I18N::translateContext('MALE', 'third %s', $relation);
610
+					case  4:
611
+						return I18N::translateContext('MALE', 'fourth %s', $relation);
612
+					case  5:
613
+						return I18N::translateContext('MALE', 'fifth %s', $relation);
614
+					default:
615
+						return /* I18N: A Spanish relationship name, such as third great-nephew */ I18N::translateContext('MALE', '%1$s × %2$s', I18N::number($n), $relation);
616
+				}
617
+			case 'F':
618
+				switch ($n) {
619
+					case  1:
620
+						return /* I18N: A Spanish relationship name, such as third great-nephew */ I18N::translateContext('FEMALE', 'first %s', $relation);
621
+					case  2:
622
+						return I18N::translateContext('FEMALE', 'second %s', $relation);
623
+					case  3:
624
+						return I18N::translateContext('FEMALE', 'third %s', $relation);
625
+					case  4:
626
+						return I18N::translateContext('FEMALE', 'fourth %s', $relation);
627
+					case  5:
628
+						return I18N::translateContext('FEMALE', 'fifth %s', $relation);
629
+					default: // I18N: A Spanish relationship name, such as third great-nephew
630
+						return I18N::translateContext('FEMALE', '%1$s × %2$s', I18N::number($n), $relation);
631
+				}
644 632
 			default:
645
-				return /* I18N: A Spanish relationship name, such as 7th great-nephew */ I18N::translate('%1$s × %2$s', I18N::number($n), $relation);
646
-			}
633
+				switch ($n) {
634
+					case  1:
635
+						return /* I18N: A Spanish relationship name, such as first great-nephew */ I18N::translate('first %s', $relation);
636
+					case  2:
637
+						return /* I18N: A Spanish relationship name, such as second great-nephew */ I18N::translate('second %s', $relation);
638
+					case  3:
639
+						return /* I18N: A Spanish relationship name, such as third great-nephew */ I18N::translate('third %s', $relation);
640
+					case  4:
641
+						return /* I18N: A Spanish relationship name, such as fourth great-nephew */ I18N::translate('fourth %s', $relation);
642
+					case  5:
643
+						return /* I18N: A Spanish relationship name, such as fifth great-nephew */ I18N::translate('fifth %s', $relation);
644
+					default:
645
+						return /* I18N: A Spanish relationship name, such as 7th great-nephew */ I18N::translate('%1$s × %2$s', I18N::number($n), $relation);
646
+				}
647 647
 		}
648 648
 	}
649 649
 
@@ -680,796 +680,796 @@  discard block
 block discarded – undo
680 680
 		}
681 681
 
682 682
 		switch ($path) {
683
-		case '':
684
-			return I18N::translate('self');
685
-		//  Level One relationships
686
-		case 'mot':
687
-			return I18N::translate('mother');
688
-		case 'fat':
689
-			return I18N::translate('father');
690
-		case 'par':
691
-			return I18N::translate('parent');
692
-		case 'hus':
693
-			if ($person1 && $person2) {
694
-				foreach ($person1->getSpouseFamilies() as $family) {
695
-					if ($person2 === $family->getSpouse($person1)) {
696
-						if ($family->getFacts('_NMR')) {
697
-							if ($family->getFacts(WT_EVENTS_DIV)) {
698
-								return I18N::translateContext('MALE', 'ex-partner');
699
-							} else {
700
-								return I18N::translateContext('MALE', 'partner');
683
+			case '':
684
+				return I18N::translate('self');
685
+			//  Level One relationships
686
+			case 'mot':
687
+				return I18N::translate('mother');
688
+			case 'fat':
689
+				return I18N::translate('father');
690
+			case 'par':
691
+				return I18N::translate('parent');
692
+			case 'hus':
693
+				if ($person1 && $person2) {
694
+					foreach ($person1->getSpouseFamilies() as $family) {
695
+						if ($person2 === $family->getSpouse($person1)) {
696
+							if ($family->getFacts('_NMR')) {
697
+								if ($family->getFacts(WT_EVENTS_DIV)) {
698
+									return I18N::translateContext('MALE', 'ex-partner');
699
+								} else {
700
+									return I18N::translateContext('MALE', 'partner');
701
+								}
702
+							} elseif ($family->getFacts(WT_EVENTS_DIV)) {
703
+								return I18N::translate('ex-husband');
701 704
 							}
702
-						} elseif ($family->getFacts(WT_EVENTS_DIV)) {
703
-							return I18N::translate('ex-husband');
704 705
 						}
705 706
 					}
706 707
 				}
707
-			}
708 708
 
709
-			return I18N::translate('husband');
710
-		case 'wif':
711
-			if ($person1 && $person2) {
712
-				foreach ($person1->getSpouseFamilies() as $family) {
713
-					if ($person2 === $family->getSpouse($person1)) {
714
-						if ($family->getFacts('_NMR')) {
715
-							if ($family->getFacts(WT_EVENTS_DIV)) {
716
-								return I18N::translateContext('FEMALE', 'ex-partner');
717
-							} else {
718
-								return I18N::translateContext('FEMALE', 'partner');
709
+				return I18N::translate('husband');
710
+			case 'wif':
711
+				if ($person1 && $person2) {
712
+					foreach ($person1->getSpouseFamilies() as $family) {
713
+						if ($person2 === $family->getSpouse($person1)) {
714
+							if ($family->getFacts('_NMR')) {
715
+								if ($family->getFacts(WT_EVENTS_DIV)) {
716
+									return I18N::translateContext('FEMALE', 'ex-partner');
717
+								} else {
718
+									return I18N::translateContext('FEMALE', 'partner');
719
+								}
720
+							} elseif ($family->getFacts(WT_EVENTS_DIV)) {
721
+								return I18N::translate('ex-wife');
719 722
 							}
720
-						} elseif ($family->getFacts(WT_EVENTS_DIV)) {
721
-							return I18N::translate('ex-wife');
722 723
 						}
723 724
 					}
724 725
 				}
725
-			}
726 726
 
727
-			return I18N::translate('wife');
728
-		case 'spo':
729
-			if ($person1 && $person2) {
730
-				foreach ($person1->getSpouseFamilies() as $family) {
731
-					if ($person2 === $family->getSpouse($person1)) {
732
-						if ($family->getFacts('_NMR')) {
733
-							if ($family->getFacts(WT_EVENTS_DIV)) {
734
-								return I18N::translate('ex-partner');
735
-							} else {
736
-								return I18N::translate('partner');
727
+				return I18N::translate('wife');
728
+			case 'spo':
729
+				if ($person1 && $person2) {
730
+					foreach ($person1->getSpouseFamilies() as $family) {
731
+						if ($person2 === $family->getSpouse($person1)) {
732
+							if ($family->getFacts('_NMR')) {
733
+								if ($family->getFacts(WT_EVENTS_DIV)) {
734
+									return I18N::translate('ex-partner');
735
+								} else {
736
+									return I18N::translate('partner');
737
+								}
738
+							} elseif ($family->getFacts(WT_EVENTS_DIV)) {
739
+								return I18N::translate('ex-spouse');
737 740
 							}
738
-						} elseif ($family->getFacts(WT_EVENTS_DIV)) {
739
-							return I18N::translate('ex-spouse');
740 741
 						}
741 742
 					}
742 743
 				}
743
-			}
744 744
 
745
-			return I18N::translate('spouse');
746
-		case 'son':
747
-			return I18N::translate('son');
748
-		case 'dau':
749
-			return I18N::translate('daughter');
750
-		case 'chi':
751
-			return I18N::translate('child');
752
-		case 'bro':
753
-			if ($person1 && $person2) {
754
-				$dob1 = $person1->getBirthDate();
755
-				$dob2 = $person2->getBirthDate();
756
-				if ($dob1->isOK() && $dob2->isOK()) {
757
-					if (abs($dob1->julianDay() - $dob2->julianDay()) < 2 && !$dob1->minimumDate()->d !== 0 && !$dob2->minimumDate()->d !== 0) {
758
-						// Exclude BEF, AFT, etc.
759
-						return I18N::translate('twin brother');
760
-					} elseif ($dob1->maximumJulianDay() < $dob2->minimumJulianDay()) {
761
-						return I18N::translate('younger brother');
762
-					} elseif ($dob1->minimumJulianDay() > $dob2->maximumJulianDay()) {
763
-						return I18N::translate('elder brother');
745
+				return I18N::translate('spouse');
746
+			case 'son':
747
+				return I18N::translate('son');
748
+			case 'dau':
749
+				return I18N::translate('daughter');
750
+			case 'chi':
751
+				return I18N::translate('child');
752
+			case 'bro':
753
+				if ($person1 && $person2) {
754
+					$dob1 = $person1->getBirthDate();
755
+					$dob2 = $person2->getBirthDate();
756
+					if ($dob1->isOK() && $dob2->isOK()) {
757
+						if (abs($dob1->julianDay() - $dob2->julianDay()) < 2 && !$dob1->minimumDate()->d !== 0 && !$dob2->minimumDate()->d !== 0) {
758
+							// Exclude BEF, AFT, etc.
759
+							return I18N::translate('twin brother');
760
+						} elseif ($dob1->maximumJulianDay() < $dob2->minimumJulianDay()) {
761
+							return I18N::translate('younger brother');
762
+						} elseif ($dob1->minimumJulianDay() > $dob2->maximumJulianDay()) {
763
+							return I18N::translate('elder brother');
764
+						}
764 765
 					}
765 766
 				}
766
-			}
767 767
 
768
-			return I18N::translate('brother');
769
-		case 'sis':
770
-			if ($person1 && $person2) {
771
-				$dob1 = $person1->getBirthDate();
772
-				$dob2 = $person2->getBirthDate();
773
-				if ($dob1->isOK() && $dob2->isOK()) {
774
-					if (abs($dob1->julianDay() - $dob2->julianDay()) < 2 && !$dob1->minimumDate()->d !== 0 && !$dob2->minimumDate()->d !== 0) {
775
-						// Exclude BEF, AFT, etc.
776
-						return I18N::translate('twin sister');
777
-					} elseif ($dob1->maximumJulianDay() < $dob2->minimumJulianDay()) {
778
-						return I18N::translate('younger sister');
779
-					} elseif ($dob1->minimumJulianDay() > $dob2->maximumJulianDay()) {
780
-						return I18N::translate('elder sister');
768
+				return I18N::translate('brother');
769
+			case 'sis':
770
+				if ($person1 && $person2) {
771
+					$dob1 = $person1->getBirthDate();
772
+					$dob2 = $person2->getBirthDate();
773
+					if ($dob1->isOK() && $dob2->isOK()) {
774
+						if (abs($dob1->julianDay() - $dob2->julianDay()) < 2 && !$dob1->minimumDate()->d !== 0 && !$dob2->minimumDate()->d !== 0) {
775
+							// Exclude BEF, AFT, etc.
776
+							return I18N::translate('twin sister');
777
+						} elseif ($dob1->maximumJulianDay() < $dob2->minimumJulianDay()) {
778
+							return I18N::translate('younger sister');
779
+						} elseif ($dob1->minimumJulianDay() > $dob2->maximumJulianDay()) {
780
+							return I18N::translate('elder sister');
781
+						}
781 782
 					}
782 783
 				}
783
-			}
784 784
 
785
-			return I18N::translate('sister');
786
-		case 'sib':
787
-			if ($person1 && $person2) {
788
-				$dob1 = $person1->getBirthDate();
789
-				$dob2 = $person2->getBirthDate();
790
-				if ($dob1->isOK() && $dob2->isOK()) {
791
-					if (abs($dob1->julianDay() - $dob2->julianDay()) < 2 && !$dob1->minimumDate()->d !== 0 && !$dob2->minimumDate()->d !== 0) {
792
-						// Exclude BEF, AFT, etc.
793
-						return I18N::translate('twin sibling');
794
-					} elseif ($dob1->maximumJulianDay() < $dob2->minimumJulianDay()) {
795
-						return I18N::translate('younger sibling');
796
-					} elseif ($dob1->minimumJulianDay() > $dob2->maximumJulianDay()) {
797
-						return I18N::translate('elder sibling');
785
+				return I18N::translate('sister');
786
+			case 'sib':
787
+				if ($person1 && $person2) {
788
+					$dob1 = $person1->getBirthDate();
789
+					$dob2 = $person2->getBirthDate();
790
+					if ($dob1->isOK() && $dob2->isOK()) {
791
+						if (abs($dob1->julianDay() - $dob2->julianDay()) < 2 && !$dob1->minimumDate()->d !== 0 && !$dob2->minimumDate()->d !== 0) {
792
+							// Exclude BEF, AFT, etc.
793
+							return I18N::translate('twin sibling');
794
+						} elseif ($dob1->maximumJulianDay() < $dob2->minimumJulianDay()) {
795
+							return I18N::translate('younger sibling');
796
+						} elseif ($dob1->minimumJulianDay() > $dob2->maximumJulianDay()) {
797
+							return I18N::translate('elder sibling');
798
+						}
798 799
 					}
799 800
 				}
800
-			}
801 801
 
802
-			return I18N::translate('sibling');
802
+				return I18N::translate('sibling');
803 803
 
804
-		// Level Two relationships
805
-		case 'brochi':
806
-			return I18N::translateContext('brother’s child', 'nephew/niece');
807
-		case 'brodau':
808
-			return I18N::translateContext('brother’s daughter', 'niece');
809
-		case 'broson':
810
-			return I18N::translateContext('brother’s son', 'nephew');
811
-		case 'browif':
812
-			return I18N::translateContext('brother’s wife', 'sister-in-law');
813
-		case 'chichi':
814
-			return I18N::translateContext('child’s child', 'grandchild');
815
-		case 'chidau':
816
-			return I18N::translateContext('child’s daughter', 'granddaughter');
817
-		case 'chihus':
818
-			return I18N::translateContext('child’s husband', 'son-in-law');
819
-		case 'chison':
820
-			return I18N::translateContext('child’s son', 'grandson');
821
-		case 'chispo':
822
-			return I18N::translateContext('child’s spouse', 'son/daughter-in-law');
823
-		case 'chiwif':
824
-			return I18N::translateContext('child’s wife', 'daughter-in-law');
825
-		case 'dauchi':
826
-			return I18N::translateContext('daughter’s child', 'grandchild');
827
-		case 'daudau':
828
-			return I18N::translateContext('daughter’s daughter', 'granddaughter');
829
-		case 'dauhus':
830
-			return I18N::translateContext('daughter’s husband', 'son-in-law');
831
-		case 'dauson':
832
-			return I18N::translateContext('daughter’s son', 'grandson');
833
-		case 'fatbro':
834
-			return I18N::translateContext('father’s brother', 'uncle');
835
-		case 'fatchi':
836
-			return I18N::translateContext('father’s child', 'half-sibling');
837
-		case 'fatdau':
838
-			return I18N::translateContext('father’s daughter', 'half-sister');
839
-		case 'fatfat':
840
-			return I18N::translateContext('father’s father', 'paternal grandfather');
841
-		case 'fatmot':
842
-			return I18N::translateContext('father’s mother', 'paternal grandmother');
843
-		case 'fatpar':
844
-			return I18N::translateContext('father’s parent', 'paternal grandparent');
845
-		case 'fatsib':
846
-			return I18N::translateContext('father’s sibling', 'aunt/uncle');
847
-		case 'fatsis':
848
-			return I18N::translateContext('father’s sister', 'aunt');
849
-		case 'fatson':
850
-			return I18N::translateContext('father’s son', 'half-brother');
851
-		case 'fatwif':
852
-			return I18N::translateContext('father’s wife', 'step-mother');
853
-		case 'husbro':
854
-			return I18N::translateContext('husband’s brother', 'brother-in-law');
855
-		case 'huschi':
856
-			return I18N::translateContext('husband’s child', 'step-child');
857
-		case 'husdau':
858
-			return I18N::translateContext('husband’s daughter', 'step-daughter');
859
-		case 'husfat':
860
-			return I18N::translateContext('husband’s father', 'father-in-law');
861
-		case 'husmot':
862
-			return I18N::translateContext('husband’s mother', 'mother-in-law');
863
-		case 'hussib':
864
-			return I18N::translateContext('husband’s sibling', 'brother/sister-in-law');
865
-		case 'hussis':
866
-			return I18N::translateContext('husband’s sister', 'sister-in-law');
867
-		case 'husson':
868
-			return I18N::translateContext('husband’s son', 'step-son');
869
-		case 'motbro':
870
-			return I18N::translateContext('mother’s brother', 'uncle');
871
-		case 'motchi':
872
-			return I18N::translateContext('mother’s child', 'half-sibling');
873
-		case 'motdau':
874
-			return I18N::translateContext('mother’s daughter', 'half-sister');
875
-		case 'motfat':
876
-			return I18N::translateContext('mother’s father', 'maternal grandfather');
877
-		case 'mothus':
878
-			return I18N::translateContext('mother’s husband', 'step-father');
879
-		case 'motmot':
880
-			return I18N::translateContext('mother’s mother', 'maternal grandmother');
881
-		case 'motpar':
882
-			return I18N::translateContext('mother’s parent', 'maternal grandparent');
883
-		case 'motsib':
884
-			return I18N::translateContext('mother’s sibling', 'aunt/uncle');
885
-		case 'motsis':
886
-			return I18N::translateContext('mother’s sister', 'aunt');
887
-		case 'motson':
888
-			return I18N::translateContext('mother’s son', 'half-brother');
889
-		case 'parbro':
890
-			return I18N::translateContext('parent’s brother', 'uncle');
891
-		case 'parchi':
892
-			return I18N::translateContext('parent’s child', 'half-sibling');
893
-		case 'pardau':
894
-			return I18N::translateContext('parent’s daughter', 'half-sister');
895
-		case 'parfat':
896
-			return I18N::translateContext('parent’s father', 'grandfather');
897
-		case 'parmot':
898
-			return I18N::translateContext('parent’s mother', 'grandmother');
899
-		case 'parpar':
900
-			return I18N::translateContext('parent’s parent', 'grandparent');
901
-		case 'parsib':
902
-			return I18N::translateContext('parent’s sibling', 'aunt/uncle');
903
-		case 'parsis':
904
-			return I18N::translateContext('parent’s sister', 'aunt');
905
-		case 'parson':
906
-			return I18N::translateContext('parent’s son', 'half-brother');
907
-		case 'parspo':
908
-			return I18N::translateContext('parent’s spouse', 'step-parent');
909
-		case 'sibchi':
910
-			return I18N::translateContext('sibling’s child', 'nephew/niece');
911
-		case 'sibdau':
912
-			return I18N::translateContext('sibling’s daughter', 'niece');
913
-		case 'sibson':
914
-			return I18N::translateContext('sibling’s son', 'nephew');
915
-		case 'sibspo':
916
-			return I18N::translateContext('sibling’s spouse', 'brother/sister-in-law');
917
-		case 'sischi':
918
-			return I18N::translateContext('sister’s child', 'nephew/niece');
919
-		case 'sisdau':
920
-			return I18N::translateContext('sister’s daughter', 'niece');
921
-		case 'sishus':
922
-			return I18N::translateContext('sister’s husband', 'brother-in-law');
923
-		case 'sisson':
924
-			return I18N::translateContext('sister’s son', 'nephew');
925
-		case 'sonchi':
926
-			return I18N::translateContext('son’s child', 'grandchild');
927
-		case 'sondau':
928
-			return I18N::translateContext('son’s daughter', 'granddaughter');
929
-		case 'sonson':
930
-			return I18N::translateContext('son’s son', 'grandson');
931
-		case 'sonwif':
932
-			return I18N::translateContext('son’s wife', 'daughter-in-law');
933
-		case 'spobro':
934
-			return I18N::translateContext('spouse’s brother', 'brother-in-law');
935
-		case 'spochi':
936
-			return I18N::translateContext('spouse’s child', 'step-child');
937
-		case 'spodau':
938
-			return I18N::translateContext('spouse’s daughter', 'step-daughter');
939
-		case 'spofat':
940
-			return I18N::translateContext('spouse’s father', 'father-in-law');
941
-		case 'spomot':
942
-			return I18N::translateContext('spouse’s mother', 'mother-in-law');
943
-		case 'sposis':
944
-			return I18N::translateContext('spouse’s sister', 'sister-in-law');
945
-		case 'sposon':
946
-			return I18N::translateContext('spouse’s son', 'step-son');
947
-		case 'spopar':
948
-			return I18N::translateContext('spouse’s parent', 'mother/father-in-law');
949
-		case 'sposib':
950
-			return I18N::translateContext('spouse’s sibling', 'brother/sister-in-law');
951
-		case 'wifbro':
952
-			return I18N::translateContext('wife’s brother', 'brother-in-law');
953
-		case 'wifchi':
954
-			return I18N::translateContext('wife’s child', 'step-child');
955
-		case 'wifdau':
956
-			return I18N::translateContext('wife’s daughter', 'step-daughter');
957
-		case 'wiffat':
958
-			return I18N::translateContext('wife’s father', 'father-in-law');
959
-		case 'wifmot':
960
-			return I18N::translateContext('wife’s mother', 'mother-in-law');
961
-		case 'wifsib':
962
-			return I18N::translateContext('wife’s sibling', 'brother/sister-in-law');
963
-		case 'wifsis':
964
-			return I18N::translateContext('wife’s sister', 'sister-in-law');
965
-		case 'wifson':
966
-			return I18N::translateContext('wife’s son', 'step-son');
804
+			// Level Two relationships
805
+			case 'brochi':
806
+				return I18N::translateContext('brother’s child', 'nephew/niece');
807
+			case 'brodau':
808
+				return I18N::translateContext('brother’s daughter', 'niece');
809
+			case 'broson':
810
+				return I18N::translateContext('brother’s son', 'nephew');
811
+			case 'browif':
812
+				return I18N::translateContext('brother’s wife', 'sister-in-law');
813
+			case 'chichi':
814
+				return I18N::translateContext('child’s child', 'grandchild');
815
+			case 'chidau':
816
+				return I18N::translateContext('child’s daughter', 'granddaughter');
817
+			case 'chihus':
818
+				return I18N::translateContext('child’s husband', 'son-in-law');
819
+			case 'chison':
820
+				return I18N::translateContext('child’s son', 'grandson');
821
+			case 'chispo':
822
+				return I18N::translateContext('child’s spouse', 'son/daughter-in-law');
823
+			case 'chiwif':
824
+				return I18N::translateContext('child’s wife', 'daughter-in-law');
825
+			case 'dauchi':
826
+				return I18N::translateContext('daughter’s child', 'grandchild');
827
+			case 'daudau':
828
+				return I18N::translateContext('daughter’s daughter', 'granddaughter');
829
+			case 'dauhus':
830
+				return I18N::translateContext('daughter’s husband', 'son-in-law');
831
+			case 'dauson':
832
+				return I18N::translateContext('daughter’s son', 'grandson');
833
+			case 'fatbro':
834
+				return I18N::translateContext('father’s brother', 'uncle');
835
+			case 'fatchi':
836
+				return I18N::translateContext('father’s child', 'half-sibling');
837
+			case 'fatdau':
838
+				return I18N::translateContext('father’s daughter', 'half-sister');
839
+			case 'fatfat':
840
+				return I18N::translateContext('father’s father', 'paternal grandfather');
841
+			case 'fatmot':
842
+				return I18N::translateContext('father’s mother', 'paternal grandmother');
843
+			case 'fatpar':
844
+				return I18N::translateContext('father’s parent', 'paternal grandparent');
845
+			case 'fatsib':
846
+				return I18N::translateContext('father’s sibling', 'aunt/uncle');
847
+			case 'fatsis':
848
+				return I18N::translateContext('father’s sister', 'aunt');
849
+			case 'fatson':
850
+				return I18N::translateContext('father’s son', 'half-brother');
851
+			case 'fatwif':
852
+				return I18N::translateContext('father’s wife', 'step-mother');
853
+			case 'husbro':
854
+				return I18N::translateContext('husband’s brother', 'brother-in-law');
855
+			case 'huschi':
856
+				return I18N::translateContext('husband’s child', 'step-child');
857
+			case 'husdau':
858
+				return I18N::translateContext('husband’s daughter', 'step-daughter');
859
+			case 'husfat':
860
+				return I18N::translateContext('husband’s father', 'father-in-law');
861
+			case 'husmot':
862
+				return I18N::translateContext('husband’s mother', 'mother-in-law');
863
+			case 'hussib':
864
+				return I18N::translateContext('husband’s sibling', 'brother/sister-in-law');
865
+			case 'hussis':
866
+				return I18N::translateContext('husband’s sister', 'sister-in-law');
867
+			case 'husson':
868
+				return I18N::translateContext('husband’s son', 'step-son');
869
+			case 'motbro':
870
+				return I18N::translateContext('mother’s brother', 'uncle');
871
+			case 'motchi':
872
+				return I18N::translateContext('mother’s child', 'half-sibling');
873
+			case 'motdau':
874
+				return I18N::translateContext('mother’s daughter', 'half-sister');
875
+			case 'motfat':
876
+				return I18N::translateContext('mother’s father', 'maternal grandfather');
877
+			case 'mothus':
878
+				return I18N::translateContext('mother’s husband', 'step-father');
879
+			case 'motmot':
880
+				return I18N::translateContext('mother’s mother', 'maternal grandmother');
881
+			case 'motpar':
882
+				return I18N::translateContext('mother’s parent', 'maternal grandparent');
883
+			case 'motsib':
884
+				return I18N::translateContext('mother’s sibling', 'aunt/uncle');
885
+			case 'motsis':
886
+				return I18N::translateContext('mother’s sister', 'aunt');
887
+			case 'motson':
888
+				return I18N::translateContext('mother’s son', 'half-brother');
889
+			case 'parbro':
890
+				return I18N::translateContext('parent’s brother', 'uncle');
891
+			case 'parchi':
892
+				return I18N::translateContext('parent’s child', 'half-sibling');
893
+			case 'pardau':
894
+				return I18N::translateContext('parent’s daughter', 'half-sister');
895
+			case 'parfat':
896
+				return I18N::translateContext('parent’s father', 'grandfather');
897
+			case 'parmot':
898
+				return I18N::translateContext('parent’s mother', 'grandmother');
899
+			case 'parpar':
900
+				return I18N::translateContext('parent’s parent', 'grandparent');
901
+			case 'parsib':
902
+				return I18N::translateContext('parent’s sibling', 'aunt/uncle');
903
+			case 'parsis':
904
+				return I18N::translateContext('parent’s sister', 'aunt');
905
+			case 'parson':
906
+				return I18N::translateContext('parent’s son', 'half-brother');
907
+			case 'parspo':
908
+				return I18N::translateContext('parent’s spouse', 'step-parent');
909
+			case 'sibchi':
910
+				return I18N::translateContext('sibling’s child', 'nephew/niece');
911
+			case 'sibdau':
912
+				return I18N::translateContext('sibling’s daughter', 'niece');
913
+			case 'sibson':
914
+				return I18N::translateContext('sibling’s son', 'nephew');
915
+			case 'sibspo':
916
+				return I18N::translateContext('sibling’s spouse', 'brother/sister-in-law');
917
+			case 'sischi':
918
+				return I18N::translateContext('sister’s child', 'nephew/niece');
919
+			case 'sisdau':
920
+				return I18N::translateContext('sister’s daughter', 'niece');
921
+			case 'sishus':
922
+				return I18N::translateContext('sister’s husband', 'brother-in-law');
923
+			case 'sisson':
924
+				return I18N::translateContext('sister’s son', 'nephew');
925
+			case 'sonchi':
926
+				return I18N::translateContext('son’s child', 'grandchild');
927
+			case 'sondau':
928
+				return I18N::translateContext('son’s daughter', 'granddaughter');
929
+			case 'sonson':
930
+				return I18N::translateContext('son’s son', 'grandson');
931
+			case 'sonwif':
932
+				return I18N::translateContext('son’s wife', 'daughter-in-law');
933
+			case 'spobro':
934
+				return I18N::translateContext('spouse’s brother', 'brother-in-law');
935
+			case 'spochi':
936
+				return I18N::translateContext('spouse’s child', 'step-child');
937
+			case 'spodau':
938
+				return I18N::translateContext('spouse’s daughter', 'step-daughter');
939
+			case 'spofat':
940
+				return I18N::translateContext('spouse’s father', 'father-in-law');
941
+			case 'spomot':
942
+				return I18N::translateContext('spouse’s mother', 'mother-in-law');
943
+			case 'sposis':
944
+				return I18N::translateContext('spouse’s sister', 'sister-in-law');
945
+			case 'sposon':
946
+				return I18N::translateContext('spouse’s son', 'step-son');
947
+			case 'spopar':
948
+				return I18N::translateContext('spouse’s parent', 'mother/father-in-law');
949
+			case 'sposib':
950
+				return I18N::translateContext('spouse’s sibling', 'brother/sister-in-law');
951
+			case 'wifbro':
952
+				return I18N::translateContext('wife’s brother', 'brother-in-law');
953
+			case 'wifchi':
954
+				return I18N::translateContext('wife’s child', 'step-child');
955
+			case 'wifdau':
956
+				return I18N::translateContext('wife’s daughter', 'step-daughter');
957
+			case 'wiffat':
958
+				return I18N::translateContext('wife’s father', 'father-in-law');
959
+			case 'wifmot':
960
+				return I18N::translateContext('wife’s mother', 'mother-in-law');
961
+			case 'wifsib':
962
+				return I18N::translateContext('wife’s sibling', 'brother/sister-in-law');
963
+			case 'wifsis':
964
+				return I18N::translateContext('wife’s sister', 'sister-in-law');
965
+			case 'wifson':
966
+				return I18N::translateContext('wife’s son', 'step-son');
967 967
 
968
-		// Level Three relationships
969
-		// I have commented out some of the unknown-sex relationships that are unlikely to to occur.
970
-		// Feel free to add them in, if you think they might be needed
971
-		case 'brochichi':
972
-			if ($sex1 === 'M') {
973
-				return I18N::translateContext('(a man’s) brother’s child’s child', 'great-nephew/niece');
974
-			} else {
975
-				return I18N::translateContext('(a woman’s) brother’s child’s child', 'great-nephew/niece');
976
-			}
977
-		case 'brochidau':
978
-			if ($sex1 === 'M') {
979
-				return I18N::translateContext('(a man’s) brother’s child’s daughter', 'great-niece');
980
-			} else {
981
-				return I18N::translateContext('(a woman’s) brother’s child’s daughter', 'great-niece');
982
-			}
983
-		case 'brochison':
984
-			if ($sex1 === 'M') {
985
-				return I18N::translateContext('(a man’s) brother’s child’s son', 'great-nephew');
986
-			} else {
987
-				return I18N::translateContext('(a woman’s) brother’s child’s son', 'great-nephew');
988
-			}
989
-		case 'brodauchi':
990
-			if ($sex1 === 'M') {
991
-				return I18N::translateContext('(a man’s) brother’s daughter’s child', 'great-nephew/niece');
992
-			} else {
993
-				return I18N::translateContext('(a woman’s) brother’s daughter’s child', 'great-nephew/niece');
994
-			}
995
-		case 'brodaudau':
996
-			if ($sex1 === 'M') {
997
-				return I18N::translateContext('(a man’s) brother’s daughter’s daughter', 'great-niece');
998
-			} else {
999
-				return I18N::translateContext('(a woman’s) brother’s daughter’s daughter', 'great-niece');
1000
-			}
1001
-		case 'brodauhus':
1002
-			return I18N::translateContext('brother’s daughter’s husband', 'nephew-in-law');
1003
-		case 'brodauson':
1004
-			if ($sex1 === 'M') {
1005
-				return I18N::translateContext('(a man’s) brother’s daughter’s son', 'great-nephew');
1006
-			} else {
1007
-				return I18N::translateContext('(a woman’s) brother’s daughter’s son', 'great-nephew');
1008
-			}
1009
-		case 'brosonchi':
1010
-			if ($sex1 === 'M') {
1011
-				return I18N::translateContext('(a man’s) brother’s son’s child', 'great-nephew/niece');
1012
-			} else {
1013
-				return I18N::translateContext('(a woman’s) brother’s son’s child', 'great-nephew/niece');
1014
-			}
1015
-		case 'brosondau':
1016
-			if ($sex1 === 'M') {
1017
-				return I18N::translateContext('(a man’s) brother’s son’s daughter', 'great-niece');
1018
-			} else {
1019
-				return I18N::translateContext('(a woman’s) brother’s son’s daughter', 'great-niece');
1020
-			}
1021
-		case 'brosonson':
1022
-			if ($sex1 === 'M') {
1023
-				return I18N::translateContext('(a man’s) brother’s son’s son', 'great-nephew');
1024
-			} else {
1025
-				return I18N::translateContext('(a woman’s) brother’s son’s son', 'great-nephew');
1026
-			}
1027
-		case 'brosonwif':
1028
-			return I18N::translateContext('brother’s son’s wife', 'niece-in-law');
1029
-		case 'browifbro':
1030
-			return I18N::translateContext('brother’s wife’s brother', 'brother-in-law');
1031
-		case 'browifsib':
1032
-			return I18N::translateContext('brother’s wife’s sibling', 'brother/sister-in-law');
1033
-		case 'browifsis':
1034
-			return I18N::translateContext('brother’s wife’s sister', 'sister-in-law');
1035
-		case 'chichichi':
1036
-			return I18N::translateContext('child’s child’s child', 'great-grandchild');
1037
-		case 'chichidau':
1038
-			return I18N::translateContext('child’s child’s daughter', 'great-granddaughter');
1039
-		case 'chichison':
1040
-			return I18N::translateContext('child’s child’s son', 'great-grandson');
1041
-		case 'chidauchi':
1042
-			return I18N::translateContext('child’s daughter’s child', 'great-grandchild');
1043
-		case 'chidaudau':
1044
-			return I18N::translateContext('child’s daughter’s daughter', 'great-granddaughter');
1045
-		case 'chidauhus':
1046
-			return I18N::translateContext('child’s daughter’s husband', 'granddaughter’s husband');
1047
-		case 'chidauson':
1048
-			return I18N::translateContext('child’s daughter’s son', 'great-grandson');
1049
-		case 'chisonchi':
1050
-			return I18N::translateContext('child’s son’s child', 'great-grandchild');
1051
-		case 'chisondau':
1052
-			return I18N::translateContext('child’s son’s daughter', 'great-granddaughter');
1053
-		case 'chisonson':
1054
-			return I18N::translateContext('child’s son’s son', 'great-grandson');
1055
-		case 'chisonwif':
1056
-			return I18N::translateContext('child’s son’s wife', 'grandson’s wife');
1057
-		case 'dauchichi':
1058
-			return I18N::translateContext('daughter’s child’s child', 'great-grandchild');
1059
-		case 'dauchidau':
1060
-			return I18N::translateContext('daughter’s child’s daughter', 'great-granddaughter');
1061
-		case 'dauchison':
1062
-			return I18N::translateContext('daughter’s child’s son', 'great-grandson');
1063
-		case 'daudauchi':
1064
-			return I18N::translateContext('daughter’s daughter’s child', 'great-grandchild');
1065
-		case 'daudaudau':
1066
-			return I18N::translateContext('daughter’s daughter’s daughter', 'great-granddaughter');
1067
-		case 'daudauhus':
1068
-			return I18N::translateContext('daughter’s daughter’s husband', 'granddaughter’s husband');
1069
-		case 'daudauson':
1070
-			return I18N::translateContext('daughter’s daughter’s son', 'great-grandson');
1071
-		case 'dauhusfat':
1072
-			return I18N::translateContext('daughter’s husband’s father', 'son-in-law’s father');
1073
-		case 'dauhusmot':
1074
-			return I18N::translateContext('daughter’s husband’s mother', 'son-in-law’s mother');
1075
-		case 'dauhuspar':
1076
-			return I18N::translateContext('daughter’s husband’s parent', 'son-in-law’s parent');
1077
-		case 'dausonchi':
1078
-			return I18N::translateContext('daughter’s son’s child', 'great-grandchild');
1079
-		case 'dausondau':
1080
-			return I18N::translateContext('daughter’s son’s daughter', 'great-granddaughter');
1081
-		case 'dausonson':
1082
-			return I18N::translateContext('daughter’s son’s son', 'great-grandson');
1083
-		case 'dausonwif':
1084
-			return I18N::translateContext('daughter’s son’s wife', 'grandson’s wife');
1085
-		case 'fatbrochi':
1086
-			return I18N::translateContext('father’s brother’s child', 'first cousin');
1087
-		case 'fatbrodau':
1088
-			return I18N::translateContext('father’s brother’s daughter', 'first cousin');
1089
-		case 'fatbroson':
1090
-			return I18N::translateContext('father’s brother’s son', 'first cousin');
1091
-		case 'fatbrowif':
1092
-			return I18N::translateContext('father’s brother’s wife', 'aunt');
1093
-		case 'fatfatbro':
1094
-			return I18N::translateContext('father’s father’s brother', 'great-uncle');
1095
-		case 'fatfatfat':
1096
-			return I18N::translateContext('father’s father’s father', 'great-grandfather');
1097
-		case 'fatfatmot':
1098
-			return I18N::translateContext('father’s father’s mother', 'great-grandmother');
1099
-		case 'fatfatpar':
1100
-			return I18N::translateContext('father’s father’s parent', 'great-grandparent');
1101
-		case 'fatfatsib':
1102
-			return I18N::translateContext('father’s father’s sibling', 'great-aunt/uncle');
1103
-		case 'fatfatsis':
1104
-			return I18N::translateContext('father’s father’s sister', 'great-aunt');
1105
-		case 'fatmotbro':
1106
-			return I18N::translateContext('father’s mother’s brother', 'great-uncle');
1107
-		case 'fatmotfat':
1108
-			return I18N::translateContext('father’s mother’s father', 'great-grandfather');
1109
-		case 'fatmotmot':
1110
-			return I18N::translateContext('father’s mother’s mother', 'great-grandmother');
1111
-		case 'fatmotpar':
1112
-			return I18N::translateContext('father’s mother’s parent', 'great-grandparent');
1113
-		case 'fatmotsib':
1114
-			return I18N::translateContext('father’s mother’s sibling', 'great-aunt/uncle');
1115
-		case 'fatmotsis':
1116
-			return I18N::translateContext('father’s mother’s sister', 'great-aunt');
1117
-		case 'fatparbro':
1118
-			return I18N::translateContext('father’s parent’s brother', 'great-uncle');
1119
-		case 'fatparfat':
1120
-			return I18N::translateContext('father’s parent’s father', 'great-grandfather');
1121
-		case 'fatparmot':
1122
-			return I18N::translateContext('father’s parent’s mother', 'great-grandmother');
1123
-		case 'fatparpar':
1124
-			return I18N::translateContext('father’s parent’s parent', 'great-grandparent');
1125
-		case 'fatparsib':
1126
-			return I18N::translateContext('father’s parent’s sibling', 'great-aunt/uncle');
1127
-		case 'fatparsis':
1128
-			return I18N::translateContext('father’s parent’s sister', 'great-aunt');
1129
-		case 'fatsischi':
1130
-			return I18N::translateContext('father’s sister’s child', 'first cousin');
1131
-		case 'fatsisdau':
1132
-			return I18N::translateContext('father’s sister’s daughter', 'first cousin');
1133
-		case 'fatsishus':
1134
-			return I18N::translateContext('father’s sister’s husband', 'uncle');
1135
-		case 'fatsisson':
1136
-			return I18N::translateContext('father’s sister’s son', 'first cousin');
1137
-		case 'fatwifchi':
1138
-			return I18N::translateContext('father’s wife’s child', 'step-sibling');
1139
-		case 'fatwifdau':
1140
-			return I18N::translateContext('father’s wife’s daughter', 'step-sister');
1141
-		case 'fatwifson':
1142
-			return I18N::translateContext('father’s wife’s son', 'step-brother');
1143
-		case 'husbrowif':
1144
-			return I18N::translateContext('husband’s brother’s wife', 'sister-in-law');
1145
-		case 'hussishus':
1146
-			return I18N::translateContext('husband’s sister’s husband', 'brother-in-law');
1147
-		case 'motbrochi':
1148
-			return I18N::translateContext('mother’s brother’s child', 'first cousin');
1149
-		case 'motbrodau':
1150
-			return I18N::translateContext('mother’s brother’s daughter', 'first cousin');
1151
-		case 'motbroson':
1152
-			return I18N::translateContext('mother’s brother’s son', 'first cousin');
1153
-		case 'motbrowif':
1154
-			return I18N::translateContext('mother’s brother’s wife', 'aunt');
1155
-		case 'motfatbro':
1156
-			return I18N::translateContext('mother’s father’s brother', 'great-uncle');
1157
-		case 'motfatfat':
1158
-			return I18N::translateContext('mother’s father’s father', 'great-grandfather');
1159
-		case 'motfatmot':
1160
-			return I18N::translateContext('mother’s father’s mother', 'great-grandmother');
1161
-		case 'motfatpar':
1162
-			return I18N::translateContext('mother’s father’s parent', 'great-grandparent');
1163
-		case 'motfatsib':
1164
-			return I18N::translateContext('mother’s father’s sibling', 'great-aunt/uncle');
1165
-		case 'motfatsis':
1166
-			return I18N::translateContext('mother’s father’s sister', 'great-aunt');
1167
-		case 'mothuschi':
1168
-			return I18N::translateContext('mother’s husband’s child', 'step-sibling');
1169
-		case 'mothusdau':
1170
-			return I18N::translateContext('mother’s husband’s daughter', 'step-sister');
1171
-		case 'mothusson':
1172
-			return I18N::translateContext('mother’s husband’s son', 'step-brother');
1173
-		case 'motmotbro':
1174
-			return I18N::translateContext('mother’s mother’s brother', 'great-uncle');
1175
-		case 'motmotfat':
1176
-			return I18N::translateContext('mother’s mother’s father', 'great-grandfather');
1177
-		case 'motmotmot':
1178
-			return I18N::translateContext('mother’s mother’s mother', 'great-grandmother');
1179
-		case 'motmotpar':
1180
-			return I18N::translateContext('mother’s mother’s parent', 'great-grandparent');
1181
-		case 'motmotsib':
1182
-			return I18N::translateContext('mother’s mother’s sibling', 'great-aunt/uncle');
1183
-		case 'motmotsis':
1184
-			return I18N::translateContext('mother’s mother’s sister', 'great-aunt');
1185
-		case 'motparbro':
1186
-			return I18N::translateContext('mother’s parent’s brother', 'great-uncle');
1187
-		case 'motparfat':
1188
-			return I18N::translateContext('mother’s parent’s father', 'great-grandfather');
1189
-		case 'motparmot':
1190
-			return I18N::translateContext('mother’s parent’s mother', 'great-grandmother');
1191
-		case 'motparpar':
1192
-			return I18N::translateContext('mother’s parent’s parent', 'great-grandparent');
1193
-		case 'motparsib':
1194
-			return I18N::translateContext('mother’s parent’s sibling', 'great-aunt/uncle');
1195
-		case 'motparsis':
1196
-			return I18N::translateContext('mother’s parent’s sister', 'great-aunt');
1197
-		case 'motsischi':
1198
-			return I18N::translateContext('mother’s sister’s child', 'first cousin');
1199
-		case 'motsisdau':
1200
-			return I18N::translateContext('mother’s sister’s daughter', 'first cousin');
1201
-		case 'motsishus':
1202
-			return I18N::translateContext('mother’s sister’s husband', 'uncle');
1203
-		case 'motsisson':
1204
-			return I18N::translateContext('mother’s sister’s son', 'first cousin');
1205
-		case 'parbrowif':
1206
-			return I18N::translateContext('parent’s brother’s wife', 'aunt');
1207
-		case 'parfatbro':
1208
-			return I18N::translateContext('parent’s father’s brother', 'great-uncle');
1209
-		case 'parfatfat':
1210
-			return I18N::translateContext('parent’s father’s father', 'great-grandfather');
1211
-		case 'parfatmot':
1212
-			return I18N::translateContext('parent’s father’s mother', 'great-grandmother');
1213
-		case 'parfatpar':
1214
-			return I18N::translateContext('parent’s father’s parent', 'great-grandparent');
1215
-		case 'parfatsib':
1216
-			return I18N::translateContext('parent’s father’s sibling', 'great-aunt/uncle');
1217
-		case 'parfatsis':
1218
-			return I18N::translateContext('parent’s father’s sister', 'great-aunt');
1219
-		case 'parmotbro':
1220
-			return I18N::translateContext('parent’s mother’s brother', 'great-uncle');
1221
-		case 'parmotfat':
1222
-			return I18N::translateContext('parent’s mother’s father', 'great-grandfather');
1223
-		case 'parmotmot':
1224
-			return I18N::translateContext('parent’s mother’s mother', 'great-grandmother');
1225
-		case 'parmotpar':
1226
-			return I18N::translateContext('parent’s mother’s parent', 'great-grandparent');
1227
-		case 'parmotsib':
1228
-			return I18N::translateContext('parent’s mother’s sibling', 'great-aunt/uncle');
1229
-		case 'parmotsis':
1230
-			return I18N::translateContext('parent’s mother’s sister', 'great-aunt');
1231
-		case 'parparbro':
1232
-			return I18N::translateContext('parent’s parent’s brother', 'great-uncle');
1233
-		case 'parparfat':
1234
-			return I18N::translateContext('parent’s parent’s father', 'great-grandfather');
1235
-		case 'parparmot':
1236
-			return I18N::translateContext('parent’s parent’s mother', 'great-grandmother');
1237
-		case 'parparpar':
1238
-			return I18N::translateContext('parent’s parent’s parent', 'great-grandparent');
1239
-		case 'parparsib':
1240
-			return I18N::translateContext('parent’s parent’s sibling', 'great-aunt/uncle');
1241
-		case 'parparsis':
1242
-			return I18N::translateContext('parent’s parent’s sister', 'great-aunt');
1243
-		case 'parsishus':
1244
-			return I18N::translateContext('parent’s sister’s husband', 'uncle');
1245
-		case 'parspochi':
1246
-			return I18N::translateContext('parent’s spouse’s child', 'step-sibling');
1247
-		case 'parspodau':
1248
-			return I18N::translateContext('parent’s spouse’s daughter', 'step-sister');
1249
-		case 'parsposon':
1250
-			return I18N::translateContext('parent’s spouse’s son', 'step-brother');
1251
-		case 'sibchichi':
1252
-			return I18N::translateContext('sibling’s child’s child', 'great-nephew/niece');
1253
-		case 'sibchidau':
1254
-			return I18N::translateContext('sibling’s child’s daughter', 'great-niece');
1255
-		case 'sibchison':
1256
-			return I18N::translateContext('sibling’s child’s son', 'great-nephew');
1257
-		case 'sibdauchi':
1258
-			return I18N::translateContext('sibling’s daughter’s child', 'great-nephew/niece');
1259
-		case 'sibdaudau':
1260
-			return I18N::translateContext('sibling’s daughter’s daughter', 'great-niece');
1261
-		case 'sibdauhus':
1262
-			return I18N::translateContext('sibling’s daughter’s husband', 'nephew-in-law');
1263
-		case 'sibdauson':
1264
-			return I18N::translateContext('sibling’s daughter’s son', 'great-nephew');
1265
-		case 'sibsonchi':
1266
-			return I18N::translateContext('sibling’s son’s child', 'great-nephew/niece');
1267
-		case 'sibsondau':
1268
-			return I18N::translateContext('sibling’s son’s daughter', 'great-niece');
1269
-		case 'sibsonson':
1270
-			return I18N::translateContext('sibling’s son’s son', 'great-nephew');
1271
-		case 'sibsonwif':
1272
-			return I18N::translateContext('sibling’s son’s wife', 'niece-in-law');
1273
-		case 'sischichi':
1274
-			if ($sex1 === 'M') {
1275
-				return I18N::translateContext('(a man’s) sister’s child’s child', 'great-nephew/niece');
1276
-			} else {
1277
-				return I18N::translateContext('(a woman’s) sister’s child’s child', 'great-nephew/niece');
1278
-			}
1279
-		case 'sischidau':
1280
-			if ($sex1 === 'M') {
1281
-				return I18N::translateContext('(a man’s) sister’s child’s daughter', 'great-niece');
1282
-			} else {
1283
-				return I18N::translateContext('(a woman’s) sister’s child’s daughter', 'great-niece');
1284
-			}
1285
-		case 'sischison':
1286
-			if ($sex1 === 'M') {
1287
-				return I18N::translateContext('(a man’s) sister’s child’s son', 'great-nephew');
1288
-			} else {
1289
-				return I18N::translateContext('(a woman’s) sister’s child’s son', 'great-nephew');
1290
-			}
1291
-		case 'sisdauchi':
1292
-			if ($sex1 === 'M') {
1293
-				return I18N::translateContext('(a man’s) sister’s daughter’s child', 'great-nephew/niece');
1294
-			} else {
1295
-				return I18N::translateContext('(a woman’s) sister’s daughter’s child', 'great-nephew/niece');
1296
-			}
1297
-		case 'sisdaudau':
1298
-			if ($sex1 === 'M') {
1299
-				return I18N::translateContext('(a man’s) sister’s daughter’s daughter', 'great-niece');
1300
-			} else {
1301
-				return I18N::translateContext('(a woman’s) sister’s daughter’s daughter', 'great-niece');
1302
-			}
1303
-		case 'sisdauhus':
1304
-			return I18N::translateContext('sisters’s daughter’s husband', 'nephew-in-law');
1305
-		case 'sisdauson':
1306
-			if ($sex1 === 'M') {
1307
-				return I18N::translateContext('(a man’s) sister’s daughter’s son', 'great-nephew');
1308
-			} else {
1309
-				return I18N::translateContext('(a woman’s) sister’s daughter’s son', 'great-nephew');
1310
-			}
1311
-		case 'sishusbro':
1312
-			return I18N::translateContext('sister’s husband’s brother', 'brother-in-law');
1313
-		case 'sishussib':
1314
-			return I18N::translateContext('sister’s husband’s sibling', 'brother/sister-in-law');
1315
-		case 'sishussis':
1316
-			return I18N::translateContext('sister’s husband’s sister', 'sister-in-law');
1317
-		case 'sissonchi':
1318
-			if ($sex1 === 'M') {
1319
-				return I18N::translateContext('(a man’s) sister’s son’s child', 'great-nephew/niece');
1320
-			} else {
1321
-				return I18N::translateContext('(a woman’s) sister’s son’s child', 'great-nephew/niece');
1322
-			}
1323
-		case 'sissondau':
1324
-			if ($sex1 === 'M') {
1325
-				return I18N::translateContext('(a man’s) sister’s son’s daughter', 'great-niece');
1326
-			} else {
1327
-				return I18N::translateContext('(a woman’s) sister’s son’s daughter', 'great-niece');
1328
-			}
1329
-		case 'sissonson':
1330
-			if ($sex1 === 'M') {
1331
-				return I18N::translateContext('(a man’s) sister’s son’s son', 'great-nephew');
1332
-			} else {
1333
-				return I18N::translateContext('(a woman’s) sister’s son’s son', 'great-nephew');
1334
-			}
1335
-		case 'sissonwif':
1336
-			return I18N::translateContext('sisters’s son’s wife', 'niece-in-law');
1337
-		case 'sonchichi':
1338
-			return I18N::translateContext('son’s child’s child', 'great-grandchild');
1339
-		case 'sonchidau':
1340
-			return I18N::translateContext('son’s child’s daughter', 'great-granddaughter');
1341
-		case 'sonchison':
1342
-			return I18N::translateContext('son’s child’s son', 'great-grandson');
1343
-		case 'sondauchi':
1344
-			return I18N::translateContext('son’s daughter’s child', 'great-grandchild');
1345
-		case 'sondaudau':
1346
-			return I18N::translateContext('son’s daughter’s daughter', 'great-granddaughter');
1347
-		case 'sondauhus':
1348
-			return I18N::translateContext('son’s daughter’s husband', 'granddaughter’s husband');
1349
-		case 'sondauson':
1350
-			return I18N::translateContext('son’s daughter’s son', 'great-grandson');
1351
-		case 'sonsonchi':
1352
-			return I18N::translateContext('son’s son’s child', 'great-grandchild');
1353
-		case 'sonsondau':
1354
-			return I18N::translateContext('son’s son’s daughter', 'great-granddaughter');
1355
-		case 'sonsonson':
1356
-			return I18N::translateContext('son’s son’s son', 'great-grandson');
1357
-		case 'sonsonwif':
1358
-			return I18N::translateContext('son’s son’s wife', 'grandson’s wife');
1359
-		case 'sonwiffat':
1360
-			return I18N::translateContext('son’s wife’s father', 'daughter-in-law’s father');
1361
-		case 'sonwifmot':
1362
-			return I18N::translateContext('son’s wife’s mother', 'daughter-in-law’s mother');
1363
-		case 'sonwifpar':
1364
-			return I18N::translateContext('son’s wife’s parent', 'daughter-in-law’s parent');
1365
-		case 'wifbrowif':
1366
-			return I18N::translateContext('wife’s brother’s wife', 'sister-in-law');
1367
-		case 'wifsishus':
1368
-			return I18N::translateContext('wife’s sister’s husband', 'brother-in-law');
968
+			// Level Three relationships
969
+			// I have commented out some of the unknown-sex relationships that are unlikely to to occur.
970
+			// Feel free to add them in, if you think they might be needed
971
+			case 'brochichi':
972
+				if ($sex1 === 'M') {
973
+					return I18N::translateContext('(a man’s) brother’s child’s child', 'great-nephew/niece');
974
+				} else {
975
+					return I18N::translateContext('(a woman’s) brother’s child’s child', 'great-nephew/niece');
976
+				}
977
+			case 'brochidau':
978
+				if ($sex1 === 'M') {
979
+					return I18N::translateContext('(a man’s) brother’s child’s daughter', 'great-niece');
980
+				} else {
981
+					return I18N::translateContext('(a woman’s) brother’s child’s daughter', 'great-niece');
982
+				}
983
+			case 'brochison':
984
+				if ($sex1 === 'M') {
985
+					return I18N::translateContext('(a man’s) brother’s child’s son', 'great-nephew');
986
+				} else {
987
+					return I18N::translateContext('(a woman’s) brother’s child’s son', 'great-nephew');
988
+				}
989
+			case 'brodauchi':
990
+				if ($sex1 === 'M') {
991
+					return I18N::translateContext('(a man’s) brother’s daughter’s child', 'great-nephew/niece');
992
+				} else {
993
+					return I18N::translateContext('(a woman’s) brother’s daughter’s child', 'great-nephew/niece');
994
+				}
995
+			case 'brodaudau':
996
+				if ($sex1 === 'M') {
997
+					return I18N::translateContext('(a man’s) brother’s daughter’s daughter', 'great-niece');
998
+				} else {
999
+					return I18N::translateContext('(a woman’s) brother’s daughter’s daughter', 'great-niece');
1000
+				}
1001
+			case 'brodauhus':
1002
+				return I18N::translateContext('brother’s daughter’s husband', 'nephew-in-law');
1003
+			case 'brodauson':
1004
+				if ($sex1 === 'M') {
1005
+					return I18N::translateContext('(a man’s) brother’s daughter’s son', 'great-nephew');
1006
+				} else {
1007
+					return I18N::translateContext('(a woman’s) brother’s daughter’s son', 'great-nephew');
1008
+				}
1009
+			case 'brosonchi':
1010
+				if ($sex1 === 'M') {
1011
+					return I18N::translateContext('(a man’s) brother’s son’s child', 'great-nephew/niece');
1012
+				} else {
1013
+					return I18N::translateContext('(a woman’s) brother’s son’s child', 'great-nephew/niece');
1014
+				}
1015
+			case 'brosondau':
1016
+				if ($sex1 === 'M') {
1017
+					return I18N::translateContext('(a man’s) brother’s son’s daughter', 'great-niece');
1018
+				} else {
1019
+					return I18N::translateContext('(a woman’s) brother’s son’s daughter', 'great-niece');
1020
+				}
1021
+			case 'brosonson':
1022
+				if ($sex1 === 'M') {
1023
+					return I18N::translateContext('(a man’s) brother’s son’s son', 'great-nephew');
1024
+				} else {
1025
+					return I18N::translateContext('(a woman’s) brother’s son’s son', 'great-nephew');
1026
+				}
1027
+			case 'brosonwif':
1028
+				return I18N::translateContext('brother’s son’s wife', 'niece-in-law');
1029
+			case 'browifbro':
1030
+				return I18N::translateContext('brother’s wife’s brother', 'brother-in-law');
1031
+			case 'browifsib':
1032
+				return I18N::translateContext('brother’s wife’s sibling', 'brother/sister-in-law');
1033
+			case 'browifsis':
1034
+				return I18N::translateContext('brother’s wife’s sister', 'sister-in-law');
1035
+			case 'chichichi':
1036
+				return I18N::translateContext('child’s child’s child', 'great-grandchild');
1037
+			case 'chichidau':
1038
+				return I18N::translateContext('child’s child’s daughter', 'great-granddaughter');
1039
+			case 'chichison':
1040
+				return I18N::translateContext('child’s child’s son', 'great-grandson');
1041
+			case 'chidauchi':
1042
+				return I18N::translateContext('child’s daughter’s child', 'great-grandchild');
1043
+			case 'chidaudau':
1044
+				return I18N::translateContext('child’s daughter’s daughter', 'great-granddaughter');
1045
+			case 'chidauhus':
1046
+				return I18N::translateContext('child’s daughter’s husband', 'granddaughter’s husband');
1047
+			case 'chidauson':
1048
+				return I18N::translateContext('child’s daughter’s son', 'great-grandson');
1049
+			case 'chisonchi':
1050
+				return I18N::translateContext('child’s son’s child', 'great-grandchild');
1051
+			case 'chisondau':
1052
+				return I18N::translateContext('child’s son’s daughter', 'great-granddaughter');
1053
+			case 'chisonson':
1054
+				return I18N::translateContext('child’s son’s son', 'great-grandson');
1055
+			case 'chisonwif':
1056
+				return I18N::translateContext('child’s son’s wife', 'grandson’s wife');
1057
+			case 'dauchichi':
1058
+				return I18N::translateContext('daughter’s child’s child', 'great-grandchild');
1059
+			case 'dauchidau':
1060
+				return I18N::translateContext('daughter’s child’s daughter', 'great-granddaughter');
1061
+			case 'dauchison':
1062
+				return I18N::translateContext('daughter’s child’s son', 'great-grandson');
1063
+			case 'daudauchi':
1064
+				return I18N::translateContext('daughter’s daughter’s child', 'great-grandchild');
1065
+			case 'daudaudau':
1066
+				return I18N::translateContext('daughter’s daughter’s daughter', 'great-granddaughter');
1067
+			case 'daudauhus':
1068
+				return I18N::translateContext('daughter’s daughter’s husband', 'granddaughter’s husband');
1069
+			case 'daudauson':
1070
+				return I18N::translateContext('daughter’s daughter’s son', 'great-grandson');
1071
+			case 'dauhusfat':
1072
+				return I18N::translateContext('daughter’s husband’s father', 'son-in-law’s father');
1073
+			case 'dauhusmot':
1074
+				return I18N::translateContext('daughter’s husband’s mother', 'son-in-law’s mother');
1075
+			case 'dauhuspar':
1076
+				return I18N::translateContext('daughter’s husband’s parent', 'son-in-law’s parent');
1077
+			case 'dausonchi':
1078
+				return I18N::translateContext('daughter’s son’s child', 'great-grandchild');
1079
+			case 'dausondau':
1080
+				return I18N::translateContext('daughter’s son’s daughter', 'great-granddaughter');
1081
+			case 'dausonson':
1082
+				return I18N::translateContext('daughter’s son’s son', 'great-grandson');
1083
+			case 'dausonwif':
1084
+				return I18N::translateContext('daughter’s son’s wife', 'grandson’s wife');
1085
+			case 'fatbrochi':
1086
+				return I18N::translateContext('father’s brother’s child', 'first cousin');
1087
+			case 'fatbrodau':
1088
+				return I18N::translateContext('father’s brother’s daughter', 'first cousin');
1089
+			case 'fatbroson':
1090
+				return I18N::translateContext('father’s brother’s son', 'first cousin');
1091
+			case 'fatbrowif':
1092
+				return I18N::translateContext('father’s brother’s wife', 'aunt');
1093
+			case 'fatfatbro':
1094
+				return I18N::translateContext('father’s father’s brother', 'great-uncle');
1095
+			case 'fatfatfat':
1096
+				return I18N::translateContext('father’s father’s father', 'great-grandfather');
1097
+			case 'fatfatmot':
1098
+				return I18N::translateContext('father’s father’s mother', 'great-grandmother');
1099
+			case 'fatfatpar':
1100
+				return I18N::translateContext('father’s father’s parent', 'great-grandparent');
1101
+			case 'fatfatsib':
1102
+				return I18N::translateContext('father’s father’s sibling', 'great-aunt/uncle');
1103
+			case 'fatfatsis':
1104
+				return I18N::translateContext('father’s father’s sister', 'great-aunt');
1105
+			case 'fatmotbro':
1106
+				return I18N::translateContext('father’s mother’s brother', 'great-uncle');
1107
+			case 'fatmotfat':
1108
+				return I18N::translateContext('father’s mother’s father', 'great-grandfather');
1109
+			case 'fatmotmot':
1110
+				return I18N::translateContext('father’s mother’s mother', 'great-grandmother');
1111
+			case 'fatmotpar':
1112
+				return I18N::translateContext('father’s mother’s parent', 'great-grandparent');
1113
+			case 'fatmotsib':
1114
+				return I18N::translateContext('father’s mother’s sibling', 'great-aunt/uncle');
1115
+			case 'fatmotsis':
1116
+				return I18N::translateContext('father’s mother’s sister', 'great-aunt');
1117
+			case 'fatparbro':
1118
+				return I18N::translateContext('father’s parent’s brother', 'great-uncle');
1119
+			case 'fatparfat':
1120
+				return I18N::translateContext('father’s parent’s father', 'great-grandfather');
1121
+			case 'fatparmot':
1122
+				return I18N::translateContext('father’s parent’s mother', 'great-grandmother');
1123
+			case 'fatparpar':
1124
+				return I18N::translateContext('father’s parent’s parent', 'great-grandparent');
1125
+			case 'fatparsib':
1126
+				return I18N::translateContext('father’s parent’s sibling', 'great-aunt/uncle');
1127
+			case 'fatparsis':
1128
+				return I18N::translateContext('father’s parent’s sister', 'great-aunt');
1129
+			case 'fatsischi':
1130
+				return I18N::translateContext('father’s sister’s child', 'first cousin');
1131
+			case 'fatsisdau':
1132
+				return I18N::translateContext('father’s sister’s daughter', 'first cousin');
1133
+			case 'fatsishus':
1134
+				return I18N::translateContext('father’s sister’s husband', 'uncle');
1135
+			case 'fatsisson':
1136
+				return I18N::translateContext('father’s sister’s son', 'first cousin');
1137
+			case 'fatwifchi':
1138
+				return I18N::translateContext('father’s wife’s child', 'step-sibling');
1139
+			case 'fatwifdau':
1140
+				return I18N::translateContext('father’s wife’s daughter', 'step-sister');
1141
+			case 'fatwifson':
1142
+				return I18N::translateContext('father’s wife’s son', 'step-brother');
1143
+			case 'husbrowif':
1144
+				return I18N::translateContext('husband’s brother’s wife', 'sister-in-law');
1145
+			case 'hussishus':
1146
+				return I18N::translateContext('husband’s sister’s husband', 'brother-in-law');
1147
+			case 'motbrochi':
1148
+				return I18N::translateContext('mother’s brother’s child', 'first cousin');
1149
+			case 'motbrodau':
1150
+				return I18N::translateContext('mother’s brother’s daughter', 'first cousin');
1151
+			case 'motbroson':
1152
+				return I18N::translateContext('mother’s brother’s son', 'first cousin');
1153
+			case 'motbrowif':
1154
+				return I18N::translateContext('mother’s brother’s wife', 'aunt');
1155
+			case 'motfatbro':
1156
+				return I18N::translateContext('mother’s father’s brother', 'great-uncle');
1157
+			case 'motfatfat':
1158
+				return I18N::translateContext('mother’s father’s father', 'great-grandfather');
1159
+			case 'motfatmot':
1160
+				return I18N::translateContext('mother’s father’s mother', 'great-grandmother');
1161
+			case 'motfatpar':
1162
+				return I18N::translateContext('mother’s father’s parent', 'great-grandparent');
1163
+			case 'motfatsib':
1164
+				return I18N::translateContext('mother’s father’s sibling', 'great-aunt/uncle');
1165
+			case 'motfatsis':
1166
+				return I18N::translateContext('mother’s father’s sister', 'great-aunt');
1167
+			case 'mothuschi':
1168
+				return I18N::translateContext('mother’s husband’s child', 'step-sibling');
1169
+			case 'mothusdau':
1170
+				return I18N::translateContext('mother’s husband’s daughter', 'step-sister');
1171
+			case 'mothusson':
1172
+				return I18N::translateContext('mother’s husband’s son', 'step-brother');
1173
+			case 'motmotbro':
1174
+				return I18N::translateContext('mother’s mother’s brother', 'great-uncle');
1175
+			case 'motmotfat':
1176
+				return I18N::translateContext('mother’s mother’s father', 'great-grandfather');
1177
+			case 'motmotmot':
1178
+				return I18N::translateContext('mother’s mother’s mother', 'great-grandmother');
1179
+			case 'motmotpar':
1180
+				return I18N::translateContext('mother’s mother’s parent', 'great-grandparent');
1181
+			case 'motmotsib':
1182
+				return I18N::translateContext('mother’s mother’s sibling', 'great-aunt/uncle');
1183
+			case 'motmotsis':
1184
+				return I18N::translateContext('mother’s mother’s sister', 'great-aunt');
1185
+			case 'motparbro':
1186
+				return I18N::translateContext('mother’s parent’s brother', 'great-uncle');
1187
+			case 'motparfat':
1188
+				return I18N::translateContext('mother’s parent’s father', 'great-grandfather');
1189
+			case 'motparmot':
1190
+				return I18N::translateContext('mother’s parent’s mother', 'great-grandmother');
1191
+			case 'motparpar':
1192
+				return I18N::translateContext('mother’s parent’s parent', 'great-grandparent');
1193
+			case 'motparsib':
1194
+				return I18N::translateContext('mother’s parent’s sibling', 'great-aunt/uncle');
1195
+			case 'motparsis':
1196
+				return I18N::translateContext('mother’s parent’s sister', 'great-aunt');
1197
+			case 'motsischi':
1198
+				return I18N::translateContext('mother’s sister’s child', 'first cousin');
1199
+			case 'motsisdau':
1200
+				return I18N::translateContext('mother’s sister’s daughter', 'first cousin');
1201
+			case 'motsishus':
1202
+				return I18N::translateContext('mother’s sister’s husband', 'uncle');
1203
+			case 'motsisson':
1204
+				return I18N::translateContext('mother’s sister’s son', 'first cousin');
1205
+			case 'parbrowif':
1206
+				return I18N::translateContext('parent’s brother’s wife', 'aunt');
1207
+			case 'parfatbro':
1208
+				return I18N::translateContext('parent’s father’s brother', 'great-uncle');
1209
+			case 'parfatfat':
1210
+				return I18N::translateContext('parent’s father’s father', 'great-grandfather');
1211
+			case 'parfatmot':
1212
+				return I18N::translateContext('parent’s father’s mother', 'great-grandmother');
1213
+			case 'parfatpar':
1214
+				return I18N::translateContext('parent’s father’s parent', 'great-grandparent');
1215
+			case 'parfatsib':
1216
+				return I18N::translateContext('parent’s father’s sibling', 'great-aunt/uncle');
1217
+			case 'parfatsis':
1218
+				return I18N::translateContext('parent’s father’s sister', 'great-aunt');
1219
+			case 'parmotbro':
1220
+				return I18N::translateContext('parent’s mother’s brother', 'great-uncle');
1221
+			case 'parmotfat':
1222
+				return I18N::translateContext('parent’s mother’s father', 'great-grandfather');
1223
+			case 'parmotmot':
1224
+				return I18N::translateContext('parent’s mother’s mother', 'great-grandmother');
1225
+			case 'parmotpar':
1226
+				return I18N::translateContext('parent’s mother’s parent', 'great-grandparent');
1227
+			case 'parmotsib':
1228
+				return I18N::translateContext('parent’s mother’s sibling', 'great-aunt/uncle');
1229
+			case 'parmotsis':
1230
+				return I18N::translateContext('parent’s mother’s sister', 'great-aunt');
1231
+			case 'parparbro':
1232
+				return I18N::translateContext('parent’s parent’s brother', 'great-uncle');
1233
+			case 'parparfat':
1234
+				return I18N::translateContext('parent’s parent’s father', 'great-grandfather');
1235
+			case 'parparmot':
1236
+				return I18N::translateContext('parent’s parent’s mother', 'great-grandmother');
1237
+			case 'parparpar':
1238
+				return I18N::translateContext('parent’s parent’s parent', 'great-grandparent');
1239
+			case 'parparsib':
1240
+				return I18N::translateContext('parent’s parent’s sibling', 'great-aunt/uncle');
1241
+			case 'parparsis':
1242
+				return I18N::translateContext('parent’s parent’s sister', 'great-aunt');
1243
+			case 'parsishus':
1244
+				return I18N::translateContext('parent’s sister’s husband', 'uncle');
1245
+			case 'parspochi':
1246
+				return I18N::translateContext('parent’s spouse’s child', 'step-sibling');
1247
+			case 'parspodau':
1248
+				return I18N::translateContext('parent’s spouse’s daughter', 'step-sister');
1249
+			case 'parsposon':
1250
+				return I18N::translateContext('parent’s spouse’s son', 'step-brother');
1251
+			case 'sibchichi':
1252
+				return I18N::translateContext('sibling’s child’s child', 'great-nephew/niece');
1253
+			case 'sibchidau':
1254
+				return I18N::translateContext('sibling’s child’s daughter', 'great-niece');
1255
+			case 'sibchison':
1256
+				return I18N::translateContext('sibling’s child’s son', 'great-nephew');
1257
+			case 'sibdauchi':
1258
+				return I18N::translateContext('sibling’s daughter’s child', 'great-nephew/niece');
1259
+			case 'sibdaudau':
1260
+				return I18N::translateContext('sibling’s daughter’s daughter', 'great-niece');
1261
+			case 'sibdauhus':
1262
+				return I18N::translateContext('sibling’s daughter’s husband', 'nephew-in-law');
1263
+			case 'sibdauson':
1264
+				return I18N::translateContext('sibling’s daughter’s son', 'great-nephew');
1265
+			case 'sibsonchi':
1266
+				return I18N::translateContext('sibling’s son’s child', 'great-nephew/niece');
1267
+			case 'sibsondau':
1268
+				return I18N::translateContext('sibling’s son’s daughter', 'great-niece');
1269
+			case 'sibsonson':
1270
+				return I18N::translateContext('sibling’s son’s son', 'great-nephew');
1271
+			case 'sibsonwif':
1272
+				return I18N::translateContext('sibling’s son’s wife', 'niece-in-law');
1273
+			case 'sischichi':
1274
+				if ($sex1 === 'M') {
1275
+					return I18N::translateContext('(a man’s) sister’s child’s child', 'great-nephew/niece');
1276
+				} else {
1277
+					return I18N::translateContext('(a woman’s) sister’s child’s child', 'great-nephew/niece');
1278
+				}
1279
+			case 'sischidau':
1280
+				if ($sex1 === 'M') {
1281
+					return I18N::translateContext('(a man’s) sister’s child’s daughter', 'great-niece');
1282
+				} else {
1283
+					return I18N::translateContext('(a woman’s) sister’s child’s daughter', 'great-niece');
1284
+				}
1285
+			case 'sischison':
1286
+				if ($sex1 === 'M') {
1287
+					return I18N::translateContext('(a man’s) sister’s child’s son', 'great-nephew');
1288
+				} else {
1289
+					return I18N::translateContext('(a woman’s) sister’s child’s son', 'great-nephew');
1290
+				}
1291
+			case 'sisdauchi':
1292
+				if ($sex1 === 'M') {
1293
+					return I18N::translateContext('(a man’s) sister’s daughter’s child', 'great-nephew/niece');
1294
+				} else {
1295
+					return I18N::translateContext('(a woman’s) sister’s daughter’s child', 'great-nephew/niece');
1296
+				}
1297
+			case 'sisdaudau':
1298
+				if ($sex1 === 'M') {
1299
+					return I18N::translateContext('(a man’s) sister’s daughter’s daughter', 'great-niece');
1300
+				} else {
1301
+					return I18N::translateContext('(a woman’s) sister’s daughter’s daughter', 'great-niece');
1302
+				}
1303
+			case 'sisdauhus':
1304
+				return I18N::translateContext('sisters’s daughter’s husband', 'nephew-in-law');
1305
+			case 'sisdauson':
1306
+				if ($sex1 === 'M') {
1307
+					return I18N::translateContext('(a man’s) sister’s daughter’s son', 'great-nephew');
1308
+				} else {
1309
+					return I18N::translateContext('(a woman’s) sister’s daughter’s son', 'great-nephew');
1310
+				}
1311
+			case 'sishusbro':
1312
+				return I18N::translateContext('sister’s husband’s brother', 'brother-in-law');
1313
+			case 'sishussib':
1314
+				return I18N::translateContext('sister’s husband’s sibling', 'brother/sister-in-law');
1315
+			case 'sishussis':
1316
+				return I18N::translateContext('sister’s husband’s sister', 'sister-in-law');
1317
+			case 'sissonchi':
1318
+				if ($sex1 === 'M') {
1319
+					return I18N::translateContext('(a man’s) sister’s son’s child', 'great-nephew/niece');
1320
+				} else {
1321
+					return I18N::translateContext('(a woman’s) sister’s son’s child', 'great-nephew/niece');
1322
+				}
1323
+			case 'sissondau':
1324
+				if ($sex1 === 'M') {
1325
+					return I18N::translateContext('(a man’s) sister’s son’s daughter', 'great-niece');
1326
+				} else {
1327
+					return I18N::translateContext('(a woman’s) sister’s son’s daughter', 'great-niece');
1328
+				}
1329
+			case 'sissonson':
1330
+				if ($sex1 === 'M') {
1331
+					return I18N::translateContext('(a man’s) sister’s son’s son', 'great-nephew');
1332
+				} else {
1333
+					return I18N::translateContext('(a woman’s) sister’s son’s son', 'great-nephew');
1334
+				}
1335
+			case 'sissonwif':
1336
+				return I18N::translateContext('sisters’s son’s wife', 'niece-in-law');
1337
+			case 'sonchichi':
1338
+				return I18N::translateContext('son’s child’s child', 'great-grandchild');
1339
+			case 'sonchidau':
1340
+				return I18N::translateContext('son’s child’s daughter', 'great-granddaughter');
1341
+			case 'sonchison':
1342
+				return I18N::translateContext('son’s child’s son', 'great-grandson');
1343
+			case 'sondauchi':
1344
+				return I18N::translateContext('son’s daughter’s child', 'great-grandchild');
1345
+			case 'sondaudau':
1346
+				return I18N::translateContext('son’s daughter’s daughter', 'great-granddaughter');
1347
+			case 'sondauhus':
1348
+				return I18N::translateContext('son’s daughter’s husband', 'granddaughter’s husband');
1349
+			case 'sondauson':
1350
+				return I18N::translateContext('son’s daughter’s son', 'great-grandson');
1351
+			case 'sonsonchi':
1352
+				return I18N::translateContext('son’s son’s child', 'great-grandchild');
1353
+			case 'sonsondau':
1354
+				return I18N::translateContext('son’s son’s daughter', 'great-granddaughter');
1355
+			case 'sonsonson':
1356
+				return I18N::translateContext('son’s son’s son', 'great-grandson');
1357
+			case 'sonsonwif':
1358
+				return I18N::translateContext('son’s son’s wife', 'grandson’s wife');
1359
+			case 'sonwiffat':
1360
+				return I18N::translateContext('son’s wife’s father', 'daughter-in-law’s father');
1361
+			case 'sonwifmot':
1362
+				return I18N::translateContext('son’s wife’s mother', 'daughter-in-law’s mother');
1363
+			case 'sonwifpar':
1364
+				return I18N::translateContext('son’s wife’s parent', 'daughter-in-law’s parent');
1365
+			case 'wifbrowif':
1366
+				return I18N::translateContext('wife’s brother’s wife', 'sister-in-law');
1367
+			case 'wifsishus':
1368
+				return I18N::translateContext('wife’s sister’s husband', 'brother-in-law');
1369 1369
 
1370
-		// Some “special case” level four relationships that have specific names in certain languages
1371
-		case 'fatfatbrowif':
1372
-			return I18N::translateContext('father’s father’s brother’s wife', 'great-aunt');
1373
-		case 'fatfatsibspo':
1374
-			return I18N::translateContext('father’s father’s sibling’s spouse', 'great-aunt/uncle');
1375
-		case 'fatfatsishus':
1376
-			return I18N::translateContext('father’s father’s sister’s husband', 'great-uncle');
1377
-		case 'fatmotbrowif':
1378
-			return I18N::translateContext('father’s mother’s brother’s wife', 'great-aunt');
1379
-		case 'fatmotsibspo':
1380
-			return I18N::translateContext('father’s mother’s sibling’s spouse', 'great-aunt/uncle');
1381
-		case 'fatmotsishus':
1382
-			return I18N::translateContext('father’s mother’s sister’s husband', 'great-uncle');
1383
-		case 'fatparbrowif':
1384
-			return I18N::translateContext('father’s parent’s brother’s wife', 'great-aunt');
1385
-		case 'fatparsibspo':
1386
-			return I18N::translateContext('father’s parent’s sibling’s spouse', 'great-aunt/uncle');
1387
-		case 'fatparsishus':
1388
-			return I18N::translateContext('father’s parent’s sister’s husband', 'great-uncle');
1389
-		case 'motfatbrowif':
1390
-			return I18N::translateContext('mother’s father’s brother’s wife', 'great-aunt');
1391
-		case 'motfatsibspo':
1392
-			return I18N::translateContext('mother’s father’s sibling’s spouse', 'great-aunt/uncle');
1393
-		case 'motfatsishus':
1394
-			return I18N::translateContext('mother’s father’s sister’s husband', 'great-uncle');
1395
-		case 'motmotbrowif':
1396
-			return I18N::translateContext('mother’s mother’s brother’s wife', 'great-aunt');
1397
-		case 'motmotsibspo':
1398
-			return I18N::translateContext('mother’s mother’s sibling’s spouse', 'great-aunt/uncle');
1399
-		case 'motmotsishus':
1400
-			return I18N::translateContext('mother’s mother’s sister’s husband', 'great-uncle');
1401
-		case 'motparbrowif':
1402
-			return I18N::translateContext('mother’s parent’s brother’s wife', 'great-aunt');
1403
-		case 'motparsibspo':
1404
-			return I18N::translateContext('mother’s parent’s sibling’s spouse', 'great-aunt/uncle');
1405
-		case 'motparsishus':
1406
-			return I18N::translateContext('mother’s parent’s sister’s husband', 'great-uncle');
1407
-		case 'parfatbrowif':
1408
-			return I18N::translateContext('parent’s father’s brother’s wife', 'great-aunt');
1409
-		case 'parfatsibspo':
1410
-			return I18N::translateContext('parent’s father’s sibling’s spouse', 'great-aunt/uncle');
1411
-		case 'parfatsishus':
1412
-			return I18N::translateContext('parent’s father’s sister’s husband', 'great-uncle');
1413
-		case 'parmotbrowif':
1414
-			return I18N::translateContext('parent’s mother’s brother’s wife', 'great-aunt');
1415
-		case 'parmotsibspo':
1416
-			return I18N::translateContext('parent’s mother’s sibling’s spouse', 'great-aunt/uncle');
1417
-		case 'parmotsishus':
1418
-			return I18N::translateContext('parent’s mother’s sister’s husband', 'great-uncle');
1419
-		case 'parparbrowif':
1420
-			return I18N::translateContext('parent’s parent’s brother’s wife', 'great-aunt');
1421
-		case 'parparsibspo':
1422
-			return I18N::translateContext('parent’s parent’s sibling’s spouse', 'great-aunt/uncle');
1423
-		case 'parparsishus':
1424
-			return I18N::translateContext('parent’s parent’s sister’s husband', 'great-uncle');
1425
-		case 'fatfatbrodau':
1426
-			return I18N::translateContext('father’s father’s brother’s daughter', 'first cousin once removed ascending');
1427
-		case 'fatfatbroson':
1428
-			return I18N::translateContext('father’s father’s brother’s son', 'first cousin once removed ascending');
1429
-		case 'fatfatbrochi':
1430
-			return I18N::translateContext('father’s father’s brother’s child', 'first cousin once removed ascending');
1431
-		case 'fatfatsisdau':
1432
-			return I18N::translateContext('father’s father’s sister’s daughter', 'first cousin once removed ascending');
1433
-		case 'fatfatsisson':
1434
-			return I18N::translateContext('father’s father’s sister’s son', 'first cousin once removed ascending');
1435
-		case 'fatfatsischi':
1436
-			return I18N::translateContext('father’s father’s sister’s child', 'first cousin once removed ascending');
1437
-		case 'fatmotbrodau':
1438
-			return I18N::translateContext('father’s mother’s brother’s daughter', 'first cousin once removed ascending');
1439
-		case 'fatmotbroson':
1440
-			return I18N::translateContext('father’s mother’s brother’s son', 'first cousin once removed ascending');
1441
-		case 'fatmotbrochi':
1442
-			return I18N::translateContext('father’s mother’s brother’s child', 'first cousin once removed ascending');
1443
-		case 'fatmotsisdau':
1444
-			return I18N::translateContext('father’s mother’s sister’s daughter', 'first cousin once removed ascending');
1445
-		case 'fatmotsisson':
1446
-			return I18N::translateContext('father’s mother’s sister’s son', 'first cousin once removed ascending');
1447
-		case 'fatmotsischi':
1448
-			return I18N::translateContext('father’s mother’s sister’s child', 'first cousin once removed ascending');
1449
-		case 'motfatbrodau':
1450
-			return I18N::translateContext('mother’s father’s brother’s daughter', 'first cousin once removed ascending');
1451
-		case 'motfatbroson':
1452
-			return I18N::translateContext('mother’s father’s brother’s son', 'first cousin once removed ascending');
1453
-		case 'motfatbrochi':
1454
-			return I18N::translateContext('mother’s father’s brother’s child', 'first cousin once removed ascending');
1455
-		case 'motfatsisdau':
1456
-			return I18N::translateContext('mother’s father’s sister’s daughter', 'first cousin once removed ascending');
1457
-		case 'motfatsisson':
1458
-			return I18N::translateContext('mother’s father’s sister’s son', 'first cousin once removed ascending');
1459
-		case 'motfatsischi':
1460
-			return I18N::translateContext('mother’s father’s sister’s child', 'first cousin once removed ascending');
1461
-		case 'motmotbrodau':
1462
-			return I18N::translateContext('mother’s mother’s brother’s daughter', 'first cousin once removed ascending');
1463
-		case 'motmotbroson':
1464
-			return I18N::translateContext('mother’s mother’s brother’s son', 'first cousin once removed ascending');
1465
-		case 'motmotbrochi':
1466
-			return I18N::translateContext('mother’s mother’s brother’s child', 'first cousin once removed ascending');
1467
-		case 'motmotsisdau':
1468
-			return I18N::translateContext('mother’s mother’s sister’s daughter', 'first cousin once removed ascending');
1469
-		case 'motmotsisson':
1470
-			return I18N::translateContext('mother’s mother’s sister’s son', 'first cousin once removed ascending');
1471
-		case 'motmotsischi':
1472
-			return I18N::translateContext('mother’s mother’s sister’s child', 'first cousin once removed ascending');
1370
+			// Some “special case” level four relationships that have specific names in certain languages
1371
+			case 'fatfatbrowif':
1372
+				return I18N::translateContext('father’s father’s brother’s wife', 'great-aunt');
1373
+			case 'fatfatsibspo':
1374
+				return I18N::translateContext('father’s father’s sibling’s spouse', 'great-aunt/uncle');
1375
+			case 'fatfatsishus':
1376
+				return I18N::translateContext('father’s father’s sister’s husband', 'great-uncle');
1377
+			case 'fatmotbrowif':
1378
+				return I18N::translateContext('father’s mother’s brother’s wife', 'great-aunt');
1379
+			case 'fatmotsibspo':
1380
+				return I18N::translateContext('father’s mother’s sibling’s spouse', 'great-aunt/uncle');
1381
+			case 'fatmotsishus':
1382
+				return I18N::translateContext('father’s mother’s sister’s husband', 'great-uncle');
1383
+			case 'fatparbrowif':
1384
+				return I18N::translateContext('father’s parent’s brother’s wife', 'great-aunt');
1385
+			case 'fatparsibspo':
1386
+				return I18N::translateContext('father’s parent’s sibling’s spouse', 'great-aunt/uncle');
1387
+			case 'fatparsishus':
1388
+				return I18N::translateContext('father’s parent’s sister’s husband', 'great-uncle');
1389
+			case 'motfatbrowif':
1390
+				return I18N::translateContext('mother’s father’s brother’s wife', 'great-aunt');
1391
+			case 'motfatsibspo':
1392
+				return I18N::translateContext('mother’s father’s sibling’s spouse', 'great-aunt/uncle');
1393
+			case 'motfatsishus':
1394
+				return I18N::translateContext('mother’s father’s sister’s husband', 'great-uncle');
1395
+			case 'motmotbrowif':
1396
+				return I18N::translateContext('mother’s mother’s brother’s wife', 'great-aunt');
1397
+			case 'motmotsibspo':
1398
+				return I18N::translateContext('mother’s mother’s sibling’s spouse', 'great-aunt/uncle');
1399
+			case 'motmotsishus':
1400
+				return I18N::translateContext('mother’s mother’s sister’s husband', 'great-uncle');
1401
+			case 'motparbrowif':
1402
+				return I18N::translateContext('mother’s parent’s brother’s wife', 'great-aunt');
1403
+			case 'motparsibspo':
1404
+				return I18N::translateContext('mother’s parent’s sibling’s spouse', 'great-aunt/uncle');
1405
+			case 'motparsishus':
1406
+				return I18N::translateContext('mother’s parent’s sister’s husband', 'great-uncle');
1407
+			case 'parfatbrowif':
1408
+				return I18N::translateContext('parent’s father’s brother’s wife', 'great-aunt');
1409
+			case 'parfatsibspo':
1410
+				return I18N::translateContext('parent’s father’s sibling’s spouse', 'great-aunt/uncle');
1411
+			case 'parfatsishus':
1412
+				return I18N::translateContext('parent’s father’s sister’s husband', 'great-uncle');
1413
+			case 'parmotbrowif':
1414
+				return I18N::translateContext('parent’s mother’s brother’s wife', 'great-aunt');
1415
+			case 'parmotsibspo':
1416
+				return I18N::translateContext('parent’s mother’s sibling’s spouse', 'great-aunt/uncle');
1417
+			case 'parmotsishus':
1418
+				return I18N::translateContext('parent’s mother’s sister’s husband', 'great-uncle');
1419
+			case 'parparbrowif':
1420
+				return I18N::translateContext('parent’s parent’s brother’s wife', 'great-aunt');
1421
+			case 'parparsibspo':
1422
+				return I18N::translateContext('parent’s parent’s sibling’s spouse', 'great-aunt/uncle');
1423
+			case 'parparsishus':
1424
+				return I18N::translateContext('parent’s parent’s sister’s husband', 'great-uncle');
1425
+			case 'fatfatbrodau':
1426
+				return I18N::translateContext('father’s father’s brother’s daughter', 'first cousin once removed ascending');
1427
+			case 'fatfatbroson':
1428
+				return I18N::translateContext('father’s father’s brother’s son', 'first cousin once removed ascending');
1429
+			case 'fatfatbrochi':
1430
+				return I18N::translateContext('father’s father’s brother’s child', 'first cousin once removed ascending');
1431
+			case 'fatfatsisdau':
1432
+				return I18N::translateContext('father’s father’s sister’s daughter', 'first cousin once removed ascending');
1433
+			case 'fatfatsisson':
1434
+				return I18N::translateContext('father’s father’s sister’s son', 'first cousin once removed ascending');
1435
+			case 'fatfatsischi':
1436
+				return I18N::translateContext('father’s father’s sister’s child', 'first cousin once removed ascending');
1437
+			case 'fatmotbrodau':
1438
+				return I18N::translateContext('father’s mother’s brother’s daughter', 'first cousin once removed ascending');
1439
+			case 'fatmotbroson':
1440
+				return I18N::translateContext('father’s mother’s brother’s son', 'first cousin once removed ascending');
1441
+			case 'fatmotbrochi':
1442
+				return I18N::translateContext('father’s mother’s brother’s child', 'first cousin once removed ascending');
1443
+			case 'fatmotsisdau':
1444
+				return I18N::translateContext('father’s mother’s sister’s daughter', 'first cousin once removed ascending');
1445
+			case 'fatmotsisson':
1446
+				return I18N::translateContext('father’s mother’s sister’s son', 'first cousin once removed ascending');
1447
+			case 'fatmotsischi':
1448
+				return I18N::translateContext('father’s mother’s sister’s child', 'first cousin once removed ascending');
1449
+			case 'motfatbrodau':
1450
+				return I18N::translateContext('mother’s father’s brother’s daughter', 'first cousin once removed ascending');
1451
+			case 'motfatbroson':
1452
+				return I18N::translateContext('mother’s father’s brother’s son', 'first cousin once removed ascending');
1453
+			case 'motfatbrochi':
1454
+				return I18N::translateContext('mother’s father’s brother’s child', 'first cousin once removed ascending');
1455
+			case 'motfatsisdau':
1456
+				return I18N::translateContext('mother’s father’s sister’s daughter', 'first cousin once removed ascending');
1457
+			case 'motfatsisson':
1458
+				return I18N::translateContext('mother’s father’s sister’s son', 'first cousin once removed ascending');
1459
+			case 'motfatsischi':
1460
+				return I18N::translateContext('mother’s father’s sister’s child', 'first cousin once removed ascending');
1461
+			case 'motmotbrodau':
1462
+				return I18N::translateContext('mother’s mother’s brother’s daughter', 'first cousin once removed ascending');
1463
+			case 'motmotbroson':
1464
+				return I18N::translateContext('mother’s mother’s brother’s son', 'first cousin once removed ascending');
1465
+			case 'motmotbrochi':
1466
+				return I18N::translateContext('mother’s mother’s brother’s child', 'first cousin once removed ascending');
1467
+			case 'motmotsisdau':
1468
+				return I18N::translateContext('mother’s mother’s sister’s daughter', 'first cousin once removed ascending');
1469
+			case 'motmotsisson':
1470
+				return I18N::translateContext('mother’s mother’s sister’s son', 'first cousin once removed ascending');
1471
+			case 'motmotsischi':
1472
+				return I18N::translateContext('mother’s mother’s sister’s child', 'first cousin once removed ascending');
1473 1473
 		}
1474 1474
 
1475 1475
 		// Some “special case” level five relationships that have specific names in certain languages
@@ -1535,125 +1535,125 @@  discard block
 block discarded – undo
1535 1535
 			$up       = strlen($match[1]) / 3;
1536 1536
 			$bef_last = substr($path, -6, 3);
1537 1537
 			switch ($up) {
1538
-			case 3:
1539
-				switch ($sex2) {
1540
-				case 'M':
1541
-				if ($bef_last === 'fat') {
1542
-				return I18N::translateContext('great-grandfather’s brother', 'great-great-uncle');
1543
-				} elseif ($bef_last === 'mot') {
1544
-				return I18N::translateContext('great-grandmother’s brother', 'great-great-uncle');
1545
-				} else {
1546
-				return I18N::translateContext('great-grandparent’s brother', 'great-great-uncle');
1547
-				}
1548
-				case 'F':
1549
-				return I18N::translate('great-great-aunt');
1550
-				default:
1551
-				return I18N::translate('great-great-aunt/uncle');
1552
-				}
1553
-			case 4:
1554
-				switch ($sex2) {
1555
-				case 'M':
1556
-				if ($bef_last === 'fat') {
1557
-				return I18N::translateContext('great-great-grandfather’s brother', 'great-great-great-uncle');
1558
-				} elseif ($bef_last === 'mot') {
1559
-				return I18N::translateContext('great-great-grandmother’s brother', 'great-great-great-uncle');
1560
-				} else {
1561
-				return I18N::translateContext('great-great-grandparent’s brother', 'great-great-great-uncle');
1562
-				}
1563
-				case 'F':
1564
-				return I18N::translate('great-great-great-aunt');
1565
-				default:
1566
-				return I18N::translate('great-great-great-aunt/uncle');
1567
-				}
1568
-			case 5:
1569
-				switch ($sex2) {
1570
-				case 'M':
1571
-				if ($bef_last === 'fat') {
1572
-				return I18N::translateContext('great-great-great-grandfather’s brother', 'great ×4 uncle');
1573
-				} elseif ($bef_last === 'mot') {
1574
-				return I18N::translateContext('great-great-great-grandmother’s brother', 'great ×4 uncle');
1575
-				} else {
1576
-				return I18N::translateContext('great-great-great-grandparent’s brother', 'great ×4 uncle');
1577
-				}
1578
-				case 'F':
1579
-				return I18N::translate('great ×4 aunt');
1580
-				default:
1581
-				return I18N::translate('great ×4 aunt/uncle');
1582
-				}
1583
-			case 6:
1584
-				switch ($sex2) {
1585
-				case 'M':
1586
-				if ($bef_last === 'fat') {
1587
-				return I18N::translateContext('great ×4 grandfather’s brother', 'great ×5 uncle');
1588
-				} elseif ($bef_last === 'mot') {
1589
-				return I18N::translateContext('great ×4 grandmother’s brother', 'great ×5 uncle');
1590
-				} else {
1591
-				return I18N::translateContext('great ×4 grandparent’s brother', 'great ×5 uncle');
1592
-				}
1593
-				case 'F':
1594
-				return I18N::translate('great ×5 aunt');
1595
-				default:
1596
-				return I18N::translate('great ×5 aunt/uncle');
1597
-				}
1598
-			case 7:
1599
-				switch ($sex2) {
1600
-				case 'M':
1601
-				if ($bef_last === 'fat') {
1602
-				return I18N::translateContext('great ×5 grandfather’s brother', 'great ×6 uncle');
1603
-				} elseif ($bef_last === 'mot') {
1604
-				return I18N::translateContext('great ×5 grandmother’s brother', 'great ×6 uncle');
1605
-				} else {
1606
-				return I18N::translateContext('great ×5 grandparent’s brother', 'great ×6 uncle');
1607
-				}
1608
-				case 'F':
1609
-				return I18N::translate('great ×6 aunt');
1610
-				default:
1611
-				return I18N::translate('great ×6 aunt/uncle');
1612
-				}
1613
-			case 8:
1614
-				switch ($sex2) {
1615
-				case 'M':
1616
-				if ($bef_last === 'fat') {
1617
-				return I18N::translateContext('great ×6 grandfather’s brother', 'great ×7 uncle');
1618
-				} elseif ($bef_last === 'mot') {
1619
-				return I18N::translateContext('great ×6 grandmother’s brother', 'great ×7 uncle');
1620
-				} else {
1621
-				return I18N::translateContext('great ×6 grandparent’s brother', 'great ×7 uncle');
1622
-				}
1623
-				case 'F':
1624
-				return I18N::translate('great ×7 aunt');
1625
-				default:
1626
-				return I18N::translate('great ×7 aunt/uncle');
1627
-				}
1628
-			default:
1629
-				// Different languages have different rules for naming generations.
1630
-				// An English great ×12 uncle is a Danish great ×10 uncle.
1631
-				//
1632
-				// Need to find out which languages use which rules.
1633
-				switch (WT_LOCALE) {
1634
-				case 'da':
1635
-				switch ($sex2) {
1636
-				case 'M':
1637
-				return I18N::translate('great ×%s uncle', I18N::number($up - 4));
1638
-				case 'F':
1639
-				return I18N::translate('great ×%s aunt', I18N::number($up - 4));
1538
+				case 3:
1539
+					switch ($sex2) {
1540
+						case 'M':
1541
+						if ($bef_last === 'fat') {
1542
+						return I18N::translateContext('great-grandfather’s brother', 'great-great-uncle');
1543
+						} elseif ($bef_last === 'mot') {
1544
+						return I18N::translateContext('great-grandmother’s brother', 'great-great-uncle');
1545
+						} else {
1546
+						return I18N::translateContext('great-grandparent’s brother', 'great-great-uncle');
1547
+						}
1548
+						case 'F':
1549
+						return I18N::translate('great-great-aunt');
1550
+						default:
1551
+						return I18N::translate('great-great-aunt/uncle');
1552
+					}
1553
+				case 4:
1554
+					switch ($sex2) {
1555
+						case 'M':
1556
+						if ($bef_last === 'fat') {
1557
+						return I18N::translateContext('great-great-grandfather’s brother', 'great-great-great-uncle');
1558
+						} elseif ($bef_last === 'mot') {
1559
+						return I18N::translateContext('great-great-grandmother’s brother', 'great-great-great-uncle');
1560
+						} else {
1561
+						return I18N::translateContext('great-great-grandparent’s brother', 'great-great-great-uncle');
1562
+						}
1563
+						case 'F':
1564
+						return I18N::translate('great-great-great-aunt');
1565
+						default:
1566
+						return I18N::translate('great-great-great-aunt/uncle');
1567
+					}
1568
+				case 5:
1569
+					switch ($sex2) {
1570
+						case 'M':
1571
+						if ($bef_last === 'fat') {
1572
+						return I18N::translateContext('great-great-great-grandfather’s brother', 'great ×4 uncle');
1573
+						} elseif ($bef_last === 'mot') {
1574
+						return I18N::translateContext('great-great-great-grandmother’s brother', 'great ×4 uncle');
1575
+						} else {
1576
+						return I18N::translateContext('great-great-great-grandparent’s brother', 'great ×4 uncle');
1577
+						}
1578
+						case 'F':
1579
+						return I18N::translate('great ×4 aunt');
1580
+						default:
1581
+						return I18N::translate('great ×4 aunt/uncle');
1582
+					}
1583
+				case 6:
1584
+					switch ($sex2) {
1585
+						case 'M':
1586
+						if ($bef_last === 'fat') {
1587
+						return I18N::translateContext('great ×4 grandfather’s brother', 'great ×5 uncle');
1588
+						} elseif ($bef_last === 'mot') {
1589
+						return I18N::translateContext('great ×4 grandmother’s brother', 'great ×5 uncle');
1590
+						} else {
1591
+						return I18N::translateContext('great ×4 grandparent’s brother', 'great ×5 uncle');
1592
+						}
1593
+						case 'F':
1594
+						return I18N::translate('great ×5 aunt');
1595
+						default:
1596
+						return I18N::translate('great ×5 aunt/uncle');
1597
+					}
1598
+				case 7:
1599
+					switch ($sex2) {
1600
+						case 'M':
1601
+						if ($bef_last === 'fat') {
1602
+						return I18N::translateContext('great ×5 grandfather’s brother', 'great ×6 uncle');
1603
+						} elseif ($bef_last === 'mot') {
1604
+						return I18N::translateContext('great ×5 grandmother’s brother', 'great ×6 uncle');
1605
+						} else {
1606
+						return I18N::translateContext('great ×5 grandparent’s brother', 'great ×6 uncle');
1607
+						}
1608
+						case 'F':
1609
+						return I18N::translate('great ×6 aunt');
1610
+						default:
1611
+						return I18N::translate('great ×6 aunt/uncle');
1612
+					}
1613
+				case 8:
1614
+					switch ($sex2) {
1615
+						case 'M':
1616
+						if ($bef_last === 'fat') {
1617
+						return I18N::translateContext('great ×6 grandfather’s brother', 'great ×7 uncle');
1618
+						} elseif ($bef_last === 'mot') {
1619
+						return I18N::translateContext('great ×6 grandmother’s brother', 'great ×7 uncle');
1620
+						} else {
1621
+						return I18N::translateContext('great ×6 grandparent’s brother', 'great ×7 uncle');
1622
+						}
1623
+						case 'F':
1624
+						return I18N::translate('great ×7 aunt');
1625
+						default:
1626
+						return I18N::translate('great ×7 aunt/uncle');
1627
+					}
1640 1628
 				default:
1641
-				return I18N::translate('great ×%s aunt/uncle', I18N::number($up - 4));
1642
-				}
1629
+					// Different languages have different rules for naming generations.
1630
+					// An English great ×12 uncle is a Danish great ×10 uncle.
1631
+					//
1632
+					// Need to find out which languages use which rules.
1633
+					switch (WT_LOCALE) {
1634
+						case 'da':
1635
+						switch ($sex2) {
1636
+							case 'M':
1637
+							return I18N::translate('great ×%s uncle', I18N::number($up - 4));
1638
+							case 'F':
1639
+							return I18N::translate('great ×%s aunt', I18N::number($up - 4));
1640
+							default:
1641
+							return I18N::translate('great ×%s aunt/uncle', I18N::number($up - 4));
1642
+						}
1643 1643
 				case 'pl':
1644 1644
 					switch ($sex2) {
1645
-					case 'M':
1646
-					if ($bef_last === 'fat') {
1647
-					return I18N::translateContext('great ×(%s-1) grandfather’s brother', 'great ×%s uncle', I18N::number($up - 2));
1648
-					} elseif ($bef_last === 'mot') {
1649
-					return I18N::translateContext('great ×(%s-1) grandmother’s brother', 'great ×%s uncle', I18N::number($up - 2));
1650
-					} else {
1651
-					return I18N::translateContext('great ×(%s-1) grandparent’s brother', 'great ×%s uncle', I18N::number($up - 2));
1652
-					}
1653
-					case 'F':
1654
-					return I18N::translate('great ×%s aunt', I18N::number($up - 2));
1655
-					default:
1656
-					return I18N::translate('great ×%s aunt/uncle', I18N::number($up - 2));
1645
+						case 'M':
1646
+						if ($bef_last === 'fat') {
1647
+						return I18N::translateContext('great ×(%s-1) grandfather’s brother', 'great ×%s uncle', I18N::number($up - 2));
1648
+						} elseif ($bef_last === 'mot') {
1649
+						return I18N::translateContext('great ×(%s-1) grandmother’s brother', 'great ×%s uncle', I18N::number($up - 2));
1650
+						} else {
1651
+						return I18N::translateContext('great ×(%s-1) grandparent’s brother', 'great ×%s uncle', I18N::number($up - 2));
1652
+						}
1653
+						case 'F':
1654
+						return I18N::translate('great ×%s aunt', I18N::number($up - 2));
1655
+						default:
1656
+						return I18N::translate('great ×%s aunt/uncle', I18N::number($up - 2));
1657 1657
 					}
1658 1658
 				case 'it': // Source: Michele Locati
1659 1659
 				case 'en_AU':
@@ -1661,12 +1661,12 @@  discard block
 block discarded – undo
1661 1661
 				case 'en_US':
1662 1662
 				default:
1663 1663
 					switch ($sex2) {
1664
-					case 'M': // I18N: if you need a different number for %s, contact the developers, as a code-change is required
1665
-					return I18N::translate('great ×%s uncle', I18N::number($up - 1));
1666
-					case 'F':
1667
-					return I18N::translate('great ×%s aunt', I18N::number($up - 1));
1668
-					default:
1669
-					return I18N::translate('great ×%s aunt/uncle', I18N::number($up - 1));
1664
+						case 'M': // I18N: if you need a different number for %s, contact the developers, as a code-change is required
1665
+						return I18N::translate('great ×%s uncle', I18N::number($up - 1));
1666
+						case 'F':
1667
+						return I18N::translate('great ×%s aunt', I18N::number($up - 1));
1668
+						default:
1669
+						return I18N::translate('great ×%s aunt/uncle', I18N::number($up - 1));
1670 1670
 					}
1671 1671
 					}
1672 1672
 			}
@@ -1676,155 +1676,155 @@  discard block
 block discarded – undo
1676 1676
 			$down  = strlen($match[1]) / 3 + 1; // Add one, as we count generations from the common ancestor
1677 1677
 			$first = substr($path, 0, 3);
1678 1678
 			switch ($down) {
1679
-			case 4:
1680
-				switch ($sex2) {
1681
-				case 'M':
1682
-				if ($first === 'bro' && $sex1 === 'M') {
1683
-				return I18N::translateContext('(a man’s) brother’s great-grandson', 'great-great-nephew');
1684
-				} elseif ($first === 'sis' && $sex1 === 'M') {
1685
-				return I18N::translateContext('(a man’s) sister’s great-grandson', 'great-great-nephew');
1686
-				} else {
1687
-				return I18N::translateContext('(a woman’s) great-great-nephew', 'great-great-nephew');
1688
-				}
1689
-				case 'F':
1690
-				if ($first === 'bro' && $sex1 === 'M') {
1691
-				return I18N::translateContext('(a man’s) brother’s great-granddaughter', 'great-great-niece');
1692
-				} elseif ($first === 'sis' && $sex1 === 'M') {
1693
-				return I18N::translateContext('(a man’s) sister’s great-granddaughter', 'great-great-niece');
1694
-				} else {
1695
-				return I18N::translateContext('(a woman’s) great-great-niece', 'great-great-niece');
1696
-				}
1697
-				default:
1698
-				if ($first === 'bro' && $sex1 === 'M') {
1699
-				return I18N::translateContext('(a man’s) brother’s great-grandchild', 'great-great-nephew/niece');
1700
-				} elseif ($first === 'sis' && $sex1 === 'M') {
1701
-				return I18N::translateContext('(a man’s) sister’s great-grandchild', 'great-great-nephew/niece');
1702
-				} else {
1703
-				return I18N::translateContext('(a woman’s) great-great-nephew/niece', 'great-great-nephew/niece');
1704
-				}
1705
-				}
1706
-			case 5:
1707
-				switch ($sex2) {
1708
-				case 'M':
1709
-				if ($first === 'bro' && $sex1 === 'M') {
1710
-				return I18N::translateContext('(a man’s) brother’s great-great-grandson', 'great-great-great-nephew');
1711
-				} elseif ($first === 'sis' && $sex1 === 'M') {
1712
-				return I18N::translateContext('(a man’s) sister’s great-great-grandson', 'great-great-great-nephew');
1713
-				} else {
1714
-				return I18N::translateContext('(a woman’s) great-great-great-nephew', 'great-great-great-nephew');
1715
-				}
1716
-				case 'F':
1717
-				if ($first === 'bro' && $sex1 === 'M') {
1718
-				return I18N::translateContext('(a man’s) brother’s great-great-granddaughter', 'great-great-great-niece');
1719
-				} elseif ($first === 'sis' && $sex1 === 'M') {
1720
-				return I18N::translateContext('(a man’s) sister’s great-great-granddaughter', 'great-great-great-niece');
1721
-				} else {
1722
-				return I18N::translateContext('(a woman’s) great-great-great-niece', 'great-great-great-niece');
1723
-				}
1724
-				default:
1725
-				if ($first === 'bro' && $sex1 === 'M') {
1726
-				return I18N::translateContext('(a man’s) brother’s great-great-grandchild', 'great-great-great-nephew/niece');
1727
-				} elseif ($first === 'sis' && $sex1 === 'M') {
1728
-				return I18N::translateContext('(a man’s) sister’s great-great-grandchild', 'great-great-great-nephew/niece');
1729
-				} else {
1730
-				return I18N::translateContext('(a woman’s) great-great-great-nephew/niece', 'great-great-great-nephew/niece');
1731
-				}
1732
-				}
1733
-			case 6:
1734
-				switch ($sex2) {
1735
-				case 'M':
1736
-				if ($first === 'bro' && $sex1 === 'M') {
1737
-				return I18N::translateContext('(a man’s) brother’s great-great-great-grandson', 'great ×4 nephew');
1738
-				} elseif ($first === 'sis' && $sex1 === 'M') {
1739
-				return I18N::translateContext('(a man’s) sister’s great-great-great-grandson', 'great ×4 nephew');
1740
-				} else {
1741
-				return I18N::translateContext('(a woman’s) great ×4 nephew', 'great ×4 nephew');
1742
-				}
1743
-				case 'F':
1744
-				if ($first === 'bro' && $sex1 === 'M') {
1745
-				return I18N::translateContext('(a man’s) brother’s great-great-great-granddaughter', 'great ×4 niece');
1746
-				} elseif ($first === 'sis' && $sex1 === 'M') {
1747
-				return I18N::translateContext('(a man’s) sister’s great-great-great-granddaughter', 'great ×4 niece');
1748
-				} else {
1749
-				return I18N::translateContext('(a woman’s) great ×4 niece', 'great ×4 niece');
1750
-				}
1751
-				default:
1752
-				if ($first === 'bro' && $sex1 === 'M') {
1753
-				return I18N::translateContext('(a man’s) brother’s great-great-great-grandchild', 'great ×4 nephew/niece');
1754
-				} elseif ($first === 'sis' && $sex1 === 'M') {
1755
-				return I18N::translateContext('(a man’s) sister’s great-great-great-grandchild', 'great ×4 nephew/niece');
1756
-				} else {
1757
-				return I18N::translateContext('(a woman’s) great ×4 nephew/niece', 'great ×4 nephew/niece');
1758
-				}
1759
-				}
1760
-			case 7:
1761
-				switch ($sex2) {
1762
-				case 'M':
1763
-				if ($first === 'bro' && $sex1 === 'M') {
1764
-				return I18N::translateContext('(a man’s) brother’s great ×4 grandson', 'great ×5 nephew');
1765
-				} elseif ($first === 'sis' && $sex1 === 'M') {
1766
-				return I18N::translateContext('(a man’s) sister’s great ×4 grandson', 'great ×5 nephew');
1767
-				} else {
1768
-				return I18N::translateContext('(a woman’s) great ×5 nephew', 'great ×5 nephew');
1769
-				}
1770
-				case 'F':
1771
-				if ($first === 'bro' && $sex1 === 'M') {
1772
-				return I18N::translateContext('(a man’s) brother’s great ×4 granddaughter', 'great ×5 niece');
1773
-				} elseif ($first === 'sis' && $sex1 === 'M') {
1774
-				return I18N::translateContext('(a man’s) sister’s great ×4 granddaughter', 'great ×5 niece');
1775
-				} else {
1776
-				return I18N::translateContext('(a woman’s) great ×5 niece', 'great ×5 niece');
1777
-				}
1778
-				default:
1779
-				if ($first === 'bro' && $sex1 === 'M') {
1780
-				return I18N::translateContext('(a man’s) brother’s great ×4 grandchild', 'great ×5 nephew/niece');
1781
-				} elseif ($first === 'sis' && $sex1 === 'M') {
1782
-				return I18N::translateContext('(a man’s) sister’s great ×4 grandchild', 'great ×5 nephew/niece');
1783
-				} else {
1784
-				return I18N::translateContext('(a woman’s) great ×5 nephew/niece', 'great ×5 nephew/niece');
1785
-				}
1786
-				}
1787
-			default:
1788
-				// Different languages have different rules for naming generations.
1789
-				// An English great ×12 nephew is a Polish great ×11 nephew.
1790
-				//
1791
-				// Need to find out which languages use which rules.
1792
-				switch (WT_LOCALE) {
1793
-				case 'pl': // Source: Lukasz Wilenski
1794
-				switch ($sex2) {
1795
-				case 'M':
1796
-				if ($first === 'bro' && $sex1 === 'M') {
1797
-				return I18N::translateContext('(a man’s) brother’s great ×(%s-1) grandson', 'great ×%s nephew', I18N::number($down - 3));
1798
-				} elseif ($first === 'sis' && $sex1 === 'M') {
1799
-				return I18N::translateContext('(a man’s) sister’s great ×(%s-1) grandson', 'great ×%s nephew', I18N::number($down - 3));
1800
-				} else {
1801
-				return I18N::translateContext('(a woman’s) great ×%s nephew', 'great ×%s nephew', I18N::number($down - 3));
1802
-				}
1803
-				case 'F':
1804
-				if ($first === 'bro' && $sex1 === 'M') {
1805
-				return I18N::translateContext('(a man’s) brother’s great ×(%s-1) granddaughter', 'great ×%s niece', I18N::number($down - 3));
1806
-				} elseif ($first === 'sis' && $sex1 === 'M') {
1807
-				return I18N::translateContext('(a man’s) sister’s great ×(%s-1) granddaughter', 'great ×%s niece', I18N::number($down - 3));
1808
-				} else {
1809
-				return I18N::translateContext('(a woman’s) great ×%s niece', 'great ×%s niece', I18N::number($down - 3));
1810
-				}
1679
+				case 4:
1680
+					switch ($sex2) {
1681
+						case 'M':
1682
+						if ($first === 'bro' && $sex1 === 'M') {
1683
+						return I18N::translateContext('(a man’s) brother’s great-grandson', 'great-great-nephew');
1684
+						} elseif ($first === 'sis' && $sex1 === 'M') {
1685
+						return I18N::translateContext('(a man’s) sister’s great-grandson', 'great-great-nephew');
1686
+						} else {
1687
+						return I18N::translateContext('(a woman’s) great-great-nephew', 'great-great-nephew');
1688
+						}
1689
+						case 'F':
1690
+						if ($first === 'bro' && $sex1 === 'M') {
1691
+						return I18N::translateContext('(a man’s) brother’s great-granddaughter', 'great-great-niece');
1692
+						} elseif ($first === 'sis' && $sex1 === 'M') {
1693
+						return I18N::translateContext('(a man’s) sister’s great-granddaughter', 'great-great-niece');
1694
+						} else {
1695
+						return I18N::translateContext('(a woman’s) great-great-niece', 'great-great-niece');
1696
+						}
1697
+						default:
1698
+						if ($first === 'bro' && $sex1 === 'M') {
1699
+						return I18N::translateContext('(a man’s) brother’s great-grandchild', 'great-great-nephew/niece');
1700
+						} elseif ($first === 'sis' && $sex1 === 'M') {
1701
+						return I18N::translateContext('(a man’s) sister’s great-grandchild', 'great-great-nephew/niece');
1702
+						} else {
1703
+						return I18N::translateContext('(a woman’s) great-great-nephew/niece', 'great-great-nephew/niece');
1704
+						}
1705
+					}
1706
+				case 5:
1707
+					switch ($sex2) {
1708
+						case 'M':
1709
+						if ($first === 'bro' && $sex1 === 'M') {
1710
+						return I18N::translateContext('(a man’s) brother’s great-great-grandson', 'great-great-great-nephew');
1711
+						} elseif ($first === 'sis' && $sex1 === 'M') {
1712
+						return I18N::translateContext('(a man’s) sister’s great-great-grandson', 'great-great-great-nephew');
1713
+						} else {
1714
+						return I18N::translateContext('(a woman’s) great-great-great-nephew', 'great-great-great-nephew');
1715
+						}
1716
+						case 'F':
1717
+						if ($first === 'bro' && $sex1 === 'M') {
1718
+						return I18N::translateContext('(a man’s) brother’s great-great-granddaughter', 'great-great-great-niece');
1719
+						} elseif ($first === 'sis' && $sex1 === 'M') {
1720
+						return I18N::translateContext('(a man’s) sister’s great-great-granddaughter', 'great-great-great-niece');
1721
+						} else {
1722
+						return I18N::translateContext('(a woman’s) great-great-great-niece', 'great-great-great-niece');
1723
+						}
1724
+						default:
1725
+						if ($first === 'bro' && $sex1 === 'M') {
1726
+						return I18N::translateContext('(a man’s) brother’s great-great-grandchild', 'great-great-great-nephew/niece');
1727
+						} elseif ($first === 'sis' && $sex1 === 'M') {
1728
+						return I18N::translateContext('(a man’s) sister’s great-great-grandchild', 'great-great-great-nephew/niece');
1729
+						} else {
1730
+						return I18N::translateContext('(a woman’s) great-great-great-nephew/niece', 'great-great-great-nephew/niece');
1731
+						}
1732
+					}
1733
+				case 6:
1734
+					switch ($sex2) {
1735
+						case 'M':
1736
+						if ($first === 'bro' && $sex1 === 'M') {
1737
+						return I18N::translateContext('(a man’s) brother’s great-great-great-grandson', 'great ×4 nephew');
1738
+						} elseif ($first === 'sis' && $sex1 === 'M') {
1739
+						return I18N::translateContext('(a man’s) sister’s great-great-great-grandson', 'great ×4 nephew');
1740
+						} else {
1741
+						return I18N::translateContext('(a woman’s) great ×4 nephew', 'great ×4 nephew');
1742
+						}
1743
+						case 'F':
1744
+						if ($first === 'bro' && $sex1 === 'M') {
1745
+						return I18N::translateContext('(a man’s) brother’s great-great-great-granddaughter', 'great ×4 niece');
1746
+						} elseif ($first === 'sis' && $sex1 === 'M') {
1747
+						return I18N::translateContext('(a man’s) sister’s great-great-great-granddaughter', 'great ×4 niece');
1748
+						} else {
1749
+						return I18N::translateContext('(a woman’s) great ×4 niece', 'great ×4 niece');
1750
+						}
1751
+						default:
1752
+						if ($first === 'bro' && $sex1 === 'M') {
1753
+						return I18N::translateContext('(a man’s) brother’s great-great-great-grandchild', 'great ×4 nephew/niece');
1754
+						} elseif ($first === 'sis' && $sex1 === 'M') {
1755
+						return I18N::translateContext('(a man’s) sister’s great-great-great-grandchild', 'great ×4 nephew/niece');
1756
+						} else {
1757
+						return I18N::translateContext('(a woman’s) great ×4 nephew/niece', 'great ×4 nephew/niece');
1758
+						}
1759
+					}
1760
+				case 7:
1761
+					switch ($sex2) {
1762
+						case 'M':
1763
+						if ($first === 'bro' && $sex1 === 'M') {
1764
+						return I18N::translateContext('(a man’s) brother’s great ×4 grandson', 'great ×5 nephew');
1765
+						} elseif ($first === 'sis' && $sex1 === 'M') {
1766
+						return I18N::translateContext('(a man’s) sister’s great ×4 grandson', 'great ×5 nephew');
1767
+						} else {
1768
+						return I18N::translateContext('(a woman’s) great ×5 nephew', 'great ×5 nephew');
1769
+						}
1770
+						case 'F':
1771
+						if ($first === 'bro' && $sex1 === 'M') {
1772
+						return I18N::translateContext('(a man’s) brother’s great ×4 granddaughter', 'great ×5 niece');
1773
+						} elseif ($first === 'sis' && $sex1 === 'M') {
1774
+						return I18N::translateContext('(a man’s) sister’s great ×4 granddaughter', 'great ×5 niece');
1775
+						} else {
1776
+						return I18N::translateContext('(a woman’s) great ×5 niece', 'great ×5 niece');
1777
+						}
1778
+						default:
1779
+						if ($first === 'bro' && $sex1 === 'M') {
1780
+						return I18N::translateContext('(a man’s) brother’s great ×4 grandchild', 'great ×5 nephew/niece');
1781
+						} elseif ($first === 'sis' && $sex1 === 'M') {
1782
+						return I18N::translateContext('(a man’s) sister’s great ×4 grandchild', 'great ×5 nephew/niece');
1783
+						} else {
1784
+						return I18N::translateContext('(a woman’s) great ×5 nephew/niece', 'great ×5 nephew/niece');
1785
+						}
1786
+					}
1811 1787
 				default:
1812
-				if ($first === 'bro' && $sex1 === 'M') {
1813
-				return I18N::translateContext('(a man’s) brother’s great ×(%s-1) grandchild', 'great ×%s nephew/niece', I18N::number($down - 3));
1814
-				} elseif ($first === 'sis' && $sex1 === 'M') {
1815
-				return I18N::translateContext('(a man’s) sister’s great ×(%s-1) grandchild', 'great ×%s nephew/niece', I18N::number($down - 3));
1816
-				} else {
1817
-				return I18N::translateContext('(a woman’s) great ×%s nephew/niece', 'great ×%s nephew/niece', I18N::number($down - 3));
1818
-				}
1819
-				}
1788
+					// Different languages have different rules for naming generations.
1789
+					// An English great ×12 nephew is a Polish great ×11 nephew.
1790
+					//
1791
+					// Need to find out which languages use which rules.
1792
+					switch (WT_LOCALE) {
1793
+						case 'pl': // Source: Lukasz Wilenski
1794
+						switch ($sex2) {
1795
+							case 'M':
1796
+							if ($first === 'bro' && $sex1 === 'M') {
1797
+							return I18N::translateContext('(a man’s) brother’s great ×(%s-1) grandson', 'great ×%s nephew', I18N::number($down - 3));
1798
+							} elseif ($first === 'sis' && $sex1 === 'M') {
1799
+							return I18N::translateContext('(a man’s) sister’s great ×(%s-1) grandson', 'great ×%s nephew', I18N::number($down - 3));
1800
+							} else {
1801
+							return I18N::translateContext('(a woman’s) great ×%s nephew', 'great ×%s nephew', I18N::number($down - 3));
1802
+							}
1803
+							case 'F':
1804
+							if ($first === 'bro' && $sex1 === 'M') {
1805
+							return I18N::translateContext('(a man’s) brother’s great ×(%s-1) granddaughter', 'great ×%s niece', I18N::number($down - 3));
1806
+							} elseif ($first === 'sis' && $sex1 === 'M') {
1807
+							return I18N::translateContext('(a man’s) sister’s great ×(%s-1) granddaughter', 'great ×%s niece', I18N::number($down - 3));
1808
+							} else {
1809
+							return I18N::translateContext('(a woman’s) great ×%s niece', 'great ×%s niece', I18N::number($down - 3));
1810
+							}
1811
+							default:
1812
+							if ($first === 'bro' && $sex1 === 'M') {
1813
+							return I18N::translateContext('(a man’s) brother’s great ×(%s-1) grandchild', 'great ×%s nephew/niece', I18N::number($down - 3));
1814
+							} elseif ($first === 'sis' && $sex1 === 'M') {
1815
+							return I18N::translateContext('(a man’s) sister’s great ×(%s-1) grandchild', 'great ×%s nephew/niece', I18N::number($down - 3));
1816
+							} else {
1817
+							return I18N::translateContext('(a woman’s) great ×%s nephew/niece', 'great ×%s nephew/niece', I18N::number($down - 3));
1818
+							}
1819
+						}
1820 1820
 				case 'he': // Source: Meliza Amity
1821 1821
 					switch ($sex2) {
1822
-					case 'M':
1823
-					return I18N::translate('great ×%s nephew', I18N::number($down - 1));
1824
-					case 'F':
1825
-					return I18N::translate('great ×%s niece', I18N::number($down - 1));
1826
-					default:
1827
-					return I18N::translate('great ×%s nephew/niece', I18N::number($down - 1));
1822
+						case 'M':
1823
+						return I18N::translate('great ×%s nephew', I18N::number($down - 1));
1824
+						case 'F':
1825
+						return I18N::translate('great ×%s niece', I18N::number($down - 1));
1826
+						default:
1827
+						return I18N::translate('great ×%s nephew/niece', I18N::number($down - 1));
1828 1828
 					}
1829 1829
 				case 'it': // Source: Michele Locati.
1830 1830
 				case 'en_AU':
@@ -1832,12 +1832,12 @@  discard block
 block discarded – undo
1832 1832
 				case 'en_US':
1833 1833
 				default:
1834 1834
 					switch ($sex2) {
1835
-					case 'M': // I18N: if you need a different number for %s, contact the developers, as a code-change is required
1836
-					return I18N::translate('great ×%s nephew', I18N::number($down - 2));
1837
-					case 'F':
1838
-					return I18N::translate('great ×%s niece', I18N::number($down - 2));
1839
-					default:
1840
-					return I18N::translate('great ×%s nephew/niece', I18N::number($down - 2));
1835
+						case 'M': // I18N: if you need a different number for %s, contact the developers, as a code-change is required
1836
+						return I18N::translate('great ×%s nephew', I18N::number($down - 2));
1837
+						case 'F':
1838
+						return I18N::translate('great ×%s niece', I18N::number($down - 2));
1839
+						default:
1840
+						return I18N::translate('great ×%s nephew/niece', I18N::number($down - 2));
1841 1841
 					}
1842 1842
 					}
1843 1843
 			}
@@ -1846,116 +1846,116 @@  discard block
 block discarded – undo
1846 1846
 			// direct ancestors
1847 1847
 			$up = strlen($match[1]) / 3;
1848 1848
 			switch ($up) {
1849
-			case 4:
1850
-				switch ($sex2) {
1851
-				case 'M':
1852
-				return I18N::translate('great-great-grandfather');
1853
-				case 'F':
1854
-				return I18N::translate('great-great-grandmother');
1855
-				default:
1856
-				return I18N::translate('great-great-grandparent');
1857
-				}
1858
-			case 5:
1859
-				switch ($sex2) {
1860
-				case 'M':
1861
-				return I18N::translate('great-great-great-grandfather');
1862
-				case 'F':
1863
-				return I18N::translate('great-great-great-grandmother');
1864
-				default:
1865
-				return I18N::translate('great-great-great-grandparent');
1866
-				}
1867
-			case 6:
1868
-				switch ($sex2) {
1869
-				case 'M':
1870
-				return I18N::translate('great ×4 grandfather');
1871
-				case 'F':
1872
-				return I18N::translate('great ×4 grandmother');
1873
-				default:
1874
-				return I18N::translate('great ×4 grandparent');
1875
-				}
1876
-			case 7:
1877
-				switch ($sex2) {
1878
-				case 'M':
1879
-				return I18N::translate('great ×5 grandfather');
1880
-				case 'F':
1881
-				return I18N::translate('great ×5 grandmother');
1882
-				default:
1883
-				return I18N::translate('great ×5 grandparent');
1884
-				}
1885
-			case 8:
1886
-				switch ($sex2) {
1887
-				case 'M':
1888
-				return I18N::translate('great ×6 grandfather');
1889
-				case 'F':
1890
-				return I18N::translate('great ×6 grandmother');
1891
-				default:
1892
-				return I18N::translate('great ×6 grandparent');
1893
-				}
1894
-			case 9:
1895
-				switch ($sex2) {
1896
-				case 'M':
1897
-				return I18N::translate('great ×7 grandfather');
1898
-				case 'F':
1899
-				return I18N::translate('great ×7 grandmother');
1900
-				default:
1901
-				return I18N::translate('great ×7 grandparent');
1902
-				}
1903
-			default:
1904
-				// Different languages have different rules for naming generations.
1905
-				// An English great ×12 grandfather is a Danish great ×11 grandfather.
1906
-				//
1907
-				// Need to find out which languages use which rules.
1908
-				switch (WT_LOCALE) {
1909
-				case 'da': // Source: Patrick Sorensen
1910
-				switch ($sex2) {
1911
-				case 'M':
1912
-				return I18N::translate('great ×%s grandfather', I18N::number($up - 3));
1913
-				case 'F':
1914
-				return I18N::translate('great ×%s grandmother', I18N::number($up - 3));
1849
+				case 4:
1850
+					switch ($sex2) {
1851
+						case 'M':
1852
+						return I18N::translate('great-great-grandfather');
1853
+						case 'F':
1854
+						return I18N::translate('great-great-grandmother');
1855
+						default:
1856
+						return I18N::translate('great-great-grandparent');
1857
+					}
1858
+				case 5:
1859
+					switch ($sex2) {
1860
+						case 'M':
1861
+						return I18N::translate('great-great-great-grandfather');
1862
+						case 'F':
1863
+						return I18N::translate('great-great-great-grandmother');
1864
+						default:
1865
+						return I18N::translate('great-great-great-grandparent');
1866
+					}
1867
+				case 6:
1868
+					switch ($sex2) {
1869
+						case 'M':
1870
+						return I18N::translate('great ×4 grandfather');
1871
+						case 'F':
1872
+						return I18N::translate('great ×4 grandmother');
1873
+						default:
1874
+						return I18N::translate('great ×4 grandparent');
1875
+					}
1876
+				case 7:
1877
+					switch ($sex2) {
1878
+						case 'M':
1879
+						return I18N::translate('great ×5 grandfather');
1880
+						case 'F':
1881
+						return I18N::translate('great ×5 grandmother');
1882
+						default:
1883
+						return I18N::translate('great ×5 grandparent');
1884
+					}
1885
+				case 8:
1886
+					switch ($sex2) {
1887
+						case 'M':
1888
+						return I18N::translate('great ×6 grandfather');
1889
+						case 'F':
1890
+						return I18N::translate('great ×6 grandmother');
1891
+						default:
1892
+						return I18N::translate('great ×6 grandparent');
1893
+					}
1894
+				case 9:
1895
+					switch ($sex2) {
1896
+						case 'M':
1897
+						return I18N::translate('great ×7 grandfather');
1898
+						case 'F':
1899
+						return I18N::translate('great ×7 grandmother');
1900
+						default:
1901
+						return I18N::translate('great ×7 grandparent');
1902
+					}
1915 1903
 				default:
1916
-				return I18N::translate('great ×%s grandparent', I18N::number($up - 3));
1917
-				}
1904
+					// Different languages have different rules for naming generations.
1905
+					// An English great ×12 grandfather is a Danish great ×11 grandfather.
1906
+					//
1907
+					// Need to find out which languages use which rules.
1908
+					switch (WT_LOCALE) {
1909
+						case 'da': // Source: Patrick Sorensen
1910
+						switch ($sex2) {
1911
+							case 'M':
1912
+							return I18N::translate('great ×%s grandfather', I18N::number($up - 3));
1913
+							case 'F':
1914
+							return I18N::translate('great ×%s grandmother', I18N::number($up - 3));
1915
+							default:
1916
+							return I18N::translate('great ×%s grandparent', I18N::number($up - 3));
1917
+						}
1918 1918
 				case 'it': // Source: Michele Locati
1919 1919
 				case 'es': // Source: Wes Groleau
1920 1920
 					switch ($sex2) {
1921
-					case 'M':
1922
-					return I18N::translate('great ×%s grandfather', I18N::number($up));
1923
-					case 'F':
1924
-					return I18N::translate('great ×%s grandmother', I18N::number($up));
1925
-					default:
1926
-					return I18N::translate('great ×%s grandparent', I18N::number($up));
1921
+						case 'M':
1922
+						return I18N::translate('great ×%s grandfather', I18N::number($up));
1923
+						case 'F':
1924
+						return I18N::translate('great ×%s grandmother', I18N::number($up));
1925
+						default:
1926
+						return I18N::translate('great ×%s grandparent', I18N::number($up));
1927 1927
 					}
1928 1928
 				case 'fr': // Source: Jacqueline Tetreault
1929 1929
 				case 'fr_CA':
1930 1930
 					switch ($sex2) {
1931
-					case 'M':
1932
-					return I18N::translate('great ×%s grandfather', I18N::number($up - 1));
1933
-					case 'F':
1934
-					return I18N::translate('great ×%s grandmother', I18N::number($up - 1));
1935
-					default:
1936
-					return I18N::translate('great ×%s grandparent', I18N::number($up - 1));
1931
+						case 'M':
1932
+						return I18N::translate('great ×%s grandfather', I18N::number($up - 1));
1933
+						case 'F':
1934
+						return I18N::translate('great ×%s grandmother', I18N::number($up - 1));
1935
+						default:
1936
+						return I18N::translate('great ×%s grandparent', I18N::number($up - 1));
1937 1937
 					}
1938 1938
 				case 'nn': // Source: Hogne Røed Nilsen (https://bugs.launchpad.net/webtrees/+bug/1168553)
1939 1939
 				case 'nb':
1940 1940
 					switch ($sex2) {
1941
-					case 'M': // I18N: if you need a different number for %s, contact the developers, as a code-change is required
1942
-					return I18N::translate('great ×%s grandfather', I18N::number($up - 3));
1943
-					case 'F':
1944
-					return I18N::translate('great ×%s grandmother', I18N::number($up - 3));
1945
-					default:
1946
-					return I18N::translate('great ×%s grandparent', I18N::number($up - 3));
1941
+						case 'M': // I18N: if you need a different number for %s, contact the developers, as a code-change is required
1942
+						return I18N::translate('great ×%s grandfather', I18N::number($up - 3));
1943
+						case 'F':
1944
+						return I18N::translate('great ×%s grandmother', I18N::number($up - 3));
1945
+						default:
1946
+						return I18N::translate('great ×%s grandparent', I18N::number($up - 3));
1947 1947
 					}
1948 1948
 				case 'en_AU':
1949 1949
 				case 'en_GB':
1950 1950
 				case 'en_US':
1951 1951
 				default:
1952 1952
 					switch ($sex2) {
1953
-					case 'M': // I18N: if you need a different number for %s, contact the developers, as a code-change is required
1954
-					return I18N::translate('great ×%s grandfather', I18N::number($up - 2));
1955
-					case 'F':
1956
-					return I18N::translate('great ×%s grandmother', I18N::number($up - 2));
1957
-					default:
1958
-					return I18N::translate('great ×%s grandparent', I18N::number($up - 2));
1953
+						case 'M': // I18N: if you need a different number for %s, contact the developers, as a code-change is required
1954
+						return I18N::translate('great ×%s grandfather', I18N::number($up - 2));
1955
+						case 'F':
1956
+						return I18N::translate('great ×%s grandmother', I18N::number($up - 2));
1957
+						default:
1958
+						return I18N::translate('great ×%s grandparent', I18N::number($up - 2));
1959 1959
 					}
1960 1960
 					}
1961 1961
 			}
@@ -1964,83 +1964,83 @@  discard block
 block discarded – undo
1964 1964
 			// direct descendants
1965 1965
 			$up = strlen($match[1]) / 3;
1966 1966
 			switch ($up) {
1967
-			case 4:
1968
-				switch ($sex2) {
1969
-				case 'M':
1970
-				return I18N::translate('great-great-grandson');
1971
-				case 'F':
1972
-				return I18N::translate('great-great-granddaughter');
1973
-				default:
1974
-				return I18N::translate('great-great-grandchild');
1975
-				}
1967
+				case 4:
1968
+					switch ($sex2) {
1969
+						case 'M':
1970
+						return I18N::translate('great-great-grandson');
1971
+						case 'F':
1972
+						return I18N::translate('great-great-granddaughter');
1973
+						default:
1974
+						return I18N::translate('great-great-grandchild');
1975
+					}
1976 1976
 
1977
-			case 5:
1978
-				switch ($sex2) {
1979
-				case 'M':
1980
-				return I18N::translate('great-great-great-grandson');
1981
-				case 'F':
1982
-				return I18N::translate('great-great-great-granddaughter');
1983
-				default:
1984
-				return I18N::translate('great-great-great-grandchild');
1985
-				}
1977
+				case 5:
1978
+					switch ($sex2) {
1979
+						case 'M':
1980
+						return I18N::translate('great-great-great-grandson');
1981
+						case 'F':
1982
+						return I18N::translate('great-great-great-granddaughter');
1983
+						default:
1984
+						return I18N::translate('great-great-great-grandchild');
1985
+					}
1986 1986
 
1987
-			case 6:
1988
-				switch ($sex2) {
1989
-				case 'M':
1990
-				return I18N::translate('great ×4 grandson');
1991
-				case 'F':
1992
-				return I18N::translate('great ×4 granddaughter');
1993
-				default:
1994
-				return I18N::translate('great ×4 grandchild');
1995
-				}
1987
+				case 6:
1988
+					switch ($sex2) {
1989
+						case 'M':
1990
+						return I18N::translate('great ×4 grandson');
1991
+						case 'F':
1992
+						return I18N::translate('great ×4 granddaughter');
1993
+						default:
1994
+						return I18N::translate('great ×4 grandchild');
1995
+					}
1996 1996
 
1997
-			case 7:
1998
-				switch ($sex2) {
1999
-				case 'M':
2000
-				return I18N::translate('great ×5 grandson');
2001
-				case 'F':
2002
-				return I18N::translate('great ×5 granddaughter');
2003
-				default:
2004
-				return I18N::translate('great ×5 grandchild');
2005
-				}
1997
+				case 7:
1998
+					switch ($sex2) {
1999
+						case 'M':
2000
+						return I18N::translate('great ×5 grandson');
2001
+						case 'F':
2002
+						return I18N::translate('great ×5 granddaughter');
2003
+						default:
2004
+						return I18N::translate('great ×5 grandchild');
2005
+					}
2006 2006
 
2007
-			case 8:
2008
-				switch ($sex2) {
2009
-				case 'M':
2010
-				return I18N::translate('great ×6 grandson');
2011
-				case 'F':
2012
-				return I18N::translate('great ×6 granddaughter');
2013
-				default:
2014
-				return I18N::translate('great ×6 grandchild');
2015
-				}
2007
+				case 8:
2008
+					switch ($sex2) {
2009
+						case 'M':
2010
+						return I18N::translate('great ×6 grandson');
2011
+						case 'F':
2012
+						return I18N::translate('great ×6 granddaughter');
2013
+						default:
2014
+						return I18N::translate('great ×6 grandchild');
2015
+					}
2016 2016
 
2017
-			case 9:
2018
-				switch ($sex2) {
2019
-				case 'M':
2020
-				return I18N::translate('great ×7 grandson');
2021
-				case 'F':
2022
-				return I18N::translate('great ×7 granddaughter');
2023
-				default:
2024
-				return I18N::translate('great ×7 grandchild');
2025
-				}
2017
+				case 9:
2018
+					switch ($sex2) {
2019
+						case 'M':
2020
+						return I18N::translate('great ×7 grandson');
2021
+						case 'F':
2022
+						return I18N::translate('great ×7 granddaughter');
2023
+						default:
2024
+						return I18N::translate('great ×7 grandchild');
2025
+					}
2026 2026
 
2027
-			default:
2028
-				// Different languages have different rules for naming generations.
2029
-				// An English great ×12 grandson is a Danish great ×11 grandson.
2030
-				//
2031
-				// Need to find out which languages use which rules.
2032
-				switch (WT_LOCALE) {
2033
-				case 'nn': // Source: Hogne Røed Nilsen
2034
-				case 'nb':
2035
-				case 'da': // Source: Patrick Sorensen
2036
-				switch ($sex2) {
2037
-				case 'M':
2038
-				return I18N::translate('great ×%s grandson', I18N::number($up - 3));
2039
-				case 'F':
2040
-				return I18N::translate('great ×%s granddaughter', I18N::number($up - 3));
2041 2027
 				default:
2042
-				return I18N::translate('great ×%s grandchild', I18N::number($up - 3));
2043
-				}
2028
+					// Different languages have different rules for naming generations.
2029
+					// An English great ×12 grandson is a Danish great ×11 grandson.
2030
+					//
2031
+					// Need to find out which languages use which rules.
2032
+					switch (WT_LOCALE) {
2033
+						case 'nn': // Source: Hogne Røed Nilsen
2034
+						case 'nb':
2035
+						case 'da': // Source: Patrick Sorensen
2036
+						switch ($sex2) {
2037
+							case 'M':
2038
+							return I18N::translate('great ×%s grandson', I18N::number($up - 3));
2039
+							case 'F':
2040
+							return I18N::translate('great ×%s granddaughter', I18N::number($up - 3));
2041
+							default:
2042
+							return I18N::translate('great ×%s grandchild', I18N::number($up - 3));
2043
+						}
2044 2044
 				case 'it': // Source: Michele Locati
2045 2045
 				case 'es': // Source: Wes Groleau (adding doesn’t change behavior, but needs to be better researched)
2046 2046
 				case 'en_AU':
@@ -2049,12 +2049,12 @@  discard block
 block discarded – undo
2049 2049
 				default:
2050 2050
 					switch ($sex2) {
2051 2051
 
2052
-					case 'M': // I18N: if you need a different number for %s, contact the developers, as a code-change is required
2053
-					return I18N::translate('great ×%s grandson', I18N::number($up - 2));
2054
-					case 'F':
2055
-					return I18N::translate('great ×%s granddaughter', I18N::number($up - 2));
2056
-					default:
2057
-					return I18N::translate('great ×%s grandchild', I18N::number($up - 2));
2052
+						case 'M': // I18N: if you need a different number for %s, contact the developers, as a code-change is required
2053
+						return I18N::translate('great ×%s grandson', I18N::number($up - 2));
2054
+						case 'F':
2055
+						return I18N::translate('great ×%s granddaughter', I18N::number($up - 2));
2056
+						default:
2057
+						return I18N::translate('great ×%s grandchild', I18N::number($up - 2));
2058 2058
 					}
2059 2059
 					}
2060 2060
 			}
@@ -2073,68 +2073,68 @@  discard block
 block discarded – undo
2073 2073
 			//
2074 2074
 			// Need to find out which languages use which rules.
2075 2075
 			switch (WT_LOCALE) {
2076
-			case 'pl': // Source: Lukasz Wilenski
2077
-				return self::cousinName($up + $down + 2, $sex2);
2078
-			case 'it':
2079
-				// Source: Michele Locati. See italian_cousins_names.zip
2080
-				// https://webtrees.net/forums/8-translation/1200-great-xn-grandparent?limit=6&start=6
2081
-				return self::cousinName($up + $down - 3, $sex2);
2082
-			case 'es':
2083
-				// Source: Wes Groleau. See http://UniGen.us/Parentesco.html & http://UniGen.us/Parentesco-D.html
2084
-				if ($down == $up) {
2085
-					return self::cousinName($cousin, $sex2);
2086
-				} elseif ($down < $up) {
2087
-					return self::cousinName2($cousin + 1, $sex2, self::getRelationshipNameFromPath('sib' . $descent, null, null));
2088
-				} else {
2089
-					switch ($sex2) {
2090
-					case 'M':
2091
-					return self::cousinName2($cousin + 1, $sex2, self::getRelationshipNameFromPath('bro' . $descent, null, null));
2092
-					case 'F':
2093
-					return self::cousinName2($cousin + 1, $sex2, self::getRelationshipNameFromPath('sis' . $descent, null, null));
2094
-					default:
2095
-					return self::cousinName2($cousin + 1, $sex2, self::getRelationshipNameFromPath('sib' . $descent, null, null));
2096
-					}
2076
+				case 'pl': // Source: Lukasz Wilenski
2077
+					return self::cousinName($up + $down + 2, $sex2);
2078
+				case 'it':
2079
+					// Source: Michele Locati. See italian_cousins_names.zip
2080
+					// https://webtrees.net/forums/8-translation/1200-great-xn-grandparent?limit=6&start=6
2081
+					return self::cousinName($up + $down - 3, $sex2);
2082
+				case 'es':
2083
+					// Source: Wes Groleau. See http://UniGen.us/Parentesco.html & http://UniGen.us/Parentesco-D.html
2084
+					if ($down == $up) {
2085
+						return self::cousinName($cousin, $sex2);
2086
+					} elseif ($down < $up) {
2087
+						return self::cousinName2($cousin + 1, $sex2, self::getRelationshipNameFromPath('sib' . $descent, null, null));
2088
+					} else {
2089
+						switch ($sex2) {
2090
+							case 'M':
2091
+							return self::cousinName2($cousin + 1, $sex2, self::getRelationshipNameFromPath('bro' . $descent, null, null));
2092
+							case 'F':
2093
+							return self::cousinName2($cousin + 1, $sex2, self::getRelationshipNameFromPath('sis' . $descent, null, null));
2094
+							default:
2095
+							return self::cousinName2($cousin + 1, $sex2, self::getRelationshipNameFromPath('sib' . $descent, null, null));
2096
+						}
2097 2097
 					}
2098
-			case 'en_AU': // See: http://en.wikipedia.org/wiki/File:CousinTree.svg
2099
-			case 'en_GB':
2100
-			case 'en_US':
2101
-			default:
2102
-				switch ($removed) {
2103
-				case 0:
2104
-				return self::cousinName($cousin, $sex2);
2105
-				case 1:
2106
-				if ($up > $down) {
2107
-				/* I18N: %s=“fifth cousin”, etc. http://www.ancestry.com/learn/library/article.aspx?article=2856 */
2108
-				return I18N::translate('%s once removed ascending', self::cousinName($cousin, $sex2));
2109
-				} else {
2110
-				/* I18N: %s=“fifth cousin”, etc. http://www.ancestry.com/learn/library/article.aspx?article=2856 */
2111
-				return I18N::translate('%s once removed descending', self::cousinName($cousin, $sex2));
2112
-				}
2113
-				case 2:
2114
-				if ($up > $down) {
2115
-				/* I18N: %s=“fifth cousin”, etc. */
2116
-				return I18N::translate('%s twice removed ascending', self::cousinName($cousin, $sex2));
2117
-				} else {
2118
-				/* I18N: %s=“fifth cousin”, etc. */
2119
-				return I18N::translate('%s twice removed descending', self::cousinName($cousin, $sex2));
2120
-				}
2121
-				case 3:
2122
-				if ($up > $down) {
2123
-				/* I18N: %s=“fifth cousin”, etc. */
2124
-				return I18N::translate('%s three times removed ascending', self::cousinName($cousin, $sex2));
2125
-				} else {
2126
-				/* I18N: %s=“fifth cousin”, etc. */
2127
-				return I18N::translate('%s three times removed descending', self::cousinName($cousin, $sex2));
2128
-				}
2098
+				case 'en_AU': // See: http://en.wikipedia.org/wiki/File:CousinTree.svg
2099
+				case 'en_GB':
2100
+				case 'en_US':
2129 2101
 				default:
2130
-				if ($up > $down) {
2131
-				/* I18N: %1$s=“fifth cousin”, etc., %2$s>=4 */
2132
-				return I18N::translate('%1$s %2$s times removed ascending', self::cousinName($cousin, $sex2), I18N::number($removed));
2133
-				} else {
2134
-				/* I18N: %1$s=“fifth cousin”, etc., %2$s>=4 */
2135
-				return I18N::translate('%1$s %2$s times removed descending', self::cousinName($cousin, $sex2), I18N::number($removed));
2136
-				}
2137
-				}
2102
+					switch ($removed) {
2103
+						case 0:
2104
+						return self::cousinName($cousin, $sex2);
2105
+						case 1:
2106
+						if ($up > $down) {
2107
+						/* I18N: %s=“fifth cousin”, etc. http://www.ancestry.com/learn/library/article.aspx?article=2856 */
2108
+						return I18N::translate('%s once removed ascending', self::cousinName($cousin, $sex2));
2109
+						} else {
2110
+						/* I18N: %s=“fifth cousin”, etc. http://www.ancestry.com/learn/library/article.aspx?article=2856 */
2111
+						return I18N::translate('%s once removed descending', self::cousinName($cousin, $sex2));
2112
+						}
2113
+						case 2:
2114
+						if ($up > $down) {
2115
+						/* I18N: %s=“fifth cousin”, etc. */
2116
+						return I18N::translate('%s twice removed ascending', self::cousinName($cousin, $sex2));
2117
+						} else {
2118
+						/* I18N: %s=“fifth cousin”, etc. */
2119
+						return I18N::translate('%s twice removed descending', self::cousinName($cousin, $sex2));
2120
+						}
2121
+						case 3:
2122
+						if ($up > $down) {
2123
+						/* I18N: %s=“fifth cousin”, etc. */
2124
+						return I18N::translate('%s three times removed ascending', self::cousinName($cousin, $sex2));
2125
+						} else {
2126
+						/* I18N: %s=“fifth cousin”, etc. */
2127
+						return I18N::translate('%s three times removed descending', self::cousinName($cousin, $sex2));
2128
+						}
2129
+						default:
2130
+						if ($up > $down) {
2131
+						/* I18N: %1$s=“fifth cousin”, etc., %2$s>=4 */
2132
+						return I18N::translate('%1$s %2$s times removed ascending', self::cousinName($cousin, $sex2), I18N::number($removed));
2133
+						} else {
2134
+						/* I18N: %1$s=“fifth cousin”, etc., %2$s>=4 */
2135
+						return I18N::translate('%1$s %2$s times removed descending', self::cousinName($cousin, $sex2), I18N::number($removed));
2136
+						}
2137
+					}
2138 2138
 			}
2139 2139
 		}
2140 2140
 
Please login to merge, or discard this patch.
app/Functions/FunctionsImport.php 1 patch
Switch Indentation   +632 added lines, -632 removed lines patch added patch discarded remove patch
@@ -59,477 +59,477 @@  discard block
 block discarded – undo
59 59
 			$tag                               = strtoupper($tag); // Tags should always be upper case
60 60
 			switch ($tag) {
61 61
 				// Convert PhpGedView tags to WT
62
-			case '_PGVU':
63
-				$tag = '_WT_USER';
64
-				break;
65
-			case '_PGV_OBJS':
66
-				$tag = '_WT_OBJE_SORT';
67
-				break;
68
-				// Convert FTM-style "TAG_FORMAL_NAME" into "TAG".
69
-			case 'ABBREVIATION':
70
-				$tag = 'ABBR';
71
-				break;
72
-			case 'ADDRESS':
73
-				$tag = 'ADDR';
74
-				break;
75
-			case 'ADDRESS1':
76
-				$tag = 'ADR1';
77
-				break;
78
-			case 'ADDRESS2':
79
-				$tag = 'ADR2';
80
-				break;
81
-			case 'ADDRESS3':
82
-				$tag = 'ADR3';
83
-				break;
84
-			case 'ADOPTION':
85
-				$tag = 'ADOP';
86
-				break;
87
-			case 'ADULT_CHRISTENING':
88
-				$tag = 'CHRA';
89
-				break;
90
-			case 'AFN':
91
-				// AFN values are upper case
92
-				$data = strtoupper($data);
93
-				break;
94
-			case 'AGENCY':
95
-				$tag = 'AGNC';
96
-				break;
97
-			case 'ALIAS':
98
-				$tag = 'ALIA';
99
-				break;
100
-			case 'ANCESTORS':
101
-				$tag = 'ANCE';
102
-				break;
103
-			case 'ANCES_INTEREST':
104
-				$tag = 'ANCI';
105
-				break;
106
-			case 'ANNULMENT':
107
-				$tag = 'ANUL';
108
-				break;
109
-			case 'ASSOCIATES':
110
-				$tag = 'ASSO';
111
-				break;
112
-			case 'AUTHOR':
113
-				$tag = 'AUTH';
114
-				break;
115
-			case 'BAPTISM':
116
-				$tag = 'BAPM';
117
-				break;
118
-			case 'BAPTISM_LDS':
119
-				$tag = 'BAPL';
120
-				break;
121
-			case 'BAR_MITZVAH':
122
-				$tag = 'BARM';
123
-				break;
124
-			case 'BAS_MITZVAH':
125
-				$tag = 'BASM';
126
-				break;
127
-			case 'BIRTH':
128
-				$tag = 'BIRT';
129
-				break;
130
-			case 'BLESSING':
131
-				$tag = 'BLES';
132
-				break;
133
-			case 'BURIAL':
134
-				$tag = 'BURI';
135
-				break;
136
-			case 'CALL_NUMBER':
137
-				$tag = 'CALN';
138
-				break;
139
-			case 'CASTE':
140
-				$tag = 'CAST';
141
-				break;
142
-			case 'CAUSE':
143
-				$tag = 'CAUS';
144
-				break;
145
-			case 'CENSUS':
146
-				$tag = 'CENS';
147
-				break;
148
-			case 'CHANGE':
149
-				$tag = 'CHAN';
150
-				break;
151
-			case 'CHARACTER':
152
-				$tag = 'CHAR';
153
-				break;
154
-			case 'CHILD':
155
-				$tag = 'CHIL';
156
-				break;
157
-			case 'CHILDREN_COUNT':
158
-				$tag = 'NCHI';
159
-				break;
160
-			case 'CHRISTENING':
161
-				$tag = 'CHR';
162
-				break;
163
-			case 'CONCATENATION':
164
-				$tag = 'CONC';
165
-				break;
166
-			case 'CONFIRMATION':
167
-				$tag = 'CONF';
168
-				break;
169
-			case 'CONFIRMATION_LDS':
170
-				$tag = 'CONL';
171
-				break;
172
-			case 'CONTINUED':
173
-				$tag = 'CONT';
174
-				break;
175
-			case 'COPYRIGHT':
176
-				$tag = 'COPR';
177
-				break;
178
-			case 'CORPORATE':
179
-				$tag = 'CORP';
180
-				break;
181
-			case 'COUNTRY':
182
-				$tag = 'CTRY';
183
-				break;
184
-			case 'CREMATION':
185
-				$tag = 'CREM';
186
-				break;
187
-			case 'DATE':
188
-				// Preserve text from INT dates
189
-				if (strpos($data, '(') !== false) {
190
-					list($date, $text) = explode('(', $data, 2);
191
-					$text              = ' (' . $text;
192
-				} else {
193
-					$date = $data;
194
-					$text = '';
195
-				}
196
-				// Capitals
197
-				$date = strtoupper($date);
198
-				// Temporarily add leading/trailing spaces, to allow efficient matching below
199
-				$date = " {$date} ";
200
-				// Ensure space digits and letters
201
-				$date = preg_replace('/([A-Z])(\d)/', '$1 $2', $date);
202
-				$date = preg_replace('/(\d)([A-Z])/', '$1 $2', $date);
203
-				// Ensure space before/after calendar escapes
204
-				$date = preg_replace('/@#[^@]+@/', ' $0 ', $date);
205
-				// "BET." => "BET"
206
-				$date = preg_replace('/(\w\w)\./', '$1', $date);
207
-				// "CIR" => "ABT"
208
-				$date = str_replace(' CIR ', ' ABT ', $date);
209
-				$date = str_replace(' APX ', ' ABT ', $date);
210
-				// B.C. => BC (temporarily, to allow easier handling of ".")
211
-				$date = str_replace(' B.C. ', ' BC ', $date);
212
-				// "BET X - Y " => "BET X AND Y"
213
-				$date = preg_replace('/^(.* BET .+) - (.+)/', '$1 AND $2', $date);
214
-				$date = preg_replace('/^(.* FROM .+) - (.+)/', '$1 TO $2', $date);
215
-				// "@#ESC@ FROM X TO Y" => "FROM @#ESC@ X TO @#ESC@ Y"
216
-				$date = preg_replace('/^ +(@#[^@]+@) +FROM +(.+) +TO +(.+)/', ' FROM $1 $2 TO $1 $3', $date);
217
-				$date = preg_replace('/^ +(@#[^@]+@) +BET +(.+) +AND +(.+)/', ' BET $1 $2 AND $1 $3', $date);
218
-				// "@#ESC@ AFT X" => "AFT @#ESC@ X"
219
-				$date = preg_replace('/^ +(@#[^@]+@) +(FROM|BET|TO|AND|BEF|AFT|CAL|EST|INT|ABT) +(.+)/', ' $2 $1 $3', $date);
220
-				// Ignore any remaining punctuation, e.g. "14-MAY, 1900" => "14 MAY 1900"
221
-				// (don't change "/" - it is used in NS/OS dates)
222
-				$date = preg_replace('/[.,:;-]/', ' ', $date);
223
-				// BC => B.C.
224
-				$date = str_replace(' BC ', ' B.C. ', $date);
225
-				// Append the "INT" text
226
-				$data = $date . $text;
227
-				break;
228
-			case 'DEATH':
229
-				$tag = 'DEAT';
230
-				break;
231
-			case '_DEATH_OF_SPOUSE':
232
-				$tag = '_DETS';
233
-				break;
234
-			case '_DEGREE':
235
-				$tag = '_DEG';
236
-				break;
237
-			case 'DESCENDANTS':
238
-				$tag = 'DESC';
239
-				break;
240
-			case 'DESCENDANT_INT':
241
-				$tag = 'DESI';
242
-				break;
243
-			case 'DESTINATION':
244
-				$tag = 'DEST';
245
-				break;
246
-			case 'DIVORCE':
247
-				$tag = 'DIV';
248
-				break;
249
-			case 'DIVORCE_FILED':
250
-				$tag = 'DIVF';
251
-				break;
252
-			case 'EDUCATION':
253
-				$tag = 'EDUC';
254
-				break;
255
-			case 'EMIGRATION':
256
-				$tag = 'EMIG';
257
-				break;
258
-			case 'ENDOWMENT':
259
-				$tag = 'ENDL';
260
-				break;
261
-			case 'ENGAGEMENT':
262
-				$tag = 'ENGA';
263
-				break;
264
-			case 'EVENT':
265
-				$tag = 'EVEN';
266
-				break;
267
-			case 'FACSIMILE':
268
-				$tag = 'FAX';
269
-				break;
270
-			case 'FAMILY':
271
-				$tag = 'FAM';
272
-				break;
273
-			case 'FAMILY_CHILD':
274
-				$tag = 'FAMC';
275
-				break;
276
-			case 'FAMILY_FILE':
277
-				$tag = 'FAMF';
278
-				break;
279
-			case 'FAMILY_SPOUSE':
280
-				$tag = 'FAMS';
281
-				break;
282
-			case 'FIRST_COMMUNION':
283
-				$tag = 'FCOM';
284
-				break;
285
-			case '_FILE':
286
-				$tag = 'FILE';
287
-				break;
288
-			case 'FORMAT':
289
-				$tag = 'FORM';
290
-			case 'FORM':
291
-				// Consistent commas
292
-				$data = preg_replace('/ *, */', ', ', $data);
293
-				break;
294
-			case 'GEDCOM':
295
-				$tag = 'GEDC';
296
-				break;
297
-			case 'GIVEN_NAME':
298
-				$tag = 'GIVN';
299
-				break;
300
-			case 'GRADUATION':
301
-				$tag = 'GRAD';
302
-				break;
303
-			case 'HEADER':
304
-				$tag = 'HEAD';
305
-			case 'HEAD':
306
-				// HEAD records don't have an XREF or DATA
307
-				if ($level == '0') {
308
-					$xref = '';
309
-					$data = '';
310
-				}
311
-				break;
312
-			case 'HUSBAND':
313
-				$tag = 'HUSB';
314
-				break;
315
-			case 'IDENT_NUMBER':
316
-				$tag = 'IDNO';
317
-				break;
318
-			case 'IMMIGRATION':
319
-				$tag = 'IMMI';
320
-				break;
321
-			case 'INDIVIDUAL':
322
-				$tag = 'INDI';
323
-				break;
324
-			case 'LANGUAGE':
325
-				$tag = 'LANG';
326
-				break;
327
-			case 'LATITUDE':
328
-				$tag = 'LATI';
329
-				break;
330
-			case 'LONGITUDE':
331
-				$tag = 'LONG';
332
-				break;
333
-			case 'MARRIAGE':
334
-				$tag = 'MARR';
335
-				break;
336
-			case 'MARRIAGE_BANN':
337
-				$tag = 'MARB';
338
-				break;
339
-			case 'MARRIAGE_COUNT':
340
-				$tag = 'NMR';
341
-				break;
342
-			case 'MARRIAGE_CONTRACT':
343
-				$tag = 'MARC';
344
-				break;
345
-			case 'MARRIAGE_LICENSE':
346
-				$tag = 'MARL';
347
-				break;
348
-			case 'MARRIAGE_SETTLEMENT':
349
-				$tag = 'MARS';
350
-				break;
351
-			case 'MEDIA':
352
-				$tag = 'MEDI';
353
-				break;
354
-			case '_MEDICAL':
355
-				$tag = '_MDCL';
356
-				break;
357
-			case '_MILITARY_SERVICE':
358
-				$tag = '_MILT';
359
-				break;
360
-			case 'NAME':
361
-				// Tidy up whitespace
362
-				$data = preg_replace('/  +/', ' ', trim($data));
363
-				break;
364
-			case 'NAME_PREFIX':
365
-				$tag = 'NPFX';
366
-				break;
367
-			case 'NAME_SUFFIX':
368
-				$tag = 'NSFX';
369
-				break;
370
-			case 'NATIONALITY':
371
-				$tag = 'NATI';
372
-				break;
373
-			case 'NATURALIZATION':
374
-				$tag = 'NATU';
375
-				break;
376
-			case 'NICKNAME':
377
-				$tag = 'NICK';
378
-				break;
379
-			case 'OBJECT':
380
-				$tag = 'OBJE';
381
-				break;
382
-			case 'OCCUPATION':
383
-				$tag = 'OCCU';
384
-				break;
385
-			case 'ORDINANCE':
386
-				$tag = 'ORDI';
387
-				break;
388
-			case 'ORDINATION':
389
-				$tag = 'ORDN';
390
-				break;
391
-			case 'PEDIGREE':
392
-				$tag = 'PEDI';
393
-			case 'PEDI':
394
-				// PEDI values are lower case
395
-				$data = strtolower($data);
396
-				break;
397
-			case 'PHONE':
398
-				$tag = 'PHON';
399
-				break;
400
-			case 'PHONETIC':
401
-				$tag = 'FONE';
402
-				break;
403
-			case 'PHY_DESCRIPTION':
404
-				$tag = 'DSCR';
405
-				break;
406
-			case 'PLACE':
407
-				$tag = 'PLAC';
408
-			case 'PLAC':
409
-				// Consistent commas
410
-				$data = preg_replace('/ *(،|,) */', ', ', $data);
411
-				// The Master Genealogist stores LAT/LONG data in the PLAC field, e.g. Pennsylvania, USA, 395945N0751013W
412
-				if (preg_match('/(.*), (\d\d)(\d\d)(\d\d)([NS])(\d\d\d)(\d\d)(\d\d)([EW])$/', $data, $match)) {
413
-					$data =
414
-						$match[1] . "\n" .
415
-						($level + 1) . " MAP\n" .
416
-						($level + 2) . " LATI " . ($match[5] . (round($match[2] + ($match[3] / 60) + ($match[4] / 3600), 4))) . "\n" .
417
-						($level + 2) . " LONG " . ($match[9] . (round($match[6] + ($match[7] / 60) + ($match[8] / 3600), 4)));
418
-				}
419
-				break;
420
-			case 'POSTAL_CODE':
421
-				$tag = 'POST';
422
-				break;
423
-			case 'PROBATE':
424
-				$tag = 'PROB';
425
-				break;
426
-			case 'PROPERTY':
427
-				$tag = 'PROP';
428
-				break;
429
-			case 'PUBLICATION':
430
-				$tag = 'PUBL';
431
-				break;
432
-			case 'QUALITY_OF_DATA':
433
-				$tag = 'QUAL';
434
-				break;
435
-			case 'REC_FILE_NUMBER':
436
-				$tag = 'RFN';
437
-				break;
438
-			case 'REC_ID_NUMBER':
439
-				$tag = 'RIN';
440
-				break;
441
-			case 'REFERENCE':
442
-				$tag = 'REFN';
443
-				break;
444
-			case 'RELATIONSHIP':
445
-				$tag = 'RELA';
446
-				break;
447
-			case 'RELIGION':
448
-				$tag = 'RELI';
449
-				break;
450
-			case 'REPOSITORY':
451
-				$tag = 'REPO';
452
-				break;
453
-			case 'RESIDENCE':
454
-				$tag = 'RESI';
455
-				break;
456
-			case 'RESTRICTION':
457
-				$tag = 'RESN';
458
-			case 'RESN':
459
-				// RESN values are lower case (confidential, privacy, locked, none)
460
-				$data = strtolower($data);
461
-				if ($data == 'invisible') {
462
-					$data = 'confidential'; // From old versions of Legacy.
463
-				}
464
-				break;
465
-			case 'RETIREMENT':
466
-				$tag = 'RETI';
467
-				break;
468
-			case 'ROMANIZED':
469
-				$tag = 'ROMN';
470
-				break;
471
-			case 'SEALING_CHILD':
472
-				$tag = 'SLGC';
473
-				break;
474
-			case 'SEALING_SPOUSE':
475
-				$tag = 'SLGS';
476
-				break;
477
-			case 'SOC_SEC_NUMBER':
478
-				$tag = 'SSN';
479
-				break;
480
-			case 'SEX':
481
-				$data = strtoupper($data);
482
-				break;
483
-			case 'SOURCE':
484
-				$tag = 'SOUR';
485
-				break;
486
-			case 'STATE':
487
-				$tag = 'STAE';
488
-				break;
489
-			case 'STATUS':
490
-				$tag = 'STAT';
491
-			case 'STAT':
492
-				if ($data == 'CANCELLED') {
493
-					// PhpGedView mis-spells this tag - correct it.
494
-					$data = 'CANCELED';
495
-				}
496
-				break;
497
-			case 'SUBMISSION':
498
-				$tag = 'SUBN';
499
-				break;
500
-			case 'SUBMITTER':
501
-				$tag = 'SUBM';
502
-				break;
503
-			case 'SURNAME':
504
-				$tag = 'SURN';
505
-				break;
506
-			case 'SURN_PREFIX':
507
-				$tag = 'SPFX';
508
-				break;
509
-			case 'TEMPLE':
510
-				$tag = 'TEMP';
511
-			case 'TEMP':
512
-				// Temple codes are upper case
513
-				$data = strtoupper($data);
514
-				break;
515
-			case 'TITLE':
516
-				$tag = 'TITL';
517
-				break;
518
-			case 'TRAILER':
519
-				$tag = 'TRLR';
520
-			case 'TRLR':
521
-				// TRLR records don't have an XREF or DATA
522
-				if ($level == '0') {
523
-					$xref = '';
524
-					$data = '';
525
-				}
526
-				break;
527
-			case 'VERSION':
528
-				$tag = 'VERS';
529
-				break;
530
-			case 'WEB':
531
-				$tag = 'WWW';
532
-				break;
62
+				case '_PGVU':
63
+					$tag = '_WT_USER';
64
+					break;
65
+				case '_PGV_OBJS':
66
+					$tag = '_WT_OBJE_SORT';
67
+					break;
68
+					// Convert FTM-style "TAG_FORMAL_NAME" into "TAG".
69
+				case 'ABBREVIATION':
70
+					$tag = 'ABBR';
71
+					break;
72
+				case 'ADDRESS':
73
+					$tag = 'ADDR';
74
+					break;
75
+				case 'ADDRESS1':
76
+					$tag = 'ADR1';
77
+					break;
78
+				case 'ADDRESS2':
79
+					$tag = 'ADR2';
80
+					break;
81
+				case 'ADDRESS3':
82
+					$tag = 'ADR3';
83
+					break;
84
+				case 'ADOPTION':
85
+					$tag = 'ADOP';
86
+					break;
87
+				case 'ADULT_CHRISTENING':
88
+					$tag = 'CHRA';
89
+					break;
90
+				case 'AFN':
91
+					// AFN values are upper case
92
+					$data = strtoupper($data);
93
+					break;
94
+				case 'AGENCY':
95
+					$tag = 'AGNC';
96
+					break;
97
+				case 'ALIAS':
98
+					$tag = 'ALIA';
99
+					break;
100
+				case 'ANCESTORS':
101
+					$tag = 'ANCE';
102
+					break;
103
+				case 'ANCES_INTEREST':
104
+					$tag = 'ANCI';
105
+					break;
106
+				case 'ANNULMENT':
107
+					$tag = 'ANUL';
108
+					break;
109
+				case 'ASSOCIATES':
110
+					$tag = 'ASSO';
111
+					break;
112
+				case 'AUTHOR':
113
+					$tag = 'AUTH';
114
+					break;
115
+				case 'BAPTISM':
116
+					$tag = 'BAPM';
117
+					break;
118
+				case 'BAPTISM_LDS':
119
+					$tag = 'BAPL';
120
+					break;
121
+				case 'BAR_MITZVAH':
122
+					$tag = 'BARM';
123
+					break;
124
+				case 'BAS_MITZVAH':
125
+					$tag = 'BASM';
126
+					break;
127
+				case 'BIRTH':
128
+					$tag = 'BIRT';
129
+					break;
130
+				case 'BLESSING':
131
+					$tag = 'BLES';
132
+					break;
133
+				case 'BURIAL':
134
+					$tag = 'BURI';
135
+					break;
136
+				case 'CALL_NUMBER':
137
+					$tag = 'CALN';
138
+					break;
139
+				case 'CASTE':
140
+					$tag = 'CAST';
141
+					break;
142
+				case 'CAUSE':
143
+					$tag = 'CAUS';
144
+					break;
145
+				case 'CENSUS':
146
+					$tag = 'CENS';
147
+					break;
148
+				case 'CHANGE':
149
+					$tag = 'CHAN';
150
+					break;
151
+				case 'CHARACTER':
152
+					$tag = 'CHAR';
153
+					break;
154
+				case 'CHILD':
155
+					$tag = 'CHIL';
156
+					break;
157
+				case 'CHILDREN_COUNT':
158
+					$tag = 'NCHI';
159
+					break;
160
+				case 'CHRISTENING':
161
+					$tag = 'CHR';
162
+					break;
163
+				case 'CONCATENATION':
164
+					$tag = 'CONC';
165
+					break;
166
+				case 'CONFIRMATION':
167
+					$tag = 'CONF';
168
+					break;
169
+				case 'CONFIRMATION_LDS':
170
+					$tag = 'CONL';
171
+					break;
172
+				case 'CONTINUED':
173
+					$tag = 'CONT';
174
+					break;
175
+				case 'COPYRIGHT':
176
+					$tag = 'COPR';
177
+					break;
178
+				case 'CORPORATE':
179
+					$tag = 'CORP';
180
+					break;
181
+				case 'COUNTRY':
182
+					$tag = 'CTRY';
183
+					break;
184
+				case 'CREMATION':
185
+					$tag = 'CREM';
186
+					break;
187
+				case 'DATE':
188
+					// Preserve text from INT dates
189
+					if (strpos($data, '(') !== false) {
190
+						list($date, $text) = explode('(', $data, 2);
191
+						$text              = ' (' . $text;
192
+					} else {
193
+						$date = $data;
194
+						$text = '';
195
+					}
196
+					// Capitals
197
+					$date = strtoupper($date);
198
+					// Temporarily add leading/trailing spaces, to allow efficient matching below
199
+					$date = " {$date} ";
200
+					// Ensure space digits and letters
201
+					$date = preg_replace('/([A-Z])(\d)/', '$1 $2', $date);
202
+					$date = preg_replace('/(\d)([A-Z])/', '$1 $2', $date);
203
+					// Ensure space before/after calendar escapes
204
+					$date = preg_replace('/@#[^@]+@/', ' $0 ', $date);
205
+					// "BET." => "BET"
206
+					$date = preg_replace('/(\w\w)\./', '$1', $date);
207
+					// "CIR" => "ABT"
208
+					$date = str_replace(' CIR ', ' ABT ', $date);
209
+					$date = str_replace(' APX ', ' ABT ', $date);
210
+					// B.C. => BC (temporarily, to allow easier handling of ".")
211
+					$date = str_replace(' B.C. ', ' BC ', $date);
212
+					// "BET X - Y " => "BET X AND Y"
213
+					$date = preg_replace('/^(.* BET .+) - (.+)/', '$1 AND $2', $date);
214
+					$date = preg_replace('/^(.* FROM .+) - (.+)/', '$1 TO $2', $date);
215
+					// "@#ESC@ FROM X TO Y" => "FROM @#ESC@ X TO @#ESC@ Y"
216
+					$date = preg_replace('/^ +(@#[^@]+@) +FROM +(.+) +TO +(.+)/', ' FROM $1 $2 TO $1 $3', $date);
217
+					$date = preg_replace('/^ +(@#[^@]+@) +BET +(.+) +AND +(.+)/', ' BET $1 $2 AND $1 $3', $date);
218
+					// "@#ESC@ AFT X" => "AFT @#ESC@ X"
219
+					$date = preg_replace('/^ +(@#[^@]+@) +(FROM|BET|TO|AND|BEF|AFT|CAL|EST|INT|ABT) +(.+)/', ' $2 $1 $3', $date);
220
+					// Ignore any remaining punctuation, e.g. "14-MAY, 1900" => "14 MAY 1900"
221
+					// (don't change "/" - it is used in NS/OS dates)
222
+					$date = preg_replace('/[.,:;-]/', ' ', $date);
223
+					// BC => B.C.
224
+					$date = str_replace(' BC ', ' B.C. ', $date);
225
+					// Append the "INT" text
226
+					$data = $date . $text;
227
+					break;
228
+				case 'DEATH':
229
+					$tag = 'DEAT';
230
+					break;
231
+				case '_DEATH_OF_SPOUSE':
232
+					$tag = '_DETS';
233
+					break;
234
+				case '_DEGREE':
235
+					$tag = '_DEG';
236
+					break;
237
+				case 'DESCENDANTS':
238
+					$tag = 'DESC';
239
+					break;
240
+				case 'DESCENDANT_INT':
241
+					$tag = 'DESI';
242
+					break;
243
+				case 'DESTINATION':
244
+					$tag = 'DEST';
245
+					break;
246
+				case 'DIVORCE':
247
+					$tag = 'DIV';
248
+					break;
249
+				case 'DIVORCE_FILED':
250
+					$tag = 'DIVF';
251
+					break;
252
+				case 'EDUCATION':
253
+					$tag = 'EDUC';
254
+					break;
255
+				case 'EMIGRATION':
256
+					$tag = 'EMIG';
257
+					break;
258
+				case 'ENDOWMENT':
259
+					$tag = 'ENDL';
260
+					break;
261
+				case 'ENGAGEMENT':
262
+					$tag = 'ENGA';
263
+					break;
264
+				case 'EVENT':
265
+					$tag = 'EVEN';
266
+					break;
267
+				case 'FACSIMILE':
268
+					$tag = 'FAX';
269
+					break;
270
+				case 'FAMILY':
271
+					$tag = 'FAM';
272
+					break;
273
+				case 'FAMILY_CHILD':
274
+					$tag = 'FAMC';
275
+					break;
276
+				case 'FAMILY_FILE':
277
+					$tag = 'FAMF';
278
+					break;
279
+				case 'FAMILY_SPOUSE':
280
+					$tag = 'FAMS';
281
+					break;
282
+				case 'FIRST_COMMUNION':
283
+					$tag = 'FCOM';
284
+					break;
285
+				case '_FILE':
286
+					$tag = 'FILE';
287
+					break;
288
+				case 'FORMAT':
289
+					$tag = 'FORM';
290
+				case 'FORM':
291
+					// Consistent commas
292
+					$data = preg_replace('/ *, */', ', ', $data);
293
+					break;
294
+				case 'GEDCOM':
295
+					$tag = 'GEDC';
296
+					break;
297
+				case 'GIVEN_NAME':
298
+					$tag = 'GIVN';
299
+					break;
300
+				case 'GRADUATION':
301
+					$tag = 'GRAD';
302
+					break;
303
+				case 'HEADER':
304
+					$tag = 'HEAD';
305
+				case 'HEAD':
306
+					// HEAD records don't have an XREF or DATA
307
+					if ($level == '0') {
308
+						$xref = '';
309
+						$data = '';
310
+					}
311
+					break;
312
+				case 'HUSBAND':
313
+					$tag = 'HUSB';
314
+					break;
315
+				case 'IDENT_NUMBER':
316
+					$tag = 'IDNO';
317
+					break;
318
+				case 'IMMIGRATION':
319
+					$tag = 'IMMI';
320
+					break;
321
+				case 'INDIVIDUAL':
322
+					$tag = 'INDI';
323
+					break;
324
+				case 'LANGUAGE':
325
+					$tag = 'LANG';
326
+					break;
327
+				case 'LATITUDE':
328
+					$tag = 'LATI';
329
+					break;
330
+				case 'LONGITUDE':
331
+					$tag = 'LONG';
332
+					break;
333
+				case 'MARRIAGE':
334
+					$tag = 'MARR';
335
+					break;
336
+				case 'MARRIAGE_BANN':
337
+					$tag = 'MARB';
338
+					break;
339
+				case 'MARRIAGE_COUNT':
340
+					$tag = 'NMR';
341
+					break;
342
+				case 'MARRIAGE_CONTRACT':
343
+					$tag = 'MARC';
344
+					break;
345
+				case 'MARRIAGE_LICENSE':
346
+					$tag = 'MARL';
347
+					break;
348
+				case 'MARRIAGE_SETTLEMENT':
349
+					$tag = 'MARS';
350
+					break;
351
+				case 'MEDIA':
352
+					$tag = 'MEDI';
353
+					break;
354
+				case '_MEDICAL':
355
+					$tag = '_MDCL';
356
+					break;
357
+				case '_MILITARY_SERVICE':
358
+					$tag = '_MILT';
359
+					break;
360
+				case 'NAME':
361
+					// Tidy up whitespace
362
+					$data = preg_replace('/  +/', ' ', trim($data));
363
+					break;
364
+				case 'NAME_PREFIX':
365
+					$tag = 'NPFX';
366
+					break;
367
+				case 'NAME_SUFFIX':
368
+					$tag = 'NSFX';
369
+					break;
370
+				case 'NATIONALITY':
371
+					$tag = 'NATI';
372
+					break;
373
+				case 'NATURALIZATION':
374
+					$tag = 'NATU';
375
+					break;
376
+				case 'NICKNAME':
377
+					$tag = 'NICK';
378
+					break;
379
+				case 'OBJECT':
380
+					$tag = 'OBJE';
381
+					break;
382
+				case 'OCCUPATION':
383
+					$tag = 'OCCU';
384
+					break;
385
+				case 'ORDINANCE':
386
+					$tag = 'ORDI';
387
+					break;
388
+				case 'ORDINATION':
389
+					$tag = 'ORDN';
390
+					break;
391
+				case 'PEDIGREE':
392
+					$tag = 'PEDI';
393
+				case 'PEDI':
394
+					// PEDI values are lower case
395
+					$data = strtolower($data);
396
+					break;
397
+				case 'PHONE':
398
+					$tag = 'PHON';
399
+					break;
400
+				case 'PHONETIC':
401
+					$tag = 'FONE';
402
+					break;
403
+				case 'PHY_DESCRIPTION':
404
+					$tag = 'DSCR';
405
+					break;
406
+				case 'PLACE':
407
+					$tag = 'PLAC';
408
+				case 'PLAC':
409
+					// Consistent commas
410
+					$data = preg_replace('/ *(،|,) */', ', ', $data);
411
+					// The Master Genealogist stores LAT/LONG data in the PLAC field, e.g. Pennsylvania, USA, 395945N0751013W
412
+					if (preg_match('/(.*), (\d\d)(\d\d)(\d\d)([NS])(\d\d\d)(\d\d)(\d\d)([EW])$/', $data, $match)) {
413
+						$data =
414
+							$match[1] . "\n" .
415
+							($level + 1) . " MAP\n" .
416
+							($level + 2) . " LATI " . ($match[5] . (round($match[2] + ($match[3] / 60) + ($match[4] / 3600), 4))) . "\n" .
417
+							($level + 2) . " LONG " . ($match[9] . (round($match[6] + ($match[7] / 60) + ($match[8] / 3600), 4)));
418
+					}
419
+					break;
420
+				case 'POSTAL_CODE':
421
+					$tag = 'POST';
422
+					break;
423
+				case 'PROBATE':
424
+					$tag = 'PROB';
425
+					break;
426
+				case 'PROPERTY':
427
+					$tag = 'PROP';
428
+					break;
429
+				case 'PUBLICATION':
430
+					$tag = 'PUBL';
431
+					break;
432
+				case 'QUALITY_OF_DATA':
433
+					$tag = 'QUAL';
434
+					break;
435
+				case 'REC_FILE_NUMBER':
436
+					$tag = 'RFN';
437
+					break;
438
+				case 'REC_ID_NUMBER':
439
+					$tag = 'RIN';
440
+					break;
441
+				case 'REFERENCE':
442
+					$tag = 'REFN';
443
+					break;
444
+				case 'RELATIONSHIP':
445
+					$tag = 'RELA';
446
+					break;
447
+				case 'RELIGION':
448
+					$tag = 'RELI';
449
+					break;
450
+				case 'REPOSITORY':
451
+					$tag = 'REPO';
452
+					break;
453
+				case 'RESIDENCE':
454
+					$tag = 'RESI';
455
+					break;
456
+				case 'RESTRICTION':
457
+					$tag = 'RESN';
458
+				case 'RESN':
459
+					// RESN values are lower case (confidential, privacy, locked, none)
460
+					$data = strtolower($data);
461
+					if ($data == 'invisible') {
462
+						$data = 'confidential'; // From old versions of Legacy.
463
+					}
464
+					break;
465
+				case 'RETIREMENT':
466
+					$tag = 'RETI';
467
+					break;
468
+				case 'ROMANIZED':
469
+					$tag = 'ROMN';
470
+					break;
471
+				case 'SEALING_CHILD':
472
+					$tag = 'SLGC';
473
+					break;
474
+				case 'SEALING_SPOUSE':
475
+					$tag = 'SLGS';
476
+					break;
477
+				case 'SOC_SEC_NUMBER':
478
+					$tag = 'SSN';
479
+					break;
480
+				case 'SEX':
481
+					$data = strtoupper($data);
482
+					break;
483
+				case 'SOURCE':
484
+					$tag = 'SOUR';
485
+					break;
486
+				case 'STATE':
487
+					$tag = 'STAE';
488
+					break;
489
+				case 'STATUS':
490
+					$tag = 'STAT';
491
+				case 'STAT':
492
+					if ($data == 'CANCELLED') {
493
+						// PhpGedView mis-spells this tag - correct it.
494
+						$data = 'CANCELED';
495
+					}
496
+					break;
497
+				case 'SUBMISSION':
498
+					$tag = 'SUBN';
499
+					break;
500
+				case 'SUBMITTER':
501
+					$tag = 'SUBM';
502
+					break;
503
+				case 'SURNAME':
504
+					$tag = 'SURN';
505
+					break;
506
+				case 'SURN_PREFIX':
507
+					$tag = 'SPFX';
508
+					break;
509
+				case 'TEMPLE':
510
+					$tag = 'TEMP';
511
+				case 'TEMP':
512
+					// Temple codes are upper case
513
+					$data = strtoupper($data);
514
+					break;
515
+				case 'TITLE':
516
+					$tag = 'TITL';
517
+					break;
518
+				case 'TRAILER':
519
+					$tag = 'TRLR';
520
+				case 'TRLR':
521
+					// TRLR records don't have an XREF or DATA
522
+					if ($level == '0') {
523
+						$xref = '';
524
+						$data = '';
525
+					}
526
+					break;
527
+				case 'VERSION':
528
+					$tag = 'VERS';
529
+					break;
530
+				case 'WEB':
531
+					$tag = 'WWW';
532
+					break;
533 533
 			}
534 534
 			// Suppress "Y", for facts/events with a DATE or PLAC
535 535
 			if ($data == 'y') {
@@ -545,40 +545,40 @@  discard block
 block discarded – undo
545 545
 			}
546 546
 			// Reassemble components back into a single line
547 547
 			switch ($tag) {
548
-			default:
549
-				// Remove tabs and multiple/leading/trailing spaces
550
-				if (strpos($data, "\t") !== false) {
551
-					$data = str_replace("\t", ' ', $data);
552
-				}
553
-				if (substr($data, 0, 1) == ' ' || substr($data, -1, 1) == ' ') {
554
-					$data = trim($data);
555
-				}
556
-				while (strpos($data, '  ')) {
557
-					$data = str_replace('  ', ' ', $data);
558
-				}
559
-				$newrec .= ($newrec ? "\n" : '') . $level . ' ' . ($level == '0' && $xref ? $xref . ' ' : '') . $tag . ($data === '' && $tag != "NOTE" ? '' : ' ' . $data);
560
-				break;
561
-			case 'NOTE':
562
-			case 'TEXT':
563
-			case 'DATA':
564
-			case 'CONT':
565
-				$newrec .= ($newrec ? "\n" : '') . $level . ' ' . ($level == '0' && $xref ? $xref . ' ' : '') . $tag . ($data === '' && $tag != "NOTE" ? '' : ' ' . $data);
566
-				break;
567
-			case 'FILE':
568
-				// Strip off the user-defined path prefix
569
-				$GEDCOM_MEDIA_PATH = $tree->getPreference('GEDCOM_MEDIA_PATH');
570
-				if ($GEDCOM_MEDIA_PATH && strpos($data, $GEDCOM_MEDIA_PATH) === 0) {
571
-					$data = substr($data, strlen($GEDCOM_MEDIA_PATH));
572
-				}
573
-				// convert backslashes in filenames to forward slashes
574
-				$data = preg_replace("/\\\/", "/", $data);
548
+				default:
549
+					// Remove tabs and multiple/leading/trailing spaces
550
+					if (strpos($data, "\t") !== false) {
551
+						$data = str_replace("\t", ' ', $data);
552
+					}
553
+					if (substr($data, 0, 1) == ' ' || substr($data, -1, 1) == ' ') {
554
+						$data = trim($data);
555
+					}
556
+					while (strpos($data, '  ')) {
557
+						$data = str_replace('  ', ' ', $data);
558
+					}
559
+					$newrec .= ($newrec ? "\n" : '') . $level . ' ' . ($level == '0' && $xref ? $xref . ' ' : '') . $tag . ($data === '' && $tag != "NOTE" ? '' : ' ' . $data);
560
+					break;
561
+				case 'NOTE':
562
+				case 'TEXT':
563
+				case 'DATA':
564
+				case 'CONT':
565
+					$newrec .= ($newrec ? "\n" : '') . $level . ' ' . ($level == '0' && $xref ? $xref . ' ' : '') . $tag . ($data === '' && $tag != "NOTE" ? '' : ' ' . $data);
566
+					break;
567
+				case 'FILE':
568
+					// Strip off the user-defined path prefix
569
+					$GEDCOM_MEDIA_PATH = $tree->getPreference('GEDCOM_MEDIA_PATH');
570
+					if ($GEDCOM_MEDIA_PATH && strpos($data, $GEDCOM_MEDIA_PATH) === 0) {
571
+						$data = substr($data, strlen($GEDCOM_MEDIA_PATH));
572
+					}
573
+					// convert backslashes in filenames to forward slashes
574
+					$data = preg_replace("/\\\/", "/", $data);
575 575
 
576
-				$newrec .= ($newrec ? "\n" : '') . $level . ' ' . ($level == '0' && $xref ? $xref . ' ' : '') . $tag . ($data === '' && $tag != "NOTE" ? '' : ' ' . $data);
577
-				break;
578
-			case 'CONC':
579
-				// Merge CONC lines, to simplify access later on.
580
-				$newrec .= ($tree->getPreference('WORD_WRAPPED_NOTES') ? ' ' : '') . $data;
581
-				break;
576
+					$newrec .= ($newrec ? "\n" : '') . $level . ' ' . ($level == '0' && $xref ? $xref . ' ' : '') . $tag . ($data === '' && $tag != "NOTE" ? '' : ' ' . $data);
577
+					break;
578
+				case 'CONC':
579
+					// Merge CONC lines, to simplify access later on.
580
+					$newrec .= ($tree->getPreference('WORD_WRAPPED_NOTES') ? ' ' : '') . $data;
581
+					break;
582 582
 			}
583 583
 		}
584 584
 
@@ -635,123 +635,123 @@  discard block
 block discarded – undo
635 635
 		}
636 636
 
637 637
 		switch ($type) {
638
-		case 'INDI':
639
-			// Convert inline media into media objects
640
-			$gedrec = self::convertInlineMedia($tree, $gedrec);
638
+			case 'INDI':
639
+				// Convert inline media into media objects
640
+				$gedrec = self::convertInlineMedia($tree, $gedrec);
641 641
 
642
-			$record = new Individual($xref, $gedrec, null, $tree);
643
-			if (preg_match('/\n1 RIN (.+)/', $gedrec, $match)) {
644
-				$rin = $match[1];
645
-			} else {
646
-				$rin = $xref;
647
-			}
648
-			Database::prepare(
649
-				"INSERT INTO `##individuals` (i_id, i_file, i_rin, i_sex, i_gedcom) VALUES (?, ?, ?, ?, ?)"
650
-			)->execute(array(
651
-				$xref, $tree_id, $rin, $record->getSex(), $gedrec,
652
-			));
653
-			// Update the cross-reference/index tables.
654
-			self::updatePlaces($xref, $tree_id, $gedrec);
655
-			self::updateDates($xref, $tree_id, $gedrec);
656
-			self::updateLinks($xref, $tree_id, $gedrec);
657
-			self::updateNames($xref, $tree_id, $record);
658
-			break;
659
-		case 'FAM':
660
-			// Convert inline media into media objects
661
-			$gedrec = self::convertInlineMedia($tree, $gedrec);
642
+				$record = new Individual($xref, $gedrec, null, $tree);
643
+				if (preg_match('/\n1 RIN (.+)/', $gedrec, $match)) {
644
+					$rin = $match[1];
645
+				} else {
646
+					$rin = $xref;
647
+				}
648
+				Database::prepare(
649
+					"INSERT INTO `##individuals` (i_id, i_file, i_rin, i_sex, i_gedcom) VALUES (?, ?, ?, ?, ?)"
650
+				)->execute(array(
651
+					$xref, $tree_id, $rin, $record->getSex(), $gedrec,
652
+				));
653
+				// Update the cross-reference/index tables.
654
+				self::updatePlaces($xref, $tree_id, $gedrec);
655
+				self::updateDates($xref, $tree_id, $gedrec);
656
+				self::updateLinks($xref, $tree_id, $gedrec);
657
+				self::updateNames($xref, $tree_id, $record);
658
+				break;
659
+			case 'FAM':
660
+				// Convert inline media into media objects
661
+				$gedrec = self::convertInlineMedia($tree, $gedrec);
662 662
 
663
-			if (preg_match('/\n1 HUSB @(' . WT_REGEX_XREF . ')@/', $gedrec, $match)) {
664
-				$husb = $match[1];
665
-			} else {
666
-				$husb = '';
667
-			}
668
-			if (preg_match('/\n1 WIFE @(' . WT_REGEX_XREF . ')@/', $gedrec, $match)) {
669
-				$wife = $match[1];
670
-			} else {
671
-				$wife = '';
672
-			}
673
-			$nchi = preg_match_all('/\n1 CHIL @(' . WT_REGEX_XREF . ')@/', $gedrec, $match);
674
-			if (preg_match('/\n1 NCHI (\d+)/', $gedrec, $match)) {
675
-				$nchi = max($nchi, $match[1]);
676
-			}
677
-			Database::prepare(
678
-				"INSERT INTO `##families` (f_id, f_file, f_husb, f_wife, f_gedcom, f_numchil) VALUES (?, ?, ?, ?, ?, ?)"
679
-			)->execute(array(
680
-				$xref, $tree_id, $husb, $wife, $gedrec, $nchi,
681
-			));
682
-			// Update the cross-reference/index tables.
683
-			self::updatePlaces($xref, $tree_id, $gedrec);
684
-			self::updateDates($xref, $tree_id, $gedrec);
685
-			self::updateLinks($xref, $tree_id, $gedrec);
686
-			break;
687
-		case 'SOUR':
688
-			// Convert inline media into media objects
689
-			$gedrec = self::convertInlineMedia($tree, $gedrec);
663
+				if (preg_match('/\n1 HUSB @(' . WT_REGEX_XREF . ')@/', $gedrec, $match)) {
664
+					$husb = $match[1];
665
+				} else {
666
+					$husb = '';
667
+				}
668
+				if (preg_match('/\n1 WIFE @(' . WT_REGEX_XREF . ')@/', $gedrec, $match)) {
669
+					$wife = $match[1];
670
+				} else {
671
+					$wife = '';
672
+				}
673
+				$nchi = preg_match_all('/\n1 CHIL @(' . WT_REGEX_XREF . ')@/', $gedrec, $match);
674
+				if (preg_match('/\n1 NCHI (\d+)/', $gedrec, $match)) {
675
+					$nchi = max($nchi, $match[1]);
676
+				}
677
+				Database::prepare(
678
+					"INSERT INTO `##families` (f_id, f_file, f_husb, f_wife, f_gedcom, f_numchil) VALUES (?, ?, ?, ?, ?, ?)"
679
+				)->execute(array(
680
+					$xref, $tree_id, $husb, $wife, $gedrec, $nchi,
681
+				));
682
+				// Update the cross-reference/index tables.
683
+				self::updatePlaces($xref, $tree_id, $gedrec);
684
+				self::updateDates($xref, $tree_id, $gedrec);
685
+				self::updateLinks($xref, $tree_id, $gedrec);
686
+				break;
687
+			case 'SOUR':
688
+				// Convert inline media into media objects
689
+				$gedrec = self::convertInlineMedia($tree, $gedrec);
690 690
 
691
-			$record = new Source($xref, $gedrec, null, $tree);
692
-			if (preg_match('/\n1 TITL (.+)/', $gedrec, $match)) {
693
-				$name = $match[1];
694
-			} elseif (preg_match('/\n1 ABBR (.+)/', $gedrec, $match)) {
695
-				$name = $match[1];
696
-			} else {
697
-				$name = $xref;
698
-			}
699
-			Database::prepare(
700
-				"INSERT INTO `##sources` (s_id, s_file, s_name, s_gedcom) VALUES (?, ?, LEFT(?, 255), ?)"
701
-			)->execute(array(
702
-				$xref, $tree_id, $name, $gedrec,
703
-			));
704
-			// Update the cross-reference/index tables.
705
-			self::updateLinks($xref, $tree_id, $gedrec);
706
-			self::updateNames($xref, $tree_id, $record);
707
-			break;
708
-		case 'REPO':
709
-			// Convert inline media into media objects
710
-			$gedrec = self::convertInlineMedia($tree, $gedrec);
691
+				$record = new Source($xref, $gedrec, null, $tree);
692
+				if (preg_match('/\n1 TITL (.+)/', $gedrec, $match)) {
693
+					$name = $match[1];
694
+				} elseif (preg_match('/\n1 ABBR (.+)/', $gedrec, $match)) {
695
+					$name = $match[1];
696
+				} else {
697
+					$name = $xref;
698
+				}
699
+				Database::prepare(
700
+					"INSERT INTO `##sources` (s_id, s_file, s_name, s_gedcom) VALUES (?, ?, LEFT(?, 255), ?)"
701
+				)->execute(array(
702
+					$xref, $tree_id, $name, $gedrec,
703
+				));
704
+				// Update the cross-reference/index tables.
705
+				self::updateLinks($xref, $tree_id, $gedrec);
706
+				self::updateNames($xref, $tree_id, $record);
707
+				break;
708
+			case 'REPO':
709
+				// Convert inline media into media objects
710
+				$gedrec = self::convertInlineMedia($tree, $gedrec);
711 711
 
712
-			$record = new Repository($xref, $gedrec, null, $tree);
713
-			Database::prepare(
714
-				"INSERT INTO `##other` (o_id, o_file, o_type, o_gedcom) VALUES (?, ?, 'REPO', ?)"
715
-			)->execute(array(
716
-				$xref, $tree_id, $gedrec,
717
-			));
718
-			// Update the cross-reference/index tables.
719
-			self::updateLinks($xref, $tree_id, $gedrec);
720
-			self::updateNames($xref, $tree_id, $record);
721
-			break;
722
-		case 'NOTE':
723
-			$record = new Note($xref, $gedrec, null, $tree);
724
-			Database::prepare(
725
-				"INSERT INTO `##other` (o_id, o_file, o_type, o_gedcom) VALUES (?, ?, 'NOTE', ?)"
726
-			)->execute(array(
727
-				$xref, $tree_id, $gedrec,
728
-			));
729
-			// Update the cross-reference/index tables.
730
-			self::updateLinks($xref, $tree_id, $gedrec);
731
-			self::updateNames($xref, $tree_id, $record);
732
-			break;
733
-		case 'OBJE':
734
-			$record = new Media($xref, $gedrec, null, $tree);
735
-			Database::prepare(
736
-				"INSERT INTO `##media` (m_id, m_ext, m_type, m_titl, m_filename, m_file, m_gedcom) VALUES (?, LEFT(?, 6), LEFT(?, 60), LEFT(?, 255), left(?, 512), ?, ?)"
737
-			)->execute(array(
738
-				$xref, $record->extension(), $record->getMediaType(), $record->getTitle(), $record->getFilename(), $tree_id, $gedrec,
739
-			));
740
-			// Update the cross-reference/index tables.
741
-			self::updateLinks($xref, $tree_id, $gedrec);
742
-			self::updateNames($xref, $tree_id, $record);
743
-			break;
744
-		default: // HEAD, TRLR, SUBM, SUBN, and custom record types.
745
-			// Force HEAD records to have a creation date.
746
-			if ($type === 'HEAD' && strpos($gedrec, "\n1 DATE ") === false) {
747
-				$gedrec .= "\n1 DATE " . date('j M Y');
748
-			}
749
-			Database::prepare(
750
-				"INSERT INTO `##other` (o_id, o_file, o_type, o_gedcom) VALUES (?, ?, LEFT(?, 15), ?)"
751
-			)->execute(array($xref, $tree_id, $type, $gedrec));
752
-			// Update the cross-reference/index tables.
753
-			self::updateLinks($xref, $tree_id, $gedrec);
754
-			break;
712
+				$record = new Repository($xref, $gedrec, null, $tree);
713
+				Database::prepare(
714
+					"INSERT INTO `##other` (o_id, o_file, o_type, o_gedcom) VALUES (?, ?, 'REPO', ?)"
715
+				)->execute(array(
716
+					$xref, $tree_id, $gedrec,
717
+				));
718
+				// Update the cross-reference/index tables.
719
+				self::updateLinks($xref, $tree_id, $gedrec);
720
+				self::updateNames($xref, $tree_id, $record);
721
+				break;
722
+			case 'NOTE':
723
+				$record = new Note($xref, $gedrec, null, $tree);
724
+				Database::prepare(
725
+					"INSERT INTO `##other` (o_id, o_file, o_type, o_gedcom) VALUES (?, ?, 'NOTE', ?)"
726
+				)->execute(array(
727
+					$xref, $tree_id, $gedrec,
728
+				));
729
+				// Update the cross-reference/index tables.
730
+				self::updateLinks($xref, $tree_id, $gedrec);
731
+				self::updateNames($xref, $tree_id, $record);
732
+				break;
733
+			case 'OBJE':
734
+				$record = new Media($xref, $gedrec, null, $tree);
735
+				Database::prepare(
736
+					"INSERT INTO `##media` (m_id, m_ext, m_type, m_titl, m_filename, m_file, m_gedcom) VALUES (?, LEFT(?, 6), LEFT(?, 60), LEFT(?, 255), left(?, 512), ?, ?)"
737
+				)->execute(array(
738
+					$xref, $record->extension(), $record->getMediaType(), $record->getTitle(), $record->getFilename(), $tree_id, $gedrec,
739
+				));
740
+				// Update the cross-reference/index tables.
741
+				self::updateLinks($xref, $tree_id, $gedrec);
742
+				self::updateNames($xref, $tree_id, $record);
743
+				break;
744
+			default: // HEAD, TRLR, SUBM, SUBN, and custom record types.
745
+				// Force HEAD records to have a creation date.
746
+				if ($type === 'HEAD' && strpos($gedrec, "\n1 DATE ") === false) {
747
+					$gedrec .= "\n1 DATE " . date('j M Y');
748
+				}
749
+				Database::prepare(
750
+					"INSERT INTO `##other` (o_id, o_file, o_type, o_gedcom) VALUES (?, ?, LEFT(?, 15), ?)"
751
+				)->execute(array($xref, $tree_id, $type, $gedrec));
752
+				// Update the cross-reference/index tables.
753
+				self::updateLinks($xref, $tree_id, $gedrec);
754
+				break;
755 755
 		}
756 756
 	}
757 757
 
@@ -1130,21 +1130,21 @@  discard block
 block discarded – undo
1130 1130
 		Database::prepare("DELETE FROM `##link` WHERE l_from=? AND l_file=?")->execute(array($gid, $ged_id));
1131 1131
 
1132 1132
 		switch ($type) {
1133
-		case 'INDI':
1134
-			Database::prepare("DELETE FROM `##individuals` WHERE i_id=? AND i_file=?")->execute(array($gid, $ged_id));
1135
-			break;
1136
-		case 'FAM':
1137
-			Database::prepare("DELETE FROM `##families` WHERE f_id=? AND f_file=?")->execute(array($gid, $ged_id));
1138
-			break;
1139
-		case 'SOUR':
1140
-			Database::prepare("DELETE FROM `##sources` WHERE s_id=? AND s_file=?")->execute(array($gid, $ged_id));
1141
-			break;
1142
-		case 'OBJE':
1143
-			Database::prepare("DELETE FROM `##media` WHERE m_id=? AND m_file=?")->execute(array($gid, $ged_id));
1144
-			break;
1145
-		default:
1146
-			Database::prepare("DELETE FROM `##other` WHERE o_id=? AND o_file=?")->execute(array($gid, $ged_id));
1147
-			break;
1133
+			case 'INDI':
1134
+				Database::prepare("DELETE FROM `##individuals` WHERE i_id=? AND i_file=?")->execute(array($gid, $ged_id));
1135
+				break;
1136
+			case 'FAM':
1137
+				Database::prepare("DELETE FROM `##families` WHERE f_id=? AND f_file=?")->execute(array($gid, $ged_id));
1138
+				break;
1139
+			case 'SOUR':
1140
+				Database::prepare("DELETE FROM `##sources` WHERE s_id=? AND s_file=?")->execute(array($gid, $ged_id));
1141
+				break;
1142
+			case 'OBJE':
1143
+				Database::prepare("DELETE FROM `##media` WHERE m_id=? AND m_file=?")->execute(array($gid, $ged_id));
1144
+				break;
1145
+			default:
1146
+				Database::prepare("DELETE FROM `##other` WHERE o_id=? AND o_file=?")->execute(array($gid, $ged_id));
1147
+				break;
1148 1148
 		}
1149 1149
 
1150 1150
 		if (!$delete) {
Please login to merge, or discard this patch.
app/Functions/FunctionsEdit.php 1 patch
Switch Indentation   +291 added lines, -291 removed lines patch added patch discarded remove patch
@@ -559,19 +559,19 @@  discard block
 block discarded – undo
559 559
 		} else {
560 560
 			// Not all facts have help text.
561 561
 			switch ($fact) {
562
-			case 'NAME':
563
-				if ($upperlevel !== 'REPO' && $upperlevel !== 'UNKNOWN') {
562
+				case 'NAME':
563
+					if ($upperlevel !== 'REPO' && $upperlevel !== 'UNKNOWN') {
564
+						echo FunctionsPrint::helpLink($fact);
565
+					}
566
+					break;
567
+				case 'DATE':
568
+				case 'PLAC':
569
+				case 'RESN':
570
+				case 'ROMN':
571
+				case 'SURN':
572
+				case '_HEB':
564 573
 					echo FunctionsPrint::helpLink($fact);
565
-				}
566
-				break;
567
-			case 'DATE':
568
-			case 'PLAC':
569
-			case 'RESN':
570
-			case 'ROMN':
571
-			case 'SURN':
572
-			case '_HEB':
573
-				echo FunctionsPrint::helpLink($fact);
574
-				break;
574
+					break;
575 575
 			}
576 576
 		}
577 577
 		// tag level
@@ -716,51 +716,51 @@  discard block
 block discarded – undo
716 716
 
717 717
 				// Extra markup for specific fact types
718 718
 				switch ($fact) {
719
-				case 'ALIA':
720
-				case 'ASSO':
721
-				case '_ASSO':
722
-					echo ' data-autocomplete-type="ASSO" data-autocomplete-extra="input.DATE"';
723
-					break;
724
-				case 'DATE':
725
-					echo ' onblur="valid_date(this);" onmouseout="valid_date(this);"';
726
-					break;
727
-				case 'GIVN':
728
-					echo ' autofocus data-autocomplete-type="GIVN"';
729
-					break;
730
-				case 'LATI':
731
-					echo ' onblur="valid_lati_long(this, \'N\', \'S\');" onmouseout="valid_lati_long(this, \'N\', \'S\');"';
732
-					break;
733
-				case 'LONG':
734
-					echo ' onblur="valid_lati_long(this, \'E\', \'W\');" onmouseout="valid_lati_long(this, \'E\', \'W\');"';
735
-					break;
736
-				case 'NOTE':
737
-					// Shared notes. Inline notes are handled elsewhere.
738
-					echo ' data-autocomplete-type="NOTE"';
739
-					break;
740
-				case 'OBJE':
741
-					echo ' data-autocomplete-type="OBJE"';
742
-					break;
743
-				case 'PAGE':
744
-					echo ' data-autocomplete-type="PAGE" data-autocomplete-extra="#' . $source_element_id . '"';
745
-					break;
746
-				case 'PLAC':
747
-					echo ' data-autocomplete-type="PLAC"';
748
-					break;
749
-				case 'REPO':
750
-					echo ' data-autocomplete-type="REPO"';
751
-					break;
752
-				case 'SOUR':
753
-					$source_element_id = $element_id;
754
-					echo ' data-autocomplete-type="SOUR"';
755
-					break;
756
-				case 'SURN':
757
-				case '_MARNM_SURN':
758
-					echo ' data-autocomplete-type="SURN"';
759
-					break;
760
-				case 'TIME':
761
-					echo ' pattern="([0-1][0-9]|2[0-3]):[0-5][0-9](:[0-5][0-9])?" dir="ltr" placeholder="' . /* I18N: Examples of valid time formats (hours:minutes:seconds) */
762
-						I18N::translate('hh:mm or hh:mm:ss') . '"';
763
-					break;
719
+					case 'ALIA':
720
+					case 'ASSO':
721
+					case '_ASSO':
722
+						echo ' data-autocomplete-type="ASSO" data-autocomplete-extra="input.DATE"';
723
+						break;
724
+					case 'DATE':
725
+						echo ' onblur="valid_date(this);" onmouseout="valid_date(this);"';
726
+						break;
727
+					case 'GIVN':
728
+						echo ' autofocus data-autocomplete-type="GIVN"';
729
+						break;
730
+					case 'LATI':
731
+						echo ' onblur="valid_lati_long(this, \'N\', \'S\');" onmouseout="valid_lati_long(this, \'N\', \'S\');"';
732
+						break;
733
+					case 'LONG':
734
+						echo ' onblur="valid_lati_long(this, \'E\', \'W\');" onmouseout="valid_lati_long(this, \'E\', \'W\');"';
735
+						break;
736
+					case 'NOTE':
737
+						// Shared notes. Inline notes are handled elsewhere.
738
+						echo ' data-autocomplete-type="NOTE"';
739
+						break;
740
+					case 'OBJE':
741
+						echo ' data-autocomplete-type="OBJE"';
742
+						break;
743
+					case 'PAGE':
744
+						echo ' data-autocomplete-type="PAGE" data-autocomplete-extra="#' . $source_element_id . '"';
745
+						break;
746
+					case 'PLAC':
747
+						echo ' data-autocomplete-type="PLAC"';
748
+						break;
749
+					case 'REPO':
750
+						echo ' data-autocomplete-type="REPO"';
751
+						break;
752
+					case 'SOUR':
753
+						$source_element_id = $element_id;
754
+						echo ' data-autocomplete-type="SOUR"';
755
+						break;
756
+					case 'SURN':
757
+					case '_MARNM_SURN':
758
+						echo ' data-autocomplete-type="SURN"';
759
+						break;
760
+					case 'TIME':
761
+						echo ' pattern="([0-1][0-9]|2[0-3]):[0-5][0-9](:[0-5][0-9])?" dir="ltr" placeholder="' . /* I18N: Examples of valid time formats (hours:minutes:seconds) */
762
+							I18N::translate('hh:mm or hh:mm:ss') . '"';
763
+						break;
764 764
 				}
765 765
 				echo '>';
766 766
 			}
@@ -810,41 +810,41 @@  discard block
 block discarded – undo
810 810
 
811 811
 		// popup links
812 812
 		switch ($fact) {
813
-		case 'DATE':
814
-			echo self::printCalendarPopup($element_id);
815
-			break;
816
-		case 'FAMC':
817
-		case 'FAMS':
818
-			echo FunctionsPrint::printFindFamilyLink($element_id);
819
-			break;
820
-		case 'ALIA':
821
-		case 'ASSO':
822
-		case '_ASSO':
823
-			echo FunctionsPrint::printFindIndividualLink($element_id, $element_id . '_description');
824
-			break;
825
-		case 'FILE':
826
-			FunctionsPrint::printFindMediaLink($element_id, '0file');
827
-			break;
828
-		case 'SOUR':
829
-			echo FunctionsPrint::printFindSourceLink($element_id, $element_id . '_description'), ' ', self::printAddNewSourceLink($element_id);
830
-			//-- checkboxes to apply '1 SOUR' to BIRT/MARR/DEAT as '2 SOUR'
831
-			if ($level === 1) {
832
-				echo '<br>';
833
-				switch ($WT_TREE->getPreference('PREFER_LEVEL2_SOURCES')) {
834
-				case '2': // records
835
-				$level1_checked = 'checked';
836
-				$level2_checked = '';
813
+			case 'DATE':
814
+				echo self::printCalendarPopup($element_id);
815
+				break;
816
+			case 'FAMC':
817
+			case 'FAMS':
818
+				echo FunctionsPrint::printFindFamilyLink($element_id);
837 819
 				break;
838
-				case '1': // facts
839
-				$level1_checked = '';
840
-				$level2_checked = 'checked';
820
+			case 'ALIA':
821
+			case 'ASSO':
822
+			case '_ASSO':
823
+				echo FunctionsPrint::printFindIndividualLink($element_id, $element_id . '_description');
841 824
 				break;
842
-				case '0': // none
843
-				default:
844
-				$level1_checked = '';
845
-				$level2_checked = '';
825
+			case 'FILE':
826
+				FunctionsPrint::printFindMediaLink($element_id, '0file');
846 827
 				break;
847
-				}
828
+			case 'SOUR':
829
+				echo FunctionsPrint::printFindSourceLink($element_id, $element_id . '_description'), ' ', self::printAddNewSourceLink($element_id);
830
+				//-- checkboxes to apply '1 SOUR' to BIRT/MARR/DEAT as '2 SOUR'
831
+				if ($level === 1) {
832
+					echo '<br>';
833
+					switch ($WT_TREE->getPreference('PREFER_LEVEL2_SOURCES')) {
834
+						case '2': // records
835
+						$level1_checked = 'checked';
836
+						$level2_checked = '';
837
+						break;
838
+						case '1': // facts
839
+						$level1_checked = '';
840
+						$level2_checked = 'checked';
841
+						break;
842
+						case '0': // none
843
+						default:
844
+						$level1_checked = '';
845
+						$level2_checked = '';
846
+						break;
847
+					}
848 848
 					if (strpos($bdm, 'B') !== false) {
849 849
 						echo ' <label><input type="checkbox" name="SOUR_INDI" ', $level1_checked, ' value="1">', I18N::translate('Individual'), '</label>';
850 850
 						if (preg_match_all('/(' . WT_REGEX_TAG . ')/', $WT_TREE->getPreference('QUICK_REQUIRED_FACTS'), $matches)) {
@@ -874,26 +874,26 @@  discard block
 block discarded – undo
874 874
 					}
875 875
 				}
876 876
 				break;
877
-		case 'REPO':
878
-			echo FunctionsPrint::printFindRepositoryLink($element_id), ' ', self::printAddNewRepositoryLink($element_id);
879
-			break;
880
-		case 'NOTE':
881
-			// Shared Notes Icons ========================================
882
-			if ($islink) {
883
-				// Print regular Shared Note icons ---------------------------
884
-				echo ' ', FunctionsPrint::printFindNoteLink($element_id, $element_id . '_description'), ' ', self::printAddNewNoteLink($element_id);
885
-				if ($value) {
886
-					echo ' ', self::printEditNoteLink($value);
877
+			case 'REPO':
878
+				echo FunctionsPrint::printFindRepositoryLink($element_id), ' ', self::printAddNewRepositoryLink($element_id);
879
+				break;
880
+			case 'NOTE':
881
+				// Shared Notes Icons ========================================
882
+				if ($islink) {
883
+					// Print regular Shared Note icons ---------------------------
884
+					echo ' ', FunctionsPrint::printFindNoteLink($element_id, $element_id . '_description'), ' ', self::printAddNewNoteLink($element_id);
885
+					if ($value) {
886
+						echo ' ', self::printEditNoteLink($value);
887
+					}
887 888
 				}
888
-			}
889
-			break;
890
-		case 'OBJE':
891
-			echo FunctionsPrint::printFindMediaLink($element_id, '1media');
892
-			if (!$value) {
893
-				echo ' ', self::printAddNewMediaLink($element_id);
894
-				$value = 'new';
895
-			}
896
-			break;
889
+				break;
890
+			case 'OBJE':
891
+				echo FunctionsPrint::printFindMediaLink($element_id, '1media');
892
+				if (!$value) {
893
+					echo ' ', self::printAddNewMediaLink($element_id);
894
+					$value = 'new';
895
+				}
896
+				break;
897 897
 		}
898 898
 
899 899
 		echo '<div id="' . $element_id . '_description">';
@@ -913,38 +913,38 @@  discard block
 block discarded – undo
913 913
 
914 914
 		if ($value && $value !== 'new' && $islink) {
915 915
 			switch ($fact) {
916
-			case 'ALIA':
917
-			case 'ASSO':
918
-			case '_ASSO':
919
-				$tmp = Individual::getInstance($value, $WT_TREE);
920
-				if ($tmp) {
921
-					echo ' ', $tmp->getFullName();
922
-				}
923
-				break;
924
-			case 'SOUR':
925
-				$tmp = Source::getInstance($value, $WT_TREE);
926
-				if ($tmp) {
927
-					echo ' ', $tmp->getFullName();
928
-				}
929
-				break;
930
-			case 'NOTE':
931
-				$tmp = Note::getInstance($value, $WT_TREE);
932
-				if ($tmp) {
933
-					echo ' ', $tmp->getFullName();
934
-				}
935
-				break;
936
-			case 'OBJE':
937
-				$tmp = Media::getInstance($value, $WT_TREE);
938
-				if ($tmp) {
939
-					echo ' ', $tmp->getFullName();
940
-				}
941
-				break;
942
-			case 'REPO':
943
-				$tmp = Repository::getInstance($value, $WT_TREE);
944
-				if ($tmp) {
945
-					echo ' ', $tmp->getFullName();
946
-				}
947
-				break;
916
+				case 'ALIA':
917
+				case 'ASSO':
918
+				case '_ASSO':
919
+					$tmp = Individual::getInstance($value, $WT_TREE);
920
+					if ($tmp) {
921
+						echo ' ', $tmp->getFullName();
922
+					}
923
+					break;
924
+				case 'SOUR':
925
+					$tmp = Source::getInstance($value, $WT_TREE);
926
+					if ($tmp) {
927
+						echo ' ', $tmp->getFullName();
928
+					}
929
+					break;
930
+				case 'NOTE':
931
+					$tmp = Note::getInstance($value, $WT_TREE);
932
+					if ($tmp) {
933
+						echo ' ', $tmp->getFullName();
934
+					}
935
+					break;
936
+				case 'OBJE':
937
+					$tmp = Media::getInstance($value, $WT_TREE);
938
+					if ($tmp) {
939
+						echo ' ', $tmp->getFullName();
940
+					}
941
+					break;
942
+				case 'REPO':
943
+					$tmp = Repository::getInstance($value, $WT_TREE);
944
+					if ($tmp) {
945
+						echo ' ', $tmp->getFullName();
946
+					}
947
+					break;
948 948
 			}
949 949
 		}
950 950
 
@@ -969,29 +969,29 @@  discard block
 block discarded – undo
969 969
 
970 970
 		// Show more likely census details at the top of the list.
971 971
 		switch (WT_LOCALE) {
972
-		case 'cs':
973
-			$census_places = array(new CensusOfCzechRepublic);
974
-			break;
975
-		case 'en-AU':
976
-		case 'en-GB':
977
-			$census_places = array(new CensusOfEngland, new CensusOfWales, new CensusOfScotland);
978
-			break;
979
-		case 'en-US':
980
-			$census_places = array(new CensusOfUnitedStates);
981
-			break;
982
-		case 'fr':
983
-		case 'fr-CA':
984
-			$census_places = array(new CensusOfFrance);
985
-			break;
986
-		case 'da':
987
-			$census_places = array(new CensusOfDenmark);
988
-			break;
989
-		case 'de':
990
-			$census_places = array(new CensusOfDeutschland);
991
-			break;
992
-		default:
993
-			$census_places = array();
994
-			break;
972
+			case 'cs':
973
+				$census_places = array(new CensusOfCzechRepublic);
974
+				break;
975
+			case 'en-AU':
976
+			case 'en-GB':
977
+				$census_places = array(new CensusOfEngland, new CensusOfWales, new CensusOfScotland);
978
+				break;
979
+			case 'en-US':
980
+				$census_places = array(new CensusOfUnitedStates);
981
+				break;
982
+			case 'fr':
983
+			case 'fr-CA':
984
+				$census_places = array(new CensusOfFrance);
985
+				break;
986
+			case 'da':
987
+				$census_places = array(new CensusOfDenmark);
988
+				break;
989
+			case 'de':
990
+				$census_places = array(new CensusOfDeutschland);
991
+				break;
992
+			default:
993
+				$census_places = array();
994
+				break;
995 995
 		}
996 996
 		foreach (Census::allCensusPlaces() as $census_place) {
997 997
 			if (!in_array($census_place, $census_places)) {
@@ -1053,97 +1053,97 @@  discard block
 block discarded – undo
1053 1053
 		global $WT_TREE;
1054 1054
 
1055 1055
 		switch ($tag) {
1056
-		case 'SOUR':
1057
-			echo '<a href="#" onclick="return expand_layer(\'newsource\');"><i id="newsource_img" class="icon-plus"></i> ', I18N::translate('Add a source citation'), '</a>';
1058
-			echo '<br>';
1059
-			echo '<div id="newsource" style="display: none;">';
1060
-			echo '<table class="facts_table">';
1061
-			// 2 SOUR
1062
-			self::addSimpleTag($level . ' SOUR @');
1063
-			// 3 PAGE
1064
-			self::addSimpleTag(($level + 1) . ' PAGE');
1065
-			// 3 DATA
1066
-			self::addSimpleTag(($level + 1) . ' DATA');
1067
-			// 4 TEXT
1068
-			self::addSimpleTag(($level + 2) . ' TEXT');
1069
-			if ($WT_TREE->getPreference('FULL_SOURCES')) {
1070
-				// 4 DATE
1071
-				self::addSimpleTag(($level + 2) . ' DATE', '', GedcomTag::getLabel('DATA:DATE'));
1072
-				// 3 QUAY
1073
-				self::addSimpleTag(($level + 1) . ' QUAY');
1074
-			}
1075
-			// 3 OBJE
1076
-			self::addSimpleTag(($level + 1) . ' OBJE');
1077
-			// 3 SHARED_NOTE
1078
-			self::addSimpleTag(($level + 1) . ' SHARED_NOTE');
1079
-			echo '</table></div>';
1080
-			break;
1081
-
1082
-		case 'ASSO':
1083
-		case 'ASSO2':
1084
-			//-- Add a new ASSOciate
1085
-			if ($tag === 'ASSO') {
1086
-				echo "<a href=\"#\" onclick=\"return expand_layer('newasso');\"><i id=\"newasso_img\" class=\"icon-plus\"></i> ", I18N::translate('Add an associate'), '</a>';
1056
+			case 'SOUR':
1057
+				echo '<a href="#" onclick="return expand_layer(\'newsource\');"><i id="newsource_img" class="icon-plus"></i> ', I18N::translate('Add a source citation'), '</a>';
1087 1058
 				echo '<br>';
1088
-				echo '<div id="newasso" style="display: none;">';
1089
-			} else {
1090
-				echo "<a href=\"#\" onclick=\"return expand_layer('newasso2');\"><i id=\"newasso2_img\" class=\"icon-plus\"></i> ", I18N::translate('Add an associate'), '</a>';
1059
+				echo '<div id="newsource" style="display: none;">';
1060
+				echo '<table class="facts_table">';
1061
+				// 2 SOUR
1062
+				self::addSimpleTag($level . ' SOUR @');
1063
+				// 3 PAGE
1064
+				self::addSimpleTag(($level + 1) . ' PAGE');
1065
+				// 3 DATA
1066
+				self::addSimpleTag(($level + 1) . ' DATA');
1067
+				// 4 TEXT
1068
+				self::addSimpleTag(($level + 2) . ' TEXT');
1069
+				if ($WT_TREE->getPreference('FULL_SOURCES')) {
1070
+					// 4 DATE
1071
+					self::addSimpleTag(($level + 2) . ' DATE', '', GedcomTag::getLabel('DATA:DATE'));
1072
+					// 3 QUAY
1073
+					self::addSimpleTag(($level + 1) . ' QUAY');
1074
+				}
1075
+				// 3 OBJE
1076
+				self::addSimpleTag(($level + 1) . ' OBJE');
1077
+				// 3 SHARED_NOTE
1078
+				self::addSimpleTag(($level + 1) . ' SHARED_NOTE');
1079
+				echo '</table></div>';
1080
+				break;
1081
+
1082
+			case 'ASSO':
1083
+			case 'ASSO2':
1084
+				//-- Add a new ASSOciate
1085
+				if ($tag === 'ASSO') {
1086
+					echo "<a href=\"#\" onclick=\"return expand_layer('newasso');\"><i id=\"newasso_img\" class=\"icon-plus\"></i> ", I18N::translate('Add an associate'), '</a>';
1087
+					echo '<br>';
1088
+					echo '<div id="newasso" style="display: none;">';
1089
+				} else {
1090
+					echo "<a href=\"#\" onclick=\"return expand_layer('newasso2');\"><i id=\"newasso2_img\" class=\"icon-plus\"></i> ", I18N::translate('Add an associate'), '</a>';
1091
+					echo '<br>';
1092
+					echo '<div id="newasso2" style="display: none;">';
1093
+				}
1094
+				echo '<table class="facts_table">';
1095
+				// 2 ASSO
1096
+				self::addSimpleTag($level . ' _ASSO @');
1097
+				// 3 RELA
1098
+				self::addSimpleTag(($level + 1) . ' RELA');
1099
+				// 3 NOTE
1100
+				self::addSimpleTag(($level + 1) . ' NOTE');
1101
+				// 3 SHARED_NOTE
1102
+				self::addSimpleTag(($level + 1) . ' SHARED_NOTE');
1103
+				echo '</table></div>';
1104
+				break;
1105
+
1106
+			case 'NOTE':
1107
+				//-- Retrieve existing note or add new note to fact
1108
+				echo "<a href=\"#\" onclick=\"return expand_layer('newnote');\"><i id=\"newnote_img\" class=\"icon-plus\"></i> ", I18N::translate('Add a note'), '</a>';
1091 1109
 				echo '<br>';
1092
-				echo '<div id="newasso2" style="display: none;">';
1093
-			}
1094
-			echo '<table class="facts_table">';
1095
-			// 2 ASSO
1096
-			self::addSimpleTag($level . ' _ASSO @');
1097
-			// 3 RELA
1098
-			self::addSimpleTag(($level + 1) . ' RELA');
1099
-			// 3 NOTE
1100
-			self::addSimpleTag(($level + 1) . ' NOTE');
1101
-			// 3 SHARED_NOTE
1102
-			self::addSimpleTag(($level + 1) . ' SHARED_NOTE');
1103
-			echo '</table></div>';
1104
-			break;
1105
-
1106
-		case 'NOTE':
1107
-			//-- Retrieve existing note or add new note to fact
1108
-			echo "<a href=\"#\" onclick=\"return expand_layer('newnote');\"><i id=\"newnote_img\" class=\"icon-plus\"></i> ", I18N::translate('Add a note'), '</a>';
1109
-			echo '<br>';
1110
-			echo '<div id="newnote" style="display: none;">';
1111
-			echo '<table class="facts_table">';
1112
-			// 2 NOTE
1113
-			self::addSimpleTag($level . ' NOTE');
1114
-			echo '</table></div>';
1115
-			break;
1116
-
1117
-		case 'SHARED_NOTE':
1118
-			echo "<a href=\"#\" onclick=\"return expand_layer('newshared_note');\"><i id=\"newshared_note_img\" class=\"icon-plus\"></i> ", I18N::translate('Add a shared note'), '</a>';
1119
-			echo '<br>';
1120
-			echo '<div id="newshared_note" style="display: none;">';
1121
-			echo '<table class="facts_table">';
1122
-			// 2 SHARED NOTE
1123
-			self::addSimpleTag($level . ' SHARED_NOTE', $parent_tag);
1124
-			echo '</table></div>';
1125
-			break;
1126
-
1127
-		case 'OBJE':
1128
-			if ($WT_TREE->getPreference('MEDIA_UPLOAD') >= Auth::accessLevel($WT_TREE)) {
1129
-				echo "<a href=\"#\" onclick=\"return expand_layer('newobje');\"><i id=\"newobje_img\" class=\"icon-plus\"></i> ", I18N::translate('Add a media object'), '</a>';
1110
+				echo '<div id="newnote" style="display: none;">';
1111
+				echo '<table class="facts_table">';
1112
+				// 2 NOTE
1113
+				self::addSimpleTag($level . ' NOTE');
1114
+				echo '</table></div>';
1115
+				break;
1116
+
1117
+			case 'SHARED_NOTE':
1118
+				echo "<a href=\"#\" onclick=\"return expand_layer('newshared_note');\"><i id=\"newshared_note_img\" class=\"icon-plus\"></i> ", I18N::translate('Add a shared note'), '</a>';
1130 1119
 				echo '<br>';
1131
-				echo '<div id="newobje" style="display: none;">';
1120
+				echo '<div id="newshared_note" style="display: none;">';
1132 1121
 				echo '<table class="facts_table">';
1133
-				self::addSimpleTag($level . ' OBJE');
1122
+				// 2 SHARED NOTE
1123
+				self::addSimpleTag($level . ' SHARED_NOTE', $parent_tag);
1134 1124
 				echo '</table></div>';
1135
-			}
1136
-			break;
1137
-
1138
-		case 'RESN':
1139
-			echo "<a href=\"#\" onclick=\"return expand_layer('newresn');\"><i id=\"newresn_img\" class=\"icon-plus\"></i> ", I18N::translate('Add a restriction'), '</a>';
1140
-			echo '<br>';
1141
-			echo '<div id="newresn" style="display: none;">';
1142
-			echo '<table class="facts_table">';
1143
-			// 2 RESN
1144
-			self::addSimpleTag($level . ' RESN');
1145
-			echo '</table></div>';
1146
-			break;
1125
+				break;
1126
+
1127
+			case 'OBJE':
1128
+				if ($WT_TREE->getPreference('MEDIA_UPLOAD') >= Auth::accessLevel($WT_TREE)) {
1129
+					echo "<a href=\"#\" onclick=\"return expand_layer('newobje');\"><i id=\"newobje_img\" class=\"icon-plus\"></i> ", I18N::translate('Add a media object'), '</a>';
1130
+					echo '<br>';
1131
+					echo '<div id="newobje" style="display: none;">';
1132
+					echo '<table class="facts_table">';
1133
+					self::addSimpleTag($level . ' OBJE');
1134
+					echo '</table></div>';
1135
+				}
1136
+				break;
1137
+
1138
+			case 'RESN':
1139
+				echo "<a href=\"#\" onclick=\"return expand_layer('newresn');\"><i id=\"newresn_img\" class=\"icon-plus\"></i> ", I18N::translate('Add a restriction'), '</a>';
1140
+				echo '<br>';
1141
+				echo '<div id="newresn" style="display: none;">';
1142
+				echo '<table class="facts_table">';
1143
+				// 2 RESN
1144
+				self::addSimpleTag($level . ' RESN');
1145
+				echo '</table></div>';
1146
+				break;
1147 1147
 		}
1148 1148
 	}
1149 1149
 
@@ -1219,12 +1219,12 @@  discard block
 block discarded – undo
1219 1219
 	 */
1220 1220
 	public static function addNewSex() {
1221 1221
 		switch (Filter::post('SEX', '[MF]', 'U')) {
1222
-		case 'M':
1223
-			return "\n1 SEX M";
1224
-		case 'F':
1225
-			return "\n1 SEX F";
1226
-		default:
1227
-			return "\n1 SEX U";
1222
+			case 'M':
1223
+				return "\n1 SEX M";
1224
+			case 'F':
1225
+				return "\n1 SEX F";
1226
+			default:
1227
+				return "\n1 SEX U";
1228 1228
 		}
1229 1229
 	}
1230 1230
 
@@ -1750,43 +1750,43 @@  discard block
 block discarded – undo
1750 1750
 				}
1751 1751
 				// Add level 3/4 tags as appropriate
1752 1752
 				switch ($key) {
1753
-				case 'PLAC':
1754
-					if (preg_match_all('/(' . WT_REGEX_TAG . ')/', $WT_TREE->getPreference('ADVANCED_PLAC_FACTS'), $match)) {
1755
-						foreach ($match[1] as $tag) {
1756
-							self::addSimpleTag('3 ' . $tag, '', GedcomTag::getLabel($level1tag . ':PLAC:' . $tag));
1753
+					case 'PLAC':
1754
+						if (preg_match_all('/(' . WT_REGEX_TAG . ')/', $WT_TREE->getPreference('ADVANCED_PLAC_FACTS'), $match)) {
1755
+							foreach ($match[1] as $tag) {
1756
+								self::addSimpleTag('3 ' . $tag, '', GedcomTag::getLabel($level1tag . ':PLAC:' . $tag));
1757
+							}
1757 1758
 						}
1758
-					}
1759
-					self::addSimpleTag('3 MAP');
1760
-					self::addSimpleTag('4 LATI');
1761
-					self::addSimpleTag('4 LONG');
1762
-					break;
1763
-				case 'FILE':
1764
-					self::addSimpleTag('3 FORM');
1765
-					break;
1766
-				case 'EVEN':
1767
-					self::addSimpleTag('3 DATE');
1768
-					self::addSimpleTag('3 PLAC');
1769
-					break;
1770
-				case 'STAT':
1771
-					if (GedcomCodeTemp::isTagLDS($level1tag)) {
1772
-						self::addSimpleTag('3 DATE', '', GedcomTag::getLabel('STAT:DATE'));
1773
-					}
1774
-					break;
1775
-				case 'DATE':
1776
-					// TIME is NOT a valid 5.5.1 tag
1777
-					if (in_array($level1tag, Config::dateAndTime())) {
1778
-						self::addSimpleTag('3 TIME');
1779
-					}
1780
-					break;
1781
-				case 'HUSB':
1782
-				case 'WIFE':
1783
-					self::addSimpleTag('3 AGE');
1784
-					break;
1785
-				case 'FAMC':
1786
-					if ($level1tag === 'ADOP') {
1787
-						self::addSimpleTag('3 ADOP BOTH');
1788
-					}
1789
-					break;
1759
+						self::addSimpleTag('3 MAP');
1760
+						self::addSimpleTag('4 LATI');
1761
+						self::addSimpleTag('4 LONG');
1762
+						break;
1763
+					case 'FILE':
1764
+						self::addSimpleTag('3 FORM');
1765
+						break;
1766
+					case 'EVEN':
1767
+						self::addSimpleTag('3 DATE');
1768
+						self::addSimpleTag('3 PLAC');
1769
+						break;
1770
+					case 'STAT':
1771
+						if (GedcomCodeTemp::isTagLDS($level1tag)) {
1772
+							self::addSimpleTag('3 DATE', '', GedcomTag::getLabel('STAT:DATE'));
1773
+						}
1774
+						break;
1775
+					case 'DATE':
1776
+						// TIME is NOT a valid 5.5.1 tag
1777
+						if (in_array($level1tag, Config::dateAndTime())) {
1778
+							self::addSimpleTag('3 TIME');
1779
+						}
1780
+						break;
1781
+					case 'HUSB':
1782
+					case 'WIFE':
1783
+						self::addSimpleTag('3 AGE');
1784
+						break;
1785
+					case 'FAMC':
1786
+						if ($level1tag === 'ADOP') {
1787
+							self::addSimpleTag('3 ADOP BOTH');
1788
+						}
1789
+						break;
1790 1790
 				}
1791 1791
 			} elseif ($key === 'DATE' && $add_date) {
1792 1792
 				self::addSimpleTag('2 DATE', $level1tag, GedcomTag::getLabel($level1tag . ':DATE'));
Please login to merge, or discard this patch.
app/Functions/FunctionsPrint.php 1 patch
Switch Indentation   +60 added lines, -60 removed lines patch added patch discarded remove patch
@@ -51,20 +51,20 @@  discard block
 block discarded – undo
51 51
 	public static function printPedigreePerson(Individual $person = null, $show_full = 1) {
52 52
 
53 53
 		switch ($show_full) {
54
-		case 0:
55
-			if ($person) {
56
-				echo Theme::theme()->individualBoxSmall($person);
57
-			} else {
58
-				echo Theme::theme()->individualBoxSmallEmpty();
59
-			}
60
-			break;
61
-		case 1:
62
-			if ($person) {
63
-				echo Theme::theme()->individualBox($person);
64
-			} else {
65
-				echo Theme::theme()->individualBoxEmpty();
66
-			}
67
-			break;
54
+			case 0:
55
+				if ($person) {
56
+					echo Theme::theme()->individualBoxSmall($person);
57
+				} else {
58
+					echo Theme::theme()->individualBoxSmallEmpty();
59
+				}
60
+				break;
61
+			case 1:
62
+				if ($person) {
63
+					echo Theme::theme()->individualBox($person);
64
+				} else {
65
+					echo Theme::theme()->individualBoxEmpty();
66
+				}
67
+				break;
68 68
 		}
69 69
 	}
70 70
 
@@ -260,25 +260,25 @@  discard block
 block discarded – undo
260 260
 					$age      = Date::getAge($parent->getBirthDate(), $birth_date, 2);
261 261
 					$deatdate = $parent->getDeathDate();
262 262
 					switch ($parent->getSex()) {
263
-					case 'F':
264
-						// Highlight mothers who die in childbirth or shortly afterwards
265
-						if ($deatdate->isOK() && $deatdate->maximumJulianDay() < $birth_date->minimumJulianDay() + 90) {
266
-							$html .= ' <span title="' . GedcomTag::getLabel('_DEAT_PARE', $parent) . '" class="parentdeath">' . $sex . $age . '</span>';
267
-						} else {
268
-							$html .= ' <span title="' . I18N::translate('Mother’s age') . '">' . $sex . $age . '</span>';
269
-						}
270
-						break;
271
-					case 'M':
272
-						// Highlight fathers who die before the birth
273
-						if ($deatdate->isOK() && $deatdate->maximumJulianDay() < $birth_date->minimumJulianDay()) {
274
-							$html .= ' <span title="' . GedcomTag::getLabel('_DEAT_PARE', $parent) . '" class="parentdeath">' . $sex . $age . '</span>';
275
-						} else {
276
-							$html .= ' <span title="' . I18N::translate('Father’s age') . '">' . $sex . $age . '</span>';
277
-						}
278
-						break;
279
-					default:
280
-						$html .= ' <span title="' . I18N::translate('Parent’s age') . '">' . $sex . $age . '</span>';
281
-						break;
263
+						case 'F':
264
+							// Highlight mothers who die in childbirth or shortly afterwards
265
+							if ($deatdate->isOK() && $deatdate->maximumJulianDay() < $birth_date->minimumJulianDay() + 90) {
266
+								$html .= ' <span title="' . GedcomTag::getLabel('_DEAT_PARE', $parent) . '" class="parentdeath">' . $sex . $age . '</span>';
267
+							} else {
268
+								$html .= ' <span title="' . I18N::translate('Mother’s age') . '">' . $sex . $age . '</span>';
269
+							}
270
+							break;
271
+						case 'M':
272
+							// Highlight fathers who die before the birth
273
+							if ($deatdate->isOK() && $deatdate->maximumJulianDay() < $birth_date->minimumJulianDay()) {
274
+								$html .= ' <span title="' . GedcomTag::getLabel('_DEAT_PARE', $parent) . '" class="parentdeath">' . $sex . $age . '</span>';
275
+							} else {
276
+								$html .= ' <span title="' . I18N::translate('Father’s age') . '">' . $sex . $age . '</span>';
277
+							}
278
+							break;
279
+						default:
280
+							$html .= ' <span title="' . I18N::translate('Parent’s age') . '">' . $sex . $age . '</span>';
281
+							break;
282 282
 					}
283 283
 				}
284 284
 			}
@@ -573,33 +573,33 @@  discard block
 block discarded – undo
573 573
 
574 574
 		// -- Add from pick list
575 575
 		switch ($type) {
576
-		case "INDI":
577
-			$addfacts    = preg_split("/[, ;:]+/", $WT_TREE->getPreference('INDI_FACTS_ADD'), -1, PREG_SPLIT_NO_EMPTY);
578
-			$uniquefacts = preg_split("/[, ;:]+/", $WT_TREE->getPreference('INDI_FACTS_UNIQUE'), -1, PREG_SPLIT_NO_EMPTY);
579
-			$quickfacts  = preg_split("/[, ;:]+/", $WT_TREE->getPreference('INDI_FACTS_QUICK'), -1, PREG_SPLIT_NO_EMPTY);
580
-			break;
581
-		case "FAM":
582
-			$addfacts    = preg_split("/[, ;:]+/", $WT_TREE->getPreference('FAM_FACTS_ADD'), -1, PREG_SPLIT_NO_EMPTY);
583
-			$uniquefacts = preg_split("/[, ;:]+/", $WT_TREE->getPreference('FAM_FACTS_UNIQUE'), -1, PREG_SPLIT_NO_EMPTY);
584
-			$quickfacts  = preg_split("/[, ;:]+/", $WT_TREE->getPreference('FAM_FACTS_QUICK'), -1, PREG_SPLIT_NO_EMPTY);
585
-			break;
586
-		case "SOUR":
587
-			$addfacts    = preg_split("/[, ;:]+/", $WT_TREE->getPreference('SOUR_FACTS_ADD'), -1, PREG_SPLIT_NO_EMPTY);
588
-			$uniquefacts = preg_split("/[, ;:]+/", $WT_TREE->getPreference('SOUR_FACTS_UNIQUE'), -1, PREG_SPLIT_NO_EMPTY);
589
-			$quickfacts  = preg_split("/[, ;:]+/", $WT_TREE->getPreference('SOUR_FACTS_QUICK'), -1, PREG_SPLIT_NO_EMPTY);
590
-			break;
591
-		case "NOTE":
592
-			$addfacts    = preg_split("/[, ;:]+/", $WT_TREE->getPreference('NOTE_FACTS_ADD'), -1, PREG_SPLIT_NO_EMPTY);
593
-			$uniquefacts = preg_split("/[, ;:]+/", $WT_TREE->getPreference('NOTE_FACTS_UNIQUE'), -1, PREG_SPLIT_NO_EMPTY);
594
-			$quickfacts  = preg_split("/[, ;:]+/", $WT_TREE->getPreference('NOTE_FACTS_QUICK'), -1, PREG_SPLIT_NO_EMPTY);
595
-			break;
596
-		case "REPO":
597
-			$addfacts    = preg_split("/[, ;:]+/", $WT_TREE->getPreference('REPO_FACTS_ADD'), -1, PREG_SPLIT_NO_EMPTY);
598
-			$uniquefacts = preg_split("/[, ;:]+/", $WT_TREE->getPreference('REPO_FACTS_UNIQUE'), -1, PREG_SPLIT_NO_EMPTY);
599
-			$quickfacts  = preg_split("/[, ;:]+/", $WT_TREE->getPreference('REPO_FACTS_QUICK'), -1, PREG_SPLIT_NO_EMPTY);
600
-			break;
601
-		default:
602
-			return;
576
+			case "INDI":
577
+				$addfacts    = preg_split("/[, ;:]+/", $WT_TREE->getPreference('INDI_FACTS_ADD'), -1, PREG_SPLIT_NO_EMPTY);
578
+				$uniquefacts = preg_split("/[, ;:]+/", $WT_TREE->getPreference('INDI_FACTS_UNIQUE'), -1, PREG_SPLIT_NO_EMPTY);
579
+				$quickfacts  = preg_split("/[, ;:]+/", $WT_TREE->getPreference('INDI_FACTS_QUICK'), -1, PREG_SPLIT_NO_EMPTY);
580
+				break;
581
+			case "FAM":
582
+				$addfacts    = preg_split("/[, ;:]+/", $WT_TREE->getPreference('FAM_FACTS_ADD'), -1, PREG_SPLIT_NO_EMPTY);
583
+				$uniquefacts = preg_split("/[, ;:]+/", $WT_TREE->getPreference('FAM_FACTS_UNIQUE'), -1, PREG_SPLIT_NO_EMPTY);
584
+				$quickfacts  = preg_split("/[, ;:]+/", $WT_TREE->getPreference('FAM_FACTS_QUICK'), -1, PREG_SPLIT_NO_EMPTY);
585
+				break;
586
+			case "SOUR":
587
+				$addfacts    = preg_split("/[, ;:]+/", $WT_TREE->getPreference('SOUR_FACTS_ADD'), -1, PREG_SPLIT_NO_EMPTY);
588
+				$uniquefacts = preg_split("/[, ;:]+/", $WT_TREE->getPreference('SOUR_FACTS_UNIQUE'), -1, PREG_SPLIT_NO_EMPTY);
589
+				$quickfacts  = preg_split("/[, ;:]+/", $WT_TREE->getPreference('SOUR_FACTS_QUICK'), -1, PREG_SPLIT_NO_EMPTY);
590
+				break;
591
+			case "NOTE":
592
+				$addfacts    = preg_split("/[, ;:]+/", $WT_TREE->getPreference('NOTE_FACTS_ADD'), -1, PREG_SPLIT_NO_EMPTY);
593
+				$uniquefacts = preg_split("/[, ;:]+/", $WT_TREE->getPreference('NOTE_FACTS_UNIQUE'), -1, PREG_SPLIT_NO_EMPTY);
594
+				$quickfacts  = preg_split("/[, ;:]+/", $WT_TREE->getPreference('NOTE_FACTS_QUICK'), -1, PREG_SPLIT_NO_EMPTY);
595
+				break;
596
+			case "REPO":
597
+				$addfacts    = preg_split("/[, ;:]+/", $WT_TREE->getPreference('REPO_FACTS_ADD'), -1, PREG_SPLIT_NO_EMPTY);
598
+				$uniquefacts = preg_split("/[, ;:]+/", $WT_TREE->getPreference('REPO_FACTS_UNIQUE'), -1, PREG_SPLIT_NO_EMPTY);
599
+				$quickfacts  = preg_split("/[, ;:]+/", $WT_TREE->getPreference('REPO_FACTS_QUICK'), -1, PREG_SPLIT_NO_EMPTY);
600
+				break;
601
+			default:
602
+				return;
603 603
 		}
604 604
 		$addfacts            = array_merge(self::checkFactUnique($uniquefacts, $usedfacts, $type), $addfacts);
605 605
 		$quickfacts          = array_intersect($quickfacts, $addfacts);
Please login to merge, or discard this patch.
app/Functions/FunctionsDb.php 1 patch
Switch Indentation   +100 added lines, -100 removed lines patch added patch discarded remove patch
@@ -249,18 +249,18 @@  discard block
 block discarded – undo
249 249
 	 */
250 250
 	public static function searchIndividualsPhonetic($soundex, $lastname, $firstname, $place, array $trees) {
251 251
 		switch ($soundex) {
252
-		case 'Russell':
253
-			$givn_sdx = Soundex::russell($firstname);
254
-			$surn_sdx = Soundex::russell($lastname);
255
-			$plac_sdx = Soundex::russell($place);
256
-			break;
257
-		case 'DaitchM':
258
-			$givn_sdx = Soundex::daitchMokotoff($firstname);
259
-			$surn_sdx = Soundex::daitchMokotoff($lastname);
260
-			$plac_sdx = Soundex::daitchMokotoff($place);
261
-			break;
262
-		default:
263
-			throw new \DomainException('soundex: ' . $soundex);
252
+			case 'Russell':
253
+				$givn_sdx = Soundex::russell($firstname);
254
+				$surn_sdx = Soundex::russell($lastname);
255
+				$plac_sdx = Soundex::russell($place);
256
+				break;
257
+			case 'DaitchM':
258
+				$givn_sdx = Soundex::daitchMokotoff($firstname);
259
+				$surn_sdx = Soundex::daitchMokotoff($lastname);
260
+				$plac_sdx = Soundex::daitchMokotoff($place);
261
+				break;
262
+			default:
263
+				throw new \DomainException('soundex: ' . $soundex);
264 264
 		}
265 265
 
266 266
 		// Nothing to search for? Return nothing.
@@ -292,12 +292,12 @@  discard block
 block discarded – undo
292 292
 			foreach ($givn_sdx as $n => $sdx) {
293 293
 				$sql .= $n ? " OR " : "";
294 294
 				switch ($soundex) {
295
-				case 'Russell':
296
-					$sql .= "n_soundex_givn_std LIKE CONCAT('%', :given_name_" . $n . ", '%')";
297
-					break;
298
-				case 'DaitchM':
299
-					$sql .= "n_soundex_givn_dm LIKE CONCAT('%', :given_name_" . $n . ", '%')";
300
-					break;
295
+					case 'Russell':
296
+						$sql .= "n_soundex_givn_std LIKE CONCAT('%', :given_name_" . $n . ", '%')";
297
+						break;
298
+					case 'DaitchM':
299
+						$sql .= "n_soundex_givn_dm LIKE CONCAT('%', :given_name_" . $n . ", '%')";
300
+						break;
301 301
 				}
302 302
 				$args['given_name_' . $n] = $sdx;
303 303
 			}
@@ -310,12 +310,12 @@  discard block
 block discarded – undo
310 310
 			foreach ($surn_sdx as $n => $sdx) {
311 311
 				$sql .= $n ? " OR " : "";
312 312
 				switch ($soundex) {
313
-				case 'Russell':
314
-					$sql .= "n_soundex_surn_std LIKE CONCAT('%', :surname_" . $n . ", '%')";
315
-					break;
316
-				case 'DaitchM':
317
-					$sql .= "n_soundex_surn_dm LIKE CONCAT('%', :surname_" . $n . ", '%')";
318
-					break;
313
+					case 'Russell':
314
+						$sql .= "n_soundex_surn_std LIKE CONCAT('%', :surname_" . $n . ", '%')";
315
+						break;
316
+					case 'DaitchM':
317
+						$sql .= "n_soundex_surn_dm LIKE CONCAT('%', :surname_" . $n . ", '%')";
318
+						break;
319 319
 				}
320 320
 				$args['surname_' . $n] = $sdx;
321 321
 			}
@@ -328,12 +328,12 @@  discard block
 block discarded – undo
328 328
 			foreach ($plac_sdx as $n => $sdx) {
329 329
 				$sql .= $n ? " OR " : "";
330 330
 				switch ($soundex) {
331
-				case 'Russell':
332
-					$sql .= "p_std_soundex LIKE CONCAT('%', :place_" . $n . ", '%')";
333
-					break;
334
-				case 'DaitchM':
335
-					$sql .= "p_dm_soundex LIKE CONCAT('%', :place_" . $n . ", '%')";
336
-					break;
331
+					case 'Russell':
332
+						$sql .= "p_std_soundex LIKE CONCAT('%', :place_" . $n . ", '%')";
333
+						break;
334
+					case 'DaitchM':
335
+						$sql .= "p_dm_soundex LIKE CONCAT('%', :place_" . $n . ", '%')";
336
+						break;
337 337
 				}
338 338
 				$args['place_' . $n] = $sdx;
339 339
 			}
@@ -758,82 +758,82 @@  discard block
 block discarded – undo
758 758
 			} else {
759 759
 				// SPECIAL CASES:
760 760
 				switch ($anniv->m) {
761
-				case 2:
762
-					// 29 CSH does not include 30 CSH (but would include an invalid 31 CSH if there were no 30 CSH)
763
-					if ($anniv->d === 1) {
764
-						$where .= " AND d_day <= 1 AND d_mon = 2";
765
-					} elseif ($anniv->d === 30) {
766
-						$where .= " AND d_day >= 30 AND d_mon = 2";
767
-					} elseif ($anniv->d === 29 && $anniv->daysInMonth() === 29) {
768
-						$where .= " AND (d_day = 29 OR d_day > 30) AND d_mon = 2";
769
-					} else {
770
-						$where .= " AND d_day = :day AND d_mon = 2";
771
-						$args['day'] = $anniv->d;
772
-					}
773
-					break;
774
-				case 3:
775
-					// 1 KSL includes 30 CSH (if this year didn’t have 30 CSH)
776
-					// 29 KSL does not include 30 KSL (but would include an invalid 31 KSL if there were no 30 KSL)
777
-					if ($anniv->d === 1) {
778
-						$tmp = new JewishDate(array($anniv->y, 'CSH', 1));
779
-						if ($tmp->daysInMonth() === 29) {
780
-							$where .= " AND (d_day <= 1 AND d_mon = 3 OR d_day = 30 AND d_mon = 2)";
761
+					case 2:
762
+						// 29 CSH does not include 30 CSH (but would include an invalid 31 CSH if there were no 30 CSH)
763
+						if ($anniv->d === 1) {
764
+							$where .= " AND d_day <= 1 AND d_mon = 2";
765
+						} elseif ($anniv->d === 30) {
766
+							$where .= " AND d_day >= 30 AND d_mon = 2";
767
+						} elseif ($anniv->d === 29 && $anniv->daysInMonth() === 29) {
768
+							$where .= " AND (d_day = 29 OR d_day > 30) AND d_mon = 2";
781 769
 						} else {
782
-							$where .= " AND d_day <= 1 AND d_mon = 3";
770
+							$where .= " AND d_day = :day AND d_mon = 2";
771
+							$args['day'] = $anniv->d;
783 772
 						}
784
-					} elseif ($anniv->d === 30) {
785
-						$where .= " AND d_day >= 30 AND d_mon = 3";
786
-					} elseif ($anniv->d == 29 && $anniv->daysInMonth() === 29) {
787
-						$where .= " AND (d_day = 29 OR d_day > 30) AND d_mon = 3";
788
-					} else {
789
-						$where .= " AND d_day = :day AND d_mon = 3";
790
-						$args['day'] = $anniv->d;
791
-					}
792
-					break;
793
-				case 4:
794
-					// 1 TVT includes 30 KSL (if this year didn’t have 30 KSL)
795
-					if ($anniv->d === 1) {
796
-						$tmp = new JewishDate(array($anniv->y, 'KSL', 1));
797
-						if ($tmp->daysInMonth() === 29) {
798
-							$where .= " AND (d_day <=1 AND d_mon = 4 OR d_day = 30 AND d_mon = 3)";
773
+						break;
774
+					case 3:
775
+						// 1 KSL includes 30 CSH (if this year didn’t have 30 CSH)
776
+						// 29 KSL does not include 30 KSL (but would include an invalid 31 KSL if there were no 30 KSL)
777
+						if ($anniv->d === 1) {
778
+							$tmp = new JewishDate(array($anniv->y, 'CSH', 1));
779
+							if ($tmp->daysInMonth() === 29) {
780
+								$where .= " AND (d_day <= 1 AND d_mon = 3 OR d_day = 30 AND d_mon = 2)";
781
+							} else {
782
+								$where .= " AND d_day <= 1 AND d_mon = 3";
783
+							}
784
+						} elseif ($anniv->d === 30) {
785
+							$where .= " AND d_day >= 30 AND d_mon = 3";
786
+						} elseif ($anniv->d == 29 && $anniv->daysInMonth() === 29) {
787
+							$where .= " AND (d_day = 29 OR d_day > 30) AND d_mon = 3";
799 788
 						} else {
800
-							$where .= " AND d_day <= 1 AND d_mon = 4";
789
+							$where .= " AND d_day = :day AND d_mon = 3";
790
+							$args['day'] = $anniv->d;
801 791
 						}
802
-					} elseif ($anniv->d === $anniv->daysInMonth()) {
803
-						$where .= " AND d_day >= :day AND d_mon=4";
804
-						$args['day'] = $anniv->d;
805
-					} else {
806
-						$where .= " AND d_day = :day AND d_mon=4";
807
-						$args['day'] = $anniv->d;
808
-					}
809
-					break;
810
-				case 7: // ADS includes ADR (non-leap)
811
-					if ($anniv->d === 1) {
812
-						$where .= " AND d_day <= 1";
813
-					} elseif ($anniv->d === $anniv->daysInMonth()) {
814
-						$where .= " AND d_day >= :day";
815
-						$args['day'] = $anniv->d;
816
-					} else {
817
-						$where .= " AND d_day = :day";
818
-						$args['day'] = $anniv->d;
819
-					}
820
-					$where .= " AND (d_mon = 6 AND MOD(7 * d_year + 1, 19) >= 7 OR d_mon = 7)";
821
-					break;
822
-				case 8: // 1 NSN includes 30 ADR, if this year is non-leap
823
-					if ($anniv->d === 1) {
824
-						if ($anniv->isLeapYear()) {
825
-							$where .= " AND d_day <= 1 AND d_mon = 8";
792
+						break;
793
+					case 4:
794
+						// 1 TVT includes 30 KSL (if this year didn’t have 30 KSL)
795
+						if ($anniv->d === 1) {
796
+							$tmp = new JewishDate(array($anniv->y, 'KSL', 1));
797
+							if ($tmp->daysInMonth() === 29) {
798
+								$where .= " AND (d_day <=1 AND d_mon = 4 OR d_day = 30 AND d_mon = 3)";
799
+							} else {
800
+								$where .= " AND d_day <= 1 AND d_mon = 4";
801
+							}
802
+						} elseif ($anniv->d === $anniv->daysInMonth()) {
803
+							$where .= " AND d_day >= :day AND d_mon=4";
804
+							$args['day'] = $anniv->d;
826 805
 						} else {
827
-							$where .= " AND (d_day <= 1 AND d_mon = 8 OR d_day = 30 AND d_mon = 6)";
806
+							$where .= " AND d_day = :day AND d_mon=4";
807
+							$args['day'] = $anniv->d;
828 808
 						}
829
-					} elseif ($anniv->d === $anniv->daysInMonth()) {
830
-						$where .= " AND d_day >= :day AND d_mon = 8";
831
-						$args['day'] = $anniv->d;
832
-					} else {
833
-						$where .= " AND d_day = :day AND d_mon = 8";
834
-						$args['day'] = $anniv->d;
835
-					}
836
-					break;
809
+						break;
810
+					case 7: // ADS includes ADR (non-leap)
811
+						if ($anniv->d === 1) {
812
+							$where .= " AND d_day <= 1";
813
+						} elseif ($anniv->d === $anniv->daysInMonth()) {
814
+							$where .= " AND d_day >= :day";
815
+							$args['day'] = $anniv->d;
816
+						} else {
817
+							$where .= " AND d_day = :day";
818
+							$args['day'] = $anniv->d;
819
+						}
820
+						$where .= " AND (d_mon = 6 AND MOD(7 * d_year + 1, 19) >= 7 OR d_mon = 7)";
821
+						break;
822
+					case 8: // 1 NSN includes 30 ADR, if this year is non-leap
823
+						if ($anniv->d === 1) {
824
+							if ($anniv->isLeapYear()) {
825
+								$where .= " AND d_day <= 1 AND d_mon = 8";
826
+							} else {
827
+								$where .= " AND (d_day <= 1 AND d_mon = 8 OR d_day = 30 AND d_mon = 6)";
828
+							}
829
+						} elseif ($anniv->d === $anniv->daysInMonth()) {
830
+							$where .= " AND d_day >= :day AND d_mon = 8";
831
+							$args['day'] = $anniv->d;
832
+						} else {
833
+							$where .= " AND d_day = :day AND d_mon = 8";
834
+							$args['day'] = $anniv->d;
835
+						}
836
+						break;
837 837
 				}
838 838
 			}
839 839
 			// Only events in the past (includes dates without a year)
Please login to merge, or discard this patch.