diff options
104 files changed, 10475 insertions, 10475 deletions
diff --git a/action.php b/action.php index 0f41b969b5..ccd0b182f8 100644 --- a/action.php +++ b/action.php @@ -62,14 +62,14 @@ case 'copy-fact': foreach ($record->getFacts() as $fact) { if ($fact->getFactId() == $fact_id) { switch ($fact->getTag()) { - case 'NOTE': - case 'SOUR': - case 'OBJE': - $type = 'all'; // paste this anywhere - break; - default: - $type = $record::RECORD_TYPE; // paste only to the same record type - break; + case 'NOTE': + case 'SOUR': + case 'OBJE': + $type = 'all'; // paste this anywhere + break; + default: + $type = $record::RECORD_TYPE; // paste only to the same record type + break; } $clipboard = Session::get('clipboard'); if (!is_array($clipboard)) { diff --git a/admin_media.php b/admin_media.php index 2cbd336734..aea4ecd47d 100644 --- a/admin_media.php +++ b/admin_media.php @@ -88,104 +88,104 @@ if ($delete_file) { //////////////////////////////////////////////////////////////////////////////// switch ($action) { -case 'load_json': - $search = Filter::get('search'); - $search = $search['value']; - $start = Filter::getInteger('start'); - $length = Filter::getInteger('length'); + case 'load_json': + $search = Filter::get('search'); + $search = $search['value']; + $start = Filter::getInteger('start'); + $length = Filter::getInteger('length'); - switch ($files) { - case 'local': - // Filtered rows - $SELECT1 = - "SELECT SQL_CACHE SQL_CALC_FOUND_ROWS TRIM(LEADING :media_path_1 FROM multimedia_file_refn) AS media_path, m_id AS xref, descriptive_title, m_file AS gedcom_id, m_gedcom AS gedcom" . - " FROM `##media`" . - " JOIN `##media_file` USING (m_file, m_id)" . - " JOIN `##gedcom_setting` ON (m_file = gedcom_id AND setting_name = 'MEDIA_DIRECTORY')" . - " JOIN `##gedcom` USING (gedcom_id)" . - " WHERE setting_value = :media_folder" . - " AND multimedia_file_refn LIKE CONCAT(:media_path_2, '%')" . - " AND (SUBSTRING_INDEX(multimedia_file_refn, '/', -1) LIKE CONCAT('%', :search_1, '%')" . - " OR descriptive_title LIKE CONCAT('%', :search_2, '%'))" . - " AND multimedia_file_refn NOT LIKE 'http://%'" . - " AND multimedia_file_refn NOT LIKE 'https://%'"; - $ARGS1 = [ - 'media_path_1' => $media_path, - 'media_folder' => $media_folder, - 'media_path_2' => Database::escapeLike($media_path), - 'search_1' => Database::escapeLike($search), - 'search_2' => Database::escapeLike($search), - ]; - // Unfiltered rows - $SELECT2 = - "SELECT SQL_CACHE COUNT(*)" . - " FROM `##media`" . - " JOIN `##media_file` USING (m_file, m_id)" . - " JOIN `##gedcom_setting` ON (m_file = gedcom_id AND setting_name = 'MEDIA_DIRECTORY')" . - " WHERE setting_value = :media_folder" . - " AND multimedia_file_refn LIKE CONCAT(:media_path_3, '%')" . - " AND multimedia_file_refn NOT LIKE 'http://%'" . - " AND multimedia_file_refn NOT LIKE 'https://%'"; - $ARGS2 = [ - 'media_folder' => $media_folder, - 'media_path_3' => $media_path, - ]; + switch ($files) { + case 'local': + // Filtered rows + $SELECT1 = + "SELECT SQL_CACHE SQL_CALC_FOUND_ROWS TRIM(LEADING :media_path_1 FROM multimedia_file_refn) AS media_path, m_id AS xref, descriptive_title, m_file AS gedcom_id, m_gedcom AS gedcom" . + " FROM `##media`" . + " JOIN `##media_file` USING (m_file, m_id)" . + " JOIN `##gedcom_setting` ON (m_file = gedcom_id AND setting_name = 'MEDIA_DIRECTORY')" . + " JOIN `##gedcom` USING (gedcom_id)" . + " WHERE setting_value = :media_folder" . + " AND multimedia_file_refn LIKE CONCAT(:media_path_2, '%')" . + " AND (SUBSTRING_INDEX(multimedia_file_refn, '/', -1) LIKE CONCAT('%', :search_1, '%')" . + " OR descriptive_title LIKE CONCAT('%', :search_2, '%'))" . + " AND multimedia_file_refn NOT LIKE 'http://%'" . + " AND multimedia_file_refn NOT LIKE 'https://%'"; + $ARGS1 = [ + 'media_path_1' => $media_path, + 'media_folder' => $media_folder, + 'media_path_2' => Database::escapeLike($media_path), + 'search_1' => Database::escapeLike($search), + 'search_2' => Database::escapeLike($search), + ]; + // Unfiltered rows + $SELECT2 = + "SELECT SQL_CACHE COUNT(*)" . + " FROM `##media`" . + " JOIN `##media_file` USING (m_file, m_id)" . + " JOIN `##gedcom_setting` ON (m_file = gedcom_id AND setting_name = 'MEDIA_DIRECTORY')" . + " WHERE setting_value = :media_folder" . + " AND multimedia_file_refn LIKE CONCAT(:media_path_3, '%')" . + " AND multimedia_file_refn NOT LIKE 'http://%'" . + " AND multimedia_file_refn NOT LIKE 'https://%'"; + $ARGS2 = [ + 'media_folder' => $media_folder, + 'media_path_3' => $media_path, + ]; - if ($subfolders == 'exclude') { - $SELECT1 .= " AND multimedia_file_refn NOT LIKE CONCAT(:media_path_4, '%/%')"; - $ARGS1['media_path_4'] = Database::escapeLike($media_path); - $SELECT2 .= " AND multimedia_file_refn NOT LIKE CONCAT(:media_path_4, '%/%')"; - $ARGS2['media_path_4'] = Database::escapeLike($media_path); - } - - $order = Filter::getArray('order'); - $SELECT1 .= " ORDER BY "; - if ($order) { - foreach ($order as $key => $value) { - if ($key > 0) { - $SELECT1 .= ','; + if ($subfolders == 'exclude') { + $SELECT1 .= " AND multimedia_file_refn NOT LIKE CONCAT(:media_path_4, '%/%')"; + $ARGS1['media_path_4'] = Database::escapeLike($media_path); + $SELECT2 .= " AND multimedia_file_refn NOT LIKE CONCAT(:media_path_4, '%/%')"; + $ARGS2['media_path_4'] = Database::escapeLike($media_path); } - // Datatables numbers columns 0, 1, 2 - // MySQL numbers columns 1, 2, 3 - switch ($value['dir']) { - case 'asc': - $SELECT1 .= ":col_" . $key . " ASC"; - break; - case 'desc': - $SELECT1 .= ":col_" . $key . " DESC"; - break; + + $order = Filter::getArray('order'); + $SELECT1 .= " ORDER BY "; + if ($order) { + foreach ($order as $key => $value) { + if ($key > 0) { + $SELECT1 .= ','; + } + // Datatables numbers columns 0, 1, 2 + // MySQL numbers columns 1, 2, 3 + switch ($value['dir']) { + case 'asc': + $SELECT1 .= ":col_" . $key . " ASC"; + break; + case 'desc': + $SELECT1 .= ":col_" . $key . " DESC"; + break; + } + $ARGS1['col_' . $key] = 1 + $value['column']; } - $ARGS1['col_' . $key] = 1 + $value['column']; + } else { + $SELECT1 = " 1 ASC"; } - } else { - $SELECT1 = " 1 ASC"; - } - if ($length > 0) { - $SELECT1 .= " LIMIT :length OFFSET :start"; - $ARGS1['length'] = $length; - $ARGS1['start'] = $start; - } + if ($length > 0) { + $SELECT1 .= " LIMIT :length OFFSET :start"; + $ARGS1['length'] = $length; + $ARGS1['start'] = $start; + } - $rows = Database::prepare($SELECT1)->execute($ARGS1)->fetchAll(); - // Total filtered/unfiltered rows - $recordsFiltered = Database::prepare("SELECT FOUND_ROWS()")->fetchOne(); - $recordsTotal = Database::prepare($SELECT2)->execute($ARGS2)->fetchOne(); + $rows = Database::prepare($SELECT1)->execute($ARGS1)->fetchAll(); + // Total filtered/unfiltered rows + $recordsFiltered = Database::prepare("SELECT FOUND_ROWS()")->fetchOne(); + $recordsTotal = Database::prepare($SELECT2)->execute($ARGS2)->fetchOne(); - $data = []; - foreach ($rows as $row) { - $media = Media::getInstance($row->xref, Tree::findById($row->gedcom_id), $row->gedcom); - $media_files = $media->mediaFiles(); - $media_files = array_map(function(MediaFile $media_file) { - return $media_file->displayImage(150, 150, '', []); - }, $media_files); - $data[] = [ - mediaFileInfo($media_folder, $media_path, $row->media_path), - implode('', $media_files), - mediaObjectInfo($media), - ]; - } - break; + $data = []; + foreach ($rows as $row) { + $media = Media::getInstance($row->xref, Tree::findById($row->gedcom_id), $row->gedcom); + $media_files = $media->mediaFiles(); + $media_files = array_map(function(MediaFile $media_file) { + return $media_file->displayImage(150, 150, '', []); + }, $media_files); + $data[] = [ + mediaFileInfo($media_folder, $media_path, $row->media_path), + implode('', $media_files), + mediaObjectInfo($media), + ]; + } + break; case 'external': // Filtered rows @@ -216,12 +216,12 @@ case 'load_json': // Datatables numbers columns 0, 1, 2 // MySQL numbers columns 1, 2, 3 switch ($value['dir']) { - case 'asc': - $SELECT1 .= ":col_" . $key . " ASC"; - break; - case 'desc': - $SELECT1 .= ":col_" . $key . " DESC"; - break; + case 'asc': + $SELECT1 .= ":col_" . $key . " ASC"; + break; + case 'desc': + $SELECT1 .= ":col_" . $key . " DESC"; + break; } $ARGS1['col_' . $key] = 1 + $value['column']; } diff --git a/admin_pgv_to_wt.php b/admin_pgv_to_wt.php index 36546a33a7..c2a3dd73d9 100644 --- a/admin_pgv_to_wt.php +++ b/admin_pgv_to_wt.php @@ -777,69 +777,69 @@ foreach ($GEDCOMS as $GEDCOM => $GED_DATA) { $stmt_gedcom_setting->execute([$GED_DATA['id'], 'INDI_FACTS_QUICK', $INDI_FACTS_QUICK]); $stmt_gedcom_setting->execute([$GED_DATA['id'], 'INDI_FACTS_UNIQUE', $INDI_FACTS_UNIQUE]); switch ($LANGUAGE) { - case 'catalan': - $stmt_gedcom_setting->execute([$GED_DATA['id'], 'LANGUAGE', 'ca']); - break; - case 'english-uk': - $stmt_gedcom_setting->execute([$GED_DATA['id'], 'LANGUAGE', 'en-GB']); - break; - case 'polish': - $stmt_gedcom_setting->execute([$GED_DATA['id'], 'LANGUAGE', 'pl']); - break; - case 'italian': - $stmt_gedcom_setting->execute([$GED_DATA['id'], 'LANGUAGE', 'it']); - break; - case 'spanish': - $stmt_gedcom_setting->execute([$GED_DATA['id'], 'LANGUAGE', 'es']); - break; - case 'finnish': - $stmt_gedcom_setting->execute([$GED_DATA['id'], 'LANGUAGE', 'fi']); - break; - case 'french': - $stmt_gedcom_setting->execute([$GED_DATA['id'], 'LANGUAGE', 'fr']); - break; - case 'german': - $stmt_gedcom_setting->execute([$GED_DATA['id'], 'LANGUAGE', 'de']); - break; - case 'danish': - $stmt_gedcom_setting->execute([$GED_DATA['id'], 'LANGUAGE', 'da']); - break; - case 'portuguese': - $stmt_gedcom_setting->execute([$GED_DATA['id'], 'LANGUAGE', 'pt']); - break; - case 'hebrew': - $stmt_gedcom_setting->execute([$GED_DATA['id'], 'LANGUAGE', 'he']); - break; - case 'estonian': - $stmt_gedcom_setting->execute([$GED_DATA['id'], 'LANGUAGE', 'et']); - break; - case 'turkish': - $stmt_gedcom_setting->execute([$GED_DATA['id'], 'LANGUAGE', 'tr']); - break; - case 'dutch': - $stmt_gedcom_setting->execute([$GED_DATA['id'], 'LANGUAGE', 'nl']); - break; - case 'slovak': - $stmt_gedcom_setting->execute([$GED_DATA['id'], 'LANGUAGE', 'sk']); - break; - case 'norwegian': - $stmt_gedcom_setting->execute([$GED_DATA['id'], 'LANGUAGE', 'nn']); - break; - case 'slovenian': - $stmt_gedcom_setting->execute([$GED_DATA['id'], 'LANGUAGE', 'sl']); - break; - case 'hungarian': - $stmt_gedcom_setting->execute([$GED_DATA['id'], 'LANGUAGE', 'hu']); - break; - case 'swedish': - $stmt_gedcom_setting->execute([$GED_DATA['id'], 'LANGUAGE', 'sv']); - break; - case 'russian': - $stmt_gedcom_setting->execute([$GED_DATA['id'], 'LANGUAGE', 'ru']); - break; - default: - $stmt_gedcom_setting->execute([$GED_DATA['id'], 'LANGUAGE', 'en-US']); - break; + case 'catalan': + $stmt_gedcom_setting->execute([$GED_DATA['id'], 'LANGUAGE', 'ca']); + break; + case 'english-uk': + $stmt_gedcom_setting->execute([$GED_DATA['id'], 'LANGUAGE', 'en-GB']); + break; + case 'polish': + $stmt_gedcom_setting->execute([$GED_DATA['id'], 'LANGUAGE', 'pl']); + break; + case 'italian': + $stmt_gedcom_setting->execute([$GED_DATA['id'], 'LANGUAGE', 'it']); + break; + case 'spanish': + $stmt_gedcom_setting->execute([$GED_DATA['id'], 'LANGUAGE', 'es']); + break; + case 'finnish': + $stmt_gedcom_setting->execute([$GED_DATA['id'], 'LANGUAGE', 'fi']); + break; + case 'french': + $stmt_gedcom_setting->execute([$GED_DATA['id'], 'LANGUAGE', 'fr']); + break; + case 'german': + $stmt_gedcom_setting->execute([$GED_DATA['id'], 'LANGUAGE', 'de']); + break; + case 'danish': + $stmt_gedcom_setting->execute([$GED_DATA['id'], 'LANGUAGE', 'da']); + break; + case 'portuguese': + $stmt_gedcom_setting->execute([$GED_DATA['id'], 'LANGUAGE', 'pt']); + break; + case 'hebrew': + $stmt_gedcom_setting->execute([$GED_DATA['id'], 'LANGUAGE', 'he']); + break; + case 'estonian': + $stmt_gedcom_setting->execute([$GED_DATA['id'], 'LANGUAGE', 'et']); + break; + case 'turkish': + $stmt_gedcom_setting->execute([$GED_DATA['id'], 'LANGUAGE', 'tr']); + break; + case 'dutch': + $stmt_gedcom_setting->execute([$GED_DATA['id'], 'LANGUAGE', 'nl']); + break; + case 'slovak': + $stmt_gedcom_setting->execute([$GED_DATA['id'], 'LANGUAGE', 'sk']); + break; + case 'norwegian': + $stmt_gedcom_setting->execute([$GED_DATA['id'], 'LANGUAGE', 'nn']); + break; + case 'slovenian': + $stmt_gedcom_setting->execute([$GED_DATA['id'], 'LANGUAGE', 'sl']); + break; + case 'hungarian': + $stmt_gedcom_setting->execute([$GED_DATA['id'], 'LANGUAGE', 'hu']); + break; + case 'swedish': + $stmt_gedcom_setting->execute([$GED_DATA['id'], 'LANGUAGE', 'sv']); + break; + case 'russian': + $stmt_gedcom_setting->execute([$GED_DATA['id'], 'LANGUAGE', 'ru']); + break; + default: + $stmt_gedcom_setting->execute([$GED_DATA['id'], 'LANGUAGE', 'en-US']); + break; } $stmt_gedcom_setting->execute([$GED_DATA['id'], 'MAX_ALIVE_AGE', $MAX_ALIVE_AGE]); $stmt_gedcom_setting->execute([$GED_DATA['id'], 'MAX_DESCENDANCY_GENERATIONS', $MAX_DESCENDANCY_GENERATIONS]); @@ -892,26 +892,26 @@ foreach ($GEDCOMS as $GEDCOM => $GED_DATA) { $stmt_gedcom_setting->execute([$GED_DATA['id'], 'SURNAME_LIST_STYLE', $SURNAME_LIST_STYLE]); $stmt_gedcom_setting->execute([$GED_DATA['id'], 'SURNAME_TRADITION', $SURNAME_TRADITION]); switch ($THEME_DIR) { - case '': - $stmt_gedcom_setting->execute([$GED_DATA['id'], 'THEME_DIR', '']); - break; - case 'themes/cloudy/': - $stmt_gedcom_setting->execute([$GED_DATA['id'], 'THEME_DIR', 'clouds']); - break; - case 'themes/minimal/': - $stmt_gedcom_setting->execute([$GED_DATA['id'], 'THEME_DIR', 'minimal']); - break; - case 'themes/simplyblue/': - case 'themes/simplygreen/': - case 'themes/simplyred/': - $stmt_gedcom_setting->execute([$GED_DATA['id'], 'THEME_DIR', 'colors']); - break; - case 'themes/xenea/': - $stmt_gedcom_setting->execute([$GED_DATA['id'], 'THEME_DIR', 'xenea']); - break; - default: - $stmt_gedcom_setting->execute([$GED_DATA['id'], 'THEME_DIR', 'webtrees']); - break; + case '': + $stmt_gedcom_setting->execute([$GED_DATA['id'], 'THEME_DIR', '']); + break; + case 'themes/cloudy/': + $stmt_gedcom_setting->execute([$GED_DATA['id'], 'THEME_DIR', 'clouds']); + break; + case 'themes/minimal/': + $stmt_gedcom_setting->execute([$GED_DATA['id'], 'THEME_DIR', 'minimal']); + break; + case 'themes/simplyblue/': + case 'themes/simplygreen/': + case 'themes/simplyred/': + $stmt_gedcom_setting->execute([$GED_DATA['id'], 'THEME_DIR', 'colors']); + break; + case 'themes/xenea/': + $stmt_gedcom_setting->execute([$GED_DATA['id'], 'THEME_DIR', 'xenea']); + break; + default: + $stmt_gedcom_setting->execute([$GED_DATA['id'], 'THEME_DIR', 'webtrees']); + break; } $stmt_gedcom_setting->execute([$GED_DATA['id'], 'USE_RELATIONSHIP_PRIVACY', $USE_RELATIONSHIP_PRIVACY]); $user = User::findByIdentifier($WEBMASTER_EMAIL); diff --git a/admin_site_config.php b/admin_site_config.php index 5e3092f285..d340f46775 100644 --- a/admin_site_config.php +++ b/admin_site_config.php @@ -24,84 +24,84 @@ $controller = new PageController; $controller->restrictAccess(Auth::isAdmin()); switch (Filter::post('action')) { -case 'site': - if (Filter::checkCsrf()) { - $INDEX_DIRECTORY = Filter::post('INDEX_DIRECTORY'); - if (substr($INDEX_DIRECTORY, -1) !== '/') { - $INDEX_DIRECTORY .= '/'; - } - if (File::mkdir($INDEX_DIRECTORY)) { - Site::setPreference('INDEX_DIRECTORY', $INDEX_DIRECTORY); - } else { - FlashMessages::addMessage(I18N::translate('The folder %s does not exist, and it could not be created.', Html::escape($INDEX_DIRECTORY)), 'danger'); + case 'site': + if (Filter::checkCsrf()) { + $INDEX_DIRECTORY = Filter::post('INDEX_DIRECTORY'); + if (substr($INDEX_DIRECTORY, -1) !== '/') { + $INDEX_DIRECTORY .= '/'; + } + if (File::mkdir($INDEX_DIRECTORY)) { + Site::setPreference('INDEX_DIRECTORY', $INDEX_DIRECTORY); + } else { + FlashMessages::addMessage(I18N::translate('The folder %s does not exist, and it could not be created.', Html::escape($INDEX_DIRECTORY)), 'danger'); + } + Site::setPreference('MEMORY_LIMIT', Filter::post('MEMORY_LIMIT')); + Site::setPreference('MAX_EXECUTION_TIME', Filter::post('MAX_EXECUTION_TIME')); + Site::setPreference('ALLOW_USER_THEMES', Filter::postBool('ALLOW_USER_THEMES')); + Site::setPreference('THEME_DIR', Filter::post('THEME_DIR')); + Site::setPreference('ALLOW_CHANGE_GEDCOM', Filter::postBool('ALLOW_CHANGE_GEDCOM')); + Site::setPreference('SESSION_TIME', Filter::post('SESSION_TIME')); + Site::setPreference('TIMEZONE', Filter::post('TIMEZONE')); + FlashMessages::addMessage(I18N::translate('The website preferences have been updated.'), 'success'); } - Site::setPreference('MEMORY_LIMIT', Filter::post('MEMORY_LIMIT')); - Site::setPreference('MAX_EXECUTION_TIME', Filter::post('MAX_EXECUTION_TIME')); - Site::setPreference('ALLOW_USER_THEMES', Filter::postBool('ALLOW_USER_THEMES')); - Site::setPreference('THEME_DIR', Filter::post('THEME_DIR')); - Site::setPreference('ALLOW_CHANGE_GEDCOM', Filter::postBool('ALLOW_CHANGE_GEDCOM')); - Site::setPreference('SESSION_TIME', Filter::post('SESSION_TIME')); - Site::setPreference('TIMEZONE', Filter::post('TIMEZONE')); - FlashMessages::addMessage(I18N::translate('The website preferences have been updated.'), 'success'); - } - header('Location: ' . route('admin-control-panel')); + header('Location: ' . route('admin-control-panel')); - return; + return; -case 'email': - if (Filter::checkCsrf()) { - Site::setPreference('SMTP_ACTIVE', Filter::post('SMTP_ACTIVE')); - Site::setPreference('SMTP_FROM_NAME', Filter::post('SMTP_FROM_NAME')); - Site::setPreference('SMTP_HOST', Filter::post('SMTP_HOST')); - Site::setPreference('SMTP_PORT', Filter::post('SMTP_PORT')); - Site::setPreference('SMTP_AUTH', Filter::post('SMTP_AUTH')); - Site::setPreference('SMTP_AUTH_USER', Filter::post('SMTP_AUTH_USER')); - Site::setPreference('SMTP_SSL', Filter::post('SMTP_SSL')); - Site::setPreference('SMTP_HELO', Filter::post('SMTP_HELO')); - if (Filter::post('SMTP_AUTH_PASS')) { - Site::setPreference('SMTP_AUTH_PASS', Filter::post('SMTP_AUTH_PASS')); + case 'email': + if (Filter::checkCsrf()) { + Site::setPreference('SMTP_ACTIVE', Filter::post('SMTP_ACTIVE')); + Site::setPreference('SMTP_FROM_NAME', Filter::post('SMTP_FROM_NAME')); + Site::setPreference('SMTP_HOST', Filter::post('SMTP_HOST')); + Site::setPreference('SMTP_PORT', Filter::post('SMTP_PORT')); + Site::setPreference('SMTP_AUTH', Filter::post('SMTP_AUTH')); + Site::setPreference('SMTP_AUTH_USER', Filter::post('SMTP_AUTH_USER')); + Site::setPreference('SMTP_SSL', Filter::post('SMTP_SSL')); + Site::setPreference('SMTP_HELO', Filter::post('SMTP_HELO')); + if (Filter::post('SMTP_AUTH_PASS')) { + Site::setPreference('SMTP_AUTH_PASS', Filter::post('SMTP_AUTH_PASS')); + } + FlashMessages::addMessage(I18N::translate('The website preferences have been updated.'), 'success'); } - FlashMessages::addMessage(I18N::translate('The website preferences have been updated.'), 'success'); - } - header('Location: ' . route('admin-control-panel')); + header('Location: ' . route('admin-control-panel')); - return; -case 'login': - if (Filter::checkCsrf()) { - Site::setPreference('LOGIN_URL', Filter::post('LOGIN_URL')); - Site::setPreference('WELCOME_TEXT_AUTH_MODE', Filter::post('WELCOME_TEXT_AUTH_MODE')); - Site::setPreference('WELCOME_TEXT_AUTH_MODE_' . WT_LOCALE, Filter::post('WELCOME_TEXT_AUTH_MODE_4')); - Site::setPreference('USE_REGISTRATION_MODULE', Filter::postBool('USE_REGISTRATION_MODULE')); - Site::setPreference('SHOW_REGISTER_CAUTION', Filter::postBool('SHOW_REGISTER_CAUTION')); - FlashMessages::addMessage(I18N::translate('The website preferences have been updated.'), 'success'); - } - header('Location: ' . route('admin-control-panel')); + return; + case 'login': + if (Filter::checkCsrf()) { + Site::setPreference('LOGIN_URL', Filter::post('LOGIN_URL')); + Site::setPreference('WELCOME_TEXT_AUTH_MODE', Filter::post('WELCOME_TEXT_AUTH_MODE')); + Site::setPreference('WELCOME_TEXT_AUTH_MODE_' . WT_LOCALE, Filter::post('WELCOME_TEXT_AUTH_MODE_4')); + Site::setPreference('USE_REGISTRATION_MODULE', Filter::postBool('USE_REGISTRATION_MODULE')); + Site::setPreference('SHOW_REGISTER_CAUTION', Filter::postBool('SHOW_REGISTER_CAUTION')); + FlashMessages::addMessage(I18N::translate('The website preferences have been updated.'), 'success'); + } + header('Location: ' . route('admin-control-panel')); - return; + return; -case 'tracking': - if (Filter::checkCsrf()) { - Site::setPreference('BING_WEBMASTER_ID', Filter::post('BING_WEBMASTER_ID')); - Site::setPreference('GOOGLE_WEBMASTER_ID', Filter::post('GOOGLE_WEBMASTER_ID')); - Site::setPreference('GOOGLE_ANALYTICS_ID', Filter::post('GOOGLE_ANALYTICS_ID')); - Site::setPreference('PIWIK_URL', Filter::post('PIWIK_URL')); - Site::setPreference('PIWIK_SITE_ID', Filter::post('PIWIK_SITE_ID')); - Site::setPreference('STATCOUNTER_PROJECT_ID', Filter::post('STATCOUNTER_PROJECT_ID')); - Site::setPreference('STATCOUNTER_SECURITY_ID', Filter::post('STATCOUNTER_SECURITY_ID')); - FlashMessages::addMessage(I18N::translate('The website preferences have been updated.'), 'success'); - } - header('Location: ' . route('admin-control-panel')); + case 'tracking': + if (Filter::checkCsrf()) { + Site::setPreference('BING_WEBMASTER_ID', Filter::post('BING_WEBMASTER_ID')); + Site::setPreference('GOOGLE_WEBMASTER_ID', Filter::post('GOOGLE_WEBMASTER_ID')); + Site::setPreference('GOOGLE_ANALYTICS_ID', Filter::post('GOOGLE_ANALYTICS_ID')); + Site::setPreference('PIWIK_URL', Filter::post('PIWIK_URL')); + Site::setPreference('PIWIK_SITE_ID', Filter::post('PIWIK_SITE_ID')); + Site::setPreference('STATCOUNTER_PROJECT_ID', Filter::post('STATCOUNTER_PROJECT_ID')); + Site::setPreference('STATCOUNTER_SECURITY_ID', Filter::post('STATCOUNTER_SECURITY_ID')); + FlashMessages::addMessage(I18N::translate('The website preferences have been updated.'), 'success'); + } + header('Location: ' . route('admin-control-panel')); - return; + return; -case 'languages': - if (Filter::checkCsrf()) { - Site::setPreference('LANGUAGES', implode(',', Filter::postArray('LANGUAGES'))); - FlashMessages::addMessage(I18N::translate('The website preferences have been updated.'), 'success'); - } - header('Location: ' . route('admin-control-panel')); + case 'languages': + if (Filter::checkCsrf()) { + Site::setPreference('LANGUAGES', implode(',', Filter::postArray('LANGUAGES'))); + FlashMessages::addMessage(I18N::translate('The website preferences have been updated.'), 'success'); + } + header('Location: ' . route('admin-control-panel')); - return; + return; } // Lists of options for <select> controls. diff --git a/admin_site_logs.php b/admin_site_logs.php index 80cca08ae4..a9026f419b 100644 --- a/admin_site_logs.php +++ b/admin_site_logs.php @@ -131,12 +131,12 @@ case 'load_json': // Datatables numbers columns 0, 1, 2 // MySQL numbers columns 1, 2, 3 switch ($value['dir']) { - case 'asc': - $order_by .= (1 + $value['column']) . " ASC "; - break; - case 'desc': - $order_by .= (1 + $value['column']) . " DESC "; - break; + case 'asc': + $order_by .= (1 + $value['column']) . " ASC "; + break; + case 'desc': + $order_by .= (1 + $value['column']) . " DESC "; + break; } } } else { diff --git a/admin_site_upgrade.php b/admin_site_upgrade.php index 7947b11004..c562314200 100644 --- a/admin_site_upgrade.php +++ b/admin_site_upgrade.php @@ -118,18 +118,18 @@ $custom_modules = false; foreach (Module::getInstalledModules('disabled') as $module) { if (!in_array($module->getName(), Module::getCoreModuleNames())) { switch ($modules_action) { - case 'disable': - Database::prepare( - "UPDATE `##module` SET status = 'disabled' WHERE module_name = ?" - )->execute([$module->getName()]); - break; - case 'ignore': - echo '<br>', I18N::translate('Custom module'), ' — ', WT_MODULES_DIR, $module->getName(), ' — ', $module->getTitle(), $icon_success; - break; - default: - echo '<br>', I18N::translate('Custom module'), ' — ', WT_MODULES_DIR, $module->getName(), ' — ', $module->getTitle(), $icon_failure; - $custom_modules = true; - break; + case 'disable': + Database::prepare( + "UPDATE `##module` SET status = 'disabled' WHERE module_name = ?" + )->execute([$module->getName()]); + break; + case 'ignore': + echo '<br>', I18N::translate('Custom module'), ' — ', WT_MODULES_DIR, $module->getName(), ' — ', $module->getTitle(), $icon_success; + break; + default: + echo '<br>', I18N::translate('Custom module'), ' — ', WT_MODULES_DIR, $module->getName(), ' — ', $module->getTitle(), $icon_failure; + $custom_modules = true; + break; } } } @@ -158,40 +158,40 @@ echo '<li>', /* I18N: The system is about to… */ I18N::translate('Check for cu $custom_themes = false; foreach (Theme::themeNames() as $theme_id => $theme_name) { switch ($theme_id) { - case 'clouds': - case 'colors': - case 'fab': - case 'minimal': - case 'webtrees': - case 'xenea': - break; - default: - $theme_used = Database::prepare( - "SELECT EXISTS (SELECT 1 FROM `##site_setting` WHERE setting_name='THEME_DIR' AND setting_value=?)" . - " OR EXISTS (SELECT 1 FROM `##gedcom_setting` WHERE setting_name='THEME_DIR' AND setting_value=?)" . - " OR EXISTS (SELECT 1 FROM `##user_setting` WHERE setting_name='theme' AND setting_value=?)" - )->execute([$theme_id, $theme_id, $theme_id])->fetchOne(); - if ($theme_used) { - switch ($themes_action) { - case 'disable': - Database::prepare( - "DELETE FROM `##site_setting` WHERE setting_name = 'THEME_DIR' AND setting_value = ?" - )->execute([$theme_id]); - Database::prepare( - "DELETE FROM `##gedcom_setting` WHERE setting_name = 'THEME_DIR' AND setting_value = ?" - )->execute([$theme_id]); - Database::prepare( - "DELETE FROM `##user_setting` WHERE setting_name = 'theme' AND setting_value = ?" - )->execute([$theme_id]); - break; - case 'ignore': - echo '<br>', I18N::translate('Custom theme'), ' — ', $theme_id, ' — ', $theme_name, $icon_success; - break; - default: - echo '<br>', I18N::translate('Custom theme'), ' — ', $theme_id, ' — ', $theme_name, $icon_failure; - $custom_themes = true; - break; - } + case 'clouds': + case 'colors': + case 'fab': + case 'minimal': + case 'webtrees': + case 'xenea': + break; + default: + $theme_used = Database::prepare( + "SELECT EXISTS (SELECT 1 FROM `##site_setting` WHERE setting_name='THEME_DIR' AND setting_value=?)" . + " OR EXISTS (SELECT 1 FROM `##gedcom_setting` WHERE setting_name='THEME_DIR' AND setting_value=?)" . + " OR EXISTS (SELECT 1 FROM `##user_setting` WHERE setting_name='theme' AND setting_value=?)" + )->execute([$theme_id, $theme_id, $theme_id])->fetchOne(); + if ($theme_used) { + switch ($themes_action) { + case 'disable': + Database::prepare( + "DELETE FROM `##site_setting` WHERE setting_name = 'THEME_DIR' AND setting_value = ?" + )->execute([$theme_id]); + Database::prepare( + "DELETE FROM `##gedcom_setting` WHERE setting_name = 'THEME_DIR' AND setting_value = ?" + )->execute([$theme_id]); + Database::prepare( + "DELETE FROM `##user_setting` WHERE setting_name = 'theme' AND setting_value = ?" + )->execute([$theme_id]); + break; + case 'ignore': + echo '<br>', I18N::translate('Custom theme'), ' — ', $theme_id, ' — ', $theme_name, $icon_success; + break; + default: + echo '<br>', I18N::translate('Custom theme'), ' — ', $theme_id, ' — ', $theme_name, $icon_failure; + $custom_themes = true; + break; + } } break; } diff --git a/admin_trees_config.php b/admin_trees_config.php index 8f2c000364..065d8f6d52 100644 --- a/admin_trees_config.php +++ b/admin_trees_config.php @@ -106,119 +106,119 @@ $CALENDAR_FORMATS = explode('_and_', $WT_TREE->getPreference('CALENDAR_FORMAT') $relatives_events = explode(',', $WT_TREE->getPreference('SHOW_RELATIVES_EVENTS')); switch (Filter::post('action')) { -case 'general': - if (!Filter::checkCsrf()) { - break; - } + case 'general': + if (!Filter::checkCsrf()) { + break; + } - // Coming soon - if (Filter::postBool('all_trees')) { - FlashMessages::addMessage(I18N::translate('The preferences for all family trees have been updated.', $WT_TREE->getTitleHtml()), 'success'); - } - if (Filter::postBool('new_trees')) { - FlashMessages::addMessage(I18N::translate('The preferences for new family trees have been updated.', $WT_TREE->getTitleHtml()), 'success'); - } + // Coming soon + if (Filter::postBool('all_trees')) { + FlashMessages::addMessage(I18N::translate('The preferences for all family trees have been updated.', $WT_TREE->getTitleHtml()), 'success'); + } + if (Filter::postBool('new_trees')) { + FlashMessages::addMessage(I18N::translate('The preferences for new family trees have been updated.', $WT_TREE->getTitleHtml()), 'success'); + } - $WT_TREE->setPreference('ADVANCED_NAME_FACTS', implode(',', Filter::postArray('ADVANCED_NAME_FACTS'))); - $WT_TREE->setPreference('ADVANCED_PLAC_FACTS', implode(',', Filter::postArray('ADVANCED_PLAC_FACTS'))); - $WT_TREE->setPreference('ALLOW_THEME_DROPDOWN', Filter::postBool('ALLOW_THEME_DROPDOWN')); - // For backwards compatibility with webtrees 1.x we store the two calendar formats in one variable - // e.g. "gregorian_and_jewish" - $WT_TREE->setPreference('CALENDAR_FORMAT', implode('_and_', array_unique([ - Filter::post('CALENDAR_FORMAT0', 'gregorian|julian|french|jewish|hijri|jalali', 'none'), - Filter::post('CALENDAR_FORMAT1', 'gregorian|julian|french|jewish|hijri|jalali', 'none'), - ]))); - $WT_TREE->setPreference('CHART_BOX_TAGS', Filter::post('CHART_BOX_TAGS')); - $WT_TREE->setPreference('CONTACT_USER_ID', Filter::post('CONTACT_USER_ID')); - $WT_TREE->setPreference('DEFAULT_PEDIGREE_GENERATIONS', Filter::post('DEFAULT_PEDIGREE_GENERATIONS')); - $WT_TREE->setPreference('EXPAND_NOTES', Filter::postBool('EXPAND_NOTES')); - $WT_TREE->setPreference('EXPAND_SOURCES', Filter::postBool('EXPAND_SOURCES')); - $WT_TREE->setPreference('FAM_FACTS_ADD', implode(',', Filter::postArray('FAM_FACTS_ADD'))); - $WT_TREE->setPreference('FAM_FACTS_QUICK', implode(',', Filter::postArray('FAM_FACTS_QUICK'))); - $WT_TREE->setPreference('FAM_FACTS_UNIQUE', implode(',', Filter::postArray('FAM_FACTS_UNIQUE'))); - $WT_TREE->setPreference('FULL_SOURCES', Filter::postBool('FULL_SOURCES')); - $WT_TREE->setPreference('FORMAT_TEXT', Filter::post('FORMAT_TEXT')); - $WT_TREE->setPreference('GEDCOM_MEDIA_PATH', Filter::post('GEDCOM_MEDIA_PATH')); - $WT_TREE->setPreference('GENERATE_UIDS', Filter::postBool('GENERATE_UIDS')); - $WT_TREE->setPreference('GEONAMES_ACCOUNT', Filter::post('GEONAMES_ACCOUNT')); - $WT_TREE->setPreference('HIDE_GEDCOM_ERRORS', Filter::postBool('HIDE_GEDCOM_ERRORS')); - $WT_TREE->setPreference('INDI_FACTS_ADD', implode(',', Filter::postArray('INDI_FACTS_ADD'))); - $WT_TREE->setPreference('INDI_FACTS_QUICK', implode(',', Filter::postArray('INDI_FACTS_QUICK'))); - $WT_TREE->setPreference('INDI_FACTS_UNIQUE', implode(',', Filter::postArray('INDI_FACTS_UNIQUE'))); - $WT_TREE->setPreference('LANGUAGE', Filter::post('LANGUAGE')); - $WT_TREE->setPreference('MAX_DESCENDANCY_GENERATIONS', Filter::post('MAX_DESCENDANCY_GENERATIONS')); - $WT_TREE->setPreference('MAX_PEDIGREE_GENERATIONS', Filter::post('MAX_PEDIGREE_GENERATIONS')); - $WT_TREE->setPreference('MEDIA_UPLOAD', Filter::post('MEDIA_UPLOAD')); - $WT_TREE->setPreference('META_DESCRIPTION', Filter::post('META_DESCRIPTION')); - $WT_TREE->setPreference('META_TITLE', Filter::post('META_TITLE')); - $WT_TREE->setPreference('NO_UPDATE_CHAN', Filter::postBool('NO_UPDATE_CHAN')); - $WT_TREE->setPreference('PEDIGREE_LAYOUT', Filter::postBool('PEDIGREE_LAYOUT')); - $WT_TREE->setPreference('PEDIGREE_ROOT_ID', Filter::post('PEDIGREE_ROOT_ID', WT_REGEX_XREF)); - $WT_TREE->setPreference('PEDIGREE_SHOW_GENDER', Filter::postBool('PEDIGREE_SHOW_GENDER')); - $WT_TREE->setPreference('PREFER_LEVEL2_SOURCES', Filter::post('PREFER_LEVEL2_SOURCES')); - $WT_TREE->setPreference('QUICK_REQUIRED_FACTS', implode(',', Filter::postArray('QUICK_REQUIRED_FACTS'))); - $WT_TREE->setPreference('QUICK_REQUIRED_FAMFACTS', implode(',', Filter::postArray('QUICK_REQUIRED_FAMFACTS'))); - $WT_TREE->setPreference('REPO_FACTS_ADD', implode(',', Filter::postArray('REPO_FACTS_ADD'))); - $WT_TREE->setPreference('REPO_FACTS_QUICK', implode(',', Filter::postArray('REPO_FACTS_QUICK'))); - $WT_TREE->setPreference('REPO_FACTS_UNIQUE', implode(',', Filter::postArray('REPO_FACTS_UNIQUE'))); - $WT_TREE->setPreference('SHOW_COUNTER', Filter::postBool('SHOW_COUNTER')); - $WT_TREE->setPreference('SHOW_EST_LIST_DATES', Filter::postBool('SHOW_EST_LIST_DATES')); - $WT_TREE->setPreference('SHOW_FACT_ICONS', Filter::postBool('SHOW_FACT_ICONS')); - $WT_TREE->setPreference('SHOW_GEDCOM_RECORD', Filter::postBool('SHOW_GEDCOM_RECORD')); - $WT_TREE->setPreference('SHOW_HIGHLIGHT_IMAGES', Filter::postBool('SHOW_HIGHLIGHT_IMAGES')); - $WT_TREE->setPreference('SHOW_LAST_CHANGE', Filter::postBool('SHOW_LAST_CHANGE')); - $WT_TREE->setPreference('SHOW_LDS_AT_GLANCE', Filter::postBool('SHOW_LDS_AT_GLANCE')); - $WT_TREE->setPreference('SHOW_MEDIA_DOWNLOAD', Filter::post('SHOW_MEDIA_DOWNLOAD')); - $WT_TREE->setPreference('SHOW_NO_WATERMARK', Filter::post('SHOW_NO_WATERMARK')); - $WT_TREE->setPreference('SHOW_PARENTS_AGE', Filter::postBool('SHOW_PARENTS_AGE')); - $WT_TREE->setPreference('SHOW_PEDIGREE_PLACES', Filter::post('SHOW_PEDIGREE_PLACES')); - $WT_TREE->setPreference('SHOW_PEDIGREE_PLACES_SUFFIX', Filter::postBool('SHOW_PEDIGREE_PLACES_SUFFIX')); - $WT_TREE->setPreference('SHOW_RELATIVES_EVENTS', implode(',', Filter::postArray('SHOW_RELATIVES_EVENTS'))); - $WT_TREE->setPreference('SOUR_FACTS_ADD', implode(',', Filter::postArray('SOUR_FACTS_ADD'))); - $WT_TREE->setPreference('SOUR_FACTS_QUICK', implode(',', Filter::postArray('SOUR_FACTS_QUICK'))); - $WT_TREE->setPreference('SOUR_FACTS_UNIQUE', implode(',', Filter::postArray('SOUR_FACTS_UNIQUE'))); - $WT_TREE->setPreference('SUBLIST_TRIGGER_I', Filter::post('SUBLIST_TRIGGER_I', WT_REGEX_INTEGER, 200)); - $WT_TREE->setPreference('SURNAME_LIST_STYLE', Filter::post('SURNAME_LIST_STYLE')); - $WT_TREE->setPreference('SURNAME_TRADITION', Filter::post('SURNAME_TRADITION')); - $WT_TREE->setPreference('THEME_DIR', Filter::post('THEME_DIR')); - $WT_TREE->setPreference('USE_SILHOUETTE', Filter::postBool('USE_SILHOUETTE')); - $WT_TREE->setPreference('WEBMASTER_USER_ID', Filter::post('WEBMASTER_USER_ID')); - $WT_TREE->setPreference('WEBTREES_EMAIL', Filter::post('WEBTREES_EMAIL')); - $WT_TREE->setPreference('title', Filter::post('title')); + $WT_TREE->setPreference('ADVANCED_NAME_FACTS', implode(',', Filter::postArray('ADVANCED_NAME_FACTS'))); + $WT_TREE->setPreference('ADVANCED_PLAC_FACTS', implode(',', Filter::postArray('ADVANCED_PLAC_FACTS'))); + $WT_TREE->setPreference('ALLOW_THEME_DROPDOWN', Filter::postBool('ALLOW_THEME_DROPDOWN')); + // For backwards compatibility with webtrees 1.x we store the two calendar formats in one variable + // e.g. "gregorian_and_jewish" + $WT_TREE->setPreference('CALENDAR_FORMAT', implode('_and_', array_unique([ + Filter::post('CALENDAR_FORMAT0', 'gregorian|julian|french|jewish|hijri|jalali', 'none'), + Filter::post('CALENDAR_FORMAT1', 'gregorian|julian|french|jewish|hijri|jalali', 'none'), + ]))); + $WT_TREE->setPreference('CHART_BOX_TAGS', Filter::post('CHART_BOX_TAGS')); + $WT_TREE->setPreference('CONTACT_USER_ID', Filter::post('CONTACT_USER_ID')); + $WT_TREE->setPreference('DEFAULT_PEDIGREE_GENERATIONS', Filter::post('DEFAULT_PEDIGREE_GENERATIONS')); + $WT_TREE->setPreference('EXPAND_NOTES', Filter::postBool('EXPAND_NOTES')); + $WT_TREE->setPreference('EXPAND_SOURCES', Filter::postBool('EXPAND_SOURCES')); + $WT_TREE->setPreference('FAM_FACTS_ADD', implode(',', Filter::postArray('FAM_FACTS_ADD'))); + $WT_TREE->setPreference('FAM_FACTS_QUICK', implode(',', Filter::postArray('FAM_FACTS_QUICK'))); + $WT_TREE->setPreference('FAM_FACTS_UNIQUE', implode(',', Filter::postArray('FAM_FACTS_UNIQUE'))); + $WT_TREE->setPreference('FULL_SOURCES', Filter::postBool('FULL_SOURCES')); + $WT_TREE->setPreference('FORMAT_TEXT', Filter::post('FORMAT_TEXT')); + $WT_TREE->setPreference('GEDCOM_MEDIA_PATH', Filter::post('GEDCOM_MEDIA_PATH')); + $WT_TREE->setPreference('GENERATE_UIDS', Filter::postBool('GENERATE_UIDS')); + $WT_TREE->setPreference('GEONAMES_ACCOUNT', Filter::post('GEONAMES_ACCOUNT')); + $WT_TREE->setPreference('HIDE_GEDCOM_ERRORS', Filter::postBool('HIDE_GEDCOM_ERRORS')); + $WT_TREE->setPreference('INDI_FACTS_ADD', implode(',', Filter::postArray('INDI_FACTS_ADD'))); + $WT_TREE->setPreference('INDI_FACTS_QUICK', implode(',', Filter::postArray('INDI_FACTS_QUICK'))); + $WT_TREE->setPreference('INDI_FACTS_UNIQUE', implode(',', Filter::postArray('INDI_FACTS_UNIQUE'))); + $WT_TREE->setPreference('LANGUAGE', Filter::post('LANGUAGE')); + $WT_TREE->setPreference('MAX_DESCENDANCY_GENERATIONS', Filter::post('MAX_DESCENDANCY_GENERATIONS')); + $WT_TREE->setPreference('MAX_PEDIGREE_GENERATIONS', Filter::post('MAX_PEDIGREE_GENERATIONS')); + $WT_TREE->setPreference('MEDIA_UPLOAD', Filter::post('MEDIA_UPLOAD')); + $WT_TREE->setPreference('META_DESCRIPTION', Filter::post('META_DESCRIPTION')); + $WT_TREE->setPreference('META_TITLE', Filter::post('META_TITLE')); + $WT_TREE->setPreference('NO_UPDATE_CHAN', Filter::postBool('NO_UPDATE_CHAN')); + $WT_TREE->setPreference('PEDIGREE_LAYOUT', Filter::postBool('PEDIGREE_LAYOUT')); + $WT_TREE->setPreference('PEDIGREE_ROOT_ID', Filter::post('PEDIGREE_ROOT_ID', WT_REGEX_XREF)); + $WT_TREE->setPreference('PEDIGREE_SHOW_GENDER', Filter::postBool('PEDIGREE_SHOW_GENDER')); + $WT_TREE->setPreference('PREFER_LEVEL2_SOURCES', Filter::post('PREFER_LEVEL2_SOURCES')); + $WT_TREE->setPreference('QUICK_REQUIRED_FACTS', implode(',', Filter::postArray('QUICK_REQUIRED_FACTS'))); + $WT_TREE->setPreference('QUICK_REQUIRED_FAMFACTS', implode(',', Filter::postArray('QUICK_REQUIRED_FAMFACTS'))); + $WT_TREE->setPreference('REPO_FACTS_ADD', implode(',', Filter::postArray('REPO_FACTS_ADD'))); + $WT_TREE->setPreference('REPO_FACTS_QUICK', implode(',', Filter::postArray('REPO_FACTS_QUICK'))); + $WT_TREE->setPreference('REPO_FACTS_UNIQUE', implode(',', Filter::postArray('REPO_FACTS_UNIQUE'))); + $WT_TREE->setPreference('SHOW_COUNTER', Filter::postBool('SHOW_COUNTER')); + $WT_TREE->setPreference('SHOW_EST_LIST_DATES', Filter::postBool('SHOW_EST_LIST_DATES')); + $WT_TREE->setPreference('SHOW_FACT_ICONS', Filter::postBool('SHOW_FACT_ICONS')); + $WT_TREE->setPreference('SHOW_GEDCOM_RECORD', Filter::postBool('SHOW_GEDCOM_RECORD')); + $WT_TREE->setPreference('SHOW_HIGHLIGHT_IMAGES', Filter::postBool('SHOW_HIGHLIGHT_IMAGES')); + $WT_TREE->setPreference('SHOW_LAST_CHANGE', Filter::postBool('SHOW_LAST_CHANGE')); + $WT_TREE->setPreference('SHOW_LDS_AT_GLANCE', Filter::postBool('SHOW_LDS_AT_GLANCE')); + $WT_TREE->setPreference('SHOW_MEDIA_DOWNLOAD', Filter::post('SHOW_MEDIA_DOWNLOAD')); + $WT_TREE->setPreference('SHOW_NO_WATERMARK', Filter::post('SHOW_NO_WATERMARK')); + $WT_TREE->setPreference('SHOW_PARENTS_AGE', Filter::postBool('SHOW_PARENTS_AGE')); + $WT_TREE->setPreference('SHOW_PEDIGREE_PLACES', Filter::post('SHOW_PEDIGREE_PLACES')); + $WT_TREE->setPreference('SHOW_PEDIGREE_PLACES_SUFFIX', Filter::postBool('SHOW_PEDIGREE_PLACES_SUFFIX')); + $WT_TREE->setPreference('SHOW_RELATIVES_EVENTS', implode(',', Filter::postArray('SHOW_RELATIVES_EVENTS'))); + $WT_TREE->setPreference('SOUR_FACTS_ADD', implode(',', Filter::postArray('SOUR_FACTS_ADD'))); + $WT_TREE->setPreference('SOUR_FACTS_QUICK', implode(',', Filter::postArray('SOUR_FACTS_QUICK'))); + $WT_TREE->setPreference('SOUR_FACTS_UNIQUE', implode(',', Filter::postArray('SOUR_FACTS_UNIQUE'))); + $WT_TREE->setPreference('SUBLIST_TRIGGER_I', Filter::post('SUBLIST_TRIGGER_I', WT_REGEX_INTEGER, 200)); + $WT_TREE->setPreference('SURNAME_LIST_STYLE', Filter::post('SURNAME_LIST_STYLE')); + $WT_TREE->setPreference('SURNAME_TRADITION', Filter::post('SURNAME_TRADITION')); + $WT_TREE->setPreference('THEME_DIR', Filter::post('THEME_DIR')); + $WT_TREE->setPreference('USE_SILHOUETTE', Filter::postBool('USE_SILHOUETTE')); + $WT_TREE->setPreference('WEBMASTER_USER_ID', Filter::post('WEBMASTER_USER_ID')); + $WT_TREE->setPreference('WEBTREES_EMAIL', Filter::post('WEBTREES_EMAIL')); + $WT_TREE->setPreference('title', Filter::post('title')); - // Only accept valid folders for MEDIA_DIRECTORY - $MEDIA_DIRECTORY = preg_replace('/[\/\\\\]+/', '/', Filter::post('MEDIA_DIRECTORY') . '/'); - if (substr($MEDIA_DIRECTORY, 0, 1) === '/') { - $MEDIA_DIRECTORY = substr($MEDIA_DIRECTORY, 1); - } + // Only accept valid folders for MEDIA_DIRECTORY + $MEDIA_DIRECTORY = preg_replace('/[\/\\\\]+/', '/', Filter::post('MEDIA_DIRECTORY') . '/'); + if (substr($MEDIA_DIRECTORY, 0, 1) === '/') { + $MEDIA_DIRECTORY = substr($MEDIA_DIRECTORY, 1); + } - if ($MEDIA_DIRECTORY) { - if (is_dir(WT_DATA_DIR . $MEDIA_DIRECTORY)) { - $WT_TREE->setPreference('MEDIA_DIRECTORY', $MEDIA_DIRECTORY); - } elseif (File::mkdir(WT_DATA_DIR . $MEDIA_DIRECTORY)) { - $WT_TREE->setPreference('MEDIA_DIRECTORY', $MEDIA_DIRECTORY); - FlashMessages::addMessage(I18N::translate('The folder %s has been created.', Html::filename(WT_DATA_DIR . $MEDIA_DIRECTORY)), 'info'); - } else { - FlashMessages::addMessage(I18N::translate('The folder %s does not exist, and it could not be created.', Html::filename(WT_DATA_DIR . $MEDIA_DIRECTORY)), 'danger'); + if ($MEDIA_DIRECTORY) { + if (is_dir(WT_DATA_DIR . $MEDIA_DIRECTORY)) { + $WT_TREE->setPreference('MEDIA_DIRECTORY', $MEDIA_DIRECTORY); + } elseif (File::mkdir(WT_DATA_DIR . $MEDIA_DIRECTORY)) { + $WT_TREE->setPreference('MEDIA_DIRECTORY', $MEDIA_DIRECTORY); + FlashMessages::addMessage(I18N::translate('The folder %s has been created.', Html::filename(WT_DATA_DIR . $MEDIA_DIRECTORY)), 'info'); + } else { + FlashMessages::addMessage(I18N::translate('The folder %s does not exist, and it could not be created.', Html::filename(WT_DATA_DIR . $MEDIA_DIRECTORY)), 'danger'); + } } - } - $gedcom = Filter::post('gedcom'); - if ($gedcom && $gedcom !== $WT_TREE->getName()) { - try { - Database::prepare("UPDATE `##gedcom` SET gedcom_name = ? WHERE gedcom_id = ?")->execute([$gedcom, $WT_TREE->getTreeId()]); - Database::prepare("UPDATE `##site_setting` SET setting_value = ? WHERE setting_name='DEFAULT_GEDCOM' AND setting_value = ?")->execute([$gedcom, $WT_TREE->getName()]); - } catch (\Exception $ex) { - DebugBar::addThrowable($ex); + $gedcom = Filter::post('gedcom'); + if ($gedcom && $gedcom !== $WT_TREE->getName()) { + try { + Database::prepare("UPDATE `##gedcom` SET gedcom_name = ? WHERE gedcom_id = ?")->execute([$gedcom, $WT_TREE->getTreeId()]); + Database::prepare("UPDATE `##site_setting` SET setting_value = ? WHERE setting_name='DEFAULT_GEDCOM' AND setting_value = ?")->execute([$gedcom, $WT_TREE->getName()]); + } catch (\Exception $ex) { + DebugBar::addThrowable($ex); - // Probably a duplicate name. + // Probably a duplicate name. + } } - } - FlashMessages::addMessage(I18N::translate('The preferences for the family tree “%s” have been updated.', $WT_TREE->getTitleHtml()), 'success'); - header('Location: admin_trees_manage.php'); + FlashMessages::addMessage(I18N::translate('The preferences for the family tree “%s” have been updated.', $WT_TREE->getTitleHtml()), 'success'); + header('Location: admin_trees_manage.php'); - return; + return; } switch (Filter::get('action')) { diff --git a/admin_trees_download.php b/admin_trees_download.php index 06acdfe152..815ff57043 100644 --- a/admin_trees_download.php +++ b/admin_trees_download.php @@ -37,19 +37,19 @@ $privatize_export = Filter::get('privatize_export', 'none|visitor|user|gedadmin' if ($action === 'download') { switch ($privatize_export) { - default: - case 'gedadmin': - $access_level = Auth::PRIV_NONE; - break; - case 'user': - $access_level = Auth::PRIV_USER; - break; - case 'visitor': - $access_level = Auth::PRIV_PRIVATE; - break; - case 'none': - $access_level = Auth::PRIV_HIDE; - break; + default: + case 'gedadmin': + $access_level = Auth::PRIV_NONE; + break; + case 'user': + $access_level = Auth::PRIV_USER; + break; + case 'visitor': + $access_level = Auth::PRIV_PRIVATE; + break; + case 'none': + $access_level = Auth::PRIV_HIDE; + break; } $exportOptions = [ diff --git a/admin_trees_manage.php b/admin_trees_manage.php index 55ece0492d..34a450ca77 100644 --- a/admin_trees_manage.php +++ b/admin_trees_manage.php @@ -45,115 +45,115 @@ if (defined('GLOB_BRACE')) { } // Process POST actions switch (Filter::post('action')) { -case 'delete': - $gedcom_id = Filter::postInteger('gedcom_id'); - if (Filter::checkCsrf() && $gedcom_id) { - $tree = Tree::findById($gedcom_id); - FlashMessages::addMessage(/* I18N: %s is the name of a family tree */ I18N::translate('The family tree “%s” has been deleted.', $tree->getTitleHtml()), 'success'); - $tree->delete(); - } - header('Location: admin_trees_manage.php'); + case 'delete': + $gedcom_id = Filter::postInteger('gedcom_id'); + if (Filter::checkCsrf() && $gedcom_id) { + $tree = Tree::findById($gedcom_id); + FlashMessages::addMessage(/* I18N: %s is the name of a family tree */ I18N::translate('The family tree “%s” has been deleted.', $tree->getTitleHtml()), 'success'); + $tree->delete(); + } + header('Location: admin_trees_manage.php'); - return; -case 'setdefault': - if (Filter::checkCsrf()) { - Site::setPreference('DEFAULT_GEDCOM', Filter::post('ged')); - FlashMessages::addMessage(/* I18N: %s is the name of a family tree */ I18N::translate('The family tree “%s” will be shown to visitors when they first arrive at this website.', $WT_TREE->getTitleHtml()), 'success'); - } - header('Location: admin_trees_manage.php'); + return; + case 'setdefault': + if (Filter::checkCsrf()) { + Site::setPreference('DEFAULT_GEDCOM', Filter::post('ged')); + FlashMessages::addMessage(/* I18N: %s is the name of a family tree */ I18N::translate('The family tree “%s” will be shown to visitors when they first arrive at this website.', $WT_TREE->getTitleHtml()), 'success'); + } + header('Location: admin_trees_manage.php'); - return; -case 'new_tree': - $basename = basename(Filter::post('tree_name')); - $tree_title = Filter::post('tree_title'); + return; + case 'new_tree': + $basename = basename(Filter::post('tree_name')); + $tree_title = Filter::post('tree_title'); - if (Filter::checkCsrf() && $basename && $tree_title) { - if (Tree::findByName($basename)) { - FlashMessages::addMessage(/* I18N: %s is the name of a family tree */ I18N::translate('The family tree “%s” already exists.', Html::escape($basename)), 'danger'); - } else { - Tree::create($basename, $tree_title); - FlashMessages::addMessage(/* I18N: %s is the name of a family tree */ I18N::translate('The family tree “%s” has been created.', Html::escape($basename)), 'success'); + if (Filter::checkCsrf() && $basename && $tree_title) { + if (Tree::findByName($basename)) { + FlashMessages::addMessage(/* I18N: %s is the name of a family tree */ I18N::translate('The family tree “%s” already exists.', Html::escape($basename)), 'danger'); + } else { + Tree::create($basename, $tree_title); + FlashMessages::addMessage(/* I18N: %s is the name of a family tree */ I18N::translate('The family tree “%s” has been created.', Html::escape($basename)), 'success'); + } } - } - header('Location: admin_trees_manage.php?ged=' . rawurlencode($basename)); + header('Location: admin_trees_manage.php?ged=' . rawurlencode($basename)); - return; -case 'replace_upload': - $gedcom_id = Filter::postInteger('gedcom_id'); - $keep_media = Filter::post('keep_media', '1', '0'); - $GEDCOM_MEDIA_PATH = Filter::post('GEDCOM_MEDIA_PATH'); - $WORD_WRAPPED_NOTES = Filter::post('WORD_WRAPPED_NOTES', '1', '0'); - $tree = Tree::findById($gedcom_id); + return; + case 'replace_upload': + $gedcom_id = Filter::postInteger('gedcom_id'); + $keep_media = Filter::post('keep_media', '1', '0'); + $GEDCOM_MEDIA_PATH = Filter::post('GEDCOM_MEDIA_PATH'); + $WORD_WRAPPED_NOTES = Filter::post('WORD_WRAPPED_NOTES', '1', '0'); + $tree = Tree::findById($gedcom_id); - if (Filter::checkCsrf() && $tree) { - $tree->setPreference('keep_media', $keep_media); - $tree->setPreference('GEDCOM_MEDIA_PATH', $GEDCOM_MEDIA_PATH); - $tree->setPreference('WORD_WRAPPED_NOTES', $WORD_WRAPPED_NOTES); - if (isset($_FILES['tree_name'])) { - if ($_FILES['tree_name']['error'] == 0 && is_readable($_FILES['tree_name']['tmp_name'])) { - $tree->importGedcomFile($_FILES['tree_name']['tmp_name'], $_FILES['tree_name']['name']); + if (Filter::checkCsrf() && $tree) { + $tree->setPreference('keep_media', $keep_media); + $tree->setPreference('GEDCOM_MEDIA_PATH', $GEDCOM_MEDIA_PATH); + $tree->setPreference('WORD_WRAPPED_NOTES', $WORD_WRAPPED_NOTES); + if (isset($_FILES['tree_name'])) { + if ($_FILES['tree_name']['error'] == 0 && is_readable($_FILES['tree_name']['tmp_name'])) { + $tree->importGedcomFile($_FILES['tree_name']['tmp_name'], $_FILES['tree_name']['name']); + } else { + FlashMessages::addMessage(Functions::fileUploadErrorText($_FILES['tree_name']['error']), 'danger'); + } } else { - FlashMessages::addMessage(Functions::fileUploadErrorText($_FILES['tree_name']['error']), 'danger'); + FlashMessages::addMessage(I18N::translate('No GEDCOM file was received.'), 'danger'); } - } else { - FlashMessages::addMessage(I18N::translate('No GEDCOM file was received.'), 'danger'); } - } - header('Location: admin_trees_manage.php'); + header('Location: admin_trees_manage.php'); - return; -case 'replace_import': - $basename = basename(Filter::post('tree_name')); - $gedcom_id = Filter::postInteger('gedcom_id'); - $keep_media = Filter::post('keep_media', '1', '0'); - $GEDCOM_MEDIA_PATH = Filter::post('GEDCOM_MEDIA_PATH'); - $WORD_WRAPPED_NOTES = Filter::post('WORD_WRAPPED_NOTES', '1', '0'); - $tree = Tree::findById($gedcom_id); + return; + case 'replace_import': + $basename = basename(Filter::post('tree_name')); + $gedcom_id = Filter::postInteger('gedcom_id'); + $keep_media = Filter::post('keep_media', '1', '0'); + $GEDCOM_MEDIA_PATH = Filter::post('GEDCOM_MEDIA_PATH'); + $WORD_WRAPPED_NOTES = Filter::post('WORD_WRAPPED_NOTES', '1', '0'); + $tree = Tree::findById($gedcom_id); - if (Filter::checkCsrf() && $tree) { - $tree->setPreference('keep_media', $keep_media); - $tree->setPreference('GEDCOM_MEDIA_PATH', $GEDCOM_MEDIA_PATH); - $tree->setPreference('WORD_WRAPPED_NOTES', $WORD_WRAPPED_NOTES); - if ($basename) { - $tree->importGedcomFile(WT_DATA_DIR . $basename, $basename); - } else { - FlashMessages::addMessage(I18N::translate('No GEDCOM file was received.'), 'danger'); + if (Filter::checkCsrf() && $tree) { + $tree->setPreference('keep_media', $keep_media); + $tree->setPreference('GEDCOM_MEDIA_PATH', $GEDCOM_MEDIA_PATH); + $tree->setPreference('WORD_WRAPPED_NOTES', $WORD_WRAPPED_NOTES); + if ($basename) { + $tree->importGedcomFile(WT_DATA_DIR . $basename, $basename); + } else { + FlashMessages::addMessage(I18N::translate('No GEDCOM file was received.'), 'danger'); + } } - } - header('Location: admin_trees_manage.php'); + header('Location: admin_trees_manage.php'); - return; + return; -case 'synchronize': - if (Filter::checkCsrf()) { - $basenames = []; + case 'synchronize': + if (Filter::checkCsrf()) { + $basenames = []; - foreach ($gedcom_files as $gedcom_file) { - $filemtime = filemtime($gedcom_file); // Only import files that have changed - $basename = basename($gedcom_file); - $basenames[] = $basename; + foreach ($gedcom_files as $gedcom_file) { + $filemtime = filemtime($gedcom_file); // Only import files that have changed + $basename = basename($gedcom_file); + $basenames[] = $basename; - $tree = Tree::findByName($basename); - if (!$tree) { - $tree = Tree::create($basename, $basename); - } - if ($tree->getPreference('filemtime') != $filemtime) { - $tree->importGedcomFile($gedcom_file, $basename); - $tree->setPreference('filemtime', $filemtime); - FlashMessages::addMessage(I18N::translate('The GEDCOM file “%s” has been imported.', Html::escape($basename)), 'success'); + $tree = Tree::findByName($basename); + if (!$tree) { + $tree = Tree::create($basename, $basename); + } + if ($tree->getPreference('filemtime') != $filemtime) { + $tree->importGedcomFile($gedcom_file, $basename); + $tree->setPreference('filemtime', $filemtime); + FlashMessages::addMessage(I18N::translate('The GEDCOM file “%s” has been imported.', Html::escape($basename)), 'success'); + } } - } - foreach (Tree::getAll() as $tree) { - if (!in_array($tree->getName(), $basenames)) { - FlashMessages::addMessage(I18N::translate('The family tree “%s” has been deleted.', $tree->getTitleHtml()), 'success'); - $tree->delete(); + foreach (Tree::getAll() as $tree) { + if (!in_array($tree->getName(), $basenames)) { + FlashMessages::addMessage(I18N::translate('The family tree “%s” has been deleted.', $tree->getTitleHtml()), 'success'); + $tree->delete(); + } } } - } - header('Location: admin_trees_manage.php'); + header('Location: admin_trees_manage.php'); - return; + return; } $default_tree_title = /* I18N: Default name for a new tree */ I18N::translate('My family tree'); @@ -167,28 +167,28 @@ $default_tree_name .= $default_tree_number; // Process GET actions switch (Filter::get('action')) { -case 'importform': - $controller - ->setPageTitle($WT_TREE->getTitleHtml() . ' — ' . I18N::translate('Import a GEDCOM file')) - ->pageHeader(); + case 'importform': + $controller + ->setPageTitle($WT_TREE->getTitleHtml() . ' — ' . I18N::translate('Import a GEDCOM file')) + ->pageHeader(); - echo Bootstrap4::breadcrumbs([ - route('admin-control-panel') => I18N::translate('Control panel'), - 'admin_trees_manage.php' => I18N::translate('Manage family trees'), - ], $controller->getPageTitle()); - ?> + echo Bootstrap4::breadcrumbs([ + route('admin-control-panel') => I18N::translate('Control panel'), + 'admin_trees_manage.php' => I18N::translate('Manage family trees'), + ], $controller->getPageTitle()); + ?> <h1><?= $controller->getPageTitle() ?></h1> <?php - $tree = Tree::findById(Filter::getInteger('gedcom_id')); - // Check it exists - if (!$tree) { - break; - } - $gedcom_filename = $tree->getPreference('gedcom_filename') - ?> - <p> + $tree = Tree::findById(Filter::getInteger('gedcom_id')); + // Check it exists + if (!$tree) { + break; + } + $gedcom_filename = $tree->getPreference('gedcom_filename') + ?> + <p> <?= /* I18N: %s is the name of a family tree */ I18N::translate('This will delete all the genealogy data from “%s” and replace it with data from a GEDCOM file.', $tree->getTitleHtml()) ?> </p> <form class="form form-horizontal" name="gedcomimportform" method="post" enctype="multipart/form-data" onsubmit="return checkGedcomImportForm('<?= Html::escape(I18N::translate('You have selected a GEDCOM file with a different name. Is this correct?')) ?>');"> @@ -222,35 +222,35 @@ case 'importform': <div class="input-group"> <span class="input-group-addon"> <?= WT_DATA_DIR ?> - </span> + </span> <?php - $d = opendir(WT_DATA_DIR); - $files = []; - while (($f = readdir($d)) !== false) { - if (!is_dir(WT_DATA_DIR . $f) && is_readable(WT_DATA_DIR . $f)) { - $fp = fopen(WT_DATA_DIR . $f, 'rb'); - $header = fread($fp, 64); - fclose($fp); - if (preg_match('/^(' . WT_UTF8_BOM . ')?0 *HEAD/', $header)) { - $files[] = $f; + $d = opendir(WT_DATA_DIR); + $files = []; + while (($f = readdir($d)) !== false) { + if (!is_dir(WT_DATA_DIR . $f) && is_readable(WT_DATA_DIR . $f)) { + $fp = fopen(WT_DATA_DIR . $f, 'rb'); + $header = fread($fp, 64); + fclose($fp); + if (preg_match('/^(' . WT_UTF8_BOM . ')?0 *HEAD/', $header)) { + $files[] = $f; + } + } + } + echo '<select name="tree_name" class="form-control" id="import-server-file">'; + echo '<option value=""></option>'; + sort($files); + foreach ($files as $gedcom_file) { + echo '<option value="', Html::escape($gedcom_file), '" '; + if ($gedcom_file === $gedcom_filename) { + echo ' selected'; } + echo'>', Html::escape($gedcom_file), '</option>'; } - } - echo '<select name="tree_name" class="form-control" id="import-server-file">'; - echo '<option value=""></option>'; - sort($files); - foreach ($files as $gedcom_file) { - echo '<option value="', Html::escape($gedcom_file), '" '; - if ($gedcom_file === $gedcom_filename) { - echo ' selected'; + if (empty($files)) { + echo '<option disabled selected>', I18N::translate('No GEDCOM files found.'), '</option>'; } - echo'>', Html::escape($gedcom_file), '</option>'; - } - if (empty($files)) { - echo '<option disabled selected>', I18N::translate('No GEDCOM files found.'), '</option>'; - } - echo '</select>'; - ?> + echo '</select>'; + ?> </div> </div> </div> @@ -294,7 +294,7 @@ case 'importform': > <p class="small text-muted"> <?= /* I18N: Help text for the “GEDCOM media path” configuration setting. A “path” is something like “C:\Documents\Genealogy\Photos\John_Smith.jpeg” */ I18N::translate('Some genealogy software creates GEDCOM files that contain media filenames with full paths. These paths will not exist on the web-server. To allow webtrees to find the file, the first part of the path must be removed.') ?> - <?= /* I18N: Help text for the “GEDCOM media path” configuration setting. %s are all folder names */ I18N::translate('For example, if the GEDCOM file contains %1$s and webtrees expects to find %2$s in the media folder, then you would need to remove %3$s.', '<code>C:\\Documents\\family\\photo.jpeg</code>', '<code>family\\photo.jpeg</code>', '<code>C:\\Documents\\</code>') ?> + <?= /* I18N: Help text for the “GEDCOM media path” configuration setting. %s are all folder names */ I18N::translate('For example, if the GEDCOM file contains %1$s and webtrees expects to find %2$s in the media folder, then you would need to remove %3$s.', '<code>C:\\Documents\\family\\photo.jpeg</code>', '<code>family\\photo.jpeg</code>', '<code>C:\\Documents\\</code>') ?> </p> </div> </div> @@ -310,7 +310,7 @@ case 'importform': </form> <?php - return; + return; } if (!Tree::getAll()) { diff --git a/admin_trees_renumber.php b/admin_trees_renumber.php index 3a985eda30..2747ff9466 100644 --- a/admin_trees_renumber.php +++ b/admin_trees_renumber.php @@ -82,146 +82,146 @@ if (Filter::get('action') === 'renumber') { ); $new_xref = $WT_TREE->getNewXref($type); switch ($type) { - case 'INDI': - Database::prepare( - "UPDATE `##individuals` SET i_id = ?, i_gedcom = REPLACE(i_gedcom, ?, ?) WHERE i_id = ? AND i_file = ?" - )->execute([$new_xref, "0 @$old_xref@ INDI\n", "0 @$new_xref@ INDI\n", $old_xref, $WT_TREE->getTreeId()]); - Database::prepare( - "UPDATE `##families` JOIN `##link` ON (l_file = f_file AND l_to = ? AND l_type = 'HUSB') SET f_gedcom = REPLACE(f_gedcom, ?, ?) WHERE f_file = ?" - )->execute([$old_xref, " HUSB @$old_xref@", " HUSB @$new_xref@", $WT_TREE->getTreeId()]); - Database::prepare( - "UPDATE `##families` JOIN `##link` ON (l_file = f_file AND l_to = ? AND l_type = 'WIFE') SET f_gedcom = REPLACE(f_gedcom, ?, ?) WHERE f_file = ?" - )->execute([$old_xref, " WIFE @$old_xref@", " WIFE @$new_xref@", $WT_TREE->getTreeId()]); - Database::prepare( - "UPDATE `##families` JOIN `##link` ON (l_file = f_file AND l_to = ? AND l_type = 'CHIL') SET f_gedcom = REPLACE(f_gedcom, ?, ?) WHERE f_file = ?" - )->execute([$old_xref, " CHIL @$old_xref@", " CHIL @$new_xref@", $WT_TREE->getTreeId()]); - Database::prepare( - "UPDATE `##families` JOIN `##link` ON (l_file = f_file AND l_to = ? AND l_type = 'ASSO') SET f_gedcom = REPLACE(f_gedcom, ?, ?) WHERE f_file = ?" - )->execute([$old_xref, " ASSO @$old_xref@", " ASSO @$new_xref@", $WT_TREE->getTreeId()]); - Database::prepare( - "UPDATE `##families` JOIN `##link` ON (l_file = f_file AND l_to = ? AND l_type = '_ASSO') SET f_gedcom = REPLACE(f_gedcom, ?, ?) WHERE f_file = ?" - )->execute([$old_xref, " _ASSO @$old_xref@", " _ASSO @$new_xref@", $WT_TREE->getTreeId()]); - Database::prepare( - "UPDATE `##individuals` JOIN `##link` ON (l_file = i_file AND l_to = ? AND l_type = 'ASSO') SET i_gedcom = REPLACE(i_gedcom, ?, ?) WHERE i_file = ?" - )->execute([$old_xref, " ASSO @$old_xref@", " ASSO @$new_xref@", $WT_TREE->getTreeId()]); - Database::prepare( - "UPDATE `##individuals` JOIN `##link` ON (l_file = i_file AND l_to = ? AND l_type = '_ASSO') SET i_gedcom = REPLACE(i_gedcom, ?, ?) WHERE i_file = ?" - )->execute([$old_xref, " _ASSO @$old_xref@", " _ASSO @$new_xref@", $WT_TREE->getTreeId()]); - Database::prepare( - "UPDATE `##placelinks` SET pl_gid = ? WHERE pl_gid = ? AND pl_file = ?" - )->execute([$new_xref, $old_xref, $WT_TREE->getTreeId()]); - Database::prepare( - "UPDATE `##dates` SET d_gid = ? WHERE d_gid = ? AND d_file = ?" - )->execute([$new_xref, $old_xref, $WT_TREE->getTreeId()]); - Database::prepare( - "UPDATE `##user_gedcom_setting` SET setting_value = ? WHERE setting_value = ? AND gedcom_id = ? AND setting_name IN ('gedcomid', 'rootid')" - )->execute([$new_xref, $old_xref, $WT_TREE->getTreeId()]); - break; - case 'FAM': - Database::prepare( - "UPDATE `##families` SET f_id = ?, f_gedcom = REPLACE(f_gedcom, ?, ?) WHERE f_id = ? AND f_file = ?" - )->execute([$new_xref, "0 @$old_xref@ FAM\n", "0 @$new_xref@ FAM\n", $old_xref, $WT_TREE->getTreeId()]); - Database::prepare( - "UPDATE `##individuals` JOIN `##link` ON (l_file = i_file AND l_to = ? AND l_type = 'FAMC') SET i_gedcom = REPLACE(i_gedcom, ?, ?) WHERE i_file = ?" - )->execute([$old_xref, " FAMC @$old_xref@", " FAMC @$new_xref@", $WT_TREE->getTreeId()]); - Database::prepare( - "UPDATE `##individuals` JOIN `##link` ON (l_file = i_file AND l_to = ? AND l_type = 'FAMS') SET i_gedcom = REPLACE(i_gedcom, ?, ?) WHERE i_file = ?" - )->execute([$old_xref, " FAMS @$old_xref@", " FAMS @$new_xref@", $WT_TREE->getTreeId()]); - Database::prepare( - "UPDATE `##placelinks` SET pl_gid = ? WHERE pl_gid = ? AND pl_file = ?" - )->execute([$new_xref, $old_xref, $WT_TREE->getTreeId()]); - Database::prepare( - "UPDATE `##dates` SET d_gid = ? WHERE d_gid = ? AND d_file = ?" - )->execute([$new_xref, $old_xref, $WT_TREE->getTreeId()]); - break; - case 'SOUR': - Database::prepare( - "UPDATE `##sources` SET s_id = ?, s_gedcom = REPLACE(s_gedcom, ?, ?) WHERE s_id = ? AND s_file = ?" - )->execute([$new_xref, "0 @$old_xref@ SOUR\n", "0 @$new_xref@ SOUR\n", $old_xref, $WT_TREE->getTreeId()]); - Database::prepare( - "UPDATE `##individuals` JOIN `##link` ON (l_file = i_file AND l_to = ? AND l_type = 'SOUR') SET i_gedcom = REPLACE(i_gedcom, ?, ?) WHERE i_file = ?" - )->execute([$old_xref, " SOUR @$old_xref@", " SOUR @$new_xref@", $WT_TREE->getTreeId()]); - Database::prepare( - "UPDATE `##families` JOIN `##link` ON (l_file = f_file AND l_to = ? AND l_type = 'SOUR') SET f_gedcom = REPLACE(f_gedcom, ?, ?) WHERE f_file = ?" - )->execute([$old_xref, " SOUR @$old_xref@", " SOUR @$new_xref@", $WT_TREE->getTreeId()]); - Database::prepare( - "UPDATE `##media` JOIN `##link` ON (l_file = m_file AND l_to = ? AND l_type = 'SOUR') SET m_gedcom = REPLACE(m_gedcom, ?, ?) WHERE m_file = ?" - )->execute([$old_xref, " SOUR @$old_xref@", " SOUR @$new_xref@", $WT_TREE->getTreeId()]); - Database::prepare( - "UPDATE `##other` JOIN `##link` ON (l_file = o_file AND l_to = ? AND l_type = 'SOUR') SET o_gedcom = REPLACE(o_gedcom, ?, ?) WHERE o_file = ?" - )->execute([$old_xref, " SOUR @$old_xref@", " SOUR @$new_xref@", $WT_TREE->getTreeId()]); - break; - case 'REPO': - Database::prepare( - "UPDATE `##other` SET o_id = ?, o_gedcom = REPLACE(o_gedcom, ?, ?) WHERE o_id = ? AND o_file = ?" - )->execute([$new_xref, "0 @$old_xref@ REPO\n", "0 @$new_xref@ REPO\n", $old_xref, $WT_TREE->getTreeId()]); - Database::prepare( - "UPDATE `##sources` JOIN `##link` ON (l_file = s_file AND l_to = ? AND l_type = 'REPO') SET s_gedcom = REPLACE(s_gedcom, ?, ?) WHERE s_file = ?" - )->execute([$old_xref, " REPO @$old_xref@", " REPO @$new_xref@", $WT_TREE->getTreeId()]); - break; - case 'NOTE': - Database::prepare( - "UPDATE `##other` SET o_id = ?, o_gedcom = REPLACE(REPLACE(o_gedcom, ?, ?), ?, ?) WHERE o_id = ? AND o_file = ?" - )->execute([$new_xref, "0 @$old_xref@ NOTE\n", "0 @$new_xref@ NOTE\n", "0 @$old_xref@ NOTE ", "0 @$new_xref@ NOTE ", $old_xref, $WT_TREE->getTreeId()]); - Database::prepare( - "UPDATE `##individuals` JOIN `##link` ON (l_file = i_file AND l_to = ? AND l_type = 'NOTE') SET i_gedcom = REPLACE(i_gedcom, ?, ?) WHERE i_file = ?" - )->execute([$old_xref, " NOTE @$old_xref@", " NOTE @$new_xref@", $WT_TREE->getTreeId()]); - Database::prepare( - "UPDATE `##families` JOIN `##link` ON (l_file = f_file AND l_to = ? AND l_type = 'NOTE') SET f_gedcom = REPLACE(f_gedcom, ?, ?) WHERE f_file = ?" - )->execute([$old_xref, " NOTE @$old_xref@", " NOTE @$new_xref@", $WT_TREE->getTreeId()]); - Database::prepare( - "UPDATE `##media` JOIN `##link` ON (l_file = m_file AND l_to = ? AND l_type = 'NOTE') SET m_gedcom = REPLACE(m_gedcom, ?, ?) WHERE m_file = ?" - )->execute([$old_xref, " NOTE @$old_xref@", " NOTE @$new_xref@", $WT_TREE->getTreeId()]); - Database::prepare( - "UPDATE `##sources` JOIN `##link` ON (l_file = s_file AND l_to = ? AND l_type = 'NOTE') SET s_gedcom = REPLACE(s_gedcom, ?, ?) WHERE s_file = ?" - )->execute([$old_xref, " NOTE @$old_xref@", " NOTE @$new_xref@", $WT_TREE->getTreeId()]); - Database::prepare( - "UPDATE `##other` JOIN `##link` ON (l_file = o_file AND l_to = ? AND l_type = 'NOTE') SET o_gedcom = REPLACE(o_gedcom, ?, ?) WHERE o_file = ?" - )->execute([$old_xref, " NOTE @$old_xref@", " NOTE @$new_xref@", $WT_TREE->getTreeId()]); - break; - case 'OBJE': - Database::prepare( - "UPDATE `##media` SET m_id = ?, m_gedcom = REPLACE(m_gedcom, ?, ?) WHERE m_id = ? AND m_file = ?" - )->execute([$new_xref, "0 @$old_xref@ OBJE\n", "0 @$new_xref@ OBJE\n", $old_xref, $WT_TREE->getTreeId()]); - Database::prepare( - "UPDATE `##media_file` SET m_id = ? WHERE m_id = ? AND m_file = ?" - )->execute([$new_xref, $old_xref, $WT_TREE->getTreeId()]); - Database::prepare( - "UPDATE `##individuals` JOIN `##link` ON (l_file = i_file AND l_to = ? AND l_type = 'OBJE') SET i_gedcom = REPLACE(i_gedcom, ?, ?) WHERE i_file = ?" - )->execute([$old_xref, " OBJE @$old_xref@", " OBJE @$new_xref@", $WT_TREE->getTreeId()]); - Database::prepare( - "UPDATE `##families` JOIN `##link` ON (l_file = f_file AND l_to = ? AND l_type = 'OBJE') SET f_gedcom = REPLACE(f_gedcom, ?, ?) WHERE f_file = ?" - )->execute([$old_xref, " OBJE @$old_xref@", " OBJE @$new_xref@", $WT_TREE->getTreeId()]); - Database::prepare( - "UPDATE `##media` JOIN `##link` ON (l_file = m_file AND l_to = ? AND l_type = 'OBJE') SET m_gedcom = REPLACE(m_gedcom, ?, ?) WHERE m_file = ?" - )->execute([$old_xref, " OBJE @$old_xref@", " OBJE @$new_xref@", $WT_TREE->getTreeId()]); - Database::prepare( - "UPDATE `##sources` JOIN `##link` ON (l_file = s_file AND l_to = ? AND l_type = 'OBJE') SET s_gedcom = REPLACE(s_gedcom, ?, ?) WHERE s_file = ?" - )->execute([$old_xref, " OBJE @$old_xref@", " OBJE @$new_xref@", $WT_TREE->getTreeId()]); - Database::prepare( - "UPDATE `##other` JOIN `##link` ON (l_file = o_file AND l_to = ? AND l_type = 'OBJE') SET o_gedcom = REPLACE(o_gedcom, ?, ?) WHERE o_file = ?" - )->execute([$old_xref, " OBJE @$old_xref@", " OBJE @$new_xref@", $WT_TREE->getTreeId()]); - break; - default: - Database::prepare( - "UPDATE `##other` SET o_id = ?, o_gedcom = REPLACE(o_gedcom, ?, ?) WHERE o_id = ? AND o_file = ?" - )->execute([$new_xref, "0 @$old_xref@ $type\n", "0 @$new_xref@ $type\n", $old_xref, $WT_TREE->getTreeId()]); - Database::prepare( - "UPDATE `##individuals` JOIN `##link` ON (l_file = i_file AND l_to = ?) SET i_gedcom = REPLACE(i_gedcom, ?, ?) WHERE i_file = ?" - )->execute([$old_xref, " @$old_xref@", " @$new_xref@", $WT_TREE->getTreeId()]); - Database::prepare( - "UPDATE `##families` JOIN `##link` ON (l_file = f_file AND l_to = ?) SET f_gedcom = REPLACE(f_gedcom, ?, ?) WHERE f_file = ?" - )->execute([$old_xref, " @$old_xref@", " @$new_xref@", $WT_TREE->getTreeId()]); - Database::prepare( - "UPDATE `##media` JOIN `##link` ON (l_file = m_file AND l_to = ?) SET m_gedcom = REPLACE(m_gedcom, ?, ?) WHERE m_file = ?" - )->execute([$old_xref, " @$old_xref@", " @$new_xref@", $WT_TREE->getTreeId()]); - Database::prepare( - "UPDATE `##sources` JOIN `##link` ON (l_file = s_file AND l_to = ?) SET s_gedcom = REPLACE(s_gedcom, ?, ?) WHERE s_file = ?" - )->execute([$old_xref, " @$old_xref@", " @$new_xref@", $WT_TREE->getTreeId()]); - Database::prepare( - "UPDATE `##other` JOIN `##link` ON (l_file = o_file AND l_to = ?) SET o_gedcom = REPLACE(o_gedcom, ?, ?) WHERE o_file = ?" - )->execute([$old_xref, " @$old_xref@", " @$new_xref@", $WT_TREE->getTreeId()]); - break; + case 'INDI': + Database::prepare( + "UPDATE `##individuals` SET i_id = ?, i_gedcom = REPLACE(i_gedcom, ?, ?) WHERE i_id = ? AND i_file = ?" + )->execute([$new_xref, "0 @$old_xref@ INDI\n", "0 @$new_xref@ INDI\n", $old_xref, $WT_TREE->getTreeId()]); + Database::prepare( + "UPDATE `##families` JOIN `##link` ON (l_file = f_file AND l_to = ? AND l_type = 'HUSB') SET f_gedcom = REPLACE(f_gedcom, ?, ?) WHERE f_file = ?" + )->execute([$old_xref, " HUSB @$old_xref@", " HUSB @$new_xref@", $WT_TREE->getTreeId()]); + Database::prepare( + "UPDATE `##families` JOIN `##link` ON (l_file = f_file AND l_to = ? AND l_type = 'WIFE') SET f_gedcom = REPLACE(f_gedcom, ?, ?) WHERE f_file = ?" + )->execute([$old_xref, " WIFE @$old_xref@", " WIFE @$new_xref@", $WT_TREE->getTreeId()]); + Database::prepare( + "UPDATE `##families` JOIN `##link` ON (l_file = f_file AND l_to = ? AND l_type = 'CHIL') SET f_gedcom = REPLACE(f_gedcom, ?, ?) WHERE f_file = ?" + )->execute([$old_xref, " CHIL @$old_xref@", " CHIL @$new_xref@", $WT_TREE->getTreeId()]); + Database::prepare( + "UPDATE `##families` JOIN `##link` ON (l_file = f_file AND l_to = ? AND l_type = 'ASSO') SET f_gedcom = REPLACE(f_gedcom, ?, ?) WHERE f_file = ?" + )->execute([$old_xref, " ASSO @$old_xref@", " ASSO @$new_xref@", $WT_TREE->getTreeId()]); + Database::prepare( + "UPDATE `##families` JOIN `##link` ON (l_file = f_file AND l_to = ? AND l_type = '_ASSO') SET f_gedcom = REPLACE(f_gedcom, ?, ?) WHERE f_file = ?" + )->execute([$old_xref, " _ASSO @$old_xref@", " _ASSO @$new_xref@", $WT_TREE->getTreeId()]); + Database::prepare( + "UPDATE `##individuals` JOIN `##link` ON (l_file = i_file AND l_to = ? AND l_type = 'ASSO') SET i_gedcom = REPLACE(i_gedcom, ?, ?) WHERE i_file = ?" + )->execute([$old_xref, " ASSO @$old_xref@", " ASSO @$new_xref@", $WT_TREE->getTreeId()]); + Database::prepare( + "UPDATE `##individuals` JOIN `##link` ON (l_file = i_file AND l_to = ? AND l_type = '_ASSO') SET i_gedcom = REPLACE(i_gedcom, ?, ?) WHERE i_file = ?" + )->execute([$old_xref, " _ASSO @$old_xref@", " _ASSO @$new_xref@", $WT_TREE->getTreeId()]); + Database::prepare( + "UPDATE `##placelinks` SET pl_gid = ? WHERE pl_gid = ? AND pl_file = ?" + )->execute([$new_xref, $old_xref, $WT_TREE->getTreeId()]); + Database::prepare( + "UPDATE `##dates` SET d_gid = ? WHERE d_gid = ? AND d_file = ?" + )->execute([$new_xref, $old_xref, $WT_TREE->getTreeId()]); + Database::prepare( + "UPDATE `##user_gedcom_setting` SET setting_value = ? WHERE setting_value = ? AND gedcom_id = ? AND setting_name IN ('gedcomid', 'rootid')" + )->execute([$new_xref, $old_xref, $WT_TREE->getTreeId()]); + break; + case 'FAM': + Database::prepare( + "UPDATE `##families` SET f_id = ?, f_gedcom = REPLACE(f_gedcom, ?, ?) WHERE f_id = ? AND f_file = ?" + )->execute([$new_xref, "0 @$old_xref@ FAM\n", "0 @$new_xref@ FAM\n", $old_xref, $WT_TREE->getTreeId()]); + Database::prepare( + "UPDATE `##individuals` JOIN `##link` ON (l_file = i_file AND l_to = ? AND l_type = 'FAMC') SET i_gedcom = REPLACE(i_gedcom, ?, ?) WHERE i_file = ?" + )->execute([$old_xref, " FAMC @$old_xref@", " FAMC @$new_xref@", $WT_TREE->getTreeId()]); + Database::prepare( + "UPDATE `##individuals` JOIN `##link` ON (l_file = i_file AND l_to = ? AND l_type = 'FAMS') SET i_gedcom = REPLACE(i_gedcom, ?, ?) WHERE i_file = ?" + )->execute([$old_xref, " FAMS @$old_xref@", " FAMS @$new_xref@", $WT_TREE->getTreeId()]); + Database::prepare( + "UPDATE `##placelinks` SET pl_gid = ? WHERE pl_gid = ? AND pl_file = ?" + )->execute([$new_xref, $old_xref, $WT_TREE->getTreeId()]); + Database::prepare( + "UPDATE `##dates` SET d_gid = ? WHERE d_gid = ? AND d_file = ?" + )->execute([$new_xref, $old_xref, $WT_TREE->getTreeId()]); + break; + case 'SOUR': + Database::prepare( + "UPDATE `##sources` SET s_id = ?, s_gedcom = REPLACE(s_gedcom, ?, ?) WHERE s_id = ? AND s_file = ?" + )->execute([$new_xref, "0 @$old_xref@ SOUR\n", "0 @$new_xref@ SOUR\n", $old_xref, $WT_TREE->getTreeId()]); + Database::prepare( + "UPDATE `##individuals` JOIN `##link` ON (l_file = i_file AND l_to = ? AND l_type = 'SOUR') SET i_gedcom = REPLACE(i_gedcom, ?, ?) WHERE i_file = ?" + )->execute([$old_xref, " SOUR @$old_xref@", " SOUR @$new_xref@", $WT_TREE->getTreeId()]); + Database::prepare( + "UPDATE `##families` JOIN `##link` ON (l_file = f_file AND l_to = ? AND l_type = 'SOUR') SET f_gedcom = REPLACE(f_gedcom, ?, ?) WHERE f_file = ?" + )->execute([$old_xref, " SOUR @$old_xref@", " SOUR @$new_xref@", $WT_TREE->getTreeId()]); + Database::prepare( + "UPDATE `##media` JOIN `##link` ON (l_file = m_file AND l_to = ? AND l_type = 'SOUR') SET m_gedcom = REPLACE(m_gedcom, ?, ?) WHERE m_file = ?" + )->execute([$old_xref, " SOUR @$old_xref@", " SOUR @$new_xref@", $WT_TREE->getTreeId()]); + Database::prepare( + "UPDATE `##other` JOIN `##link` ON (l_file = o_file AND l_to = ? AND l_type = 'SOUR') SET o_gedcom = REPLACE(o_gedcom, ?, ?) WHERE o_file = ?" + )->execute([$old_xref, " SOUR @$old_xref@", " SOUR @$new_xref@", $WT_TREE->getTreeId()]); + break; + case 'REPO': + Database::prepare( + "UPDATE `##other` SET o_id = ?, o_gedcom = REPLACE(o_gedcom, ?, ?) WHERE o_id = ? AND o_file = ?" + )->execute([$new_xref, "0 @$old_xref@ REPO\n", "0 @$new_xref@ REPO\n", $old_xref, $WT_TREE->getTreeId()]); + Database::prepare( + "UPDATE `##sources` JOIN `##link` ON (l_file = s_file AND l_to = ? AND l_type = 'REPO') SET s_gedcom = REPLACE(s_gedcom, ?, ?) WHERE s_file = ?" + )->execute([$old_xref, " REPO @$old_xref@", " REPO @$new_xref@", $WT_TREE->getTreeId()]); + break; + case 'NOTE': + Database::prepare( + "UPDATE `##other` SET o_id = ?, o_gedcom = REPLACE(REPLACE(o_gedcom, ?, ?), ?, ?) WHERE o_id = ? AND o_file = ?" + )->execute([$new_xref, "0 @$old_xref@ NOTE\n", "0 @$new_xref@ NOTE\n", "0 @$old_xref@ NOTE ", "0 @$new_xref@ NOTE ", $old_xref, $WT_TREE->getTreeId()]); + Database::prepare( + "UPDATE `##individuals` JOIN `##link` ON (l_file = i_file AND l_to = ? AND l_type = 'NOTE') SET i_gedcom = REPLACE(i_gedcom, ?, ?) WHERE i_file = ?" + )->execute([$old_xref, " NOTE @$old_xref@", " NOTE @$new_xref@", $WT_TREE->getTreeId()]); + Database::prepare( + "UPDATE `##families` JOIN `##link` ON (l_file = f_file AND l_to = ? AND l_type = 'NOTE') SET f_gedcom = REPLACE(f_gedcom, ?, ?) WHERE f_file = ?" + )->execute([$old_xref, " NOTE @$old_xref@", " NOTE @$new_xref@", $WT_TREE->getTreeId()]); + Database::prepare( + "UPDATE `##media` JOIN `##link` ON (l_file = m_file AND l_to = ? AND l_type = 'NOTE') SET m_gedcom = REPLACE(m_gedcom, ?, ?) WHERE m_file = ?" + )->execute([$old_xref, " NOTE @$old_xref@", " NOTE @$new_xref@", $WT_TREE->getTreeId()]); + Database::prepare( + "UPDATE `##sources` JOIN `##link` ON (l_file = s_file AND l_to = ? AND l_type = 'NOTE') SET s_gedcom = REPLACE(s_gedcom, ?, ?) WHERE s_file = ?" + )->execute([$old_xref, " NOTE @$old_xref@", " NOTE @$new_xref@", $WT_TREE->getTreeId()]); + Database::prepare( + "UPDATE `##other` JOIN `##link` ON (l_file = o_file AND l_to = ? AND l_type = 'NOTE') SET o_gedcom = REPLACE(o_gedcom, ?, ?) WHERE o_file = ?" + )->execute([$old_xref, " NOTE @$old_xref@", " NOTE @$new_xref@", $WT_TREE->getTreeId()]); + break; + case 'OBJE': + Database::prepare( + "UPDATE `##media` SET m_id = ?, m_gedcom = REPLACE(m_gedcom, ?, ?) WHERE m_id = ? AND m_file = ?" + )->execute([$new_xref, "0 @$old_xref@ OBJE\n", "0 @$new_xref@ OBJE\n", $old_xref, $WT_TREE->getTreeId()]); + Database::prepare( + "UPDATE `##media_file` SET m_id = ? WHERE m_id = ? AND m_file = ?" + )->execute([$new_xref, $old_xref, $WT_TREE->getTreeId()]); + Database::prepare( + "UPDATE `##individuals` JOIN `##link` ON (l_file = i_file AND l_to = ? AND l_type = 'OBJE') SET i_gedcom = REPLACE(i_gedcom, ?, ?) WHERE i_file = ?" + )->execute([$old_xref, " OBJE @$old_xref@", " OBJE @$new_xref@", $WT_TREE->getTreeId()]); + Database::prepare( + "UPDATE `##families` JOIN `##link` ON (l_file = f_file AND l_to = ? AND l_type = 'OBJE') SET f_gedcom = REPLACE(f_gedcom, ?, ?) WHERE f_file = ?" + )->execute([$old_xref, " OBJE @$old_xref@", " OBJE @$new_xref@", $WT_TREE->getTreeId()]); + Database::prepare( + "UPDATE `##media` JOIN `##link` ON (l_file = m_file AND l_to = ? AND l_type = 'OBJE') SET m_gedcom = REPLACE(m_gedcom, ?, ?) WHERE m_file = ?" + )->execute([$old_xref, " OBJE @$old_xref@", " OBJE @$new_xref@", $WT_TREE->getTreeId()]); + Database::prepare( + "UPDATE `##sources` JOIN `##link` ON (l_file = s_file AND l_to = ? AND l_type = 'OBJE') SET s_gedcom = REPLACE(s_gedcom, ?, ?) WHERE s_file = ?" + )->execute([$old_xref, " OBJE @$old_xref@", " OBJE @$new_xref@", $WT_TREE->getTreeId()]); + Database::prepare( + "UPDATE `##other` JOIN `##link` ON (l_file = o_file AND l_to = ? AND l_type = 'OBJE') SET o_gedcom = REPLACE(o_gedcom, ?, ?) WHERE o_file = ?" + )->execute([$old_xref, " OBJE @$old_xref@", " OBJE @$new_xref@", $WT_TREE->getTreeId()]); + break; + default: + Database::prepare( + "UPDATE `##other` SET o_id = ?, o_gedcom = REPLACE(o_gedcom, ?, ?) WHERE o_id = ? AND o_file = ?" + )->execute([$new_xref, "0 @$old_xref@ $type\n", "0 @$new_xref@ $type\n", $old_xref, $WT_TREE->getTreeId()]); + Database::prepare( + "UPDATE `##individuals` JOIN `##link` ON (l_file = i_file AND l_to = ?) SET i_gedcom = REPLACE(i_gedcom, ?, ?) WHERE i_file = ?" + )->execute([$old_xref, " @$old_xref@", " @$new_xref@", $WT_TREE->getTreeId()]); + Database::prepare( + "UPDATE `##families` JOIN `##link` ON (l_file = f_file AND l_to = ?) SET f_gedcom = REPLACE(f_gedcom, ?, ?) WHERE f_file = ?" + )->execute([$old_xref, " @$old_xref@", " @$new_xref@", $WT_TREE->getTreeId()]); + Database::prepare( + "UPDATE `##media` JOIN `##link` ON (l_file = m_file AND l_to = ?) SET m_gedcom = REPLACE(m_gedcom, ?, ?) WHERE m_file = ?" + )->execute([$old_xref, " @$old_xref@", " @$new_xref@", $WT_TREE->getTreeId()]); + Database::prepare( + "UPDATE `##sources` JOIN `##link` ON (l_file = s_file AND l_to = ?) SET s_gedcom = REPLACE(s_gedcom, ?, ?) WHERE s_file = ?" + )->execute([$old_xref, " @$old_xref@", " @$new_xref@", $WT_TREE->getTreeId()]); + Database::prepare( + "UPDATE `##other` JOIN `##link` ON (l_file = o_file AND l_to = ?) SET o_gedcom = REPLACE(o_gedcom, ?, ?) WHERE o_file = ?" + )->execute([$old_xref, " @$old_xref@", " @$new_xref@", $WT_TREE->getTreeId()]); + break; } Database::prepare( "UPDATE `##name` SET n_id = ? WHERE n_id = ? AND n_file = ?" diff --git a/admin_users.php b/admin_users.php index ef1fdaf20b..61fa4ab282 100644 --- a/admin_users.php +++ b/admin_users.php @@ -41,108 +41,108 @@ $THEME_OPTIONS = ['' => I18N::translate('<default theme>')] + Theme::themeNames( // Form actions switch (Filter::post('action')) { -case 'save': - if (Filter::checkCsrf()) { - $user_id = Filter::postInteger('user_id'); - $user = User::find($user_id); - $username = Filter::post('username'); - $real_name = Filter::post('real_name'); - $email = Filter::post('email'); - $pass1 = Filter::post('pass1', WT_REGEX_PASSWORD); - $pass2 = Filter::post('pass2', WT_REGEX_PASSWORD); - $theme = Filter::post('theme', implode('|', array_keys(Theme::themeNames())), ''); - $language = Filter::post('language'); - $timezone = Filter::post('timezone'); - $contact_method = Filter::post('contact_method'); - $comment = Filter::post('comment'); - $auto_accept = Filter::postBool('auto_accept'); - $canadmin = Filter::postBool('canadmin'); - $visible_online = Filter::postBool('visible_online'); - $verified = Filter::postBool('verified'); - $approved = Filter::postBool('approved'); + case 'save': + if (Filter::checkCsrf()) { + $user_id = Filter::postInteger('user_id'); + $user = User::find($user_id); + $username = Filter::post('username'); + $real_name = Filter::post('real_name'); + $email = Filter::post('email'); + $pass1 = Filter::post('pass1', WT_REGEX_PASSWORD); + $pass2 = Filter::post('pass2', WT_REGEX_PASSWORD); + $theme = Filter::post('theme', implode('|', array_keys(Theme::themeNames())), ''); + $language = Filter::post('language'); + $timezone = Filter::post('timezone'); + $contact_method = Filter::post('contact_method'); + $comment = Filter::post('comment'); + $auto_accept = Filter::postBool('auto_accept'); + $canadmin = Filter::postBool('canadmin'); + $visible_online = Filter::postBool('visible_online'); + $verified = Filter::postBool('verified'); + $approved = Filter::postBool('approved'); - if ($user_id === 0) { - // Create a new user - if (User::findByUserName($username)) { - FlashMessages::addMessage(I18N::translate('Duplicate username. A user with that username already exists. Please choose another username.')); - } elseif (User::findByEmail($email)) { - FlashMessages::addMessage(I18N::translate('Duplicate email address. A user with that email already exists.')); - } elseif ($pass1 !== $pass2) { - FlashMessages::addMessage(I18N::translate('The passwords do not match.')); + if ($user_id === 0) { + // Create a new user + if (User::findByUserName($username)) { + FlashMessages::addMessage(I18N::translate('Duplicate username. A user with that username already exists. Please choose another username.')); + } elseif (User::findByEmail($email)) { + FlashMessages::addMessage(I18N::translate('Duplicate email address. A user with that email already exists.')); + } elseif ($pass1 !== $pass2) { + FlashMessages::addMessage(I18N::translate('The passwords do not match.')); + } else { + $user = User::create($username, $real_name, $email, $pass1); + $user->setPreference('reg_timestamp', date('U'))->setPreference('sessiontime', '0'); + Log::addAuthenticationLog('User ->' . $username . '<- created'); + } } else { - $user = User::create($username, $real_name, $email, $pass1); - $user->setPreference('reg_timestamp', date('U'))->setPreference('sessiontime', '0'); - Log::addAuthenticationLog('User ->' . $username . '<- created'); - } - } else { - $user = User::find($user_id); - if ($user && $username && $real_name) { - $user->setEmail($email); - $user->setUserName($username); - $user->setRealName($real_name); - if ($pass1 !== null && $pass1 === $pass2) { - $user->setPassword($pass1); + $user = User::find($user_id); + if ($user && $username && $real_name) { + $user->setEmail($email); + $user->setUserName($username); + $user->setRealName($real_name); + if ($pass1 !== null && $pass1 === $pass2) { + $user->setPassword($pass1); + } } } - } - if ($user) { - // Approving for the first time? Send a confirmation email - if ($approved && !$user->getPreference('verified_by_admin') && $user->getPreference('sessiontime') == 0) { - I18N::init($user->getPreference('language')); + if ($user) { + // Approving for the first time? Send a confirmation email + if ($approved && !$user->getPreference('verified_by_admin') && $user->getPreference('sessiontime') == 0) { + I18N::init($user->getPreference('language')); - // Create a dummy user, so we can send messages from the tree. - $sender = new User( - (object) [ - 'user_id' => null, - 'user_name' => '', - 'real_name' => $WT_TREE->getTitle(), - 'email' => $WT_TREE->getPreference('WEBTREES_EMAIL'), - ] - ); + // Create a dummy user, so we can send messages from the tree. + $sender = new User( + (object) [ + 'user_id' => null, + 'user_name' => '', + 'real_name' => $WT_TREE->getTitle(), + 'email' => $WT_TREE->getPreference('WEBTREES_EMAIL'), + ] + ); - Mail::send( - $sender, - $user, - $sender, - I18N::translate('Approval of account at %s', WT_BASE_URL), - View::make('emails/approve-user-text', ['user' => $user]), - View::make('emails/approve-user-html', ['user' => $user]) - ); - } + Mail::send( + $sender, + $user, + $sender, + I18N::translate('Approval of account at %s', WT_BASE_URL), + View::make('emails/approve-user-text', ['user' => $user]), + View::make('emails/approve-user-html', ['user' => $user]) + ); + } - $user - ->setPreference('theme', $theme) - ->setPreference('language', $language) - ->setPreference('TIMEZONE', $timezone) - ->setPreference('contactmethod', $contact_method) - ->setPreference('comment', $comment) - ->setPreference('auto_accept', $auto_accept ? '1' : '0') - ->setPreference('visibleonline', $visible_online ? '1' : '0') - ->setPreference('verified', $verified ? '1' : '0') - ->setPreference('verified_by_admin', $approved ? '1' : '0'); + $user + ->setPreference('theme', $theme) + ->setPreference('language', $language) + ->setPreference('TIMEZONE', $timezone) + ->setPreference('contactmethod', $contact_method) + ->setPreference('comment', $comment) + ->setPreference('auto_accept', $auto_accept ? '1' : '0') + ->setPreference('visibleonline', $visible_online ? '1' : '0') + ->setPreference('verified', $verified ? '1' : '0') + ->setPreference('verified_by_admin', $approved ? '1' : '0'); - // We cannot change our own admin status. Another admin will need to do it. - if ($user->getUserId() !== Auth::id()) { - $user->setPreference('canadmin', $canadmin ? '1' : '0'); - } + // We cannot change our own admin status. Another admin will need to do it. + if ($user->getUserId() !== Auth::id()) { + $user->setPreference('canadmin', $canadmin ? '1' : '0'); + } - foreach (Tree::getAll() as $tree) { - $tree->setUserPreference($user, 'gedcomid', Filter::post('gedcomid' . $tree->getTreeId(), WT_REGEX_XREF)); - $tree->setUserPreference($user, 'canedit', Filter::post('canedit' . $tree->getTreeId(), implode('|', array_keys($ALL_EDIT_OPTIONS)))); - if (Filter::post('gedcomid' . $tree->getTreeId(), WT_REGEX_XREF)) { - $tree->setUserPreference($user, 'RELATIONSHIP_PATH_LENGTH', Filter::postInteger('RELATIONSHIP_PATH_LENGTH' . $tree->getTreeId(), 0, 10, 0)); - } else { - // Do not allow a path length to be set if the individual ID is not - $tree->setUserPreference($user, 'RELATIONSHIP_PATH_LENGTH', null); + foreach (Tree::getAll() as $tree) { + $tree->setUserPreference($user, 'gedcomid', Filter::post('gedcomid' . $tree->getTreeId(), WT_REGEX_XREF)); + $tree->setUserPreference($user, 'canedit', Filter::post('canedit' . $tree->getTreeId(), implode('|', array_keys($ALL_EDIT_OPTIONS)))); + if (Filter::post('gedcomid' . $tree->getTreeId(), WT_REGEX_XREF)) { + $tree->setUserPreference($user, 'RELATIONSHIP_PATH_LENGTH', Filter::postInteger('RELATIONSHIP_PATH_LENGTH' . $tree->getTreeId(), 0, 10, 0)); + } else { + // Do not allow a path length to be set if the individual ID is not + $tree->setUserPreference($user, 'RELATIONSHIP_PATH_LENGTH', null); + } } } } - } - header('Location: admin_users.php'); + header('Location: admin_users.php'); - return; + return; } switch (Filter::get('action')) { @@ -182,12 +182,12 @@ case 'load_json': // Datatables numbers columns 0, 1, 2 // MySQL numbers columns 1, 2, 3 switch ($value['dir']) { - case 'asc': - $sql_select .= (1 + $value['column']) . " ASC "; - break; - case 'desc': - $sql_select .= (1 + $value['column']) . " DESC "; - break; + case 'asc': + $sql_select .= (1 + $value['column']) . " ASC "; + break; + case 'desc': + $sql_select .= (1 + $value['column']) . " DESC "; + break; } } } else { diff --git a/app/Controller/AdvancedSearchController.php b/app/Controller/AdvancedSearchController.php index b44a46e90f..c34d82ea7c 100644 --- a/app/Controller/AdvancedSearchController.php +++ b/app/Controller/AdvancedSearchController.php @@ -373,108 +373,108 @@ class AdvancedSearchController extends SearchController { if ($parts[0] == 'NAME') { // NAME:* switch ($parts[1]) { - case 'GIVN': - switch ($parts[2]) { - case 'EXACT': - $sql .= " AND i_n.n_givn=?"; - $bind[] = $value; - break; - case 'BEGINS': - $sql .= " AND i_n.n_givn LIKE CONCAT(?, '%')"; - $bind[] = $value; - break; - case 'CONTAINS': - $sql .= " AND i_n.n_givn LIKE CONCAT('%', ?, '%')"; - $bind[] = $value; - break; - case 'SDX_STD': - $sdx = Soundex::russell($value); - if ($sdx !== null) { - $sdx = explode(':', $sdx); - foreach ($sdx as $k => $v) { - $sdx[$k] = "i_n.n_soundex_givn_std LIKE CONCAT('%', ?, '%')"; - $bind[] = $v; - } - $sql .= ' AND (' . implode(' OR ', $sdx) . ')'; - } else { - // No phonetic content? Use a substring match - $sql .= " AND i_n.n_givn LIKE CONCAT('%', ?, '%')"; - $bind[] = $value; + case 'GIVN': + switch ($parts[2]) { + case 'EXACT': + $sql .= " AND i_n.n_givn=?"; + $bind[] = $value; + break; + case 'BEGINS': + $sql .= " AND i_n.n_givn LIKE CONCAT(?, '%')"; + $bind[] = $value; + break; + case 'CONTAINS': + $sql .= " AND i_n.n_givn LIKE CONCAT('%', ?, '%')"; + $bind[] = $value; + break; + case 'SDX_STD': + $sdx = Soundex::russell($value); + if ($sdx !== null) { + $sdx = explode(':', $sdx); + foreach ($sdx as $k => $v) { + $sdx[$k] = "i_n.n_soundex_givn_std LIKE CONCAT('%', ?, '%')"; + $bind[] = $v; + } + $sql .= ' AND (' . implode(' OR ', $sdx) . ')'; + } else { + // No phonetic content? Use a substring match + $sql .= " AND i_n.n_givn LIKE CONCAT('%', ?, '%')"; + $bind[] = $value; + } + break; + case 'SDX': // SDX uses DM by default. + case 'SDX_DM': + $sdx = Soundex::daitchMokotoff($value); + if ($sdx !== null) { + $sdx = explode(':', $sdx); + foreach ($sdx as $k => $v) { + $sdx[$k] = "i_n.n_soundex_givn_dm LIKE CONCAT('%', ?, '%')"; + $bind[] = $v; + } + $sql .= ' AND (' . implode(' OR ', $sdx) . ')'; + } else { + // No phonetic content? Use a substring match + $sql .= " AND i_n.n_givn LIKE CONCAT('%', ?, '%')"; + $bind[] = $value; + } + break; } - break; - case 'SDX': // SDX uses DM by default. - case 'SDX_DM': - $sdx = Soundex::daitchMokotoff($value); - if ($sdx !== null) { - $sdx = explode(':', $sdx); - foreach ($sdx as $k => $v) { - $sdx[$k] = "i_n.n_soundex_givn_dm LIKE CONCAT('%', ?, '%')"; - $bind[] = $v; - } - $sql .= ' AND (' . implode(' OR ', $sdx) . ')'; - } else { - // No phonetic content? Use a substring match - $sql .= " AND i_n.n_givn LIKE CONCAT('%', ?, '%')"; - $bind[] = $value; + break; + case 'SURN': + switch ($parts[2]) { + case 'EXACT': + $sql .= " AND i_n.n_surname=?"; + $bind[] = $value; + break; + case 'BEGINS': + $sql .= " AND i_n.n_surname LIKE CONCAT(?, '%')"; + $bind[] = $value; + break; + case 'CONTAINS': + $sql .= " AND i_n.n_surname LIKE CONCAT('%', ?, '%')"; + $bind[] = $value; + break; + case 'SDX_STD': + $sdx = Soundex::russell($value); + if ($sdx !== null) { + $sdx = explode(':', $sdx); + foreach ($sdx as $k => $v) { + $sdx[$k] = "i_n.n_soundex_surn_std LIKE CONCAT('%', ?, '%')"; + $bind[] = $v; + } + $sql .= " AND (" . implode(' OR ', $sdx) . ")"; + } else { + // No phonetic content? Use a substring match + $sql .= " AND i_n.n_surn LIKE CONCAT('%', ?, '%')"; + $bind[] = $value; + } + break; + case 'SDX': // SDX uses DM by default. + case 'SDX_DM': + $sdx = Soundex::daitchMokotoff($value); + if ($sdx !== null) { + $sdx = explode(':', $sdx); + foreach ($sdx as $k => $v) { + $sdx[$k] = "i_n.n_soundex_surn_dm LIKE CONCAT('%', ?, '%')"; + $bind[] = $v; + } + $sql .= " AND (" . implode(' OR ', $sdx) . ")"; + break; + } else { + // No phonetic content? Use a substring match + $sql .= " AND i_n.n_surn LIKE CONCAT('%', ?, '%')"; + $bind[] = $value; + } } - break; - } break; - case 'SURN': - switch ($parts[2]) { - case 'EXACT': - $sql .= " AND i_n.n_surname=?"; + case 'NICK': + case '_MARNM': + case '_HEB': + case '_AKA': + $sql .= " AND i_n.n_type=? AND i_n.n_full LIKE CONCAT('%', ?, '%')"; + $bind[] = $parts[1]; $bind[] = $value; break; - case 'BEGINS': - $sql .= " AND i_n.n_surname LIKE CONCAT(?, '%')"; - $bind[] = $value; - break; - case 'CONTAINS': - $sql .= " AND i_n.n_surname LIKE CONCAT('%', ?, '%')"; - $bind[] = $value; - break; - case 'SDX_STD': - $sdx = Soundex::russell($value); - if ($sdx !== null) { - $sdx = explode(':', $sdx); - foreach ($sdx as $k => $v) { - $sdx[$k] = "i_n.n_soundex_surn_std LIKE CONCAT('%', ?, '%')"; - $bind[] = $v; - } - $sql .= " AND (" . implode(' OR ', $sdx) . ")"; - } else { - // No phonetic content? Use a substring match - $sql .= " AND i_n.n_surn LIKE CONCAT('%', ?, '%')"; - $bind[] = $value; - } - break; - case 'SDX': // SDX uses DM by default. - case 'SDX_DM': - $sdx = Soundex::daitchMokotoff($value); - if ($sdx !== null) { - $sdx = explode(':', $sdx); - foreach ($sdx as $k => $v) { - $sdx[$k] = "i_n.n_soundex_surn_dm LIKE CONCAT('%', ?, '%')"; - $bind[] = $v; - } - $sql .= " AND (" . implode(' OR ', $sdx) . ")"; - break; - } else { - // No phonetic content? Use a substring match - $sql .= " AND i_n.n_surn LIKE CONCAT('%', ?, '%')"; - $bind[] = $value; - } - } - break; - case 'NICK': - case '_MARNM': - case '_HEB': - case '_AKA': - $sql .= " AND i_n.n_type=? AND i_n.n_full LIKE CONCAT('%', ?, '%')"; - $bind[] = $parts[1]; - $bind[] = $value; - break; } } elseif ($parts[1] == 'DATE') { // *:DATE @@ -522,99 +522,99 @@ class AdvancedSearchController extends SearchController { $table = $parts[1] == 'HUSB' ? 'f_n' : 'm_n'; // NAME:* switch ($parts[3]) { - case 'GIVN': - switch ($parts[4]) { - case 'EXACT': - $sql .= " AND {$table}.n_givn=?"; - $bind[] = $value; - break; - case 'BEGINS': - $sql .= " AND {$table}.n_givn LIKE CONCAT(?, '%')"; - $bind[] = $value; - break; - case 'CONTAINS': - $sql .= " AND {$table}.n_givn LIKE CONCAT('%', ?, '%')"; - $bind[] = $value; - break; - case 'SDX_STD': - $sdx = Soundex::russell($value); - if ($sdx !== null) { - $sdx = explode(':', $sdx); - foreach ($sdx as $k => $v) { - $sdx[$k] = "{$table}.n_soundex_givn_std LIKE CONCAT('%', ?, '%')"; - $bind[] = $v; - } - $sql .= ' AND (' . implode(' OR ', $sdx) . ')'; - } else { - // No phonetic content? Use a substring match - $sql .= " AND {$table}.n_givn = LIKE CONCAT('%', ?, '%')"; - $bind[] = $value; + case 'GIVN': + switch ($parts[4]) { + case 'EXACT': + $sql .= " AND {$table}.n_givn=?"; + $bind[] = $value; + break; + case 'BEGINS': + $sql .= " AND {$table}.n_givn LIKE CONCAT(?, '%')"; + $bind[] = $value; + break; + case 'CONTAINS': + $sql .= " AND {$table}.n_givn LIKE CONCAT('%', ?, '%')"; + $bind[] = $value; + break; + case 'SDX_STD': + $sdx = Soundex::russell($value); + if ($sdx !== null) { + $sdx = explode(':', $sdx); + foreach ($sdx as $k => $v) { + $sdx[$k] = "{$table}.n_soundex_givn_std LIKE CONCAT('%', ?, '%')"; + $bind[] = $v; + } + $sql .= ' AND (' . implode(' OR ', $sdx) . ')'; + } else { + // No phonetic content? Use a substring match + $sql .= " AND {$table}.n_givn = LIKE CONCAT('%', ?, '%')"; + $bind[] = $value; + } + break; + case 'SDX': // SDX uses DM by default. + case 'SDX_DM': + $sdx = Soundex::daitchMokotoff($value); + if ($sdx !== null) { + $sdx = explode(':', $sdx); + foreach ($sdx as $k => $v) { + $sdx[$k] = "{$table}.n_soundex_givn_dm LIKE CONCAT('%', ?, '%')"; + $bind[] = $v; + } + $sql .= ' AND (' . implode(' OR ', $sdx) . ')'; + break; + } else { + // No phonetic content? Use a substring match + $sql .= " AND {$table}.n_givn = LIKE CONCAT('%', ?, '%')"; + $bind[] = $value; + } } - break; - case 'SDX': // SDX uses DM by default. - case 'SDX_DM': - $sdx = Soundex::daitchMokotoff($value); - if ($sdx !== null) { - $sdx = explode(':', $sdx); - foreach ($sdx as $k => $v) { - $sdx[$k] = "{$table}.n_soundex_givn_dm LIKE CONCAT('%', ?, '%')"; - $bind[] = $v; - } - $sql .= ' AND (' . implode(' OR ', $sdx) . ')'; - break; - } else { - // No phonetic content? Use a substring match - $sql .= " AND {$table}.n_givn = LIKE CONCAT('%', ?, '%')"; - $bind[] = $value; - } - } break; - case 'SURN': - switch ($parts[4]) { - case 'EXACT': - $sql .= " AND {$table}.n_surname=?"; - $bind[] = $value; - break; - case 'BEGINS': - $sql .= " AND {$table}.n_surname LIKE CONCAT(?, '%')"; - $bind[] = $value; - break; - case 'CONTAINS': - $sql .= " AND {$table}.n_surname LIKE CONCAT('%', ?, '%')"; - $bind[] = $value; - break; - case 'SDX_STD': - $sdx = Soundex::russell($value); - if ($sdx !== null) { - $sdx = explode(':', $sdx); - foreach ($sdx as $k => $v) { - $sdx[$k] = "{$table}.n_soundex_surn_std LIKE CONCAT('%', ?, '%')"; - $bind[] = $v; - } - $sql .= ' AND (' . implode(' OR ', $sdx) . ')'; - } else { - // No phonetic content? Use a substring match - $sql .= " AND {$table}.n_surn = LIKE CONCAT('%', ?, '%')"; - $bind[] = $value; - } - break; - case 'SDX': // SDX uses DM by default. - case 'SDX_DM': - $sdx = Soundex::daitchMokotoff($value); - if ($sdx !== null) { - $sdx = explode(':', $sdx); - foreach ($sdx as $k => $v) { - $sdx[$k] = "{$table}.n_soundex_surn_dm LIKE CONCAT('%', ?, '%')"; - $bind[] = $v; - } - $sql .= ' AND (' . implode(' OR ', $sdx) . ')'; - } else { - // No phonetic content? Use a substring match - $sql .= " AND {$table}.n_surn = LIKE CONCAT('%', ?, '%')"; - $bind[] = $value; + case 'SURN': + switch ($parts[4]) { + case 'EXACT': + $sql .= " AND {$table}.n_surname=?"; + $bind[] = $value; + break; + case 'BEGINS': + $sql .= " AND {$table}.n_surname LIKE CONCAT(?, '%')"; + $bind[] = $value; + break; + case 'CONTAINS': + $sql .= " AND {$table}.n_surname LIKE CONCAT('%', ?, '%')"; + $bind[] = $value; + break; + case 'SDX_STD': + $sdx = Soundex::russell($value); + if ($sdx !== null) { + $sdx = explode(':', $sdx); + foreach ($sdx as $k => $v) { + $sdx[$k] = "{$table}.n_soundex_surn_std LIKE CONCAT('%', ?, '%')"; + $bind[] = $v; + } + $sql .= ' AND (' . implode(' OR ', $sdx) . ')'; + } else { + // No phonetic content? Use a substring match + $sql .= " AND {$table}.n_surn = LIKE CONCAT('%', ?, '%')"; + $bind[] = $value; + } + break; + case 'SDX': // SDX uses DM by default. + case 'SDX_DM': + $sdx = Soundex::daitchMokotoff($value); + if ($sdx !== null) { + $sdx = explode(':', $sdx); + foreach ($sdx as $k => $v) { + $sdx[$k] = "{$table}.n_soundex_surn_dm LIKE CONCAT('%', ?, '%')"; + $bind[] = $v; + } + $sql .= ' AND (' . implode(' OR ', $sdx) . ')'; + } else { + // No phonetic content? Use a substring match + $sql .= " AND {$table}.n_surn = LIKE CONCAT('%', ?, '%')"; + $bind[] = $value; + } + break; } - break; - } break; } } elseif ($parts[0] === 'FAMS') { diff --git a/app/Controller/AncestryController.php b/app/Controller/AncestryController.php index 6ddb44ca8d..89cac81048 100644 --- a/app/Controller/AncestryController.php +++ b/app/Controller/AncestryController.php @@ -124,47 +124,47 @@ class AncestryController extends ChartController { } switch ($this->chart_style) { - case 0: - // List - return - '<ul class="chart_common">' . - $this->printChildAscendancy($this->root, 1, $this->generations - 1) . - '</ul>'; + case 0: + // List + return + '<ul class="chart_common">' . + $this->printChildAscendancy($this->root, 1, $this->generations - 1) . + '</ul>'; - case 1: - // Booklet - // first page : show indi facts - FunctionsPrint::printPedigreePerson($this->root); - // process the tree - $ancestors = $this->sosaAncestors($this->generations - 1); - $ancestors = array_filter($ancestors); // The SOSA array includes empty placeholders + case 1: + // Booklet + // first page : show indi facts + FunctionsPrint::printPedigreePerson($this->root); + // process the tree + $ancestors = $this->sosaAncestors($this->generations - 1); + $ancestors = array_filter($ancestors); // The SOSA array includes empty placeholders - foreach ($ancestors as $sosa => $individual) { - foreach ($individual->getChildFamilies() as $family) { - FunctionsCharts::printSosaFamily($family->getXref(), $individual->getXref(), $sosa, '', '', '', $this->show_cousins); + foreach ($ancestors as $sosa => $individual) { + foreach ($individual->getChildFamilies() as $family) { + FunctionsCharts::printSosaFamily($family->getXref(), $individual->getXref(), $sosa, '', '', '', $this->show_cousins); + } } - } - break; + break; - case 2: - // Individual list - $ancestors = $this->sosaAncestors($this->generations); - $ancestors = array_filter($ancestors); // The SOSA array includes empty placeholders + case 2: + // Individual list + $ancestors = $this->sosaAncestors($this->generations); + $ancestors = array_filter($ancestors); // The SOSA array includes empty placeholders - return FunctionsPrintLists::individualTable($ancestors, 'sosa'); + return FunctionsPrintLists::individualTable($ancestors, 'sosa'); - case 3: - // Family list - $ancestors = $this->sosaAncestors($this->generations - 1); - $ancestors = array_filter($ancestors); // The SOSA array includes empty placeholders - $families = []; - foreach ($ancestors as $individual) { - foreach ($individual->getChildFamilies() as $family) { - $families[$family->getXref()] = $family; + case 3: + // Family list + $ancestors = $this->sosaAncestors($this->generations - 1); + $ancestors = array_filter($ancestors); // The SOSA array includes empty placeholders + $families = []; + foreach ($ancestors as $individual) { + foreach ($individual->getChildFamilies() as $family) { + $families[$family->getXref()] = $family; + } } - } - return FunctionsPrintLists::familyTable($families); + return FunctionsPrintLists::familyTable($families); } return ''; diff --git a/app/Controller/FanchartController.php b/app/Controller/FanchartController.php index 93eb7bcb4e..59ba8e0c68 100644 --- a/app/Controller/FanchartController.php +++ b/app/Controller/FanchartController.php @@ -245,15 +245,15 @@ class FanchartController extends ChartController { $text .= "\n" . I18N::reverseText($person->getLifeSpan()); switch ($person->getSex()) { - case 'M': - $bg = $bgcolorM; - break; - case 'F': - $bg = $bgcolorF; - break; - default: - $bg = $bgcolor; - break; + case 'M': + $bg = $bgcolorM; + break; + case 'F': + $bg = $bgcolorF; + break; + default: + $bg = $bgcolor; + break; } imagefilledarc($image, $cx, $cy, $rx, $rx, $deg1, $deg2, $bg, IMG_ARC_PIE); @@ -364,19 +364,19 @@ class FanchartController extends ChartController { $imagemap .= '</map>'; switch ($what) { - case 'html': - return $html . $imagemap . '<div id="fan_chart_img"><img src="fanchart.php?rootid=' . $this->root->getXref() . '&fan_style=' . $this->fan_style . '&generations=' . $this->generations . '&fan_width=' . $this->fan_width . '&img=1" width="' . $fanw . '" height="' . $fanh . '" alt="' . strip_tags($this->getPageTitle()) . '" usemap="#fanmap"></div>'; + case 'html': + return $html . $imagemap . '<div id="fan_chart_img"><img src="fanchart.php?rootid=' . $this->root->getXref() . '&fan_style=' . $this->fan_style . '&generations=' . $this->generations . '&fan_width=' . $this->fan_width . '&img=1" width="' . $fanw . '" height="' . $fanh . '" alt="' . strip_tags($this->getPageTitle()) . '" usemap="#fanmap"></div>'; - case 'png': - imagestringup($image, 1, $fanw - 10, $fanh / 3, WT_BASE_URL, $color); - ob_start(); - imagepng($image); - imagedestroy($image); + case 'png': + imagestringup($image, 1, $fanw - 10, $fanh / 3, WT_BASE_URL, $color); + ob_start(); + imagepng($image); + imagedestroy($image); - return ob_get_clean(); + return ob_get_clean(); - default: - throw new \InvalidArgumentException(__METHOD__ . ' ' . $what); + default: + throw new \InvalidArgumentException(__METHOD__ . ' ' . $what); } } } diff --git a/app/Controller/IndividualController.php b/app/Controller/IndividualController.php index 8e58369609..11db1739c9 100644 --- a/app/Controller/IndividualController.php +++ b/app/Controller/IndividualController.php @@ -166,23 +166,23 @@ class IndividualController extends GedcomRecordController { $name = str_replace('/', '', $name); $name = preg_replace('/(\S*)\*/', '<span class="starredname">\\1</span>', $name); switch ($tag) { - case 'TYPE': - echo GedcomCodeName::getValue($name, $this->record); - break; - case 'SURN': - // The SURN field is not necessarily the surname. - // Where it is not a substring of the real surname, show it after the real surname. - $surname = Html::escape($dummy->getAllNames()[0]['surname']); - $surns = preg_replace('/, */', ' ', $nmatch[$i][2]); - if (strpos($dummy->getAllNames()[0]['surname'], $surns) !== false) { - echo '<span dir="auto">' . $surname . '</span>'; - } else { - echo I18N::translate('%1$s (%2$s)', '<span dir="auto">' . $surname . '</span>', '<span dir="auto">' . $name . '</span>'); - } - break; - default: - echo '<span dir="auto">' . $name . '</span>'; - break; + case 'TYPE': + echo GedcomCodeName::getValue($name, $this->record); + break; + case 'SURN': + // The SURN field is not necessarily the surname. + // Where it is not a substring of the real surname, show it after the real surname. + $surname = Html::escape($dummy->getAllNames()[0]['surname']); + $surns = preg_replace('/, */', ' ', $nmatch[$i][2]); + if (strpos($dummy->getAllNames()[0]['surname'], $surns) !== false) { + echo '<span dir="auto">' . $surname . '</span>'; + } else { + echo I18N::translate('%1$s (%2$s)', '<span dir="auto">' . $surname . '</span>', '<span dir="auto">' . $name . '</span>'); + } + break; + default: + echo '<span dir="auto">' . $name . '</span>'; + break; } } echo '</dd>'; @@ -228,15 +228,15 @@ class IndividualController extends GedcomRecordController { $individual = $fact->getParent(); switch ($fact->getValue()) { - case 'M': - $sex = I18N::translate('Male'); - break; - case 'F': - $sex = I18N::translate('Female'); - break; - default: - $sex = I18N::translateContext('unknown gender', 'Unknown'); - break; + case 'M': + $sex = I18N::translate('Male'); + break; + case 'F': + $sex = I18N::translate('Female'); + break; + default: + $sex = I18N::translateContext('unknown gender', 'Unknown'); + break; } $container_class = 'card'; @@ -296,15 +296,15 @@ class IndividualController extends GedcomRecordController { */ public function getPersonStyle($person) { switch ($person->getSex()) { - case 'M': - $class = 'person_box'; - break; - case 'F': - $class = 'person_boxF'; - break; - default: - $class = 'person_boxNN'; - break; + case 'M': + $class = 'person_box'; + break; + case 'F': + $class = 'person_boxF'; + break; + default: + $class = 'person_boxNN'; + break; } if ($person->isPendingDeletion()) { $class .= ' old'; diff --git a/app/Controller/IndividualListController.php b/app/Controller/IndividualListController.php index 8510107ad0..a480a30952 100644 --- a/app/Controller/IndividualListController.php +++ b/app/Controller/IndividualListController.php @@ -35,85 +35,85 @@ class IndividualListController extends PageController { */ private function getAlphabetForLocale($locale) { switch ($locale) { - case 'ar': - return [ - 'ا', 'ب', 'ت', 'ث', 'ج', 'ح', 'خ', 'د', 'ذ', 'ر', 'ز', 'س', 'ش', 'ص', 'ض', 'ط', 'ظ', 'ع', 'غ', 'ف', 'ق', 'ك', 'ل', 'م', 'ن', 'ه', 'و', 'ي', 'آ', 'ة', 'ى', 'ی', - ]; - case 'cs': - return [ - 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'CH', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', - ]; - case 'da': - case 'nb': - case 'nn': - return [ - 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'Æ', 'Ø', 'Å', - ]; - case 'el': - return [ - 'Α', 'Β', 'Γ', 'Δ', 'Ε', 'Ζ', 'Η', 'Θ', 'Ι', 'Κ', 'Λ', 'Μ', 'Ν', 'Ξ', 'Ο', 'Π', 'Ρ', 'Σ', 'Τ', 'Υ', 'Φ', 'Χ', 'Ψ', 'Ω', - ]; - case 'es': - return [ - 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'Ñ', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', - ]; - case 'et': - return [ - 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'Š', 'Z', 'Ž', 'T', 'U', 'V', 'W', 'Õ', 'Ä', 'Ö', 'Ü', 'X', 'Y', - ]; - case 'fi': - case 'sv': - return [ - 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'Å', 'Ä', 'Ö', - ]; - case 'he': - return [ - 'א', 'ב', 'ג', 'ד', 'ה', 'ו', 'ז', 'ח', 'ט', 'י', 'כ', 'ל', 'מ', 'נ', 'ס', 'ע', 'פ', 'צ', 'ק', 'ר', 'ש', 'ת', - ]; - case 'hu': - return [ - 'A', 'B', 'C', 'CS', 'D', 'DZ', 'DZS', 'E', 'F', 'G', 'GY', 'H', 'I', 'J', 'K', 'L', 'LY', 'M', 'N', 'NY', 'O', 'Ö', 'P', 'Q', 'R', 'S', 'SZ', 'T', 'TY', 'U', 'Ü', 'V', 'W', 'X', 'Y', 'Z', 'ZS', - ]; - case 'lt': - return [ - 'A', 'Ą', 'B', 'C', 'Č', 'D', 'E', 'Ę', 'Ė', 'F', 'G', 'H', 'I', 'Y', 'Į', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'R', 'S', 'Š', 'T', 'U', 'Ų', 'Ū', 'V', 'Z', 'Ž', - ]; - case 'nl': - return [ - 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'IJ', - ]; - case 'pl': - return [ - 'A', 'B', 'C', 'Ć', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'Ł', 'M', 'N', 'O', 'Ó', 'P', 'Q', 'R', 'S', 'Ś', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'Ź', 'Ż', - ]; - case 'ro': - return [ - 'A', 'Ă', 'Â', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'Î', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'Ş', 'T', 'Ţ', 'U', 'V', 'W', 'X', 'Y', 'Z', - ]; - case 'ru': - return [ - 'А', 'Б', 'В', 'Г', 'Д', 'Е', 'Ё', 'Ж', 'З', 'И', 'Й', 'К', 'Л', 'М', 'Н', 'О', 'П', 'Р', 'С', 'Т', 'У', 'Ф', 'Х', 'Ц', 'Ч', 'Ш', 'Щ', 'Ъ', 'Ы', 'Ь', 'Э', 'Ю', 'Я', - ]; - case 'sk': - return [ - 'A', 'Á', 'Ä', 'B', 'C', 'Č', 'D', 'Ď', 'E', 'É', 'F', 'G', 'H', 'I', 'Í', 'J', 'K', 'L', 'Ľ', 'Ĺ', 'M', 'N', 'Ň', 'O', 'Ó', 'Ô', 'P', 'Q', 'R', 'Ŕ', 'S', 'Š', 'T', 'Ť', 'U', 'Ú', 'V', 'W', 'X', 'Y', 'Ý', 'Z', 'Ž', - ]; - case 'sl': - return [ - 'A', 'B', 'C', 'Č', 'Ć', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'Š', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'Ž', - ]; - case 'sr': - return [ - 'A', 'B', 'C', 'Č', 'Ć', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'Š', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'Ž', - ]; - case 'tr': - return [ - 'A', 'B', 'C', 'Ç', 'D', 'E', 'F', 'G', 'Ğ', 'H', 'I', 'İ', 'J', 'K', 'L', 'M', 'N', 'O', 'Ö', 'P', 'R', 'S', 'Ş', 'T', 'U', 'Ü', 'V', 'Y', 'Z', - ]; - default: - return [ - 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', - ]; + case 'ar': + return [ + 'ا', 'ب', 'ت', 'ث', 'ج', 'ح', 'خ', 'د', 'ذ', 'ر', 'ز', 'س', 'ش', 'ص', 'ض', 'ط', 'ظ', 'ع', 'غ', 'ف', 'ق', 'ك', 'ل', 'م', 'ن', 'ه', 'و', 'ي', 'آ', 'ة', 'ى', 'ی', + ]; + case 'cs': + return [ + 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'CH', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', + ]; + case 'da': + case 'nb': + case 'nn': + return [ + 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'Æ', 'Ø', 'Å', + ]; + case 'el': + return [ + 'Α', 'Β', 'Γ', 'Δ', 'Ε', 'Ζ', 'Η', 'Θ', 'Ι', 'Κ', 'Λ', 'Μ', 'Ν', 'Ξ', 'Ο', 'Π', 'Ρ', 'Σ', 'Τ', 'Υ', 'Φ', 'Χ', 'Ψ', 'Ω', + ]; + case 'es': + return [ + 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'Ñ', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', + ]; + case 'et': + return [ + 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'Š', 'Z', 'Ž', 'T', 'U', 'V', 'W', 'Õ', 'Ä', 'Ö', 'Ü', 'X', 'Y', + ]; + case 'fi': + case 'sv': + return [ + 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'Å', 'Ä', 'Ö', + ]; + case 'he': + return [ + 'א', 'ב', 'ג', 'ד', 'ה', 'ו', 'ז', 'ח', 'ט', 'י', 'כ', 'ל', 'מ', 'נ', 'ס', 'ע', 'פ', 'צ', 'ק', 'ר', 'ש', 'ת', + ]; + case 'hu': + return [ + 'A', 'B', 'C', 'CS', 'D', 'DZ', 'DZS', 'E', 'F', 'G', 'GY', 'H', 'I', 'J', 'K', 'L', 'LY', 'M', 'N', 'NY', 'O', 'Ö', 'P', 'Q', 'R', 'S', 'SZ', 'T', 'TY', 'U', 'Ü', 'V', 'W', 'X', 'Y', 'Z', 'ZS', + ]; + case 'lt': + return [ + 'A', 'Ą', 'B', 'C', 'Č', 'D', 'E', 'Ę', 'Ė', 'F', 'G', 'H', 'I', 'Y', 'Į', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'R', 'S', 'Š', 'T', 'U', 'Ų', 'Ū', 'V', 'Z', 'Ž', + ]; + case 'nl': + return [ + 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'IJ', + ]; + case 'pl': + return [ + 'A', 'B', 'C', 'Ć', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'Ł', 'M', 'N', 'O', 'Ó', 'P', 'Q', 'R', 'S', 'Ś', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'Ź', 'Ż', + ]; + case 'ro': + return [ + 'A', 'Ă', 'Â', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'Î', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'Ş', 'T', 'Ţ', 'U', 'V', 'W', 'X', 'Y', 'Z', + ]; + case 'ru': + return [ + 'А', 'Б', 'В', 'Г', 'Д', 'Е', 'Ё', 'Ж', 'З', 'И', 'Й', 'К', 'Л', 'М', 'Н', 'О', 'П', 'Р', 'С', 'Т', 'У', 'Ф', 'Х', 'Ц', 'Ч', 'Ш', 'Щ', 'Ъ', 'Ы', 'Ь', 'Э', 'Ю', 'Я', + ]; + case 'sk': + return [ + 'A', 'Á', 'Ä', 'B', 'C', 'Č', 'D', 'Ď', 'E', 'É', 'F', 'G', 'H', 'I', 'Í', 'J', 'K', 'L', 'Ľ', 'Ĺ', 'M', 'N', 'Ň', 'O', 'Ó', 'Ô', 'P', 'Q', 'R', 'Ŕ', 'S', 'Š', 'T', 'Ť', 'U', 'Ú', 'V', 'W', 'X', 'Y', 'Ý', 'Z', 'Ž', + ]; + case 'sl': + return [ + 'A', 'B', 'C', 'Č', 'Ć', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'Š', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'Ž', + ]; + case 'sr': + return [ + 'A', 'B', 'C', 'Č', 'Ć', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'Š', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'Ž', + ]; + case 'tr': + return [ + 'A', 'B', 'C', 'Ç', 'D', 'E', 'F', 'G', 'Ğ', 'H', 'I', 'İ', 'J', 'K', 'L', 'M', 'N', 'O', 'Ö', 'P', 'R', 'S', 'Ş', 'T', 'U', 'Ü', 'V', 'Y', 'Z', + ]; + default: + return [ + 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', + ]; } } @@ -127,44 +127,44 @@ class IndividualListController extends PageController { public function initialLetter($name) { $name = I18N::strtoupper($name); switch (WT_LOCALE) { - case 'cs': - if (substr($name, 0, 2) == 'CH') { - return 'CH'; - } - break; - case 'da': - case 'nb': - case 'nn': - if (substr($name, 0, 2) == 'AA') { - return 'Å'; - } - break; - case 'hu': - if (substr($name, 0, 2) == 'CS') { - return 'CS'; - } elseif (substr($name, 0, 3) == 'DZS') { - return 'DZS'; - } elseif (substr($name, 0, 2) == 'DZ') { - return 'DZ'; - } elseif (substr($name, 0, 2) == 'GY') { - return 'GY'; - } elseif (substr($name, 0, 2) == 'LY') { - return 'LY'; - } elseif (substr($name, 0, 2) == 'NY') { - return 'NY'; - } elseif (substr($name, 0, 2) == 'SZ') { - return 'SZ'; - } elseif (substr($name, 0, 2) == 'TY') { - return 'TY'; - } elseif (substr($name, 0, 2) == 'ZS') { - return 'ZS'; - } - break; - case 'nl': - if (substr($name, 0, 2) == 'IJ') { - return 'IJ'; - } - break; + case 'cs': + if (substr($name, 0, 2) == 'CH') { + return 'CH'; + } + break; + case 'da': + case 'nb': + case 'nn': + if (substr($name, 0, 2) == 'AA') { + return 'Å'; + } + break; + case 'hu': + if (substr($name, 0, 2) == 'CS') { + return 'CS'; + } elseif (substr($name, 0, 3) == 'DZS') { + return 'DZS'; + } elseif (substr($name, 0, 2) == 'DZ') { + return 'DZ'; + } elseif (substr($name, 0, 2) == 'GY') { + return 'GY'; + } elseif (substr($name, 0, 2) == 'LY') { + return 'LY'; + } elseif (substr($name, 0, 2) == 'NY') { + return 'NY'; + } elseif (substr($name, 0, 2) == 'SZ') { + return 'SZ'; + } elseif (substr($name, 0, 2) == 'TY') { + return 'TY'; + } elseif (substr($name, 0, 2) == 'ZS') { + return 'ZS'; + } + break; + case 'nl': + if (substr($name, 0, 2) == 'IJ') { + return 'IJ'; + } + break; } // No special rules - just take the first character return mb_substr($name, 0, 1); @@ -192,37 +192,37 @@ class IndividualListController extends PageController { */ private function getInitialSql($field, $letter) { switch (WT_LOCALE) { - case 'cs': - switch ($letter) { - case 'C': return $field . " LIKE 'C%' COLLATE " . I18N::collation() . " AND " . $field . " NOT LIKE 'CH%' COLLATE " . I18N::collation(); - } + case 'cs': + switch ($letter) { + case 'C': return $field . " LIKE 'C%' COLLATE " . I18N::collation() . " AND " . $field . " NOT LIKE 'CH%' COLLATE " . I18N::collation(); + } break; - case 'da': - case 'nb': - case 'nn': - switch ($letter) { - // AA gets listed under Å - case 'A': return $field . " LIKE 'A%' COLLATE " . I18N::collation() . " AND " . $field . " NOT LIKE 'AA%' COLLATE " . I18N::collation(); - case 'Å': return "(" . $field . " LIKE 'Å%' COLLATE " . I18N::collation() . " OR " . $field . " LIKE 'AA%' COLLATE " . I18N::collation() . ")"; - } + case 'da': + case 'nb': + case 'nn': + switch ($letter) { + // AA gets listed under Å + case 'A': return $field . " LIKE 'A%' COLLATE " . I18N::collation() . " AND " . $field . " NOT LIKE 'AA%' COLLATE " . I18N::collation(); + case 'Å': return "(" . $field . " LIKE 'Å%' COLLATE " . I18N::collation() . " OR " . $field . " LIKE 'AA%' COLLATE " . I18N::collation() . ")"; + } break; - case 'hu': - switch ($letter) { - case 'C': return $field . " LIKE 'C%' COLLATE " . I18N::collation() . " AND " . $field . " NOT LIKE 'CS%' COLLATE " . I18N::collation(); - case 'D': return $field . " LIKE 'D%' COLLATE " . I18N::collation() . " AND " . $field . " NOT LIKE 'DZ%' COLLATE " . I18N::collation(); - case 'DZ': return $field . " LIKE 'DZ%' COLLATE " . I18N::collation() . " AND " . $field . " NOT LIKE 'DZS%' COLLATE " . I18N::collation(); - case 'G': return $field . " LIKE 'G%' COLLATE " . I18N::collation() . " AND " . $field . " NOT LIKE 'GY%' COLLATE " . I18N::collation(); - case 'L': return $field . " LIKE 'L%' COLLATE " . I18N::collation() . " AND " . $field . " NOT LIKE 'LY%' COLLATE " . I18N::collation(); - case 'N': return $field . " LIKE 'N%' COLLATE " . I18N::collation() . " AND " . $field . " NOT LIKE 'NY%' COLLATE " . I18N::collation(); - case 'S': return $field . " LIKE 'S%' COLLATE " . I18N::collation() . " AND " . $field . " NOT LIKE 'SZ%' COLLATE " . I18N::collation(); - case 'T': return $field . " LIKE 'T%' COLLATE " . I18N::collation() . " AND " . $field . " NOT LIKE 'TY%' COLLATE " . I18N::collation(); - case 'Z': return $field . " LIKE 'Z%' COLLATE " . I18N::collation() . " AND " . $field . " NOT LIKE 'ZS%' COLLATE " . I18N::collation(); - } + case 'hu': + switch ($letter) { + case 'C': return $field . " LIKE 'C%' COLLATE " . I18N::collation() . " AND " . $field . " NOT LIKE 'CS%' COLLATE " . I18N::collation(); + case 'D': return $field . " LIKE 'D%' COLLATE " . I18N::collation() . " AND " . $field . " NOT LIKE 'DZ%' COLLATE " . I18N::collation(); + case 'DZ': return $field . " LIKE 'DZ%' COLLATE " . I18N::collation() . " AND " . $field . " NOT LIKE 'DZS%' COLLATE " . I18N::collation(); + case 'G': return $field . " LIKE 'G%' COLLATE " . I18N::collation() . " AND " . $field . " NOT LIKE 'GY%' COLLATE " . I18N::collation(); + case 'L': return $field . " LIKE 'L%' COLLATE " . I18N::collation() . " AND " . $field . " NOT LIKE 'LY%' COLLATE " . I18N::collation(); + case 'N': return $field . " LIKE 'N%' COLLATE " . I18N::collation() . " AND " . $field . " NOT LIKE 'NY%' COLLATE " . I18N::collation(); + case 'S': return $field . " LIKE 'S%' COLLATE " . I18N::collation() . " AND " . $field . " NOT LIKE 'SZ%' COLLATE " . I18N::collation(); + case 'T': return $field . " LIKE 'T%' COLLATE " . I18N::collation() . " AND " . $field . " NOT LIKE 'TY%' COLLATE " . I18N::collation(); + case 'Z': return $field . " LIKE 'Z%' COLLATE " . I18N::collation() . " AND " . $field . " NOT LIKE 'ZS%' COLLATE " . I18N::collation(); + } break; - case 'nl': - switch ($letter) { - case 'I': return $field . " LIKE 'I%' COLLATE " . I18N::collation() . " AND " . $field . " NOT LIKE 'IJ%' COLLATE " . I18N::collation(); - } + case 'nl': + switch ($letter) { + case 'I': return $field . " LIKE 'I%' COLLATE " . I18N::collation() . " AND " . $field . " NOT LIKE 'IJ%' COLLATE " . I18N::collation(); + } break; } @@ -538,12 +538,12 @@ class IndividualListController extends PageController { */ public function givenNameInitial($initial) { switch ($initial) { - case '@': - return I18N::translateContext('Unknown given name', '…'); - break; - default: - return Html::escape($initial); - break; + case '@': + return I18N::translateContext('Unknown given name', '…'); + break; + default: + return Html::escape($initial); + break; } } @@ -556,15 +556,15 @@ class IndividualListController extends PageController { */ public function surnameInitial($initial) { switch ($initial) { - case '@': - return I18N::translateContext('Unknown surname', '…'); - break; - case ',': - return I18N::translate('None'); - break; - default: - return Html::escape($initial); - break; + case '@': + return I18N::translateContext('Unknown surname', '…'); + break; + case ',': + return I18N::translate('None'); + break; + default: + return Html::escape($initial); + break; } } } diff --git a/app/Controller/LifespanController.php b/app/Controller/LifespanController.php index 5eff37e885..07a778f07f 100644 --- a/app/Controller/LifespanController.php +++ b/app/Controller/LifespanController.php @@ -497,23 +497,23 @@ class LifespanController extends PageController { */ private function getCalendarDate($date) { switch ($this->calendar) { - case 'julian': - $caldate = new JulianDate($date); - break; - case 'french': - $caldate = new FrenchDate($date); - break; - case 'jewish': - $caldate = new JewishDate($date); - break; - case 'hijri': - $caldate = new HijriDate($date); - break; - case 'jalali': - $caldate = new JalaliDate($date); - break; - default: - $caldate = new GregorianDate($date); + case 'julian': + $caldate = new JulianDate($date); + break; + case 'french': + $caldate = new FrenchDate($date); + break; + case 'jewish': + $caldate = new JewishDate($date); + break; + case 'hijri': + $caldate = new HijriDate($date); + break; + case 'jalali': + $caldate = new JalaliDate($date); + break; + default: + $caldate = new GregorianDate($date); } return $caldate; diff --git a/app/Controller/SearchController.php b/app/Controller/SearchController.php index 0883fe4c2d..9718a467f7 100644 --- a/app/Controller/SearchController.php +++ b/app/Controller/SearchController.php @@ -169,46 +169,46 @@ class SearchController extends PageController { // If we want to show associated persons, build the list switch ($this->action) { - case 'header': - // We can type in an XREF into the header search, and jump straight to it. - // Otherwise, the header search is the same as the general search - if (preg_match('/' . WT_REGEX_XREF . '/', $this->query)) { - $record = GedcomRecord::getInstance($this->query, $this->tree()); - if ($record && $record->canShowName()) { - header('Location: ' . $record->getRawUrl()); + case 'header': + // We can type in an XREF into the header search, and jump straight to it. + // Otherwise, the header search is the same as the general search + if (preg_match('/' . WT_REGEX_XREF . '/', $this->query)) { + $record = GedcomRecord::getInstance($this->query, $this->tree()); + if ($record && $record->canShowName()) { + header('Location: ' . $record->getRawUrl()); + exit; + } + } + $this->action = 'general'; + $this->srindi = 'checked'; + $this->srfams = 'checked'; + $this->srsour = 'checked'; + $this->srnote = 'checked'; + $this->setPageTitle(I18N::translate('General search')); + $this->generalSearch(); + break; + case 'general': + $this->setPageTitle(I18N::translate('General search')); + $this->generalSearch(); + break; + case 'soundex': + // Create a dummy search query to use as a title to the results list + $this->query = trim($this->firstname . ' ' . $this->lastname . ' ' . $this->place); + $this->setPageTitle(I18N::translate('Phonetic search')); + $this->soundexSearch(); + break; + case 'replace': + $this->setPageTitle(I18N::translate('Search and replace')); + $this->search_trees = [$this->tree()]; + $this->srindi = 'checked'; + $this->srfams = 'checked'; + $this->srsour = 'checked'; + $this->srnote = 'checked'; + if (Filter::post('query')) { + $this->searchAndReplace($this->tree()); + header('Location: search.php?action=replace&query=' . rawurlencode($this->query) . '&replace=' . rawurlencode($this->replace) . '&replaceAll=' . $this->replaceAll . '&replaceNames=' . $this->replaceNames . '&replacePlaces=' . $this->replacePlaces . '&replacePlacesWord=' . $this->replacePlacesWord); exit; } - } - $this->action = 'general'; - $this->srindi = 'checked'; - $this->srfams = 'checked'; - $this->srsour = 'checked'; - $this->srnote = 'checked'; - $this->setPageTitle(I18N::translate('General search')); - $this->generalSearch(); - break; - case 'general': - $this->setPageTitle(I18N::translate('General search')); - $this->generalSearch(); - break; - case 'soundex': - // Create a dummy search query to use as a title to the results list - $this->query = trim($this->firstname . ' ' . $this->lastname . ' ' . $this->place); - $this->setPageTitle(I18N::translate('Phonetic search')); - $this->soundexSearch(); - break; - case 'replace': - $this->setPageTitle(I18N::translate('Search and replace')); - $this->search_trees = [$this->tree()]; - $this->srindi = 'checked'; - $this->srfams = 'checked'; - $this->srsour = 'checked'; - $this->srnote = 'checked'; - if (Filter::post('query')) { - $this->searchAndReplace($this->tree()); - header('Location: search.php?action=replace&query=' . rawurlencode($this->query) . '&replace=' . rawurlencode($this->replace) . '&replaceAll=' . $this->replaceAll . '&replaceNames=' . $this->replaceNames . '&replacePlaces=' . $this->replacePlaces . '&replacePlacesWord=' . $this->replacePlacesWord); - exit; - } } } diff --git a/app/Date.php b/app/Date.php index 6671b11b57..61705985fd 100644 --- a/app/Date.php +++ b/app/Date.php @@ -169,22 +169,22 @@ class Date { } // Now construct an object of the correct type switch ($cal) { - case '@#DGREGORIAN@': - return new GregorianDate([$y, $m, $d]); - case '@#DJULIAN@': - return new JulianDate([$y, $m, $d]); - case '@#DHEBREW@': - return new JewishDate([$y, $m, $d]); - case '@#DHIJRI@': - return new HijriDate([$y, $m, $d]); - case '@#DFRENCH R@': - return new FrenchDate([$y, $m, $d]); - case '@#DJALALI@': - return new JalaliDate([$y, $m, $d]); - case '@#DROMAN@': - return new RomanDate([$y, $m, $d]); - default: - throw new \DomainException('Invalid calendar'); + case '@#DGREGORIAN@': + return new GregorianDate([$y, $m, $d]); + case '@#DJULIAN@': + return new JulianDate([$y, $m, $d]); + case '@#DHEBREW@': + return new JewishDate([$y, $m, $d]); + case '@#DHIJRI@': + return new HijriDate([$y, $m, $d]); + case '@#DFRENCH R@': + return new FrenchDate([$y, $m, $d]); + case '@#DJALALI@': + return new JalaliDate([$y, $m, $d]); + case '@#DROMAN@': + return new RomanDate([$y, $m, $d]); + default: + throw new \DomainException('Invalid calendar'); } } @@ -291,42 +291,42 @@ class Date { // Localise the date switch ($q1 . $q2) { - case '': - $tmp = $d1 . $conv1; - break; - case 'ABT': - $tmp = /* I18N: Gedcom ABT dates */ I18N::translate('about %s', $d1 . $conv1); - break; - case 'CAL': - $tmp = /* I18N: Gedcom CAL dates */ I18N::translate('calculated %s', $d1 . $conv1); - break; - case 'EST': - $tmp = /* I18N: Gedcom EST dates */ I18N::translate('estimated %s', $d1 . $conv1); - break; - case 'INT': - $tmp = /* I18N: Gedcom INT dates */ I18N::translate('interpreted %s (%s)', $d1 . $conv1, $this->text); - break; - case 'BEF': - $tmp = /* I18N: Gedcom BEF dates */ I18N::translate('before %s', $d1 . $conv1); - break; - case 'AFT': - $tmp = /* I18N: Gedcom AFT dates */ I18N::translate('after %s', $d1 . $conv1); - break; - case 'FROM': - $tmp = /* I18N: Gedcom FROM dates */ I18N::translate('from %s', $d1 . $conv1); - break; - case 'TO': - $tmp = /* I18N: Gedcom TO dates */ I18N::translate('to %s', $d1 . $conv1); - break; - case 'BETAND': - $tmp = /* I18N: Gedcom BET-AND dates */ I18N::translate('between %s and %s', $d1 . $conv1, $d2 . $conv2); - break; - case 'FROMTO': - $tmp = /* I18N: Gedcom FROM-TO dates */ I18N::translate('from %s to %s', $d1 . $conv1, $d2 . $conv2); - break; - default: - $tmp = I18N::translate('Invalid date'); - break; // e.g. BET without AND + case '': + $tmp = $d1 . $conv1; + break; + case 'ABT': + $tmp = /* I18N: Gedcom ABT dates */ I18N::translate('about %s', $d1 . $conv1); + break; + case 'CAL': + $tmp = /* I18N: Gedcom CAL dates */ I18N::translate('calculated %s', $d1 . $conv1); + break; + case 'EST': + $tmp = /* I18N: Gedcom EST dates */ I18N::translate('estimated %s', $d1 . $conv1); + break; + case 'INT': + $tmp = /* I18N: Gedcom INT dates */ I18N::translate('interpreted %s (%s)', $d1 . $conv1, $this->text); + break; + case 'BEF': + $tmp = /* I18N: Gedcom BEF dates */ I18N::translate('before %s', $d1 . $conv1); + break; + case 'AFT': + $tmp = /* I18N: Gedcom AFT dates */ I18N::translate('after %s', $d1 . $conv1); + break; + case 'FROM': + $tmp = /* I18N: Gedcom FROM dates */ I18N::translate('from %s', $d1 . $conv1); + break; + case 'TO': + $tmp = /* I18N: Gedcom TO dates */ I18N::translate('to %s', $d1 . $conv1); + break; + case 'BETAND': + $tmp = /* I18N: Gedcom BET-AND dates */ I18N::translate('between %s and %s', $d1 . $conv1, $d2 . $conv2); + break; + case 'FROMTO': + $tmp = /* I18N: Gedcom FROM-TO dates */ I18N::translate('from %s to %s', $d1 . $conv1, $d2 . $conv2); + break; + default: + $tmp = I18N::translate('Invalid date'); + break; // e.g. BET without AND } if ($this->text && !$q1) { $tmp = I18N::translate('%1$s (%2$s)', $tmp, $this->text); @@ -445,33 +445,33 @@ class Date { } switch ($format) { - case 0: - // Years - integer only (for statistics, rather than for display) - if ($jd && $d1->minimumJulianDay() && $d1->minimumJulianDay() <= $jd) { - return $d1->minimumDate()->getAge(false, $jd, false); - } else { - return -1; - } - case 1: - // Days - integer only (for sorting, rather than for display) - if ($jd && $d1->minimumJulianDay()) { - return $jd - $d1->minimumJulianDay(); - } else { - return -1; - } - case 2: - // Just years, in local digits, with warning for negative/ - if ($jd && $d1->minimumJulianDay()) { - if ($d1->minimumJulianDay() > $jd) { - return '<i class="icon-warning"></i>'; + case 0: + // Years - integer only (for statistics, rather than for display) + if ($jd && $d1->minimumJulianDay() && $d1->minimumJulianDay() <= $jd) { + return $d1->minimumDate()->getAge(false, $jd, false); } else { - return I18N::number($d1->minimumDate()->getAge(false, $jd)); + return -1; } - } else { - return ''; - } - default: - throw new \InvalidArgumentException('format: ' . $format); + case 1: + // Days - integer only (for sorting, rather than for display) + if ($jd && $d1->minimumJulianDay()) { + return $jd - $d1->minimumJulianDay(); + } else { + return -1; + } + case 2: + // Just years, in local digits, with warning for negative/ + if ($jd && $d1->minimumJulianDay()) { + if ($d1->minimumJulianDay() > $jd) { + return '<i class="icon-warning"></i>'; + } else { + return I18N::number($d1->minimumDate()->getAge(false, $jd)); + } + } else { + return ''; + } + default: + throw new \InvalidArgumentException('format: ' . $format); } } @@ -515,32 +515,32 @@ class Date { public static function compare(Date $a, Date $b) { // Get min/max JD for each date. switch ($a->qual1) { - case 'BEF': - $amin = $a->minimumJulianDay() - 1; - $amax = $amin; - break; - case 'AFT': - $amax = $a->maximumJulianDay() + 1; - $amin = $amax; - break; - default: - $amin = $a->minimumJulianDay(); - $amax = $a->maximumJulianDay(); - break; + case 'BEF': + $amin = $a->minimumJulianDay() - 1; + $amax = $amin; + break; + case 'AFT': + $amax = $a->maximumJulianDay() + 1; + $amin = $amax; + break; + default: + $amin = $a->minimumJulianDay(); + $amax = $a->maximumJulianDay(); + break; } switch ($b->qual1) { - case 'BEF': - $bmin = $b->minimumJulianDay() - 1; - $bmax = $bmin; - break; - case 'AFT': - $bmax = $b->maximumJulianDay() + 1; - $bmin = $bmax; - break; - default: - $bmin = $b->minimumJulianDay(); - $bmax = $b->maximumJulianDay(); - break; + case 'BEF': + $bmin = $b->minimumJulianDay() - 1; + $bmax = $bmin; + break; + case 'AFT': + $bmax = $b->maximumJulianDay() + 1; + $bmin = $bmax; + break; + default: + $bmin = $b->minimumJulianDay(); + $bmax = $b->maximumJulianDay(); + break; } if ($amax < $bmin) { return -1; diff --git a/app/Date/CalendarDate.php b/app/Date/CalendarDate.php index 0131533793..e6eabd52ad 100644 --- a/app/Date/CalendarDate.php +++ b/app/Date/CalendarDate.php @@ -491,20 +491,20 @@ class CalendarDate { */ public function convertToCalendar($calendar) { switch ($calendar) { - case 'gregorian': - return new GregorianDate($this); - case 'julian': - return new JulianDate($this); - case 'jewish': - return new JewishDate($this); - case 'french': - return new FrenchDate($this); - case 'hijri': - return new HijriDate($this); - case 'jalali': - return new JalaliDate($this); - default: - return $this; + case 'gregorian': + return new GregorianDate($this); + case 'julian': + return new JulianDate($this); + case 'jewish': + return new JewishDate($this); + case 'french': + return new FrenchDate($this); + case 'hijri': + return new HijriDate($this); + case 'jalali': + return new JalaliDate($this); + default: + return $this; } } @@ -581,90 +581,90 @@ class CalendarDate { $case = 'GENITIVE'; } else { switch ($qualifier) { - case 'TO': - case 'ABT': - case 'FROM': - $case = 'GENITIVE'; - break; - case 'AFT': - $case = 'LOCATIVE'; - break; - case 'BEF': - case 'BET': - case 'AND': - $case = 'INSTRUMENTAL'; - break; - case '': - case 'INT': - case 'EST': - case 'CAL': - default: // There shouldn't be any other options... - $case = 'NOMINATIVE'; - break; + case 'TO': + case 'ABT': + case 'FROM': + $case = 'GENITIVE'; + break; + case 'AFT': + $case = 'LOCATIVE'; + break; + case 'BEF': + case 'BET': + case 'AND': + $case = 'INSTRUMENTAL'; + break; + case '': + case 'INT': + case 'EST': + case 'CAL': + default: // There shouldn't be any other options... + $case = 'NOMINATIVE'; + break; } } // Build up the formatted date, character at a time preg_match_all('/%[^%]/', $format, $matches); foreach ($matches[0] as $match) { switch ($match) { - case '%d': - $format = str_replace($match, $this->formatDayZeros(), $format); - break; - case '%j': - $format = str_replace($match, $this->formatDay(), $format); - break; - case '%l': - $format = str_replace($match, $this->formatLongWeekday(), $format); - break; - case '%D': - $format = str_replace($match, $this->formatShortWeekday(), $format); - break; - case '%N': - $format = str_replace($match, $this->formatIsoWeekday(), $format); - break; - case '%w': - $format = str_replace($match, $this->formatNumericWeekday(), $format); - break; - case '%z': - $format = str_replace($match, $this->formatDayOfYear(), $format); - break; - case '%F': - $format = str_replace($match, $this->formatLongMonth($case), $format); - break; - case '%m': - $format = str_replace($match, $this->formatMonthZeros(), $format); - break; - case '%M': - $format = str_replace($match, $this->formatShortMonth(), $format); - break; - case '%n': - $format = str_replace($match, $this->formatMonth(), $format); - break; - case '%t': - $format = str_replace($match, $this->daysInMonth(), $format); - break; - case '%L': - $format = str_replace($match, (int) $this->isLeapYear(), $format); - break; - case '%Y': - $format = str_replace($match, $this->formatLongYear(), $format); - break; - case '%y': - $format = str_replace($match, $this->formatShortYear(), $format); - break; - // These 4 extensions are useful for re-formatting gedcom dates. - case '%@': - $format = str_replace($match, $this->calendar->gedcomCalendarEscape(), $format); - break; - case '%A': - $format = str_replace($match, $this->formatGedcomDay(), $format); - break; - case '%O': - $format = str_replace($match, $this->formatGedcomMonth(), $format); - break; - case '%E': - $format = str_replace($match, $this->formatGedcomYear(), $format); - break; + case '%d': + $format = str_replace($match, $this->formatDayZeros(), $format); + break; + case '%j': + $format = str_replace($match, $this->formatDay(), $format); + break; + case '%l': + $format = str_replace($match, $this->formatLongWeekday(), $format); + break; + case '%D': + $format = str_replace($match, $this->formatShortWeekday(), $format); + break; + case '%N': + $format = str_replace($match, $this->formatIsoWeekday(), $format); + break; + case '%w': + $format = str_replace($match, $this->formatNumericWeekday(), $format); + break; + case '%z': + $format = str_replace($match, $this->formatDayOfYear(), $format); + break; + case '%F': + $format = str_replace($match, $this->formatLongMonth($case), $format); + break; + case '%m': + $format = str_replace($match, $this->formatMonthZeros(), $format); + break; + case '%M': + $format = str_replace($match, $this->formatShortMonth(), $format); + break; + case '%n': + $format = str_replace($match, $this->formatMonth(), $format); + break; + case '%t': + $format = str_replace($match, $this->daysInMonth(), $format); + break; + case '%L': + $format = str_replace($match, (int) $this->isLeapYear(), $format); + break; + case '%Y': + $format = str_replace($match, $this->formatLongYear(), $format); + break; + case '%y': + $format = str_replace($match, $this->formatShortYear(), $format); + break; + // These 4 extensions are useful for re-formatting gedcom dates. + case '%@': + $format = str_replace($match, $this->calendar->gedcomCalendarEscape(), $format); + break; + case '%A': + $format = str_replace($match, $this->formatGedcomDay(), $format); + break; + case '%O': + $format = str_replace($match, $this->formatGedcomMonth(), $format); + break; + case '%E': + $format = str_replace($match, $this->formatGedcomYear(), $format); + break; } } @@ -769,16 +769,16 @@ class CalendarDate { */ protected function formatLongMonth($case = 'NOMINATIVE') { switch ($case) { - case 'GENITIVE': - return $this->monthNameGenitiveCase($this->m, $this->isLeapYear()); - case 'NOMINATIVE': - return $this->monthNameNominativeCase($this->m, $this->isLeapYear()); - case 'LOCATIVE': - return $this->monthNameLocativeCase($this->m, $this->isLeapYear()); - case 'INSTRUMENTAL': - return $this->monthNameInstrumentalCase($this->m, $this->isLeapYear()); - default: - throw new \InvalidArgumentException($case); + case 'GENITIVE': + return $this->monthNameGenitiveCase($this->m, $this->isLeapYear()); + case 'NOMINATIVE': + return $this->monthNameNominativeCase($this->m, $this->isLeapYear()); + case 'LOCATIVE': + return $this->monthNameLocativeCase($this->m, $this->isLeapYear()); + case 'INSTRUMENTAL': + return $this->monthNameInstrumentalCase($this->m, $this->isLeapYear()); + default: + throw new \InvalidArgumentException($case); } } diff --git a/app/Fact.php b/app/Fact.php index 0a1e0c622d..08d8bee9e7 100644 --- a/app/Fact.php +++ b/app/Fact.php @@ -93,23 +93,23 @@ class Fact { public function getTarget() { $xref = trim($this->getValue(), '@'); switch ($this->tag) { - case 'FAMC': - case 'FAMS': - return Family::getInstance($xref, $this->getParent()->getTree()); - case 'HUSB': - case 'WIFE': - case 'CHIL': - return Individual::getInstance($xref, $this->getParent()->getTree()); - case 'SOUR': - return Source::getInstance($xref, $this->getParent()->getTree()); - case 'OBJE': - return Media::getInstance($xref, $this->getParent()->getTree()); - case 'REPO': - return Repository::getInstance($xref, $this->getParent()->getTree()); - case 'NOTE': - return Note::getInstance($xref, $this->getParent()->getTree()); - default: - return GedcomRecord::getInstance($xref, $this->getParent()->getTree()); + case 'FAMC': + case 'FAMS': + return Family::getInstance($xref, $this->getParent()->getTree()); + case 'HUSB': + case 'WIFE': + case 'CHIL': + return Individual::getInstance($xref, $this->getParent()->getTree()); + case 'SOUR': + return Source::getInstance($xref, $this->getParent()->getTree()); + case 'OBJE': + return Media::getInstance($xref, $this->getParent()->getTree()); + case 'REPO': + return Repository::getInstance($xref, $this->getParent()->getTree()); + case 'NOTE': + return Note::getInstance($xref, $this->getParent()->getTree()); + default: + return GedcomRecord::getInstance($xref, $this->getParent()->getTree()); } } @@ -263,15 +263,15 @@ class Fact { */ public function getLabel() { switch ($this->tag) { - case 'EVEN': - case 'FACT': - if ($this->getAttribute('TYPE') !== '') { - // Custom FACT/EVEN - with a TYPE - return I18N::translate(Html::escape($this->getAttribute('TYPE'))); - } - // no break - drop into next case - default: - return GedcomTag::getLabel($this->tag, $this->parent); + case 'EVEN': + case 'FACT': + if ($this->getAttribute('TYPE') !== '') { + // Custom FACT/EVEN - with a TYPE + return I18N::translate(Html::escape($this->getAttribute('TYPE'))); + } + // no break - drop into next case + default: + return GedcomTag::getLabel($this->tag, $this->parent); } } diff --git a/app/Filter.php b/app/Filter.php index a6f621f666..4ca4e0a434 100644 --- a/app/Filter.php +++ b/app/Filter.php @@ -50,10 +50,10 @@ class Filter { */ public static function formatText($text, Tree $WT_TREE) { switch ($WT_TREE->getPreference('FORMAT_TEXT')) { - case 'markdown': - return '<div class="markdown" dir="auto">' . self::markdown($text, $WT_TREE) . '</div>'; - default: - return '<div class="markdown" style="white-space: pre-wrap;" dir="auto">' . self::expandUrls($text, $WT_TREE) . '</div>'; + case 'markdown': + return '<div class="markdown" dir="auto">' . self::markdown($text, $WT_TREE) . '</div>'; + default: + return '<div class="markdown" style="white-space: pre-wrap;" dir="auto">' . self::expandUrls($text, $WT_TREE) . '</div>'; } } diff --git a/app/Functions/Functions.php b/app/Functions/Functions.php index 851763f962..54c2733c6a 100644 --- a/app/Functions/Functions.php +++ b/app/Functions/Functions.php @@ -79,29 +79,29 @@ class Functions { */ public static function fileUploadErrorText($error_code) { switch ($error_code) { - case UPLOAD_ERR_OK: - return I18N::translate('File successfully uploaded'); - case UPLOAD_ERR_INI_SIZE: - case UPLOAD_ERR_FORM_SIZE: - // I18N: PHP internal error message - php.net/manual/en/features.file-upload.errors.php - return I18N::translate('The uploaded file exceeds the allowed size.'); - case UPLOAD_ERR_PARTIAL: - // I18N: PHP internal error message - php.net/manual/en/features.file-upload.errors.php - return I18N::translate('The file was only partially uploaded. Please try again.'); - case UPLOAD_ERR_NO_FILE: - // I18N: PHP internal error message - php.net/manual/en/features.file-upload.errors.php - return I18N::translate('No file was received. Please try again.'); - case UPLOAD_ERR_NO_TMP_DIR: - // I18N: PHP internal error message - php.net/manual/en/features.file-upload.errors.php - return I18N::translate('The PHP temporary folder is missing.'); - case UPLOAD_ERR_CANT_WRITE: - // I18N: PHP internal error message - php.net/manual/en/features.file-upload.errors.php - return I18N::translate('PHP failed to write to disk.'); - case UPLOAD_ERR_EXTENSION: - // I18N: PHP internal error message - php.net/manual/en/features.file-upload.errors.php - return I18N::translate('PHP blocked the file because of its extension.'); - default: - return 'Error: ' . $error_code; + case UPLOAD_ERR_OK: + return I18N::translate('File successfully uploaded'); + case UPLOAD_ERR_INI_SIZE: + case UPLOAD_ERR_FORM_SIZE: + // I18N: PHP internal error message - php.net/manual/en/features.file-upload.errors.php + return I18N::translate('The uploaded file exceeds the allowed size.'); + case UPLOAD_ERR_PARTIAL: + // I18N: PHP internal error message - php.net/manual/en/features.file-upload.errors.php + return I18N::translate('The file was only partially uploaded. Please try again.'); + case UPLOAD_ERR_NO_FILE: + // I18N: PHP internal error message - php.net/manual/en/features.file-upload.errors.php + return I18N::translate('No file was received. Please try again.'); + case UPLOAD_ERR_NO_TMP_DIR: + // I18N: PHP internal error message - php.net/manual/en/features.file-upload.errors.php + return I18N::translate('The PHP temporary folder is missing.'); + case UPLOAD_ERR_CANT_WRITE: + // I18N: PHP internal error message - php.net/manual/en/features.file-upload.errors.php + return I18N::translate('PHP failed to write to disk.'); + case UPLOAD_ERR_EXTENSION: + // I18N: PHP internal error message - php.net/manual/en/features.file-upload.errors.php + return I18N::translate('PHP blocked the file because of its extension.'); + default: + return 'Error: ' . $error_code; } } @@ -268,12 +268,12 @@ class Functions { */ private static function reflexivePronoun(Individual $individual) { switch ($individual->getSex()) { - case 'M': - return /* I18N: reflexive pronoun */ I18N::translate('himself'); - case 'F': - return /* I18N: reflexive pronoun */ I18N::translate('herself'); - default: - return /* I18N: reflexive pronoun - gender neutral version of himself/herself */ I18N::translate('themself'); + case 'M': + return /* I18N: reflexive pronoun */ I18N::translate('himself'); + case 'F': + return /* I18N: reflexive pronoun */ I18N::translate('herself'); + default: + return /* I18N: reflexive pronoun - gender neutral version of himself/herself */ I18N::translate('themself'); } } @@ -436,127 +436,127 @@ class Functions { */ public static function cousinName($n, $sex) { switch ($sex) { - case 'M': - switch ($n) { - case 1: - /* 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. */ - return I18N::translateContext('MALE', 'first cousin'); - case 2: - /* 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. */ - return I18N::translateContext('MALE', 'second cousin'); - case 3: - /* 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. */ - return I18N::translateContext('MALE', 'third cousin'); - case 4: - /* 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. */ - return I18N::translateContext('MALE', 'fourth cousin'); - case 5: - /* 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. */ - return I18N::translateContext('MALE', 'fifth cousin'); - case 6: - /* 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. */ - return I18N::translateContext('MALE', 'sixth cousin'); - case 7: - /* 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. */ - return I18N::translateContext('MALE', 'seventh cousin'); - case 8: - /* 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. */ - return I18N::translateContext('MALE', 'eighth cousin'); - case 9: - /* 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. */ - return I18N::translateContext('MALE', 'ninth cousin'); - case 10: - /* 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. */ - return I18N::translateContext('MALE', 'tenth cousin'); - case 11: - /* 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. */ - return I18N::translateContext('MALE', 'eleventh cousin'); - case 12: - /* 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. */ - return I18N::translateContext('MALE', 'twelfth cousin'); - case 13: - /* 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. */ - return I18N::translateContext('MALE', 'thirteenth cousin'); - case 14: - /* 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. */ - return I18N::translateContext('MALE', 'fourteenth cousin'); - case 15: - /* 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. */ - return I18N::translateContext('MALE', 'fifteenth cousin'); - default: - /* 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. */ - return I18N::translateContext('MALE', '%s × cousin', I18N::number($n)); - } - case 'F': - switch ($n) { - case 1: - return I18N::translateContext('FEMALE', 'first cousin'); - case 2: - return I18N::translateContext('FEMALE', 'second cousin'); - case 3: - return I18N::translateContext('FEMALE', 'third cousin'); - case 4: - return I18N::translateContext('FEMALE', 'fourth cousin'); - case 5: - return I18N::translateContext('FEMALE', 'fifth cousin'); - case 6: - return I18N::translateContext('FEMALE', 'sixth cousin'); - case 7: - return I18N::translateContext('FEMALE', 'seventh cousin'); - case 8: - return I18N::translateContext('FEMALE', 'eighth cousin'); - case 9: - return I18N::translateContext('FEMALE', 'ninth cousin'); - case 10: - return I18N::translateContext('FEMALE', 'tenth cousin'); - case 11: - return I18N::translateContext('FEMALE', 'eleventh cousin'); - case 12: - return I18N::translateContext('FEMALE', 'twelfth cousin'); - case 13: - return I18N::translateContext('FEMALE', 'thirteenth cousin'); - case 14: - return I18N::translateContext('FEMALE', 'fourteenth cousin'); - case 15: - return I18N::translateContext('FEMALE', 'fifteenth cousin'); - default: - return I18N::translateContext('FEMALE', '%s × cousin', I18N::number($n)); - } - default: - switch ($n) { - case 1: - return I18N::translate('first cousin'); - case 2: - return I18N::translate('second cousin'); - case 3: - return I18N::translate('third cousin'); - case 4: - return I18N::translate('fourth cousin'); - case 5: - return I18N::translate('fifth cousin'); - case 6: - return I18N::translate('sixth cousin'); - case 7: - return I18N::translate('seventh cousin'); - case 8: - return I18N::translate('eighth cousin'); - case 9: - return I18N::translate('ninth cousin'); - case 10: - return I18N::translate('tenth cousin'); - case 11: - return I18N::translate('eleventh cousin'); - case 12: - return I18N::translate('twelfth cousin'); - case 13: - return I18N::translate('thirteenth cousin'); - case 14: - return I18N::translate('fourteenth cousin'); - case 15: - return I18N::translate('fifteenth cousin'); + case 'M': + switch ($n) { + case 1: + /* 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. */ + return I18N::translateContext('MALE', 'first cousin'); + case 2: + /* 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. */ + return I18N::translateContext('MALE', 'second cousin'); + case 3: + /* 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. */ + return I18N::translateContext('MALE', 'third cousin'); + case 4: + /* 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. */ + return I18N::translateContext('MALE', 'fourth cousin'); + case 5: + /* 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. */ + return I18N::translateContext('MALE', 'fifth cousin'); + case 6: + /* 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. */ + return I18N::translateContext('MALE', 'sixth cousin'); + case 7: + /* 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. */ + return I18N::translateContext('MALE', 'seventh cousin'); + case 8: + /* 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. */ + return I18N::translateContext('MALE', 'eighth cousin'); + case 9: + /* 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. */ + return I18N::translateContext('MALE', 'ninth cousin'); + case 10: + /* 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. */ + return I18N::translateContext('MALE', 'tenth cousin'); + case 11: + /* 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. */ + return I18N::translateContext('MALE', 'eleventh cousin'); + case 12: + /* 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. */ + return I18N::translateContext('MALE', 'twelfth cousin'); + case 13: + /* 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. */ + return I18N::translateContext('MALE', 'thirteenth cousin'); + case 14: + /* 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. */ + return I18N::translateContext('MALE', 'fourteenth cousin'); + case 15: + /* 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. */ + return I18N::translateContext('MALE', 'fifteenth cousin'); + default: + /* 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. */ + return I18N::translateContext('MALE', '%s × cousin', I18N::number($n)); + } + case 'F': + switch ($n) { + case 1: + return I18N::translateContext('FEMALE', 'first cousin'); + case 2: + return I18N::translateContext('FEMALE', 'second cousin'); + case 3: + return I18N::translateContext('FEMALE', 'third cousin'); + case 4: + return I18N::translateContext('FEMALE', 'fourth cousin'); + case 5: + return I18N::translateContext('FEMALE', 'fifth cousin'); + case 6: + return I18N::translateContext('FEMALE', 'sixth cousin'); + case 7: + return I18N::translateContext('FEMALE', 'seventh cousin'); + case 8: + return I18N::translateContext('FEMALE', 'eighth cousin'); + case 9: + return I18N::translateContext('FEMALE', 'ninth cousin'); + case 10: + return I18N::translateContext('FEMALE', 'tenth cousin'); + case 11: + return I18N::translateContext('FEMALE', 'eleventh cousin'); + case 12: + return I18N::translateContext('FEMALE', 'twelfth cousin'); + case 13: + return I18N::translateContext('FEMALE', 'thirteenth cousin'); + case 14: + return I18N::translateContext('FEMALE', 'fourteenth cousin'); + case 15: + return I18N::translateContext('FEMALE', 'fifteenth cousin'); + default: + return I18N::translateContext('FEMALE', '%s × cousin', I18N::number($n)); + } default: - return I18N::translate('%s × cousin', I18N::number($n)); - } + switch ($n) { + case 1: + return I18N::translate('first cousin'); + case 2: + return I18N::translate('second cousin'); + case 3: + return I18N::translate('third cousin'); + case 4: + return I18N::translate('fourth cousin'); + case 5: + return I18N::translate('fifth cousin'); + case 6: + return I18N::translate('sixth cousin'); + case 7: + return I18N::translate('seventh cousin'); + case 8: + return I18N::translate('eighth cousin'); + case 9: + return I18N::translate('ninth cousin'); + case 10: + return I18N::translate('tenth cousin'); + case 11: + return I18N::translate('eleventh cousin'); + case 12: + return I18N::translate('twelfth cousin'); + case 13: + return I18N::translate('thirteenth cousin'); + case 14: + return I18N::translate('fourteenth cousin'); + case 15: + return I18N::translate('fifteenth cousin'); + default: + return I18N::translate('%s × cousin', I18N::number($n)); + } } } @@ -572,51 +572,51 @@ class Functions { */ public static function cousinName2($n, $sex, $relation) { switch ($sex) { - case 'M': - switch ($n) { - case 1: - return /* I18N: A Spanish relationship name, such as third great-nephew */ I18N::translateContext('MALE', 'first %s', $relation); - case 2: - return I18N::translateContext('MALE', 'second %s', $relation); - case 3: - return I18N::translateContext('MALE', 'third %s', $relation); - case 4: - return I18N::translateContext('MALE', 'fourth %s', $relation); - case 5: - return I18N::translateContext('MALE', 'fifth %s', $relation); - default: - return /* I18N: A Spanish relationship name, such as third great-nephew */ I18N::translateContext('MALE', '%1$s × %2$s', I18N::number($n), $relation); - } - case 'F': - switch ($n) { - case 1: - return /* I18N: A Spanish relationship name, such as third great-nephew */ I18N::translateContext('FEMALE', 'first %s', $relation); - case 2: - return I18N::translateContext('FEMALE', 'second %s', $relation); - case 3: - return I18N::translateContext('FEMALE', 'third %s', $relation); - case 4: - return I18N::translateContext('FEMALE', 'fourth %s', $relation); - case 5: - return I18N::translateContext('FEMALE', 'fifth %s', $relation); - default: // I18N: A Spanish relationship name, such as third great-nephew - return I18N::translateContext('FEMALE', '%1$s × %2$s', I18N::number($n), $relation); - } - default: - switch ($n) { - case 1: - return /* I18N: A Spanish relationship name, such as first great-nephew */ I18N::translate('first %s', $relation); - case 2: - return /* I18N: A Spanish relationship name, such as second great-nephew */ I18N::translate('second %s', $relation); - case 3: - return /* I18N: A Spanish relationship name, such as third great-nephew */ I18N::translate('third %s', $relation); - case 4: - return /* I18N: A Spanish relationship name, such as fourth great-nephew */ I18N::translate('fourth %s', $relation); - case 5: - return /* I18N: A Spanish relationship name, such as fifth great-nephew */ I18N::translate('fifth %s', $relation); + case 'M': + switch ($n) { + case 1: + return /* I18N: A Spanish relationship name, such as third great-nephew */ I18N::translateContext('MALE', 'first %s', $relation); + case 2: + return I18N::translateContext('MALE', 'second %s', $relation); + case 3: + return I18N::translateContext('MALE', 'third %s', $relation); + case 4: + return I18N::translateContext('MALE', 'fourth %s', $relation); + case 5: + return I18N::translateContext('MALE', 'fifth %s', $relation); + default: + return /* I18N: A Spanish relationship name, such as third great-nephew */ I18N::translateContext('MALE', '%1$s × %2$s', I18N::number($n), $relation); + } + case 'F': + switch ($n) { + case 1: + return /* I18N: A Spanish relationship name, such as third great-nephew */ I18N::translateContext('FEMALE', 'first %s', $relation); + case 2: + return I18N::translateContext('FEMALE', 'second %s', $relation); + case 3: + return I18N::translateContext('FEMALE', 'third %s', $relation); + case 4: + return I18N::translateContext('FEMALE', 'fourth %s', $relation); + case 5: + return I18N::translateContext('FEMALE', 'fifth %s', $relation); + default: // I18N: A Spanish relationship name, such as third great-nephew + return I18N::translateContext('FEMALE', '%1$s × %2$s', I18N::number($n), $relation); + } default: - return /* I18N: A Spanish relationship name, such as 7th great-nephew */ I18N::translate('%1$s × %2$s', I18N::number($n), $relation); - } + switch ($n) { + case 1: + return /* I18N: A Spanish relationship name, such as first great-nephew */ I18N::translate('first %s', $relation); + case 2: + return /* I18N: A Spanish relationship name, such as second great-nephew */ I18N::translate('second %s', $relation); + case 3: + return /* I18N: A Spanish relationship name, such as third great-nephew */ I18N::translate('third %s', $relation); + case 4: + return /* I18N: A Spanish relationship name, such as fourth great-nephew */ I18N::translate('fourth %s', $relation); + case 5: + return /* I18N: A Spanish relationship name, such as fifth great-nephew */ I18N::translate('fifth %s', $relation); + default: + return /* I18N: A Spanish relationship name, such as 7th great-nephew */ I18N::translate('%1$s × %2$s', I18N::number($n), $relation); + } } } @@ -653,796 +653,796 @@ class Functions { } switch ($path) { - case '': - return I18N::translate('self'); - // Level One relationships - case 'mot': - return I18N::translate('mother'); - case 'fat': - return I18N::translate('father'); - case 'par': - return I18N::translate('parent'); - case 'hus': - if ($person1 && $person2) { - foreach ($person1->getSpouseFamilies() as $family) { - if ($person2 === $family->getSpouse($person1)) { - if ($family->getFacts('MARR')) { - if ($family->getFacts(WT_EVENTS_DIV)) { - return I18N::translate('ex-husband'); - } else { - return I18N::translate('husband'); + case '': + return I18N::translate('self'); + // Level One relationships + case 'mot': + return I18N::translate('mother'); + case 'fat': + return I18N::translate('father'); + case 'par': + return I18N::translate('parent'); + case 'hus': + if ($person1 && $person2) { + foreach ($person1->getSpouseFamilies() as $family) { + if ($person2 === $family->getSpouse($person1)) { + if ($family->getFacts('MARR')) { + if ($family->getFacts(WT_EVENTS_DIV)) { + return I18N::translate('ex-husband'); + } else { + return I18N::translate('husband'); + } + } elseif ($family->getFacts(WT_EVENTS_DIV)) { + return I18N::translateContext('MALE', 'ex-partner'); } - } elseif ($family->getFacts(WT_EVENTS_DIV)) { - return I18N::translateContext('MALE', 'ex-partner'); } } } - } - return I18N::translateContext('MALE', 'partner'); - case 'wif': - if ($person1 && $person2) { - foreach ($person1->getSpouseFamilies() as $family) { - if ($person2 === $family->getSpouse($person1)) { - if ($family->getFacts('MARR')) { - if ($family->getFacts(WT_EVENTS_DIV)) { - return I18N::translate('ex-wife'); - } else { - return I18N::translate('wife'); + return I18N::translateContext('MALE', 'partner'); + case 'wif': + if ($person1 && $person2) { + foreach ($person1->getSpouseFamilies() as $family) { + if ($person2 === $family->getSpouse($person1)) { + if ($family->getFacts('MARR')) { + if ($family->getFacts(WT_EVENTS_DIV)) { + return I18N::translate('ex-wife'); + } else { + return I18N::translate('wife'); + } + } elseif ($family->getFacts(WT_EVENTS_DIV)) { + return I18N::translateContext('FEMALE', 'ex-partner'); } - } elseif ($family->getFacts(WT_EVENTS_DIV)) { - return I18N::translateContext('FEMALE', 'ex-partner'); } } } - } - return I18N::translateContext('FEMALE', 'partner'); - case 'spo': - if ($person1 && $person2) { - foreach ($person1->getSpouseFamilies() as $family) { - if ($person2 === $family->getSpouse($person1)) { - if ($family->getFacts('MARR')) { - if ($family->getFacts(WT_EVENTS_DIV)) { - return I18N::translate('ex-spouse'); - } else { - return I18N::translate('spouse'); + return I18N::translateContext('FEMALE', 'partner'); + case 'spo': + if ($person1 && $person2) { + foreach ($person1->getSpouseFamilies() as $family) { + if ($person2 === $family->getSpouse($person1)) { + if ($family->getFacts('MARR')) { + if ($family->getFacts(WT_EVENTS_DIV)) { + return I18N::translate('ex-spouse'); + } else { + return I18N::translate('spouse'); + } + } elseif ($family->getFacts(WT_EVENTS_DIV)) { + return I18N::translate('ex-partner'); } - } elseif ($family->getFacts(WT_EVENTS_DIV)) { - return I18N::translate('ex-partner'); } } } - } - return I18N::translate('partner'); - case 'son': - return I18N::translate('son'); - case 'dau': - return I18N::translate('daughter'); - case 'chi': - return I18N::translate('child'); - case 'bro': - if ($person1 && $person2) { - $dob1 = $person1->getBirthDate(); - $dob2 = $person2->getBirthDate(); - if ($dob1->isOK() && $dob2->isOK()) { - if (abs($dob1->julianDay() - $dob2->julianDay()) < 2 && !$dob1->minimumDate()->d !== 0 && !$dob2->minimumDate()->d !== 0) { - // Exclude BEF, AFT, etc. - return I18N::translate('twin brother'); - } elseif ($dob1->maximumJulianDay() < $dob2->minimumJulianDay()) { - return I18N::translate('younger brother'); - } elseif ($dob1->minimumJulianDay() > $dob2->maximumJulianDay()) { - return I18N::translate('elder brother'); + return I18N::translate('partner'); + case 'son': + return I18N::translate('son'); + case 'dau': + return I18N::translate('daughter'); + case 'chi': + return I18N::translate('child'); + case 'bro': + if ($person1 && $person2) { + $dob1 = $person1->getBirthDate(); + $dob2 = $person2->getBirthDate(); + if ($dob1->isOK() && $dob2->isOK()) { + if (abs($dob1->julianDay() - $dob2->julianDay()) < 2 && !$dob1->minimumDate()->d !== 0 && !$dob2->minimumDate()->d !== 0) { + // Exclude BEF, AFT, etc. + return I18N::translate('twin brother'); + } elseif ($dob1->maximumJulianDay() < $dob2->minimumJulianDay()) { + return I18N::translate('younger brother'); + } elseif ($dob1->minimumJulianDay() > $dob2->maximumJulianDay()) { + return I18N::translate('elder brother'); + } } } - } - return I18N::translate('brother'); - case 'sis': - if ($person1 && $person2) { - $dob1 = $person1->getBirthDate(); - $dob2 = $person2->getBirthDate(); - if ($dob1->isOK() && $dob2->isOK()) { - if (abs($dob1->julianDay() - $dob2->julianDay()) < 2 && !$dob1->minimumDate()->d !== 0 && !$dob2->minimumDate()->d !== 0) { - // Exclude BEF, AFT, etc. - return I18N::translate('twin sister'); - } elseif ($dob1->maximumJulianDay() < $dob2->minimumJulianDay()) { - return I18N::translate('younger sister'); - } elseif ($dob1->minimumJulianDay() > $dob2->maximumJulianDay()) { - return I18N::translate('elder sister'); + return I18N::translate('brother'); + case 'sis': + if ($person1 && $person2) { + $dob1 = $person1->getBirthDate(); + $dob2 = $person2->getBirthDate(); + if ($dob1->isOK() && $dob2->isOK()) { + if (abs($dob1->julianDay() - $dob2->julianDay()) < 2 && !$dob1->minimumDate()->d !== 0 && !$dob2->minimumDate()->d !== 0) { + // Exclude BEF, AFT, etc. + return I18N::translate('twin sister'); + } elseif ($dob1->maximumJulianDay() < $dob2->minimumJulianDay()) { + return I18N::translate('younger sister'); + } elseif ($dob1->minimumJulianDay() > $dob2->maximumJulianDay()) { + return I18N::translate('elder sister'); + } } } - } - return I18N::translate('sister'); - case 'sib': - if ($person1 && $person2) { - $dob1 = $person1->getBirthDate(); - $dob2 = $person2->getBirthDate(); - if ($dob1->isOK() && $dob2->isOK()) { - if (abs($dob1->julianDay() - $dob2->julianDay()) < 2 && !$dob1->minimumDate()->d !== 0 && !$dob2->minimumDate()->d !== 0) { - // Exclude BEF, AFT, etc. - return I18N::translate('twin sibling'); - } elseif ($dob1->maximumJulianDay() < $dob2->minimumJulianDay()) { - return I18N::translate('younger sibling'); - } elseif ($dob1->minimumJulianDay() > $dob2->maximumJulianDay()) { - return I18N::translate('elder sibling'); + return I18N::translate('sister'); + case 'sib': + if ($person1 && $person2) { + $dob1 = $person1->getBirthDate(); + $dob2 = $person2->getBirthDate(); + if ($dob1->isOK() && $dob2->isOK()) { + if (abs($dob1->julianDay() - $dob2->julianDay()) < 2 && !$dob1->minimumDate()->d !== 0 && !$dob2->minimumDate()->d !== 0) { + // Exclude BEF, AFT, etc. + return I18N::translate('twin sibling'); + } elseif ($dob1->maximumJulianDay() < $dob2->minimumJulianDay()) { + return I18N::translate('younger sibling'); + } elseif ($dob1->minimumJulianDay() > $dob2->maximumJulianDay()) { + return I18N::translate('elder sibling'); + } } } - } - return I18N::translate('sibling'); + return I18N::translate('sibling'); - // Level Two relationships - case 'brochi': - return I18N::translateContext('brother’s child', 'nephew/niece'); - case 'brodau': - return I18N::translateContext('brother’s daughter', 'niece'); - case 'broson': - return I18N::translateContext('brother’s son', 'nephew'); - case 'browif': - return I18N::translateContext('brother’s wife', 'sister-in-law'); - case 'chichi': - return I18N::translateContext('child’s child', 'grandchild'); - case 'chidau': - return I18N::translateContext('child’s daughter', 'granddaughter'); - case 'chihus': - return I18N::translateContext('child’s husband', 'son-in-law'); - case 'chison': - return I18N::translateContext('child’s son', 'grandson'); - case 'chispo': - return I18N::translateContext('child’s spouse', 'son/daughter-in-law'); - case 'chiwif': - return I18N::translateContext('child’s wife', 'daughter-in-law'); - case 'dauchi': - return I18N::translateContext('daughter’s child', 'grandchild'); - case 'daudau': - return I18N::translateContext('daughter’s daughter', 'granddaughter'); - case 'dauhus': - return I18N::translateContext('daughter’s husband', 'son-in-law'); - case 'dauson': - return I18N::translateContext('daughter’s son', 'grandson'); - case 'fatbro': - return I18N::translateContext('father’s brother', 'uncle'); - case 'fatchi': - return I18N::translateContext('father’s child', 'half-sibling'); - case 'fatdau': - return I18N::translateContext('father’s daughter', 'half-sister'); - case 'fatfat': - return I18N::translateContext('father’s father', 'paternal grandfather'); - case 'fatmot': - return I18N::translateContext('father’s mother', 'paternal grandmother'); - case 'fatpar': - return I18N::translateContext('father’s parent', 'paternal grandparent'); - case 'fatsib': - return I18N::translateContext('father’s sibling', 'aunt/uncle'); - case 'fatsis': - return I18N::translateContext('father’s sister', 'aunt'); - case 'fatson': - return I18N::translateContext('father’s son', 'half-brother'); - case 'fatwif': - return I18N::translateContext('father’s wife', 'step-mother'); - case 'husbro': - return I18N::translateContext('husband’s brother', 'brother-in-law'); - case 'huschi': - return I18N::translateContext('husband’s child', 'step-child'); - case 'husdau': - return I18N::translateContext('husband’s daughter', 'step-daughter'); - case 'husfat': - return I18N::translateContext('husband’s father', 'father-in-law'); - case 'husmot': - return I18N::translateContext('husband’s mother', 'mother-in-law'); - case 'hussib': - return I18N::translateContext('husband’s sibling', 'brother/sister-in-law'); - case 'hussis': - return I18N::translateContext('husband’s sister', 'sister-in-law'); - case 'husson': - return I18N::translateContext('husband’s son', 'step-son'); - case 'motbro': - return I18N::translateContext('mother’s brother', 'uncle'); - case 'motchi': - return I18N::translateContext('mother’s child', 'half-sibling'); - case 'motdau': - return I18N::translateContext('mother’s daughter', 'half-sister'); - case 'motfat': - return I18N::translateContext('mother’s father', 'maternal grandfather'); - case 'mothus': - return I18N::translateContext('mother’s husband', 'step-father'); - case 'motmot': - return I18N::translateContext('mother’s mother', 'maternal grandmother'); - case 'motpar': - return I18N::translateContext('mother’s parent', 'maternal grandparent'); - case 'motsib': - return I18N::translateContext('mother’s sibling', 'aunt/uncle'); - case 'motsis': - return I18N::translateContext('mother’s sister', 'aunt'); - case 'motson': - return I18N::translateContext('mother’s son', 'half-brother'); - case 'parbro': - return I18N::translateContext('parent’s brother', 'uncle'); - case 'parchi': - return I18N::translateContext('parent’s child', 'half-sibling'); - case 'pardau': - return I18N::translateContext('parent’s daughter', 'half-sister'); - case 'parfat': - return I18N::translateContext('parent’s father', 'grandfather'); - case 'parmot': - return I18N::translateContext('parent’s mother', 'grandmother'); - case 'parpar': - return I18N::translateContext('parent’s parent', 'grandparent'); - case 'parsib': - return I18N::translateContext('parent’s sibling', 'aunt/uncle'); - case 'parsis': - return I18N::translateContext('parent’s sister', 'aunt'); - case 'parson': - return I18N::translateContext('parent’s son', 'half-brother'); - case 'parspo': - return I18N::translateContext('parent’s spouse', 'step-parent'); - case 'sibchi': - return I18N::translateContext('sibling’s child', 'nephew/niece'); - case 'sibdau': - return I18N::translateContext('sibling’s daughter', 'niece'); - case 'sibson': - return I18N::translateContext('sibling’s son', 'nephew'); - case 'sibspo': - return I18N::translateContext('sibling’s spouse', 'brother/sister-in-law'); - case 'sischi': - return I18N::translateContext('sister’s child', 'nephew/niece'); - case 'sisdau': - return I18N::translateContext('sister’s daughter', 'niece'); - case 'sishus': - return I18N::translateContext('sister’s husband', 'brother-in-law'); - case 'sisson': - return I18N::translateContext('sister’s son', 'nephew'); - case 'sonchi': - return I18N::translateContext('son’s child', 'grandchild'); - case 'sondau': - return I18N::translateContext('son’s daughter', 'granddaughter'); - case 'sonson': - return I18N::translateContext('son’s son', 'grandson'); - case 'sonwif': - return I18N::translateContext('son’s wife', 'daughter-in-law'); - case 'spobro': - return I18N::translateContext('spouse’s brother', 'brother-in-law'); - case 'spochi': - return I18N::translateContext('spouse’s child', 'step-child'); - case 'spodau': - return I18N::translateContext('spouse’s daughter', 'step-daughter'); - case 'spofat': - return I18N::translateContext('spouse’s father', 'father-in-law'); - case 'spomot': - return I18N::translateContext('spouse’s mother', 'mother-in-law'); - case 'sposis': - return I18N::translateContext('spouse’s sister', 'sister-in-law'); - case 'sposon': - return I18N::translateContext('spouse’s son', 'step-son'); - case 'spopar': - return I18N::translateContext('spouse’s parent', 'mother/father-in-law'); - case 'sposib': - return I18N::translateContext('spouse’s sibling', 'brother/sister-in-law'); - case 'wifbro': - return I18N::translateContext('wife’s brother', 'brother-in-law'); - case 'wifchi': - return I18N::translateContext('wife’s child', 'step-child'); - case 'wifdau': - return I18N::translateContext('wife’s daughter', 'step-daughter'); - case 'wiffat': - return I18N::translateContext('wife’s father', 'father-in-law'); - case 'wifmot': - return I18N::translateContext('wife’s mother', 'mother-in-law'); - case 'wifsib': - return I18N::translateContext('wife’s sibling', 'brother/sister-in-law'); - case 'wifsis': - return I18N::translateContext('wife’s sister', 'sister-in-law'); - case 'wifson': - return I18N::translateContext('wife’s son', 'step-son'); + // Level Two relationships + case 'brochi': + return I18N::translateContext('brother’s child', 'nephew/niece'); + case 'brodau': + return I18N::translateContext('brother’s daughter', 'niece'); + case 'broson': + return I18N::translateContext('brother’s son', 'nephew'); + case 'browif': + return I18N::translateContext('brother’s wife', 'sister-in-law'); + case 'chichi': + return I18N::translateContext('child’s child', 'grandchild'); + case 'chidau': + return I18N::translateContext('child’s daughter', 'granddaughter'); + case 'chihus': + return I18N::translateContext('child’s husband', 'son-in-law'); + case 'chison': + return I18N::translateContext('child’s son', 'grandson'); + case 'chispo': + return I18N::translateContext('child’s spouse', 'son/daughter-in-law'); + case 'chiwif': + return I18N::translateContext('child’s wife', 'daughter-in-law'); + case 'dauchi': + return I18N::translateContext('daughter’s child', 'grandchild'); + case 'daudau': + return I18N::translateContext('daughter’s daughter', 'granddaughter'); + case 'dauhus': + return I18N::translateContext('daughter’s husband', 'son-in-law'); + case 'dauson': + return I18N::translateContext('daughter’s son', 'grandson'); + case 'fatbro': + return I18N::translateContext('father’s brother', 'uncle'); + case 'fatchi': + return I18N::translateContext('father’s child', 'half-sibling'); + case 'fatdau': + return I18N::translateContext('father’s daughter', 'half-sister'); + case 'fatfat': + return I18N::translateContext('father’s father', 'paternal grandfather'); + case 'fatmot': + return I18N::translateContext('father’s mother', 'paternal grandmother'); + case 'fatpar': + return I18N::translateContext('father’s parent', 'paternal grandparent'); + case 'fatsib': + return I18N::translateContext('father’s sibling', 'aunt/uncle'); + case 'fatsis': + return I18N::translateContext('father’s sister', 'aunt'); + case 'fatson': + return I18N::translateContext('father’s son', 'half-brother'); + case 'fatwif': + return I18N::translateContext('father’s wife', 'step-mother'); + case 'husbro': + return I18N::translateContext('husband’s brother', 'brother-in-law'); + case 'huschi': + return I18N::translateContext('husband’s child', 'step-child'); + case 'husdau': + return I18N::translateContext('husband’s daughter', 'step-daughter'); + case 'husfat': + return I18N::translateContext('husband’s father', 'father-in-law'); + case 'husmot': + return I18N::translateContext('husband’s mother', 'mother-in-law'); + case 'hussib': + return I18N::translateContext('husband’s sibling', 'brother/sister-in-law'); + case 'hussis': + return I18N::translateContext('husband’s sister', 'sister-in-law'); + case 'husson': + return I18N::translateContext('husband’s son', 'step-son'); + case 'motbro': + return I18N::translateContext('mother’s brother', 'uncle'); + case 'motchi': + return I18N::translateContext('mother’s child', 'half-sibling'); + case 'motdau': + return I18N::translateContext('mother’s daughter', 'half-sister'); + case 'motfat': + return I18N::translateContext('mother’s father', 'maternal grandfather'); + case 'mothus': + return I18N::translateContext('mother’s husband', 'step-father'); + case 'motmot': + return I18N::translateContext('mother’s mother', 'maternal grandmother'); + case 'motpar': + return I18N::translateContext('mother’s parent', 'maternal grandparent'); + case 'motsib': + return I18N::translateContext('mother’s sibling', 'aunt/uncle'); + case 'motsis': + return I18N::translateContext('mother’s sister', 'aunt'); + case 'motson': + return I18N::translateContext('mother’s son', 'half-brother'); + case 'parbro': + return I18N::translateContext('parent’s brother', 'uncle'); + case 'parchi': + return I18N::translateContext('parent’s child', 'half-sibling'); + case 'pardau': + return I18N::translateContext('parent’s daughter', 'half-sister'); + case 'parfat': + return I18N::translateContext('parent’s father', 'grandfather'); + case 'parmot': + return I18N::translateContext('parent’s mother', 'grandmother'); + case 'parpar': + return I18N::translateContext('parent’s parent', 'grandparent'); + case 'parsib': + return I18N::translateContext('parent’s sibling', 'aunt/uncle'); + case 'parsis': + return I18N::translateContext('parent’s sister', 'aunt'); + case 'parson': + return I18N::translateContext('parent’s son', 'half-brother'); + case 'parspo': + return I18N::translateContext('parent’s spouse', 'step-parent'); + case 'sibchi': + return I18N::translateContext('sibling’s child', 'nephew/niece'); + case 'sibdau': + return I18N::translateContext('sibling’s daughter', 'niece'); + case 'sibson': + return I18N::translateContext('sibling’s son', 'nephew'); + case 'sibspo': + return I18N::translateContext('sibling’s spouse', 'brother/sister-in-law'); + case 'sischi': + return I18N::translateContext('sister’s child', 'nephew/niece'); + case 'sisdau': + return I18N::translateContext('sister’s daughter', 'niece'); + case 'sishus': + return I18N::translateContext('sister’s husband', 'brother-in-law'); + case 'sisson': + return I18N::translateContext('sister’s son', 'nephew'); + case 'sonchi': + return I18N::translateContext('son’s child', 'grandchild'); + case 'sondau': + return I18N::translateContext('son’s daughter', 'granddaughter'); + case 'sonson': + return I18N::translateContext('son’s son', 'grandson'); + case 'sonwif': + return I18N::translateContext('son’s wife', 'daughter-in-law'); + case 'spobro': + return I18N::translateContext('spouse’s brother', 'brother-in-law'); + case 'spochi': + return I18N::translateContext('spouse’s child', 'step-child'); + case 'spodau': + return I18N::translateContext('spouse’s daughter', 'step-daughter'); + case 'spofat': + return I18N::translateContext('spouse’s father', 'father-in-law'); + case 'spomot': + return I18N::translateContext('spouse’s mother', 'mother-in-law'); + case 'sposis': + return I18N::translateContext('spouse’s sister', 'sister-in-law'); + case 'sposon': + return I18N::translateContext('spouse’s son', 'step-son'); + case 'spopar': + return I18N::translateContext('spouse’s parent', 'mother/father-in-law'); + case 'sposib': + return I18N::translateContext('spouse’s sibling', 'brother/sister-in-law'); + case 'wifbro': + return I18N::translateContext('wife’s brother', 'brother-in-law'); + case 'wifchi': + return I18N::translateContext('wife’s child', 'step-child'); + case 'wifdau': + return I18N::translateContext('wife’s daughter', 'step-daughter'); + case 'wiffat': + return I18N::translateContext('wife’s father', 'father-in-law'); + case 'wifmot': + return I18N::translateContext('wife’s mother', 'mother-in-law'); + case 'wifsib': + return I18N::translateContext('wife’s sibling', 'brother/sister-in-law'); + case 'wifsis': + return I18N::translateContext('wife’s sister', 'sister-in-law'); + case 'wifson': + return I18N::translateContext('wife’s son', 'step-son'); - // Level Three relationships - // I have commented out some of the unknown-sex relationships that are unlikely to to occur. - // Feel free to add them in, if you think they might be needed - case 'brochichi': - if ($sex1 === 'M') { - return I18N::translateContext('(a man’s) brother’s child’s child', 'great-nephew/niece'); - } else { - return I18N::translateContext('(a woman’s) brother’s child’s child', 'great-nephew/niece'); - } - case 'brochidau': - if ($sex1 === 'M') { - return I18N::translateContext('(a man’s) brother’s child’s daughter', 'great-niece'); - } else { - return I18N::translateContext('(a woman’s) brother’s child’s daughter', 'great-niece'); - } - case 'brochison': - if ($sex1 === 'M') { - return I18N::translateContext('(a man’s) brother’s child’s son', 'great-nephew'); - } else { - return I18N::translateContext('(a woman’s) brother’s child’s son', 'great-nephew'); - } - case 'brodauchi': - if ($sex1 === 'M') { - return I18N::translateContext('(a man’s) brother’s daughter’s child', 'great-nephew/niece'); - } else { - return I18N::translateContext('(a woman’s) brother’s daughter’s child', 'great-nephew/niece'); - } - case 'brodaudau': - if ($sex1 === 'M') { - return I18N::translateContext('(a man’s) brother’s daughter’s daughter', 'great-niece'); - } else { - return I18N::translateContext('(a woman’s) brother’s daughter’s daughter', 'great-niece'); - } - case 'brodauhus': - return I18N::translateContext('brother’s daughter’s husband', 'nephew-in-law'); - case 'brodauson': - if ($sex1 === 'M') { - return I18N::translateContext('(a man’s) brother’s daughter’s son', 'great-nephew'); - } else { - return I18N::translateContext('(a woman’s) brother’s daughter’s son', 'great-nephew'); - } - case 'brosonchi': - if ($sex1 === 'M') { - return I18N::translateContext('(a man’s) brother’s son’s child', 'great-nephew/niece'); - } else { - return I18N::translateContext('(a woman’s) brother’s son’s child', 'great-nephew/niece'); - } - case 'brosondau': - if ($sex1 === 'M') { - return I18N::translateContext('(a man’s) brother’s son’s daughter', 'great-niece'); - } else { - return I18N::translateContext('(a woman’s) brother’s son’s daughter', 'great-niece'); - } - case 'brosonson': - if ($sex1 === 'M') { - return I18N::translateContext('(a man’s) brother’s son’s son', 'great-nephew'); - } else { - return I18N::translateContext('(a woman’s) brother’s son’s son', 'great-nephew'); - } - case 'brosonwif': - return I18N::translateContext('brother’s son’s wife', 'niece-in-law'); - case 'browifbro': - return I18N::translateContext('brother’s wife’s brother', 'brother-in-law'); - case 'browifsib': - return I18N::translateContext('brother’s wife’s sibling', 'brother/sister-in-law'); - case 'browifsis': - return I18N::translateContext('brother’s wife’s sister', 'sister-in-law'); - case 'chichichi': - return I18N::translateContext('child’s child’s child', 'great-grandchild'); - case 'chichidau': - return I18N::translateContext('child’s child’s daughter', 'great-granddaughter'); - case 'chichison': - return I18N::translateContext('child’s child’s son', 'great-grandson'); - case 'chidauchi': - return I18N::translateContext('child’s daughter’s child', 'great-grandchild'); - case 'chidaudau': - return I18N::translateContext('child’s daughter’s daughter', 'great-granddaughter'); - case 'chidauhus': - return I18N::translateContext('child’s daughter’s husband', 'granddaughter’s husband'); - case 'chidauson': - return I18N::translateContext('child’s daughter’s son', 'great-grandson'); - case 'chisonchi': - return I18N::translateContext('child’s son’s child', 'great-grandchild'); - case 'chisondau': - return I18N::translateContext('child’s son’s daughter', 'great-granddaughter'); - case 'chisonson': - return I18N::translateContext('child’s son’s son', 'great-grandson'); - case 'chisonwif': - return I18N::translateContext('child’s son’s wife', 'grandson’s wife'); - case 'dauchichi': - return I18N::translateContext('daughter’s child’s child', 'great-grandchild'); - case 'dauchidau': - return I18N::translateContext('daughter’s child’s daughter', 'great-granddaughter'); - case 'dauchison': - return I18N::translateContext('daughter’s child’s son', 'great-grandson'); - case 'daudauchi': - return I18N::translateContext('daughter’s daughter’s child', 'great-grandchild'); - case 'daudaudau': - return I18N::translateContext('daughter’s daughter’s daughter', 'great-granddaughter'); - case 'daudauhus': - return I18N::translateContext('daughter’s daughter’s husband', 'granddaughter’s husband'); - case 'daudauson': - return I18N::translateContext('daughter’s daughter’s son', 'great-grandson'); - case 'dauhusfat': - return I18N::translateContext('daughter’s husband’s father', 'son-in-law’s father'); - case 'dauhusmot': - return I18N::translateContext('daughter’s husband’s mother', 'son-in-law’s mother'); - case 'dauhuspar': - return I18N::translateContext('daughter’s husband’s parent', 'son-in-law’s parent'); - case 'dausonchi': - return I18N::translateContext('daughter’s son’s child', 'great-grandchild'); - case 'dausondau': - return I18N::translateContext('daughter’s son’s daughter', 'great-granddaughter'); - case 'dausonson': - return I18N::translateContext('daughter’s son’s son', 'great-grandson'); - case 'dausonwif': - return I18N::translateContext('daughter’s son’s wife', 'grandson’s wife'); - case 'fatbrochi': - return I18N::translateContext('father’s brother’s child', 'first cousin'); - case 'fatbrodau': - return I18N::translateContext('father’s brother’s daughter', 'first cousin'); - case 'fatbroson': - return I18N::translateContext('father’s brother’s son', 'first cousin'); - case 'fatbrowif': - return I18N::translateContext('father’s brother’s wife', 'aunt'); - case 'fatfatbro': - return I18N::translateContext('father’s father’s brother', 'great-uncle'); - case 'fatfatfat': - return I18N::translateContext('father’s father’s father', 'great-grandfather'); - case 'fatfatmot': - return I18N::translateContext('father’s father’s mother', 'great-grandmother'); - case 'fatfatpar': - return I18N::translateContext('father’s father’s parent', 'great-grandparent'); - case 'fatfatsib': - return I18N::translateContext('father’s father’s sibling', 'great-aunt/uncle'); - case 'fatfatsis': - return I18N::translateContext('father’s father’s sister', 'great-aunt'); - case 'fatmotbro': - return I18N::translateContext('father’s mother’s brother', 'great-uncle'); - case 'fatmotfat': - return I18N::translateContext('father’s mother’s father', 'great-grandfather'); - case 'fatmotmot': - return I18N::translateContext('father’s mother’s mother', 'great-grandmother'); - case 'fatmotpar': - return I18N::translateContext('father’s mother’s parent', 'great-grandparent'); - case 'fatmotsib': - return I18N::translateContext('father’s mother’s sibling', 'great-aunt/uncle'); - case 'fatmotsis': - return I18N::translateContext('father’s mother’s sister', 'great-aunt'); - case 'fatparbro': - return I18N::translateContext('father’s parent’s brother', 'great-uncle'); - case 'fatparfat': - return I18N::translateContext('father’s parent’s father', 'great-grandfather'); - case 'fatparmot': - return I18N::translateContext('father’s parent’s mother', 'great-grandmother'); - case 'fatparpar': - return I18N::translateContext('father’s parent’s parent', 'great-grandparent'); - case 'fatparsib': - return I18N::translateContext('father’s parent’s sibling', 'great-aunt/uncle'); - case 'fatparsis': - return I18N::translateContext('father’s parent’s sister', 'great-aunt'); - case 'fatsischi': - return I18N::translateContext('father’s sister’s child', 'first cousin'); - case 'fatsisdau': - return I18N::translateContext('father’s sister’s daughter', 'first cousin'); - case 'fatsishus': - return I18N::translateContext('father’s sister’s husband', 'uncle'); - case 'fatsisson': - return I18N::translateContext('father’s sister’s son', 'first cousin'); - case 'fatwifchi': - return I18N::translateContext('father’s wife’s child', 'step-sibling'); - case 'fatwifdau': - return I18N::translateContext('father’s wife’s daughter', 'step-sister'); - case 'fatwifson': - return I18N::translateContext('father’s wife’s son', 'step-brother'); - case 'husbrowif': - return I18N::translateContext('husband’s brother’s wife', 'sister-in-law'); - case 'hussishus': - return I18N::translateContext('husband’s sister’s husband', 'brother-in-law'); - case 'motbrochi': - return I18N::translateContext('mother’s brother’s child', 'first cousin'); - case 'motbrodau': - return I18N::translateContext('mother’s brother’s daughter', 'first cousin'); - case 'motbroson': - return I18N::translateContext('mother’s brother’s son', 'first cousin'); - case 'motbrowif': - return I18N::translateContext('mother’s brother’s wife', 'aunt'); - case 'motfatbro': - return I18N::translateContext('mother’s father’s brother', 'great-uncle'); - case 'motfatfat': - return I18N::translateContext('mother’s father’s father', 'great-grandfather'); - case 'motfatmot': - return I18N::translateContext('mother’s father’s mother', 'great-grandmother'); - case 'motfatpar': - return I18N::translateContext('mother’s father’s parent', 'great-grandparent'); - case 'motfatsib': - return I18N::translateContext('mother’s father’s sibling', 'great-aunt/uncle'); - case 'motfatsis': - return I18N::translateContext('mother’s father’s sister', 'great-aunt'); - case 'mothuschi': - return I18N::translateContext('mother’s husband’s child', 'step-sibling'); - case 'mothusdau': - return I18N::translateContext('mother’s husband’s daughter', 'step-sister'); - case 'mothusson': - return I18N::translateContext('mother’s husband’s son', 'step-brother'); - case 'motmotbro': - return I18N::translateContext('mother’s mother’s brother', 'great-uncle'); - case 'motmotfat': - return I18N::translateContext('mother’s mother’s father', 'great-grandfather'); - case 'motmotmot': - return I18N::translateContext('mother’s mother’s mother', 'great-grandmother'); - case 'motmotpar': - return I18N::translateContext('mother’s mother’s parent', 'great-grandparent'); - case 'motmotsib': - return I18N::translateContext('mother’s mother’s sibling', 'great-aunt/uncle'); - case 'motmotsis': - return I18N::translateContext('mother’s mother’s sister', 'great-aunt'); - case 'motparbro': - return I18N::translateContext('mother’s parent’s brother', 'great-uncle'); - case 'motparfat': - return I18N::translateContext('mother’s parent’s father', 'great-grandfather'); - case 'motparmot': - return I18N::translateContext('mother’s parent’s mother', 'great-grandmother'); - case 'motparpar': - return I18N::translateContext('mother’s parent’s parent', 'great-grandparent'); - case 'motparsib': - return I18N::translateContext('mother’s parent’s sibling', 'great-aunt/uncle'); - case 'motparsis': - return I18N::translateContext('mother’s parent’s sister', 'great-aunt'); - case 'motsischi': - return I18N::translateContext('mother’s sister’s child', 'first cousin'); - case 'motsisdau': - return I18N::translateContext('mother’s sister’s daughter', 'first cousin'); - case 'motsishus': - return I18N::translateContext('mother’s sister’s husband', 'uncle'); - case 'motsisson': - return I18N::translateContext('mother’s sister’s son', 'first cousin'); - case 'parbrowif': - return I18N::translateContext('parent’s brother’s wife', 'aunt'); - case 'parfatbro': - return I18N::translateContext('parent’s father’s brother', 'great-uncle'); - case 'parfatfat': - return I18N::translateContext('parent’s father’s father', 'great-grandfather'); - case 'parfatmot': - return I18N::translateContext('parent’s father’s mother', 'great-grandmother'); - case 'parfatpar': - return I18N::translateContext('parent’s father’s parent', 'great-grandparent'); - case 'parfatsib': - return I18N::translateContext('parent’s father’s sibling', 'great-aunt/uncle'); - case 'parfatsis': - return I18N::translateContext('parent’s father’s sister', 'great-aunt'); - case 'parmotbro': - return I18N::translateContext('parent’s mother’s brother', 'great-uncle'); - case 'parmotfat': - return I18N::translateContext('parent’s mother’s father', 'great-grandfather'); - case 'parmotmot': - return I18N::translateContext('parent’s mother’s mother', 'great-grandmother'); - case 'parmotpar': - return I18N::translateContext('parent’s mother’s parent', 'great-grandparent'); - case 'parmotsib': - return I18N::translateContext('parent’s mother’s sibling', 'great-aunt/uncle'); - case 'parmotsis': - return I18N::translateContext('parent’s mother’s sister', 'great-aunt'); - case 'parparbro': - return I18N::translateContext('parent’s parent’s brother', 'great-uncle'); - case 'parparfat': - return I18N::translateContext('parent’s parent’s father', 'great-grandfather'); - case 'parparmot': - return I18N::translateContext('parent’s parent’s mother', 'great-grandmother'); - case 'parparpar': - return I18N::translateContext('parent’s parent’s parent', 'great-grandparent'); - case 'parparsib': - return I18N::translateContext('parent’s parent’s sibling', 'great-aunt/uncle'); - case 'parparsis': - return I18N::translateContext('parent’s parent’s sister', 'great-aunt'); - case 'parsishus': - return I18N::translateContext('parent’s sister’s husband', 'uncle'); - case 'parspochi': - return I18N::translateContext('parent’s spouse’s child', 'step-sibling'); - case 'parspodau': - return I18N::translateContext('parent’s spouse’s daughter', 'step-sister'); - case 'parsposon': - return I18N::translateContext('parent’s spouse’s son', 'step-brother'); - case 'sibchichi': - return I18N::translateContext('sibling’s child’s child', 'great-nephew/niece'); - case 'sibchidau': - return I18N::translateContext('sibling’s child’s daughter', 'great-niece'); - case 'sibchison': - return I18N::translateContext('sibling’s child’s son', 'great-nephew'); - case 'sibdauchi': - return I18N::translateContext('sibling’s daughter’s child', 'great-nephew/niece'); - case 'sibdaudau': - return I18N::translateContext('sibling’s daughter’s daughter', 'great-niece'); - case 'sibdauhus': - return I18N::translateContext('sibling’s daughter’s husband', 'nephew-in-law'); - case 'sibdauson': - return I18N::translateContext('sibling’s daughter’s son', 'great-nephew'); - case 'sibsonchi': - return I18N::translateContext('sibling’s son’s child', 'great-nephew/niece'); - case 'sibsondau': - return I18N::translateContext('sibling’s son’s daughter', 'great-niece'); - case 'sibsonson': - return I18N::translateContext('sibling’s son’s son', 'great-nephew'); - case 'sibsonwif': - return I18N::translateContext('sibling’s son’s wife', 'niece-in-law'); - case 'sischichi': - if ($sex1 === 'M') { - return I18N::translateContext('(a man’s) sister’s child’s child', 'great-nephew/niece'); - } else { - return I18N::translateContext('(a woman’s) sister’s child’s child', 'great-nephew/niece'); - } - case 'sischidau': - if ($sex1 === 'M') { - return I18N::translateContext('(a man’s) sister’s child’s daughter', 'great-niece'); - } else { - return I18N::translateContext('(a woman’s) sister’s child’s daughter', 'great-niece'); - } - case 'sischison': - if ($sex1 === 'M') { - return I18N::translateContext('(a man’s) sister’s child’s son', 'great-nephew'); - } else { - return I18N::translateContext('(a woman’s) sister’s child’s son', 'great-nephew'); - } - case 'sisdauchi': - if ($sex1 === 'M') { - return I18N::translateContext('(a man’s) sister’s daughter’s child', 'great-nephew/niece'); - } else { - return I18N::translateContext('(a woman’s) sister’s daughter’s child', 'great-nephew/niece'); - } - case 'sisdaudau': - if ($sex1 === 'M') { - return I18N::translateContext('(a man’s) sister’s daughter’s daughter', 'great-niece'); - } else { - return I18N::translateContext('(a woman’s) sister’s daughter’s daughter', 'great-niece'); - } - case 'sisdauhus': - return I18N::translateContext('sisters’s daughter’s husband', 'nephew-in-law'); - case 'sisdauson': - if ($sex1 === 'M') { - return I18N::translateContext('(a man’s) sister’s daughter’s son', 'great-nephew'); - } else { - return I18N::translateContext('(a woman’s) sister’s daughter’s son', 'great-nephew'); - } - case 'sishusbro': - return I18N::translateContext('sister’s husband’s brother', 'brother-in-law'); - case 'sishussib': - return I18N::translateContext('sister’s husband’s sibling', 'brother/sister-in-law'); - case 'sishussis': - return I18N::translateContext('sister’s husband’s sister', 'sister-in-law'); - case 'sissonchi': - if ($sex1 === 'M') { - return I18N::translateContext('(a man’s) sister’s son’s child', 'great-nephew/niece'); - } else { - return I18N::translateContext('(a woman’s) sister’s son’s child', 'great-nephew/niece'); - } - case 'sissondau': - if ($sex1 === 'M') { - return I18N::translateContext('(a man’s) sister’s son’s daughter', 'great-niece'); - } else { - return I18N::translateContext('(a woman’s) sister’s son’s daughter', 'great-niece'); - } - case 'sissonson': - if ($sex1 === 'M') { - return I18N::translateContext('(a man’s) sister’s son’s son', 'great-nephew'); - } else { - return I18N::translateContext('(a woman’s) sister’s son’s son', 'great-nephew'); - } - case 'sissonwif': - return I18N::translateContext('sisters’s son’s wife', 'niece-in-law'); - case 'sonchichi': - return I18N::translateContext('son’s child’s child', 'great-grandchild'); - case 'sonchidau': - return I18N::translateContext('son’s child’s daughter', 'great-granddaughter'); - case 'sonchison': - return I18N::translateContext('son’s child’s son', 'great-grandson'); - case 'sondauchi': - return I18N::translateContext('son’s daughter’s child', 'great-grandchild'); - case 'sondaudau': - return I18N::translateContext('son’s daughter’s daughter', 'great-granddaughter'); - case 'sondauhus': - return I18N::translateContext('son’s daughter’s husband', 'granddaughter’s husband'); - case 'sondauson': - return I18N::translateContext('son’s daughter’s son', 'great-grandson'); - case 'sonsonchi': - return I18N::translateContext('son’s son’s child', 'great-grandchild'); - case 'sonsondau': - return I18N::translateContext('son’s son’s daughter', 'great-granddaughter'); - case 'sonsonson': - return I18N::translateContext('son’s son’s son', 'great-grandson'); - case 'sonsonwif': - return I18N::translateContext('son’s son’s wife', 'grandson’s wife'); - case 'sonwiffat': - return I18N::translateContext('son’s wife’s father', 'daughter-in-law’s father'); - case 'sonwifmot': - return I18N::translateContext('son’s wife’s mother', 'daughter-in-law’s mother'); - case 'sonwifpar': - return I18N::translateContext('son’s wife’s parent', 'daughter-in-law’s parent'); - case 'wifbrowif': - return I18N::translateContext('wife’s brother’s wife', 'sister-in-law'); - case 'wifsishus': - return I18N::translateContext('wife’s sister’s husband', 'brother-in-law'); + // Level Three relationships + // I have commented out some of the unknown-sex relationships that are unlikely to to occur. + // Feel free to add them in, if you think they might be needed + case 'brochichi': + if ($sex1 === 'M') { + return I18N::translateContext('(a man’s) brother’s child’s child', 'great-nephew/niece'); + } else { + return I18N::translateContext('(a woman’s) brother’s child’s child', 'great-nephew/niece'); + } + case 'brochidau': + if ($sex1 === 'M') { + return I18N::translateContext('(a man’s) brother’s child’s daughter', 'great-niece'); + } else { + return I18N::translateContext('(a woman’s) brother’s child’s daughter', 'great-niece'); + } + case 'brochison': + if ($sex1 === 'M') { + return I18N::translateContext('(a man’s) brother’s child’s son', 'great-nephew'); + } else { + return I18N::translateContext('(a woman’s) brother’s child’s son', 'great-nephew'); + } + case 'brodauchi': + if ($sex1 === 'M') { + return I18N::translateContext('(a man’s) brother’s daughter’s child', 'great-nephew/niece'); + } else { + return I18N::translateContext('(a woman’s) brother’s daughter’s child', 'great-nephew/niece'); + } + case 'brodaudau': + if ($sex1 === 'M') { + return I18N::translateContext('(a man’s) brother’s daughter’s daughter', 'great-niece'); + } else { + return I18N::translateContext('(a woman’s) brother’s daughter’s daughter', 'great-niece'); + } + case 'brodauhus': + return I18N::translateContext('brother’s daughter’s husband', 'nephew-in-law'); + case 'brodauson': + if ($sex1 === 'M') { + return I18N::translateContext('(a man’s) brother’s daughter’s son', 'great-nephew'); + } else { + return I18N::translateContext('(a woman’s) brother’s daughter’s son', 'great-nephew'); + } + case 'brosonchi': + if ($sex1 === 'M') { + return I18N::translateContext('(a man’s) brother’s son’s child', 'great-nephew/niece'); + } else { + return I18N::translateContext('(a woman’s) brother’s son’s child', 'great-nephew/niece'); + } + case 'brosondau': + if ($sex1 === 'M') { + return I18N::translateContext('(a man’s) brother’s son’s daughter', 'great-niece'); + } else { + return I18N::translateContext('(a woman’s) brother’s son’s daughter', 'great-niece'); + } + case 'brosonson': + if ($sex1 === 'M') { + return I18N::translateContext('(a man’s) brother’s son’s son', 'great-nephew'); + } else { + return I18N::translateContext('(a woman’s) brother’s son’s son', 'great-nephew'); + } + case 'brosonwif': + return I18N::translateContext('brother’s son’s wife', 'niece-in-law'); + case 'browifbro': + return I18N::translateContext('brother’s wife’s brother', 'brother-in-law'); + case 'browifsib': + return I18N::translateContext('brother’s wife’s sibling', 'brother/sister-in-law'); + case 'browifsis': + return I18N::translateContext('brother’s wife’s sister', 'sister-in-law'); + case 'chichichi': + return I18N::translateContext('child’s child’s child', 'great-grandchild'); + case 'chichidau': + return I18N::translateContext('child’s child’s daughter', 'great-granddaughter'); + case 'chichison': + return I18N::translateContext('child’s child’s son', 'great-grandson'); + case 'chidauchi': + return I18N::translateContext('child’s daughter’s child', 'great-grandchild'); + case 'chidaudau': + return I18N::translateContext('child’s daughter’s daughter', 'great-granddaughter'); + case 'chidauhus': + return I18N::translateContext('child’s daughter’s husband', 'granddaughter’s husband'); + case 'chidauson': + return I18N::translateContext('child’s daughter’s son', 'great-grandson'); + case 'chisonchi': + return I18N::translateContext('child’s son’s child', 'great-grandchild'); + case 'chisondau': + return I18N::translateContext('child’s son’s daughter', 'great-granddaughter'); + case 'chisonson': + return I18N::translateContext('child’s son’s son', 'great-grandson'); + case 'chisonwif': + return I18N::translateContext('child’s son’s wife', 'grandson’s wife'); + case 'dauchichi': + return I18N::translateContext('daughter’s child’s child', 'great-grandchild'); + case 'dauchidau': + return I18N::translateContext('daughter’s child’s daughter', 'great-granddaughter'); + case 'dauchison': + return I18N::translateContext('daughter’s child’s son', 'great-grandson'); + case 'daudauchi': + return I18N::translateContext('daughter’s daughter’s child', 'great-grandchild'); + case 'daudaudau': + return I18N::translateContext('daughter’s daughter’s daughter', 'great-granddaughter'); + case 'daudauhus': + return I18N::translateContext('daughter’s daughter’s husband', 'granddaughter’s husband'); + case 'daudauson': + return I18N::translateContext('daughter’s daughter’s son', 'great-grandson'); + case 'dauhusfat': + return I18N::translateContext('daughter’s husband’s father', 'son-in-law’s father'); + case 'dauhusmot': + return I18N::translateContext('daughter’s husband’s mother', 'son-in-law’s mother'); + case 'dauhuspar': + return I18N::translateContext('daughter’s husband’s parent', 'son-in-law’s parent'); + case 'dausonchi': + return I18N::translateContext('daughter’s son’s child', 'great-grandchild'); + case 'dausondau': + return I18N::translateContext('daughter’s son’s daughter', 'great-granddaughter'); + case 'dausonson': + return I18N::translateContext('daughter’s son’s son', 'great-grandson'); + case 'dausonwif': + return I18N::translateContext('daughter’s son’s wife', 'grandson’s wife'); + case 'fatbrochi': + return I18N::translateContext('father’s brother’s child', 'first cousin'); + case 'fatbrodau': + return I18N::translateContext('father’s brother’s daughter', 'first cousin'); + case 'fatbroson': + return I18N::translateContext('father’s brother’s son', 'first cousin'); + case 'fatbrowif': + return I18N::translateContext('father’s brother’s wife', 'aunt'); + case 'fatfatbro': + return I18N::translateContext('father’s father’s brother', 'great-uncle'); + case 'fatfatfat': + return I18N::translateContext('father’s father’s father', 'great-grandfather'); + case 'fatfatmot': + return I18N::translateContext('father’s father’s mother', 'great-grandmother'); + case 'fatfatpar': + return I18N::translateContext('father’s father’s parent', 'great-grandparent'); + case 'fatfatsib': + return I18N::translateContext('father’s father’s sibling', 'great-aunt/uncle'); + case 'fatfatsis': + return I18N::translateContext('father’s father’s sister', 'great-aunt'); + case 'fatmotbro': + return I18N::translateContext('father’s mother’s brother', 'great-uncle'); + case 'fatmotfat': + return I18N::translateContext('father’s mother’s father', 'great-grandfather'); + case 'fatmotmot': + return I18N::translateContext('father’s mother’s mother', 'great-grandmother'); + case 'fatmotpar': + return I18N::translateContext('father’s mother’s parent', 'great-grandparent'); + case 'fatmotsib': + return I18N::translateContext('father’s mother’s sibling', 'great-aunt/uncle'); + case 'fatmotsis': + return I18N::translateContext('father’s mother’s sister', 'great-aunt'); + case 'fatparbro': + return I18N::translateContext('father’s parent’s brother', 'great-uncle'); + case 'fatparfat': + return I18N::translateContext('father’s parent’s father', 'great-grandfather'); + case 'fatparmot': + return I18N::translateContext('father’s parent’s mother', 'great-grandmother'); + case 'fatparpar': + return I18N::translateContext('father’s parent’s parent', 'great-grandparent'); + case 'fatparsib': + return I18N::translateContext('father’s parent’s sibling', 'great-aunt/uncle'); + case 'fatparsis': + return I18N::translateContext('father’s parent’s sister', 'great-aunt'); + case 'fatsischi': + return I18N::translateContext('father’s sister’s child', 'first cousin'); + case 'fatsisdau': + return I18N::translateContext('father’s sister’s daughter', 'first cousin'); + case 'fatsishus': + return I18N::translateContext('father’s sister’s husband', 'uncle'); + case 'fatsisson': + return I18N::translateContext('father’s sister’s son', 'first cousin'); + case 'fatwifchi': + return I18N::translateContext('father’s wife’s child', 'step-sibling'); + case 'fatwifdau': + return I18N::translateContext('father’s wife’s daughter', 'step-sister'); + case 'fatwifson': + return I18N::translateContext('father’s wife’s son', 'step-brother'); + case 'husbrowif': + return I18N::translateContext('husband’s brother’s wife', 'sister-in-law'); + case 'hussishus': + return I18N::translateContext('husband’s sister’s husband', 'brother-in-law'); + case 'motbrochi': + return I18N::translateContext('mother’s brother’s child', 'first cousin'); + case 'motbrodau': + return I18N::translateContext('mother’s brother’s daughter', 'first cousin'); + case 'motbroson': + return I18N::translateContext('mother’s brother’s son', 'first cousin'); + case 'motbrowif': + return I18N::translateContext('mother’s brother’s wife', 'aunt'); + case 'motfatbro': + return I18N::translateContext('mother’s father’s brother', 'great-uncle'); + case 'motfatfat': + return I18N::translateContext('mother’s father’s father', 'great-grandfather'); + case 'motfatmot': + return I18N::translateContext('mother’s father’s mother', 'great-grandmother'); + case 'motfatpar': + return I18N::translateContext('mother’s father’s parent', 'great-grandparent'); + case 'motfatsib': + return I18N::translateContext('mother’s father’s sibling', 'great-aunt/uncle'); + case 'motfatsis': + return I18N::translateContext('mother’s father’s sister', 'great-aunt'); + case 'mothuschi': + return I18N::translateContext('mother’s husband’s child', 'step-sibling'); + case 'mothusdau': + return I18N::translateContext('mother’s husband’s daughter', 'step-sister'); + case 'mothusson': + return I18N::translateContext('mother’s husband’s son', 'step-brother'); + case 'motmotbro': + return I18N::translateContext('mother’s mother’s brother', 'great-uncle'); + case 'motmotfat': + return I18N::translateContext('mother’s mother’s father', 'great-grandfather'); + case 'motmotmot': + return I18N::translateContext('mother’s mother’s mother', 'great-grandmother'); + case 'motmotpar': + return I18N::translateContext('mother’s mother’s parent', 'great-grandparent'); + case 'motmotsib': + return I18N::translateContext('mother’s mother’s sibling', 'great-aunt/uncle'); + case 'motmotsis': + return I18N::translateContext('mother’s mother’s sister', 'great-aunt'); + case 'motparbro': + return I18N::translateContext('mother’s parent’s brother', 'great-uncle'); + case 'motparfat': + return I18N::translateContext('mother’s parent’s father', 'great-grandfather'); + case 'motparmot': + return I18N::translateContext('mother’s parent’s mother', 'great-grandmother'); + case 'motparpar': + return I18N::translateContext('mother’s parent’s parent', 'great-grandparent'); + case 'motparsib': + return I18N::translateContext('mother’s parent’s sibling', 'great-aunt/uncle'); + case 'motparsis': + return I18N::translateContext('mother’s parent’s sister', 'great-aunt'); + case 'motsischi': + return I18N::translateContext('mother’s sister’s child', 'first cousin'); + case 'motsisdau': + return I18N::translateContext('mother’s sister’s daughter', 'first cousin'); + case 'motsishus': + return I18N::translateContext('mother’s sister’s husband', 'uncle'); + case 'motsisson': + return I18N::translateContext('mother’s sister’s son', 'first cousin'); + case 'parbrowif': + return I18N::translateContext('parent’s brother’s wife', 'aunt'); + case 'parfatbro': + return I18N::translateContext('parent’s father’s brother', 'great-uncle'); + case 'parfatfat': + return I18N::translateContext('parent’s father’s father', 'great-grandfather'); + case 'parfatmot': + return I18N::translateContext('parent’s father’s mother', 'great-grandmother'); + case 'parfatpar': + return I18N::translateContext('parent’s father’s parent', 'great-grandparent'); + case 'parfatsib': + return I18N::translateContext('parent’s father’s sibling', 'great-aunt/uncle'); + case 'parfatsis': + return I18N::translateContext('parent’s father’s sister', 'great-aunt'); + case 'parmotbro': + return I18N::translateContext('parent’s mother’s brother', 'great-uncle'); + case 'parmotfat': + return I18N::translateContext('parent’s mother’s father', 'great-grandfather'); + case 'parmotmot': + return I18N::translateContext('parent’s mother’s mother', 'great-grandmother'); + case 'parmotpar': + return I18N::translateContext('parent’s mother’s parent', 'great-grandparent'); + case 'parmotsib': + return I18N::translateContext('parent’s mother’s sibling', 'great-aunt/uncle'); + case 'parmotsis': + return I18N::translateContext('parent’s mother’s sister', 'great-aunt'); + case 'parparbro': + return I18N::translateContext('parent’s parent’s brother', 'great-uncle'); + case 'parparfat': + return I18N::translateContext('parent’s parent’s father', 'great-grandfather'); + case 'parparmot': + return I18N::translateContext('parent’s parent’s mother', 'great-grandmother'); + case 'parparpar': + return I18N::translateContext('parent’s parent’s parent', 'great-grandparent'); + case 'parparsib': + return I18N::translateContext('parent’s parent’s sibling', 'great-aunt/uncle'); + case 'parparsis': + return I18N::translateContext('parent’s parent’s sister', 'great-aunt'); + case 'parsishus': + return I18N::translateContext('parent’s sister’s husband', 'uncle'); + case 'parspochi': + return I18N::translateContext('parent’s spouse’s child', 'step-sibling'); + case 'parspodau': + return I18N::translateContext('parent’s spouse’s daughter', 'step-sister'); + case 'parsposon': + return I18N::translateContext('parent’s spouse’s son', 'step-brother'); + case 'sibchichi': + return I18N::translateContext('sibling’s child’s child', 'great-nephew/niece'); + case 'sibchidau': + return I18N::translateContext('sibling’s child’s daughter', 'great-niece'); + case 'sibchison': + return I18N::translateContext('sibling’s child’s son', 'great-nephew'); + case 'sibdauchi': + return I18N::translateContext('sibling’s daughter’s child', 'great-nephew/niece'); + case 'sibdaudau': + return I18N::translateContext('sibling’s daughter’s daughter', 'great-niece'); + case 'sibdauhus': + return I18N::translateContext('sibling’s daughter’s husband', 'nephew-in-law'); + case 'sibdauson': + return I18N::translateContext('sibling’s daughter’s son', 'great-nephew'); + case 'sibsonchi': + return I18N::translateContext('sibling’s son’s child', 'great-nephew/niece'); + case 'sibsondau': + return I18N::translateContext('sibling’s son’s daughter', 'great-niece'); + case 'sibsonson': + return I18N::translateContext('sibling’s son’s son', 'great-nephew'); + case 'sibsonwif': + return I18N::translateContext('sibling’s son’s wife', 'niece-in-law'); + case 'sischichi': + if ($sex1 === 'M') { + return I18N::translateContext('(a man’s) sister’s child’s child', 'great-nephew/niece'); + } else { + return I18N::translateContext('(a woman’s) sister’s child’s child', 'great-nephew/niece'); + } + case 'sischidau': + if ($sex1 === 'M') { + return I18N::translateContext('(a man’s) sister’s child’s daughter', 'great-niece'); + } else { + return I18N::translateContext('(a woman’s) sister’s child’s daughter', 'great-niece'); + } + case 'sischison': + if ($sex1 === 'M') { + return I18N::translateContext('(a man’s) sister’s child’s son', 'great-nephew'); + } else { + return I18N::translateContext('(a woman’s) sister’s child’s son', 'great-nephew'); + } + case 'sisdauchi': + if ($sex1 === 'M') { + return I18N::translateContext('(a man’s) sister’s daughter’s child', 'great-nephew/niece'); + } else { + return I18N::translateContext('(a woman’s) sister’s daughter’s child', 'great-nephew/niece'); + } + case 'sisdaudau': + if ($sex1 === 'M') { + return I18N::translateContext('(a man’s) sister’s daughter’s daughter', 'great-niece'); + } else { + return I18N::translateContext('(a woman’s) sister’s daughter’s daughter', 'great-niece'); + } + case 'sisdauhus': + return I18N::translateContext('sisters’s daughter’s husband', 'nephew-in-law'); + case 'sisdauson': + if ($sex1 === 'M') { + return I18N::translateContext('(a man’s) sister’s daughter’s son', 'great-nephew'); + } else { + return I18N::translateContext('(a woman’s) sister’s daughter’s son', 'great-nephew'); + } + case 'sishusbro': + return I18N::translateContext('sister’s husband’s brother', 'brother-in-law'); + case 'sishussib': + return I18N::translateContext('sister’s husband’s sibling', 'brother/sister-in-law'); + case 'sishussis': + return I18N::translateContext('sister’s husband’s sister', 'sister-in-law'); + case 'sissonchi': + if ($sex1 === 'M') { + return I18N::translateContext('(a man’s) sister’s son’s child', 'great-nephew/niece'); + } else { + return I18N::translateContext('(a woman’s) sister’s son’s child', 'great-nephew/niece'); + } + case 'sissondau': + if ($sex1 === 'M') { + return I18N::translateContext('(a man’s) sister’s son’s daughter', 'great-niece'); + } else { + return I18N::translateContext('(a woman’s) sister’s son’s daughter', 'great-niece'); + } + case 'sissonson': + if ($sex1 === 'M') { + return I18N::translateContext('(a man’s) sister’s son’s son', 'great-nephew'); + } else { + return I18N::translateContext('(a woman’s) sister’s son’s son', 'great-nephew'); + } + case 'sissonwif': + return I18N::translateContext('sisters’s son’s wife', 'niece-in-law'); + case 'sonchichi': + return I18N::translateContext('son’s child’s child', 'great-grandchild'); + case 'sonchidau': + return I18N::translateContext('son’s child’s daughter', 'great-granddaughter'); + case 'sonchison': + return I18N::translateContext('son’s child’s son', 'great-grandson'); + case 'sondauchi': + return I18N::translateContext('son’s daughter’s child', 'great-grandchild'); + case 'sondaudau': + return I18N::translateContext('son’s daughter’s daughter', 'great-granddaughter'); + case 'sondauhus': + return I18N::translateContext('son’s daughter’s husband', 'granddaughter’s husband'); + case 'sondauson': + return I18N::translateContext('son’s daughter’s son', 'great-grandson'); + case 'sonsonchi': + return I18N::translateContext('son’s son’s child', 'great-grandchild'); + case 'sonsondau': + return I18N::translateContext('son’s son’s daughter', 'great-granddaughter'); + case 'sonsonson': + return I18N::translateContext('son’s son’s son', 'great-grandson'); + case 'sonsonwif': + return I18N::translateContext('son’s son’s wife', 'grandson’s wife'); + case 'sonwiffat': + return I18N::translateContext('son’s wife’s father', 'daughter-in-law’s father'); + case 'sonwifmot': + return I18N::translateContext('son’s wife’s mother', 'daughter-in-law’s mother'); + case 'sonwifpar': + return I18N::translateContext('son’s wife’s parent', 'daughter-in-law’s parent'); + case 'wifbrowif': + return I18N::translateContext('wife’s brother’s wife', 'sister-in-law'); + case 'wifsishus': + return I18N::translateContext('wife’s sister’s husband', 'brother-in-law'); - // Some “special case” level four relationships that have specific names in certain languages - case 'fatfatbrowif': - return I18N::translateContext('father’s father’s brother’s wife', 'great-aunt'); - case 'fatfatsibspo': - return I18N::translateContext('father’s father’s sibling’s spouse', 'great-aunt/uncle'); - case 'fatfatsishus': - return I18N::translateContext('father’s father’s sister’s husband', 'great-uncle'); - case 'fatmotbrowif': - return I18N::translateContext('father’s mother’s brother’s wife', 'great-aunt'); - case 'fatmotsibspo': - return I18N::translateContext('father’s mother’s sibling’s spouse', 'great-aunt/uncle'); - case 'fatmotsishus': - return I18N::translateContext('father’s mother’s sister’s husband', 'great-uncle'); - case 'fatparbrowif': - return I18N::translateContext('father’s parent’s brother’s wife', 'great-aunt'); - case 'fatparsibspo': - return I18N::translateContext('father’s parent’s sibling’s spouse', 'great-aunt/uncle'); - case 'fatparsishus': - return I18N::translateContext('father’s parent’s sister’s husband', 'great-uncle'); - case 'motfatbrowif': - return I18N::translateContext('mother’s father’s brother’s wife', 'great-aunt'); - case 'motfatsibspo': - return I18N::translateContext('mother’s father’s sibling’s spouse', 'great-aunt/uncle'); - case 'motfatsishus': - return I18N::translateContext('mother’s father’s sister’s husband', 'great-uncle'); - case 'motmotbrowif': - return I18N::translateContext('mother’s mother’s brother’s wife', 'great-aunt'); - case 'motmotsibspo': - return I18N::translateContext('mother’s mother’s sibling’s spouse', 'great-aunt/uncle'); - case 'motmotsishus': - return I18N::translateContext('mother’s mother’s sister’s husband', 'great-uncle'); - case 'motparbrowif': - return I18N::translateContext('mother’s parent’s brother’s wife', 'great-aunt'); - case 'motparsibspo': - return I18N::translateContext('mother’s parent’s sibling’s spouse', 'great-aunt/uncle'); - case 'motparsishus': - return I18N::translateContext('mother’s parent’s sister’s husband', 'great-uncle'); - case 'parfatbrowif': - return I18N::translateContext('parent’s father’s brother’s wife', 'great-aunt'); - case 'parfatsibspo': - return I18N::translateContext('parent’s father’s sibling’s spouse', 'great-aunt/uncle'); - case 'parfatsishus': - return I18N::translateContext('parent’s father’s sister’s husband', 'great-uncle'); - case 'parmotbrowif': - return I18N::translateContext('parent’s mother’s brother’s wife', 'great-aunt'); - case 'parmotsibspo': - return I18N::translateContext('parent’s mother’s sibling’s spouse', 'great-aunt/uncle'); - case 'parmotsishus': - return I18N::translateContext('parent’s mother’s sister’s husband', 'great-uncle'); - case 'parparbrowif': - return I18N::translateContext('parent’s parent’s brother’s wife', 'great-aunt'); - case 'parparsibspo': - return I18N::translateContext('parent’s parent’s sibling’s spouse', 'great-aunt/uncle'); - case 'parparsishus': - return I18N::translateContext('parent’s parent’s sister’s husband', 'great-uncle'); - case 'fatfatbrodau': - return I18N::translateContext('father’s father’s brother’s daughter', 'first cousin once removed ascending'); - case 'fatfatbroson': - return I18N::translateContext('father’s father’s brother’s son', 'first cousin once removed ascending'); - case 'fatfatbrochi': - return I18N::translateContext('father’s father’s brother’s child', 'first cousin once removed ascending'); - case 'fatfatsisdau': - return I18N::translateContext('father’s father’s sister’s daughter', 'first cousin once removed ascending'); - case 'fatfatsisson': - return I18N::translateContext('father’s father’s sister’s son', 'first cousin once removed ascending'); - case 'fatfatsischi': - return I18N::translateContext('father’s father’s sister’s child', 'first cousin once removed ascending'); - case 'fatmotbrodau': - return I18N::translateContext('father’s mother’s brother’s daughter', 'first cousin once removed ascending'); - case 'fatmotbroson': - return I18N::translateContext('father’s mother’s brother’s son', 'first cousin once removed ascending'); - case 'fatmotbrochi': - return I18N::translateContext('father’s mother’s brother’s child', 'first cousin once removed ascending'); - case 'fatmotsisdau': - return I18N::translateContext('father’s mother’s sister’s daughter', 'first cousin once removed ascending'); - case 'fatmotsisson': - return I18N::translateContext('father’s mother’s sister’s son', 'first cousin once removed ascending'); - case 'fatmotsischi': - return I18N::translateContext('father’s mother’s sister’s child', 'first cousin once removed ascending'); - case 'motfatbrodau': - return I18N::translateContext('mother’s father’s brother’s daughter', 'first cousin once removed ascending'); - case 'motfatbroson': - return I18N::translateContext('mother’s father’s brother’s son', 'first cousin once removed ascending'); - case 'motfatbrochi': - return I18N::translateContext('mother’s father’s brother’s child', 'first cousin once removed ascending'); - case 'motfatsisdau': - return I18N::translateContext('mother’s father’s sister’s daughter', 'first cousin once removed ascending'); - case 'motfatsisson': - return I18N::translateContext('mother’s father’s sister’s son', 'first cousin once removed ascending'); - case 'motfatsischi': - return I18N::translateContext('mother’s father’s sister’s child', 'first cousin once removed ascending'); - case 'motmotbrodau': - return I18N::translateContext('mother’s mother’s brother’s daughter', 'first cousin once removed ascending'); - case 'motmotbroson': - return I18N::translateContext('mother’s mother’s brother’s son', 'first cousin once removed ascending'); - case 'motmotbrochi': - return I18N::translateContext('mother’s mother’s brother’s child', 'first cousin once removed ascending'); - case 'motmotsisdau': - return I18N::translateContext('mother’s mother’s sister’s daughter', 'first cousin once removed ascending'); - case 'motmotsisson': - return I18N::translateContext('mother’s mother’s sister’s son', 'first cousin once removed ascending'); - case 'motmotsischi': - return I18N::translateContext('mother’s mother’s sister’s child', 'first cousin once removed ascending'); + // Some “special case” level four relationships that have specific names in certain languages + case 'fatfatbrowif': + return I18N::translateContext('father’s father’s brother’s wife', 'great-aunt'); + case 'fatfatsibspo': + return I18N::translateContext('father’s father’s sibling’s spouse', 'great-aunt/uncle'); + case 'fatfatsishus': + return I18N::translateContext('father’s father’s sister’s husband', 'great-uncle'); + case 'fatmotbrowif': + return I18N::translateContext('father’s mother’s brother’s wife', 'great-aunt'); + case 'fatmotsibspo': + return I18N::translateContext('father’s mother’s sibling’s spouse', 'great-aunt/uncle'); + case 'fatmotsishus': + return I18N::translateContext('father’s mother’s sister’s husband', 'great-uncle'); + case 'fatparbrowif': + return I18N::translateContext('father’s parent’s brother’s wife', 'great-aunt'); + case 'fatparsibspo': + return I18N::translateContext('father’s parent’s sibling’s spouse', 'great-aunt/uncle'); + case 'fatparsishus': + return I18N::translateContext('father’s parent’s sister’s husband', 'great-uncle'); + case 'motfatbrowif': + return I18N::translateContext('mother’s father’s brother’s wife', 'great-aunt'); + case 'motfatsibspo': + return I18N::translateContext('mother’s father’s sibling’s spouse', 'great-aunt/uncle'); + case 'motfatsishus': + return I18N::translateContext('mother’s father’s sister’s husband', 'great-uncle'); + case 'motmotbrowif': + return I18N::translateContext('mother’s mother’s brother’s wife', 'great-aunt'); + case 'motmotsibspo': + return I18N::translateContext('mother’s mother’s sibling’s spouse', 'great-aunt/uncle'); + case 'motmotsishus': + return I18N::translateContext('mother’s mother’s sister’s husband', 'great-uncle'); + case 'motparbrowif': + return I18N::translateContext('mother’s parent’s brother’s wife', 'great-aunt'); + case 'motparsibspo': + return I18N::translateContext('mother’s parent’s sibling’s spouse', 'great-aunt/uncle'); + case 'motparsishus': + return I18N::translateContext('mother’s parent’s sister’s husband', 'great-uncle'); + case 'parfatbrowif': + return I18N::translateContext('parent’s father’s brother’s wife', 'great-aunt'); + case 'parfatsibspo': + return I18N::translateContext('parent’s father’s sibling’s spouse', 'great-aunt/uncle'); + case 'parfatsishus': + return I18N::translateContext('parent’s father’s sister’s husband', 'great-uncle'); + case 'parmotbrowif': + return I18N::translateContext('parent’s mother’s brother’s wife', 'great-aunt'); + case 'parmotsibspo': + return I18N::translateContext('parent’s mother’s sibling’s spouse', 'great-aunt/uncle'); + case 'parmotsishus': + return I18N::translateContext('parent’s mother’s sister’s husband', 'great-uncle'); + case 'parparbrowif': + return I18N::translateContext('parent’s parent’s brother’s wife', 'great-aunt'); + case 'parparsibspo': + return I18N::translateContext('parent’s parent’s sibling’s spouse', 'great-aunt/uncle'); + case 'parparsishus': + return I18N::translateContext('parent’s parent’s sister’s husband', 'great-uncle'); + case 'fatfatbrodau': + return I18N::translateContext('father’s father’s brother’s daughter', 'first cousin once removed ascending'); + case 'fatfatbroson': + return I18N::translateContext('father’s father’s brother’s son', 'first cousin once removed ascending'); + case 'fatfatbrochi': + return I18N::translateContext('father’s father’s brother’s child', 'first cousin once removed ascending'); + case 'fatfatsisdau': + return I18N::translateContext('father’s father’s sister’s daughter', 'first cousin once removed ascending'); + case 'fatfatsisson': + return I18N::translateContext('father’s father’s sister’s son', 'first cousin once removed ascending'); + case 'fatfatsischi': + return I18N::translateContext('father’s father’s sister’s child', 'first cousin once removed ascending'); + case 'fatmotbrodau': + return I18N::translateContext('father’s mother’s brother’s daughter', 'first cousin once removed ascending'); + case 'fatmotbroson': + return I18N::translateContext('father’s mother’s brother’s son', 'first cousin once removed ascending'); + case 'fatmotbrochi': + return I18N::translateContext('father’s mother’s brother’s child', 'first cousin once removed ascending'); + case 'fatmotsisdau': + return I18N::translateContext('father’s mother’s sister’s daughter', 'first cousin once removed ascending'); + case 'fatmotsisson': + return I18N::translateContext('father’s mother’s sister’s son', 'first cousin once removed ascending'); + case 'fatmotsischi': + return I18N::translateContext('father’s mother’s sister’s child', 'first cousin once removed ascending'); + case 'motfatbrodau': + return I18N::translateContext('mother’s father’s brother’s daughter', 'first cousin once removed ascending'); + case 'motfatbroson': + return I18N::translateContext('mother’s father’s brother’s son', 'first cousin once removed ascending'); + case 'motfatbrochi': + return I18N::translateContext('mother’s father’s brother’s child', 'first cousin once removed ascending'); + case 'motfatsisdau': + return I18N::translateContext('mother’s father’s sister’s daughter', 'first cousin once removed ascending'); + case 'motfatsisson': + return I18N::translateContext('mother’s father’s sister’s son', 'first cousin once removed ascending'); + case 'motfatsischi': + return I18N::translateContext('mother’s father’s sister’s child', 'first cousin once removed ascending'); + case 'motmotbrodau': + return I18N::translateContext('mother’s mother’s brother’s daughter', 'first cousin once removed ascending'); + case 'motmotbroson': + return I18N::translateContext('mother’s mother’s brother’s son', 'first cousin once removed ascending'); + case 'motmotbrochi': + return I18N::translateContext('mother’s mother’s brother’s child', 'first cousin once removed ascending'); + case 'motmotsisdau': + return I18N::translateContext('mother’s mother’s sister’s daughter', 'first cousin once removed ascending'); + case 'motmotsisson': + return I18N::translateContext('mother’s mother’s sister’s son', 'first cousin once removed ascending'); + case 'motmotsischi': + return I18N::translateContext('mother’s mother’s sister’s child', 'first cousin once removed ascending'); } // Some “special case” level five relationships that have specific names in certain languages @@ -1508,125 +1508,125 @@ class Functions { $up = strlen($match[1]) / 3; $bef_last = substr($path, -6, 3); switch ($up) { - case 3: - switch ($sex2) { - case 'M': - if ($bef_last === 'fat') { - return I18N::translateContext('great-grandfather’s brother', 'great-great-uncle'); - } elseif ($bef_last === 'mot') { - return I18N::translateContext('great-grandmother’s brother', 'great-great-uncle'); - } else { - return I18N::translateContext('great-grandparent’s brother', 'great-great-uncle'); - } - case 'F': - return I18N::translate('great-great-aunt'); - default: - return I18N::translate('great-great-aunt/uncle'); - } - case 4: - switch ($sex2) { - case 'M': - if ($bef_last === 'fat') { - return I18N::translateContext('great-great-grandfather’s brother', 'great-great-great-uncle'); - } elseif ($bef_last === 'mot') { - return I18N::translateContext('great-great-grandmother’s brother', 'great-great-great-uncle'); - } else { - return I18N::translateContext('great-great-grandparent’s brother', 'great-great-great-uncle'); - } - case 'F': - return I18N::translate('great-great-great-aunt'); - default: - return I18N::translate('great-great-great-aunt/uncle'); - } - case 5: - switch ($sex2) { - case 'M': - if ($bef_last === 'fat') { - return I18N::translateContext('great-great-great-grandfather’s brother', 'great ×4 uncle'); - } elseif ($bef_last === 'mot') { - return I18N::translateContext('great-great-great-grandmother’s brother', 'great ×4 uncle'); - } else { - return I18N::translateContext('great-great-great-grandparent’s brother', 'great ×4 uncle'); - } - case 'F': - return I18N::translate('great ×4 aunt'); - default: - return I18N::translate('great ×4 aunt/uncle'); - } - case 6: - switch ($sex2) { - case 'M': - if ($bef_last === 'fat') { - return I18N::translateContext('great ×4 grandfather’s brother', 'great ×5 uncle'); - } elseif ($bef_last === 'mot') { - return I18N::translateContext('great ×4 grandmother’s brother', 'great ×5 uncle'); - } else { - return I18N::translateContext('great ×4 grandparent’s brother', 'great ×5 uncle'); - } - case 'F': - return I18N::translate('great ×5 aunt'); - default: - return I18N::translate('great ×5 aunt/uncle'); - } - case 7: - switch ($sex2) { - case 'M': - if ($bef_last === 'fat') { - return I18N::translateContext('great ×5 grandfather’s brother', 'great ×6 uncle'); - } elseif ($bef_last === 'mot') { - return I18N::translateContext('great ×5 grandmother’s brother', 'great ×6 uncle'); - } else { - return I18N::translateContext('great ×5 grandparent’s brother', 'great ×6 uncle'); - } - case 'F': - return I18N::translate('great ×6 aunt'); - default: - return I18N::translate('great ×6 aunt/uncle'); - } - case 8: - switch ($sex2) { - case 'M': - if ($bef_last === 'fat') { - return I18N::translateContext('great ×6 grandfather’s brother', 'great ×7 uncle'); - } elseif ($bef_last === 'mot') { - return I18N::translateContext('great ×6 grandmother’s brother', 'great ×7 uncle'); - } else { - return I18N::translateContext('great ×6 grandparent’s brother', 'great ×7 uncle'); - } - case 'F': - return I18N::translate('great ×7 aunt'); - default: - return I18N::translate('great ×7 aunt/uncle'); - } - default: - // Different languages have different rules for naming generations. - // An English great ×12 uncle is a Danish great ×10 uncle. - // - // Need to find out which languages use which rules. - switch (WT_LOCALE) { - case 'da': - switch ($sex2) { - case 'M': - return I18N::translate('great ×%s uncle', I18N::number($up - 4)); - case 'F': - return I18N::translate('great ×%s aunt', I18N::number($up - 4)); + case 3: + switch ($sex2) { + case 'M': + if ($bef_last === 'fat') { + return I18N::translateContext('great-grandfather’s brother', 'great-great-uncle'); + } elseif ($bef_last === 'mot') { + return I18N::translateContext('great-grandmother’s brother', 'great-great-uncle'); + } else { + return I18N::translateContext('great-grandparent’s brother', 'great-great-uncle'); + } + case 'F': + return I18N::translate('great-great-aunt'); + default: + return I18N::translate('great-great-aunt/uncle'); + } + case 4: + switch ($sex2) { + case 'M': + if ($bef_last === 'fat') { + return I18N::translateContext('great-great-grandfather’s brother', 'great-great-great-uncle'); + } elseif ($bef_last === 'mot') { + return I18N::translateContext('great-great-grandmother’s brother', 'great-great-great-uncle'); + } else { + return I18N::translateContext('great-great-grandparent’s brother', 'great-great-great-uncle'); + } + case 'F': + return I18N::translate('great-great-great-aunt'); + default: + return I18N::translate('great-great-great-aunt/uncle'); + } + case 5: + switch ($sex2) { + case 'M': + if ($bef_last === 'fat') { + return I18N::translateContext('great-great-great-grandfather’s brother', 'great ×4 uncle'); + } elseif ($bef_last === 'mot') { + return I18N::translateContext('great-great-great-grandmother’s brother', 'great ×4 uncle'); + } else { + return I18N::translateContext('great-great-great-grandparent’s brother', 'great ×4 uncle'); + } + case 'F': + return I18N::translate('great ×4 aunt'); + default: + return I18N::translate('great ×4 aunt/uncle'); + } + case 6: + switch ($sex2) { + case 'M': + if ($bef_last === 'fat') { + return I18N::translateContext('great ×4 grandfather’s brother', 'great ×5 uncle'); + } elseif ($bef_last === 'mot') { + return I18N::translateContext('great ×4 grandmother’s brother', 'great ×5 uncle'); + } else { + return I18N::translateContext('great ×4 grandparent’s brother', 'great ×5 uncle'); + } + case 'F': + return I18N::translate('great ×5 aunt'); + default: + return I18N::translate('great ×5 aunt/uncle'); + } + case 7: + switch ($sex2) { + case 'M': + if ($bef_last === 'fat') { + return I18N::translateContext('great ×5 grandfather’s brother', 'great ×6 uncle'); + } elseif ($bef_last === 'mot') { + return I18N::translateContext('great ×5 grandmother’s brother', 'great ×6 uncle'); + } else { + return I18N::translateContext('great ×5 grandparent’s brother', 'great ×6 uncle'); + } + case 'F': + return I18N::translate('great ×6 aunt'); + default: + return I18N::translate('great ×6 aunt/uncle'); + } + case 8: + switch ($sex2) { + case 'M': + if ($bef_last === 'fat') { + return I18N::translateContext('great ×6 grandfather’s brother', 'great ×7 uncle'); + } elseif ($bef_last === 'mot') { + return I18N::translateContext('great ×6 grandmother’s brother', 'great ×7 uncle'); + } else { + return I18N::translateContext('great ×6 grandparent’s brother', 'great ×7 uncle'); + } + case 'F': + return I18N::translate('great ×7 aunt'); + default: + return I18N::translate('great ×7 aunt/uncle'); + } default: - return I18N::translate('great ×%s aunt/uncle', I18N::number($up - 4)); - } + // Different languages have different rules for naming generations. + // An English great ×12 uncle is a Danish great ×10 uncle. + // + // Need to find out which languages use which rules. + switch (WT_LOCALE) { + case 'da': + switch ($sex2) { + case 'M': + return I18N::translate('great ×%s uncle', I18N::number($up - 4)); + case 'F': + return I18N::translate('great ×%s aunt', I18N::number($up - 4)); + default: + return I18N::translate('great ×%s aunt/uncle', I18N::number($up - 4)); + } case 'pl': switch ($sex2) { - case 'M': - if ($bef_last === 'fat') { - return I18N::translateContext('great ×(%s-1) grandfather’s brother', 'great ×%s uncle', I18N::number($up - 2)); - } elseif ($bef_last === 'mot') { - return I18N::translateContext('great ×(%s-1) grandmother’s brother', 'great ×%s uncle', I18N::number($up - 2)); - } else { - return I18N::translateContext('great ×(%s-1) grandparent’s brother', 'great ×%s uncle', I18N::number($up - 2)); - } - case 'F': - return I18N::translate('great ×%s aunt', I18N::number($up - 2)); - default: - return I18N::translate('great ×%s aunt/uncle', I18N::number($up - 2)); + case 'M': + if ($bef_last === 'fat') { + return I18N::translateContext('great ×(%s-1) grandfather’s brother', 'great ×%s uncle', I18N::number($up - 2)); + } elseif ($bef_last === 'mot') { + return I18N::translateContext('great ×(%s-1) grandmother’s brother', 'great ×%s uncle', I18N::number($up - 2)); + } else { + return I18N::translateContext('great ×(%s-1) grandparent’s brother', 'great ×%s uncle', I18N::number($up - 2)); + } + case 'F': + return I18N::translate('great ×%s aunt', I18N::number($up - 2)); + default: + return I18N::translate('great ×%s aunt/uncle', I18N::number($up - 2)); } case 'it': // Source: Michele Locati case 'en_AU': @@ -1634,12 +1634,12 @@ class Functions { case 'en_US': default: switch ($sex2) { - case 'M': // I18N: if you need a different number for %s, contact the developers, as a code-change is required - return I18N::translate('great ×%s uncle', I18N::number($up - 1)); - case 'F': - return I18N::translate('great ×%s aunt', I18N::number($up - 1)); - default: - return I18N::translate('great ×%s aunt/uncle', I18N::number($up - 1)); + case 'M': // I18N: if you need a different number for %s, contact the developers, as a code-change is required + return I18N::translate('great ×%s uncle', I18N::number($up - 1)); + case 'F': + return I18N::translate('great ×%s aunt', I18N::number($up - 1)); + default: + return I18N::translate('great ×%s aunt/uncle', I18N::number($up - 1)); } } } @@ -1649,155 +1649,155 @@ class Functions { $down = strlen($match[1]) / 3 + 1; // Add one, as we count generations from the common ancestor $first = substr($path, 0, 3); switch ($down) { - case 4: - switch ($sex2) { - case 'M': - if ($first === 'bro' && $sex1 === 'M') { - return I18N::translateContext('(a man’s) brother’s great-grandson', 'great-great-nephew'); - } elseif ($first === 'sis' && $sex1 === 'M') { - return I18N::translateContext('(a man’s) sister’s great-grandson', 'great-great-nephew'); - } else { - return I18N::translateContext('(a woman’s) great-great-nephew', 'great-great-nephew'); - } - case 'F': - if ($first === 'bro' && $sex1 === 'M') { - return I18N::translateContext('(a man’s) brother’s great-granddaughter', 'great-great-niece'); - } elseif ($first === 'sis' && $sex1 === 'M') { - return I18N::translateContext('(a man’s) sister’s great-granddaughter', 'great-great-niece'); - } else { - return I18N::translateContext('(a woman’s) great-great-niece', 'great-great-niece'); - } - default: - if ($first === 'bro' && $sex1 === 'M') { - return I18N::translateContext('(a man’s) brother’s great-grandchild', 'great-great-nephew/niece'); - } elseif ($first === 'sis' && $sex1 === 'M') { - return I18N::translateContext('(a man’s) sister’s great-grandchild', 'great-great-nephew/niece'); - } else { - return I18N::translateContext('(a woman’s) great-great-nephew/niece', 'great-great-nephew/niece'); - } - } - case 5: - switch ($sex2) { - case 'M': - if ($first === 'bro' && $sex1 === 'M') { - return I18N::translateContext('(a man’s) brother’s great-great-grandson', 'great-great-great-nephew'); - } elseif ($first === 'sis' && $sex1 === 'M') { - return I18N::translateContext('(a man’s) sister’s great-great-grandson', 'great-great-great-nephew'); - } else { - return I18N::translateContext('(a woman’s) great-great-great-nephew', 'great-great-great-nephew'); - } - case 'F': - if ($first === 'bro' && $sex1 === 'M') { - return I18N::translateContext('(a man’s) brother’s great-great-granddaughter', 'great-great-great-niece'); - } elseif ($first === 'sis' && $sex1 === 'M') { - return I18N::translateContext('(a man’s) sister’s great-great-granddaughter', 'great-great-great-niece'); - } else { - return I18N::translateContext('(a woman’s) great-great-great-niece', 'great-great-great-niece'); - } - default: - if ($first === 'bro' && $sex1 === 'M') { - return I18N::translateContext('(a man’s) brother’s great-great-grandchild', 'great-great-great-nephew/niece'); - } elseif ($first === 'sis' && $sex1 === 'M') { - return I18N::translateContext('(a man’s) sister’s great-great-grandchild', 'great-great-great-nephew/niece'); - } else { - return I18N::translateContext('(a woman’s) great-great-great-nephew/niece', 'great-great-great-nephew/niece'); - } - } - case 6: - switch ($sex2) { - case 'M': - if ($first === 'bro' && $sex1 === 'M') { - return I18N::translateContext('(a man’s) brother’s great-great-great-grandson', 'great ×4 nephew'); - } elseif ($first === 'sis' && $sex1 === 'M') { - return I18N::translateContext('(a man’s) sister’s great-great-great-grandson', 'great ×4 nephew'); - } else { - return I18N::translateContext('(a woman’s) great ×4 nephew', 'great ×4 nephew'); - } - case 'F': - if ($first === 'bro' && $sex1 === 'M') { - return I18N::translateContext('(a man’s) brother’s great-great-great-granddaughter', 'great ×4 niece'); - } elseif ($first === 'sis' && $sex1 === 'M') { - return I18N::translateContext('(a man’s) sister’s great-great-great-granddaughter', 'great ×4 niece'); - } else { - return I18N::translateContext('(a woman’s) great ×4 niece', 'great ×4 niece'); - } - default: - if ($first === 'bro' && $sex1 === 'M') { - return I18N::translateContext('(a man’s) brother’s great-great-great-grandchild', 'great ×4 nephew/niece'); - } elseif ($first === 'sis' && $sex1 === 'M') { - return I18N::translateContext('(a man’s) sister’s great-great-great-grandchild', 'great ×4 nephew/niece'); - } else { - return I18N::translateContext('(a woman’s) great ×4 nephew/niece', 'great ×4 nephew/niece'); - } - } - case 7: - switch ($sex2) { - case 'M': - if ($first === 'bro' && $sex1 === 'M') { - return I18N::translateContext('(a man’s) brother’s great ×4 grandson', 'great ×5 nephew'); - } elseif ($first === 'sis' && $sex1 === 'M') { - return I18N::translateContext('(a man’s) sister’s great ×4 grandson', 'great ×5 nephew'); - } else { - return I18N::translateContext('(a woman’s) great ×5 nephew', 'great ×5 nephew'); - } - case 'F': - if ($first === 'bro' && $sex1 === 'M') { - return I18N::translateContext('(a man’s) brother’s great ×4 granddaughter', 'great ×5 niece'); - } elseif ($first === 'sis' && $sex1 === 'M') { - return I18N::translateContext('(a man’s) sister’s great ×4 granddaughter', 'great ×5 niece'); - } else { - return I18N::translateContext('(a woman’s) great ×5 niece', 'great ×5 niece'); - } - default: - if ($first === 'bro' && $sex1 === 'M') { - return I18N::translateContext('(a man’s) brother’s great ×4 grandchild', 'great ×5 nephew/niece'); - } elseif ($first === 'sis' && $sex1 === 'M') { - return I18N::translateContext('(a man’s) sister’s great ×4 grandchild', 'great ×5 nephew/niece'); - } else { - return I18N::translateContext('(a woman’s) great ×5 nephew/niece', 'great ×5 nephew/niece'); - } - } - default: - // Different languages have different rules for naming generations. - // An English great ×12 nephew is a Polish great ×11 nephew. - // - // Need to find out which languages use which rules. - switch (WT_LOCALE) { - case 'pl': // Source: Lukasz Wilenski - switch ($sex2) { - case 'M': - if ($first === 'bro' && $sex1 === 'M') { - return I18N::translateContext('(a man’s) brother’s great ×(%s-1) grandson', 'great ×%s nephew', I18N::number($down - 3)); - } elseif ($first === 'sis' && $sex1 === 'M') { - return I18N::translateContext('(a man’s) sister’s great ×(%s-1) grandson', 'great ×%s nephew', I18N::number($down - 3)); - } else { - return I18N::translateContext('(a woman’s) great ×%s nephew', 'great ×%s nephew', I18N::number($down - 3)); - } - case 'F': - if ($first === 'bro' && $sex1 === 'M') { - return I18N::translateContext('(a man’s) brother’s great ×(%s-1) granddaughter', 'great ×%s niece', I18N::number($down - 3)); - } elseif ($first === 'sis' && $sex1 === 'M') { - return I18N::translateContext('(a man’s) sister’s great ×(%s-1) granddaughter', 'great ×%s niece', I18N::number($down - 3)); - } else { - return I18N::translateContext('(a woman’s) great ×%s niece', 'great ×%s niece', I18N::number($down - 3)); - } + case 4: + switch ($sex2) { + case 'M': + if ($first === 'bro' && $sex1 === 'M') { + return I18N::translateContext('(a man’s) brother’s great-grandson', 'great-great-nephew'); + } elseif ($first === 'sis' && $sex1 === 'M') { + return I18N::translateContext('(a man’s) sister’s great-grandson', 'great-great-nephew'); + } else { + return I18N::translateContext('(a woman’s) great-great-nephew', 'great-great-nephew'); + } + case 'F': + if ($first === 'bro' && $sex1 === 'M') { + return I18N::translateContext('(a man’s) brother’s great-granddaughter', 'great-great-niece'); + } elseif ($first === 'sis' && $sex1 === 'M') { + return I18N::translateContext('(a man’s) sister’s great-granddaughter', 'great-great-niece'); + } else { + return I18N::translateContext('(a woman’s) great-great-niece', 'great-great-niece'); + } + default: + if ($first === 'bro' && $sex1 === 'M') { + return I18N::translateContext('(a man’s) brother’s great-grandchild', 'great-great-nephew/niece'); + } elseif ($first === 'sis' && $sex1 === 'M') { + return I18N::translateContext('(a man’s) sister’s great-grandchild', 'great-great-nephew/niece'); + } else { + return I18N::translateContext('(a woman’s) great-great-nephew/niece', 'great-great-nephew/niece'); + } + } + case 5: + switch ($sex2) { + case 'M': + if ($first === 'bro' && $sex1 === 'M') { + return I18N::translateContext('(a man’s) brother’s great-great-grandson', 'great-great-great-nephew'); + } elseif ($first === 'sis' && $sex1 === 'M') { + return I18N::translateContext('(a man’s) sister’s great-great-grandson', 'great-great-great-nephew'); + } else { + return I18N::translateContext('(a woman’s) great-great-great-nephew', 'great-great-great-nephew'); + } + case 'F': + if ($first === 'bro' && $sex1 === 'M') { + return I18N::translateContext('(a man’s) brother’s great-great-granddaughter', 'great-great-great-niece'); + } elseif ($first === 'sis' && $sex1 === 'M') { + return I18N::translateContext('(a man’s) sister’s great-great-granddaughter', 'great-great-great-niece'); + } else { + return I18N::translateContext('(a woman’s) great-great-great-niece', 'great-great-great-niece'); + } + default: + if ($first === 'bro' && $sex1 === 'M') { + return I18N::translateContext('(a man’s) brother’s great-great-grandchild', 'great-great-great-nephew/niece'); + } elseif ($first === 'sis' && $sex1 === 'M') { + return I18N::translateContext('(a man’s) sister’s great-great-grandchild', 'great-great-great-nephew/niece'); + } else { + return I18N::translateContext('(a woman’s) great-great-great-nephew/niece', 'great-great-great-nephew/niece'); + } + } + case 6: + switch ($sex2) { + case 'M': + if ($first === 'bro' && $sex1 === 'M') { + return I18N::translateContext('(a man’s) brother’s great-great-great-grandson', 'great ×4 nephew'); + } elseif ($first === 'sis' && $sex1 === 'M') { + return I18N::translateContext('(a man’s) sister’s great-great-great-grandson', 'great ×4 nephew'); + } else { + return I18N::translateContext('(a woman’s) great ×4 nephew', 'great ×4 nephew'); + } + case 'F': + if ($first === 'bro' && $sex1 === 'M') { + return I18N::translateContext('(a man’s) brother’s great-great-great-granddaughter', 'great ×4 niece'); + } elseif ($first === 'sis' && $sex1 === 'M') { + return I18N::translateContext('(a man’s) sister’s great-great-great-granddaughter', 'great ×4 niece'); + } else { + return I18N::translateContext('(a woman’s) great ×4 niece', 'great ×4 niece'); + } + default: + if ($first === 'bro' && $sex1 === 'M') { + return I18N::translateContext('(a man’s) brother’s great-great-great-grandchild', 'great ×4 nephew/niece'); + } elseif ($first === 'sis' && $sex1 === 'M') { + return I18N::translateContext('(a man’s) sister’s great-great-great-grandchild', 'great ×4 nephew/niece'); + } else { + return I18N::translateContext('(a woman’s) great ×4 nephew/niece', 'great ×4 nephew/niece'); + } + } + case 7: + switch ($sex2) { + case 'M': + if ($first === 'bro' && $sex1 === 'M') { + return I18N::translateContext('(a man’s) brother’s great ×4 grandson', 'great ×5 nephew'); + } elseif ($first === 'sis' && $sex1 === 'M') { + return I18N::translateContext('(a man’s) sister’s great ×4 grandson', 'great ×5 nephew'); + } else { + return I18N::translateContext('(a woman’s) great ×5 nephew', 'great ×5 nephew'); + } + case 'F': + if ($first === 'bro' && $sex1 === 'M') { + return I18N::translateContext('(a man’s) brother’s great ×4 granddaughter', 'great ×5 niece'); + } elseif ($first === 'sis' && $sex1 === 'M') { + return I18N::translateContext('(a man’s) sister’s great ×4 granddaughter', 'great ×5 niece'); + } else { + return I18N::translateContext('(a woman’s) great ×5 niece', 'great ×5 niece'); + } + default: + if ($first === 'bro' && $sex1 === 'M') { + return I18N::translateContext('(a man’s) brother’s great ×4 grandchild', 'great ×5 nephew/niece'); + } elseif ($first === 'sis' && $sex1 === 'M') { + return I18N::translateContext('(a man’s) sister’s great ×4 grandchild', 'great ×5 nephew/niece'); + } else { + return I18N::translateContext('(a woman’s) great ×5 nephew/niece', 'great ×5 nephew/niece'); + } + } default: - if ($first === 'bro' && $sex1 === 'M') { - return I18N::translateContext('(a man’s) brother’s great ×(%s-1) grandchild', 'great ×%s nephew/niece', I18N::number($down - 3)); - } elseif ($first === 'sis' && $sex1 === 'M') { - return I18N::translateContext('(a man’s) sister’s great ×(%s-1) grandchild', 'great ×%s nephew/niece', I18N::number($down - 3)); - } else { - return I18N::translateContext('(a woman’s) great ×%s nephew/niece', 'great ×%s nephew/niece', I18N::number($down - 3)); - } - } + // Different languages have different rules for naming generations. + // An English great ×12 nephew is a Polish great ×11 nephew. + // + // Need to find out which languages use which rules. + switch (WT_LOCALE) { + case 'pl': // Source: Lukasz Wilenski + switch ($sex2) { + case 'M': + if ($first === 'bro' && $sex1 === 'M') { + return I18N::translateContext('(a man’s) brother’s great ×(%s-1) grandson', 'great ×%s nephew', I18N::number($down - 3)); + } elseif ($first === 'sis' && $sex1 === 'M') { + return I18N::translateContext('(a man’s) sister’s great ×(%s-1) grandson', 'great ×%s nephew', I18N::number($down - 3)); + } else { + return I18N::translateContext('(a woman’s) great ×%s nephew', 'great ×%s nephew', I18N::number($down - 3)); + } + case 'F': + if ($first === 'bro' && $sex1 === 'M') { + return I18N::translateContext('(a man’s) brother’s great ×(%s-1) granddaughter', 'great ×%s niece', I18N::number($down - 3)); + } elseif ($first === 'sis' && $sex1 === 'M') { + return I18N::translateContext('(a man’s) sister’s great ×(%s-1) granddaughter', 'great ×%s niece', I18N::number($down - 3)); + } else { + return I18N::translateContext('(a woman’s) great ×%s niece', 'great ×%s niece', I18N::number($down - 3)); + } + default: + if ($first === 'bro' && $sex1 === 'M') { + return I18N::translateContext('(a man’s) brother’s great ×(%s-1) grandchild', 'great ×%s nephew/niece', I18N::number($down - 3)); + } elseif ($first === 'sis' && $sex1 === 'M') { + return I18N::translateContext('(a man’s) sister’s great ×(%s-1) grandchild', 'great ×%s nephew/niece', I18N::number($down - 3)); + } else { + return I18N::translateContext('(a woman’s) great ×%s nephew/niece', 'great ×%s nephew/niece', I18N::number($down - 3)); + } + } case 'he': // Source: Meliza Amity switch ($sex2) { - case 'M': - return I18N::translate('great ×%s nephew', I18N::number($down - 1)); - case 'F': - return I18N::translate('great ×%s niece', I18N::number($down - 1)); - default: - return I18N::translate('great ×%s nephew/niece', I18N::number($down - 1)); + case 'M': + return I18N::translate('great ×%s nephew', I18N::number($down - 1)); + case 'F': + return I18N::translate('great ×%s niece', I18N::number($down - 1)); + default: + return I18N::translate('great ×%s nephew/niece', I18N::number($down - 1)); } case 'it': // Source: Michele Locati. case 'en_AU': @@ -1805,12 +1805,12 @@ class Functions { case 'en_US': default: switch ($sex2) { - case 'M': // I18N: if you need a different number for %s, contact the developers, as a code-change is required - return I18N::translate('great ×%s nephew', I18N::number($down - 2)); - case 'F': - return I18N::translate('great ×%s niece', I18N::number($down - 2)); - default: - return I18N::translate('great ×%s nephew/niece', I18N::number($down - 2)); + case 'M': // I18N: if you need a different number for %s, contact the developers, as a code-change is required + return I18N::translate('great ×%s nephew', I18N::number($down - 2)); + case 'F': + return I18N::translate('great ×%s niece', I18N::number($down - 2)); + default: + return I18N::translate('great ×%s nephew/niece', I18N::number($down - 2)); } } } @@ -1819,116 +1819,116 @@ class Functions { // direct ancestors $up = strlen($match[1]) / 3; switch ($up) { - case 4: - switch ($sex2) { - case 'M': - return I18N::translate('great-great-grandfather'); - case 'F': - return I18N::translate('great-great-grandmother'); - default: - return I18N::translate('great-great-grandparent'); - } - case 5: - switch ($sex2) { - case 'M': - return I18N::translate('great-great-great-grandfather'); - case 'F': - return I18N::translate('great-great-great-grandmother'); - default: - return I18N::translate('great-great-great-grandparent'); - } - case 6: - switch ($sex2) { - case 'M': - return I18N::translate('great ×4 grandfather'); - case 'F': - return I18N::translate('great ×4 grandmother'); - default: - return I18N::translate('great ×4 grandparent'); - } - case 7: - switch ($sex2) { - case 'M': - return I18N::translate('great ×5 grandfather'); - case 'F': - return I18N::translate('great ×5 grandmother'); - default: - return I18N::translate('great ×5 grandparent'); - } - case 8: - switch ($sex2) { - case 'M': - return I18N::translate('great ×6 grandfather'); - case 'F': - return I18N::translate('great ×6 grandmother'); - default: - return I18N::translate('great ×6 grandparent'); - } - case 9: - switch ($sex2) { - case 'M': - return I18N::translate('great ×7 grandfather'); - case 'F': - return I18N::translate('great ×7 grandmother'); - default: - return I18N::translate('great ×7 grandparent'); - } - default: - // Different languages have different rules for naming generations. - // An English great ×12 grandfather is a Danish great ×11 grandfather. - // - // Need to find out which languages use which rules. - switch (WT_LOCALE) { - case 'da': // Source: Patrick Sorensen - switch ($sex2) { - case 'M': - return I18N::translate('great ×%s grandfather', I18N::number($up - 3)); - case 'F': - return I18N::translate('great ×%s grandmother', I18N::number($up - 3)); + case 4: + switch ($sex2) { + case 'M': + return I18N::translate('great-great-grandfather'); + case 'F': + return I18N::translate('great-great-grandmother'); + default: + return I18N::translate('great-great-grandparent'); + } + case 5: + switch ($sex2) { + case 'M': + return I18N::translate('great-great-great-grandfather'); + case 'F': + return I18N::translate('great-great-great-grandmother'); + default: + return I18N::translate('great-great-great-grandparent'); + } + case 6: + switch ($sex2) { + case 'M': + return I18N::translate('great ×4 grandfather'); + case 'F': + return I18N::translate('great ×4 grandmother'); + default: + return I18N::translate('great ×4 grandparent'); + } + case 7: + switch ($sex2) { + case 'M': + return I18N::translate('great ×5 grandfather'); + case 'F': + return I18N::translate('great ×5 grandmother'); + default: + return I18N::translate('great ×5 grandparent'); + } + case 8: + switch ($sex2) { + case 'M': + return I18N::translate('great ×6 grandfather'); + case 'F': + return I18N::translate('great ×6 grandmother'); + default: + return I18N::translate('great ×6 grandparent'); + } + case 9: + switch ($sex2) { + case 'M': + return I18N::translate('great ×7 grandfather'); + case 'F': + return I18N::translate('great ×7 grandmother'); + default: + return I18N::translate('great ×7 grandparent'); + } default: - return I18N::translate('great ×%s grandparent', I18N::number($up - 3)); - } + // Different languages have different rules for naming generations. + // An English great ×12 grandfather is a Danish great ×11 grandfather. + // + // Need to find out which languages use which rules. + switch (WT_LOCALE) { + case 'da': // Source: Patrick Sorensen + switch ($sex2) { + case 'M': + return I18N::translate('great ×%s grandfather', I18N::number($up - 3)); + case 'F': + return I18N::translate('great ×%s grandmother', I18N::number($up - 3)); + default: + return I18N::translate('great ×%s grandparent', I18N::number($up - 3)); + } case 'it': // Source: Michele Locati case 'es': // Source: Wes Groleau switch ($sex2) { - case 'M': - return I18N::translate('great ×%s grandfather', I18N::number($up)); - case 'F': - return I18N::translate('great ×%s grandmother', I18N::number($up)); - default: - return I18N::translate('great ×%s grandparent', I18N::number($up)); + case 'M': + return I18N::translate('great ×%s grandfather', I18N::number($up)); + case 'F': + return I18N::translate('great ×%s grandmother', I18N::number($up)); + default: + return I18N::translate('great ×%s grandparent', I18N::number($up)); } case 'fr': // Source: Jacqueline Tetreault case 'fr_CA': switch ($sex2) { - case 'M': - return I18N::translate('great ×%s grandfather', I18N::number($up - 1)); - case 'F': - return I18N::translate('great ×%s grandmother', I18N::number($up - 1)); - default: - return I18N::translate('great ×%s grandparent', I18N::number($up - 1)); + case 'M': + return I18N::translate('great ×%s grandfather', I18N::number($up - 1)); + case 'F': + return I18N::translate('great ×%s grandmother', I18N::number($up - 1)); + default: + return I18N::translate('great ×%s grandparent', I18N::number($up - 1)); } case 'nn': // Source: Hogne Røed Nilsen (https://bugs.launchpad.net/webtrees/+bug/1168553) case 'nb': switch ($sex2) { - case 'M': // I18N: if you need a different number for %s, contact the developers, as a code-change is required - return I18N::translate('great ×%s grandfather', I18N::number($up - 3)); - case 'F': - return I18N::translate('great ×%s grandmother', I18N::number($up - 3)); - default: - return I18N::translate('great ×%s grandparent', I18N::number($up - 3)); + case 'M': // I18N: if you need a different number for %s, contact the developers, as a code-change is required + return I18N::translate('great ×%s grandfather', I18N::number($up - 3)); + case 'F': + return I18N::translate('great ×%s grandmother', I18N::number($up - 3)); + default: + return I18N::translate('great ×%s grandparent', I18N::number($up - 3)); } case 'en_AU': case 'en_GB': case 'en_US': default: switch ($sex2) { - case 'M': // I18N: if you need a different number for %s, contact the developers, as a code-change is required - return I18N::translate('great ×%s grandfather', I18N::number($up - 2)); - case 'F': - return I18N::translate('great ×%s grandmother', I18N::number($up - 2)); - default: - return I18N::translate('great ×%s grandparent', I18N::number($up - 2)); + case 'M': // I18N: if you need a different number for %s, contact the developers, as a code-change is required + return I18N::translate('great ×%s grandfather', I18N::number($up - 2)); + case 'F': + return I18N::translate('great ×%s grandmother', I18N::number($up - 2)); + default: + return I18N::translate('great ×%s grandparent', I18N::number($up - 2)); } } } @@ -1937,83 +1937,83 @@ class Functions { // direct descendants $up = strlen($match[1]) / 3; switch ($up) { - case 4: - switch ($sex2) { - case 'M': - return I18N::translate('great-great-grandson'); - case 'F': - return I18N::translate('great-great-granddaughter'); - default: - return I18N::translate('great-great-grandchild'); - } + case 4: + switch ($sex2) { + case 'M': + return I18N::translate('great-great-grandson'); + case 'F': + return I18N::translate('great-great-granddaughter'); + default: + return I18N::translate('great-great-grandchild'); + } - case 5: - switch ($sex2) { - case 'M': - return I18N::translate('great-great-great-grandson'); - case 'F': - return I18N::translate('great-great-great-granddaughter'); - default: - return I18N::translate('great-great-great-grandchild'); - } + case 5: + switch ($sex2) { + case 'M': + return I18N::translate('great-great-great-grandson'); + case 'F': + return I18N::translate('great-great-great-granddaughter'); + default: + return I18N::translate('great-great-great-grandchild'); + } - case 6: - switch ($sex2) { - case 'M': - return I18N::translate('great ×4 grandson'); - case 'F': - return I18N::translate('great ×4 granddaughter'); - default: - return I18N::translate('great ×4 grandchild'); - } + case 6: + switch ($sex2) { + case 'M': + return I18N::translate('great ×4 grandson'); + case 'F': + return I18N::translate('great ×4 granddaughter'); + default: + return I18N::translate('great ×4 grandchild'); + } - case 7: - switch ($sex2) { - case 'M': - return I18N::translate('great ×5 grandson'); - case 'F': - return I18N::translate('great ×5 granddaughter'); - default: - return I18N::translate('great ×5 grandchild'); - } + case 7: + switch ($sex2) { + case 'M': + return I18N::translate('great ×5 grandson'); + case 'F': + return I18N::translate('great ×5 granddaughter'); + default: + return I18N::translate('great ×5 grandchild'); + } - case 8: - switch ($sex2) { - case 'M': - return I18N::translate('great ×6 grandson'); - case 'F': - return I18N::translate('great ×6 granddaughter'); - default: - return I18N::translate('great ×6 grandchild'); - } + case 8: + switch ($sex2) { + case 'M': + return I18N::translate('great ×6 grandson'); + case 'F': + return I18N::translate('great ×6 granddaughter'); + default: + return I18N::translate('great ×6 grandchild'); + } - case 9: - switch ($sex2) { - case 'M': - return I18N::translate('great ×7 grandson'); - case 'F': - return I18N::translate('great ×7 granddaughter'); - default: - return I18N::translate('great ×7 grandchild'); - } + case 9: + switch ($sex2) { + case 'M': + return I18N::translate('great ×7 grandson'); + case 'F': + return I18N::translate('great ×7 granddaughter'); + default: + return I18N::translate('great ×7 grandchild'); + } - default: - // Different languages have different rules for naming generations. - // An English great ×12 grandson is a Danish great ×11 grandson. - // - // Need to find out which languages use which rules. - switch (WT_LOCALE) { - case 'nn': // Source: Hogne Røed Nilsen - case 'nb': - case 'da': // Source: Patrick Sorensen - switch ($sex2) { - case 'M': - return I18N::translate('great ×%s grandson', I18N::number($up - 3)); - case 'F': - return I18N::translate('great ×%s granddaughter', I18N::number($up - 3)); default: - return I18N::translate('great ×%s grandchild', I18N::number($up - 3)); - } + // Different languages have different rules for naming generations. + // An English great ×12 grandson is a Danish great ×11 grandson. + // + // Need to find out which languages use which rules. + switch (WT_LOCALE) { + case 'nn': // Source: Hogne Røed Nilsen + case 'nb': + case 'da': // Source: Patrick Sorensen + switch ($sex2) { + case 'M': + return I18N::translate('great ×%s grandson', I18N::number($up - 3)); + case 'F': + return I18N::translate('great ×%s granddaughter', I18N::number($up - 3)); + default: + return I18N::translate('great ×%s grandchild', I18N::number($up - 3)); + } case 'it': // Source: Michele Locati case 'es': // Source: Wes Groleau (adding doesn’t change behavior, but needs to be better researched) case 'en_AU': @@ -2022,12 +2022,12 @@ class Functions { default: switch ($sex2) { - case 'M': // I18N: if you need a different number for %s, contact the developers, as a code-change is required - return I18N::translate('great ×%s grandson', I18N::number($up - 2)); - case 'F': - return I18N::translate('great ×%s granddaughter', I18N::number($up - 2)); - default: - return I18N::translate('great ×%s grandchild', I18N::number($up - 2)); + case 'M': // I18N: if you need a different number for %s, contact the developers, as a code-change is required + return I18N::translate('great ×%s grandson', I18N::number($up - 2)); + case 'F': + return I18N::translate('great ×%s granddaughter', I18N::number($up - 2)); + default: + return I18N::translate('great ×%s grandchild', I18N::number($up - 2)); } } } @@ -2046,68 +2046,68 @@ class Functions { // // Need to find out which languages use which rules. switch (WT_LOCALE) { - case 'pl': // Source: Lukasz Wilenski - return self::cousinName($up + $down + 2, $sex2); - case 'it': - // Source: Michele Locati. See italian_cousins_names.zip - // https://webtrees.net/forums/8-translation/1200-great-xn-grandparent?limit=6&start=6 - return self::cousinName($up + $down - 3, $sex2); - case 'es': - // Source: Wes Groleau. See http://UniGen.us/Parentesco.html & http://UniGen.us/Parentesco-D.html - if ($down == $up) { - return self::cousinName($cousin, $sex2); - } elseif ($down < $up) { - return self::cousinName2($cousin + 1, $sex2, self::getRelationshipNameFromPath('sib' . $descent, null, null)); - } else { - switch ($sex2) { - case 'M': - return self::cousinName2($cousin + 1, $sex2, self::getRelationshipNameFromPath('bro' . $descent, null, null)); - case 'F': - return self::cousinName2($cousin + 1, $sex2, self::getRelationshipNameFromPath('sis' . $descent, null, null)); - default: - return self::cousinName2($cousin + 1, $sex2, self::getRelationshipNameFromPath('sib' . $descent, null, null)); - } - } - case 'en_AU': // See: http://en.wikipedia.org/wiki/File:CousinTree.svg - case 'en_GB': - case 'en_US': - default: - switch ($removed) { - case 0: - return self::cousinName($cousin, $sex2); - case 1: - if ($up > $down) { - /* I18N: %s=“fifth cousin”, etc. http://www.ancestry.com/learn/library/article.aspx?article=2856 */ - return I18N::translate('%s once removed ascending', self::cousinName($cousin, $sex2)); - } else { - /* I18N: %s=“fifth cousin”, etc. http://www.ancestry.com/learn/library/article.aspx?article=2856 */ - return I18N::translate('%s once removed descending', self::cousinName($cousin, $sex2)); - } - case 2: - if ($up > $down) { - /* I18N: %s=“fifth cousin”, etc. */ - return I18N::translate('%s twice removed ascending', self::cousinName($cousin, $sex2)); - } else { - /* I18N: %s=“fifth cousin”, etc. */ - return I18N::translate('%s twice removed descending', self::cousinName($cousin, $sex2)); - } - case 3: - if ($up > $down) { - /* I18N: %s=“fifth cousin”, etc. */ - return I18N::translate('%s three times removed ascending', self::cousinName($cousin, $sex2)); - } else { - /* I18N: %s=“fifth cousin”, etc. */ - return I18N::translate('%s three times removed descending', self::cousinName($cousin, $sex2)); + case 'pl': // Source: Lukasz Wilenski + return self::cousinName($up + $down + 2, $sex2); + case 'it': + // Source: Michele Locati. See italian_cousins_names.zip + // https://webtrees.net/forums/8-translation/1200-great-xn-grandparent?limit=6&start=6 + return self::cousinName($up + $down - 3, $sex2); + case 'es': + // Source: Wes Groleau. See http://UniGen.us/Parentesco.html & http://UniGen.us/Parentesco-D.html + if ($down == $up) { + return self::cousinName($cousin, $sex2); + } elseif ($down < $up) { + return self::cousinName2($cousin + 1, $sex2, self::getRelationshipNameFromPath('sib' . $descent, null, null)); + } else { + switch ($sex2) { + case 'M': + return self::cousinName2($cousin + 1, $sex2, self::getRelationshipNameFromPath('bro' . $descent, null, null)); + case 'F': + return self::cousinName2($cousin + 1, $sex2, self::getRelationshipNameFromPath('sis' . $descent, null, null)); + default: + return self::cousinName2($cousin + 1, $sex2, self::getRelationshipNameFromPath('sib' . $descent, null, null)); + } } + case 'en_AU': // See: http://en.wikipedia.org/wiki/File:CousinTree.svg + case 'en_GB': + case 'en_US': default: - if ($up > $down) { - /* I18N: %1$s=“fifth cousin”, etc., %2$s>=4 */ - return I18N::translate('%1$s %2$s times removed ascending', self::cousinName($cousin, $sex2), I18N::number($removed)); - } else { - /* I18N: %1$s=“fifth cousin”, etc., %2$s>=4 */ - return I18N::translate('%1$s %2$s times removed descending', self::cousinName($cousin, $sex2), I18N::number($removed)); - } - } + switch ($removed) { + case 0: + return self::cousinName($cousin, $sex2); + case 1: + if ($up > $down) { + /* I18N: %s=“fifth cousin”, etc. http://www.ancestry.com/learn/library/article.aspx?article=2856 */ + return I18N::translate('%s once removed ascending', self::cousinName($cousin, $sex2)); + } else { + /* I18N: %s=“fifth cousin”, etc. http://www.ancestry.com/learn/library/article.aspx?article=2856 */ + return I18N::translate('%s once removed descending', self::cousinName($cousin, $sex2)); + } + case 2: + if ($up > $down) { + /* I18N: %s=“fifth cousin”, etc. */ + return I18N::translate('%s twice removed ascending', self::cousinName($cousin, $sex2)); + } else { + /* I18N: %s=“fifth cousin”, etc. */ + return I18N::translate('%s twice removed descending', self::cousinName($cousin, $sex2)); + } + case 3: + if ($up > $down) { + /* I18N: %s=“fifth cousin”, etc. */ + return I18N::translate('%s three times removed ascending', self::cousinName($cousin, $sex2)); + } else { + /* I18N: %s=“fifth cousin”, etc. */ + return I18N::translate('%s three times removed descending', self::cousinName($cousin, $sex2)); + } + default: + if ($up > $down) { + /* I18N: %1$s=“fifth cousin”, etc., %2$s>=4 */ + return I18N::translate('%1$s %2$s times removed ascending', self::cousinName($cousin, $sex2), I18N::number($removed)); + } else { + /* I18N: %1$s=“fifth cousin”, etc., %2$s>=4 */ + return I18N::translate('%1$s %2$s times removed descending', self::cousinName($cousin, $sex2), I18N::number($removed)); + } + } } } diff --git a/app/Functions/FunctionsDate.php b/app/Functions/FunctionsDate.php index 8acc6c7bf6..81f73e17dc 100644 --- a/app/Functions/FunctionsDate.php +++ b/app/Functions/FunctionsDate.php @@ -31,28 +31,28 @@ class FunctionsDate { */ public static function getAgeAtEvent($age_string) { switch (strtoupper($age_string)) { - case 'CHILD': - return I18N::translate('Child'); - case 'INFANT': - return I18N::translate('Infant'); - case 'STILLBORN': - return I18N::translate('Stillborn'); - default: - return preg_replace_callback( - [ - '/(\d+)([ymwd])/', - ], - function ($match) { - switch ($match[2]) { - case 'y': - return I18N::plural('%s year', '%s years', $match[1], I18N::digits($match[1])); - case 'm': - return I18N::plural('%s month', '%s months', $match[1], I18N::digits($match[1])); - case 'w': - return I18N::plural('%s week', '%s weeks', $match[1], I18N::digits($match[1])); - case 'd': - return I18N::plural('%s day', '%s days', $match[1], I18N::digits($match[1])); - } + case 'CHILD': + return I18N::translate('Child'); + case 'INFANT': + return I18N::translate('Infant'); + case 'STILLBORN': + return I18N::translate('Stillborn'); + default: + return preg_replace_callback( + [ + '/(\d+)([ymwd])/', + ], + function ($match) { + switch ($match[2]) { + case 'y': + return I18N::plural('%s year', '%s years', $match[1], I18N::digits($match[1])); + case 'm': + return I18N::plural('%s month', '%s months', $match[1], I18N::digits($match[1])); + case 'w': + return I18N::plural('%s week', '%s weeks', $match[1], I18N::digits($match[1])); + case 'd': + return I18N::plural('%s day', '%s days', $match[1], I18N::digits($match[1])); + } }, $age_string ); @@ -74,40 +74,40 @@ class FunctionsDate { preg_match_all('/%[^%]/', $time_fmt, $matches); foreach ($matches[0] as $match) { switch ($match) { - case '%a': - $t = gmdate('His', $time); - if ($t == '000000') { - $time_fmt = str_replace($match, /* I18N: time format “%a” - exactly 00:00:00 */ - I18N::translate('midnight'), $time_fmt); - } elseif ($t < '120000') { - $time_fmt = str_replace($match, /* I18N: time format “%a” - between 00:00:01 and 11:59:59 */ - I18N::translate('a.m.'), $time_fmt); - } elseif ($t == '120000') { - $time_fmt = str_replace($match, /* I18N: time format “%a” - exactly 12:00:00 */ - I18N::translate('noon'), $time_fmt); - } else { - $time_fmt = str_replace($match, /* I18N: time format “%a” - between 12:00:01 and 23:59:59 */ - I18N::translate('p.m.'), $time_fmt); - } - break; - case '%A': - $t = gmdate('His', $time); - if ($t == '000000') { - $time_fmt = str_replace($match, /* I18N: time format “%A” - exactly 00:00:00 */ - I18N::translate('Midnight'), $time_fmt); - } elseif ($t < '120000') { - $time_fmt = str_replace($match, /* I18N: time format “%A” - between 00:00:01 and 11:59:59 */ - I18N::translate('A.M.'), $time_fmt); - } elseif ($t == '120000') { - $time_fmt = str_replace($match, /* I18N: time format “%A” - exactly 12:00:00 */ - I18N::translate('Noon'), $time_fmt); - } else { - $time_fmt = str_replace($match, /* I18N: time format “%A” - between 12:00:01 and 23:59:59 */ - I18N::translate('P.M.'), $time_fmt); - } - break; - default: - $time_fmt = str_replace($match, I18N::digits(gmdate(substr($match, -1), $time)), $time_fmt); + case '%a': + $t = gmdate('His', $time); + if ($t == '000000') { + $time_fmt = str_replace($match, /* I18N: time format “%a” - exactly 00:00:00 */ + I18N::translate('midnight'), $time_fmt); + } elseif ($t < '120000') { + $time_fmt = str_replace($match, /* I18N: time format “%a” - between 00:00:01 and 11:59:59 */ + I18N::translate('a.m.'), $time_fmt); + } elseif ($t == '120000') { + $time_fmt = str_replace($match, /* I18N: time format “%a” - exactly 12:00:00 */ + I18N::translate('noon'), $time_fmt); + } else { + $time_fmt = str_replace($match, /* I18N: time format “%a” - between 12:00:01 and 23:59:59 */ + I18N::translate('p.m.'), $time_fmt); + } + break; + case '%A': + $t = gmdate('His', $time); + if ($t == '000000') { + $time_fmt = str_replace($match, /* I18N: time format “%A” - exactly 00:00:00 */ + I18N::translate('Midnight'), $time_fmt); + } elseif ($t < '120000') { + $time_fmt = str_replace($match, /* I18N: time format “%A” - between 00:00:01 and 11:59:59 */ + I18N::translate('A.M.'), $time_fmt); + } elseif ($t == '120000') { + $time_fmt = str_replace($match, /* I18N: time format “%A” - exactly 12:00:00 */ + I18N::translate('Noon'), $time_fmt); + } else { + $time_fmt = str_replace($match, /* I18N: time format “%A” - between 12:00:01 and 23:59:59 */ + I18N::translate('P.M.'), $time_fmt); + } + break; + default: + $time_fmt = str_replace($match, I18N::digits(gmdate(substr($match, -1), $time)), $time_fmt); } } diff --git a/app/Functions/FunctionsDb.php b/app/Functions/FunctionsDb.php index 1625b454cd..87524753ae 100644 --- a/app/Functions/FunctionsDb.php +++ b/app/Functions/FunctionsDb.php @@ -255,18 +255,18 @@ class FunctionsDb { */ public static function searchIndividualsPhonetic($soundex, $lastname, $firstname, $place, array $trees) { switch ($soundex) { - case 'Russell': - $givn_sdx = Soundex::russell($firstname); - $surn_sdx = Soundex::russell($lastname); - $plac_sdx = Soundex::russell($place); - break; - case 'DaitchM': - $givn_sdx = Soundex::daitchMokotoff($firstname); - $surn_sdx = Soundex::daitchMokotoff($lastname); - $plac_sdx = Soundex::daitchMokotoff($place); - break; - default: - throw new \DomainException('soundex: ' . $soundex); + case 'Russell': + $givn_sdx = Soundex::russell($firstname); + $surn_sdx = Soundex::russell($lastname); + $plac_sdx = Soundex::russell($place); + break; + case 'DaitchM': + $givn_sdx = Soundex::daitchMokotoff($firstname); + $surn_sdx = Soundex::daitchMokotoff($lastname); + $plac_sdx = Soundex::daitchMokotoff($place); + break; + default: + throw new \DomainException('soundex: ' . $soundex); } // Nothing to search for? Return nothing. @@ -298,12 +298,12 @@ class FunctionsDb { foreach ($givn_sdx as $n => $sdx) { $sql .= $n ? " OR " : ""; switch ($soundex) { - case 'Russell': - $sql .= "n_soundex_givn_std LIKE CONCAT('%', :given_name_" . $n . ", '%')"; - break; - case 'DaitchM': - $sql .= "n_soundex_givn_dm LIKE CONCAT('%', :given_name_" . $n . ", '%')"; - break; + case 'Russell': + $sql .= "n_soundex_givn_std LIKE CONCAT('%', :given_name_" . $n . ", '%')"; + break; + case 'DaitchM': + $sql .= "n_soundex_givn_dm LIKE CONCAT('%', :given_name_" . $n . ", '%')"; + break; } $args['given_name_' . $n] = $sdx; } @@ -316,12 +316,12 @@ class FunctionsDb { foreach ($surn_sdx as $n => $sdx) { $sql .= $n ? " OR " : ""; switch ($soundex) { - case 'Russell': - $sql .= "n_soundex_surn_std LIKE CONCAT('%', :surname_" . $n . ", '%')"; - break; - case 'DaitchM': - $sql .= "n_soundex_surn_dm LIKE CONCAT('%', :surname_" . $n . ", '%')"; - break; + case 'Russell': + $sql .= "n_soundex_surn_std LIKE CONCAT('%', :surname_" . $n . ", '%')"; + break; + case 'DaitchM': + $sql .= "n_soundex_surn_dm LIKE CONCAT('%', :surname_" . $n . ", '%')"; + break; } $args['surname_' . $n] = $sdx; } @@ -334,12 +334,12 @@ class FunctionsDb { foreach ($plac_sdx as $n => $sdx) { $sql .= $n ? " OR " : ""; switch ($soundex) { - case 'Russell': - $sql .= "p_std_soundex LIKE CONCAT('%', :place_" . $n . ", '%')"; - break; - case 'DaitchM': - $sql .= "p_dm_soundex LIKE CONCAT('%', :place_" . $n . ", '%')"; - break; + case 'Russell': + $sql .= "p_std_soundex LIKE CONCAT('%', :place_" . $n . ", '%')"; + break; + case 'DaitchM': + $sql .= "p_dm_soundex LIKE CONCAT('%', :place_" . $n . ", '%')"; + break; } $args['place_' . $n] = $sdx; } @@ -774,82 +774,82 @@ class FunctionsDb { } else { // SPECIAL CASES: switch ($anniv->m) { - case 2: - // 29 CSH does not include 30 CSH (but would include an invalid 31 CSH if there were no 30 CSH) - if ($anniv->d === 1) { - $where .= " AND d_day <= 1 AND d_mon = 2"; - } elseif ($anniv->d === 30) { - $where .= " AND d_day >= 30 AND d_mon = 2"; - } elseif ($anniv->d === 29 && $anniv->daysInMonth() === 29) { - $where .= " AND (d_day = 29 OR d_day > 30) AND d_mon = 2"; - } else { - $where .= " AND d_day = :day AND d_mon = 2"; - $args['day'] = $anniv->d; - } - break; - case 3: - // 1 KSL includes 30 CSH (if this year didn’t have 30 CSH) - // 29 KSL does not include 30 KSL (but would include an invalid 31 KSL if there were no 30 KSL) - if ($anniv->d === 1) { - $tmp = new JewishDate([$anniv->y, 'CSH', 1]); - if ($tmp->daysInMonth() === 29) { - $where .= " AND (d_day <= 1 AND d_mon = 3 OR d_day = 30 AND d_mon = 2)"; + case 2: + // 29 CSH does not include 30 CSH (but would include an invalid 31 CSH if there were no 30 CSH) + if ($anniv->d === 1) { + $where .= " AND d_day <= 1 AND d_mon = 2"; + } elseif ($anniv->d === 30) { + $where .= " AND d_day >= 30 AND d_mon = 2"; + } elseif ($anniv->d === 29 && $anniv->daysInMonth() === 29) { + $where .= " AND (d_day = 29 OR d_day > 30) AND d_mon = 2"; } else { - $where .= " AND d_day <= 1 AND d_mon = 3"; + $where .= " AND d_day = :day AND d_mon = 2"; + $args['day'] = $anniv->d; } - } elseif ($anniv->d === 30) { - $where .= " AND d_day >= 30 AND d_mon = 3"; - } elseif ($anniv->d == 29 && $anniv->daysInMonth() === 29) { - $where .= " AND (d_day = 29 OR d_day > 30) AND d_mon = 3"; - } else { - $where .= " AND d_day = :day AND d_mon = 3"; - $args['day'] = $anniv->d; - } - break; - case 4: - // 1 TVT includes 30 KSL (if this year didn’t have 30 KSL) - if ($anniv->d === 1) { - $tmp = new JewishDate([$anniv->y, 'KSL', 1]); - if ($tmp->daysInMonth() === 29) { - $where .= " AND (d_day <=1 AND d_mon = 4 OR d_day = 30 AND d_mon = 3)"; + break; + case 3: + // 1 KSL includes 30 CSH (if this year didn’t have 30 CSH) + // 29 KSL does not include 30 KSL (but would include an invalid 31 KSL if there were no 30 KSL) + if ($anniv->d === 1) { + $tmp = new JewishDate([$anniv->y, 'CSH', 1]); + if ($tmp->daysInMonth() === 29) { + $where .= " AND (d_day <= 1 AND d_mon = 3 OR d_day = 30 AND d_mon = 2)"; + } else { + $where .= " AND d_day <= 1 AND d_mon = 3"; + } + } elseif ($anniv->d === 30) { + $where .= " AND d_day >= 30 AND d_mon = 3"; + } elseif ($anniv->d == 29 && $anniv->daysInMonth() === 29) { + $where .= " AND (d_day = 29 OR d_day > 30) AND d_mon = 3"; } else { - $where .= " AND d_day <= 1 AND d_mon = 4"; + $where .= " AND d_day = :day AND d_mon = 3"; + $args['day'] = $anniv->d; } - } elseif ($anniv->d === $anniv->daysInMonth()) { - $where .= " AND d_day >= :day AND d_mon=4"; - $args['day'] = $anniv->d; - } else { - $where .= " AND d_day = :day AND d_mon=4"; - $args['day'] = $anniv->d; - } - break; - case 7: // ADS includes ADR (non-leap) - if ($anniv->d === 1) { - $where .= " AND d_day <= 1"; - } elseif ($anniv->d === $anniv->daysInMonth()) { - $where .= " AND d_day >= :day"; - $args['day'] = $anniv->d; - } else { - $where .= " AND d_day = :day"; - $args['day'] = $anniv->d; - } - $where .= " AND (d_mon = 6 AND MOD(7 * d_year + 1, 19) >= 7 OR d_mon = 7)"; - break; - case 8: // 1 NSN includes 30 ADR, if this year is non-leap - if ($anniv->d === 1) { - if ($anniv->isLeapYear()) { - $where .= " AND d_day <= 1 AND d_mon = 8"; + break; + case 4: + // 1 TVT includes 30 KSL (if this year didn’t have 30 KSL) + if ($anniv->d === 1) { + $tmp = new JewishDate([$anniv->y, 'KSL', 1]); + if ($tmp->daysInMonth() === 29) { + $where .= " AND (d_day <=1 AND d_mon = 4 OR d_day = 30 AND d_mon = 3)"; + } else { + $where .= " AND d_day <= 1 AND d_mon = 4"; + } + } elseif ($anniv->d === $anniv->daysInMonth()) { + $where .= " AND d_day >= :day AND d_mon=4"; + $args['day'] = $anniv->d; } else { - $where .= " AND (d_day <= 1 AND d_mon = 8 OR d_day = 30 AND d_mon = 6)"; + $where .= " AND d_day = :day AND d_mon=4"; + $args['day'] = $anniv->d; } - } elseif ($anniv->d === $anniv->daysInMonth()) { - $where .= " AND d_day >= :day AND d_mon = 8"; - $args['day'] = $anniv->d; - } else { - $where .= " AND d_day = :day AND d_mon = 8"; - $args['day'] = $anniv->d; - } - break; + break; + case 7: // ADS includes ADR (non-leap) + if ($anniv->d === 1) { + $where .= " AND d_day <= 1"; + } elseif ($anniv->d === $anniv->daysInMonth()) { + $where .= " AND d_day >= :day"; + $args['day'] = $anniv->d; + } else { + $where .= " AND d_day = :day"; + $args['day'] = $anniv->d; + } + $where .= " AND (d_mon = 6 AND MOD(7 * d_year + 1, 19) >= 7 OR d_mon = 7)"; + break; + case 8: // 1 NSN includes 30 ADR, if this year is non-leap + if ($anniv->d === 1) { + if ($anniv->isLeapYear()) { + $where .= " AND d_day <= 1 AND d_mon = 8"; + } else { + $where .= " AND (d_day <= 1 AND d_mon = 8 OR d_day = 30 AND d_mon = 6)"; + } + } elseif ($anniv->d === $anniv->daysInMonth()) { + $where .= " AND d_day >= :day AND d_mon = 8"; + $args['day'] = $anniv->d; + } else { + $where .= " AND d_day = :day AND d_mon = 8"; + $args['day'] = $anniv->d; + } + break; } } // Only events in the past (includes dates without a year) diff --git a/app/Functions/FunctionsEdit.php b/app/Functions/FunctionsEdit.php index fd6211b6b3..9f884edc0c 100644 --- a/app/Functions/FunctionsEdit.php +++ b/app/Functions/FunctionsEdit.php @@ -598,21 +598,21 @@ class FunctionsEdit { $row_class = 'form-group row'; switch ($fact) { - case 'DATA': - case 'MAP': - // These GEDCOM tags should have no data, just child tags. - if ($value === '') { - $row_class .= ' d-none'; - } - break; - case 'LATI': - case 'LONG': - // Indicate that this row is a child of a previous row, so we can expand/collapse them. - $row_class .= ' child_of_' . $previous_ids['PLAC']; - if ($value === '') { - $row_class .= ' collapse'; - } - break; + case 'DATA': + case 'MAP': + // These GEDCOM tags should have no data, just child tags. + if ($value === '') { + $row_class .= ' d-none'; + } + break; + case 'LATI': + case 'LONG': + // Indicate that this row is a child of a previous row, so we can expand/collapse them. + $row_class .= ' child_of_' . $previous_ids['PLAC']; + if ($value === '') { + $row_class .= ' collapse'; + } + break; } $html = ''; @@ -634,16 +634,16 @@ class FunctionsEdit { } else { // Not all facts have help text. switch ($fact) { - case 'NAME': - if ($upperlevel !== 'REPO' && $upperlevel !== 'UNKNOWN') { + case 'NAME': + if ($upperlevel !== 'REPO' && $upperlevel !== 'UNKNOWN') { + $html .= FunctionsPrint::helpLink($fact); + } + break; + case 'ROMN': + case 'SURN': + case '_HEB': $html .= FunctionsPrint::helpLink($fact); - } - break; - case 'ROMN': - case 'SURN': - case '_HEB': - $html .= FunctionsPrint::helpLink($fact); - break; + break; } } // tag level @@ -848,25 +848,25 @@ class FunctionsEdit { // popup links switch ($fact) { - case 'SOUR': - //-- checkboxes to apply '1 SOUR' to BIRT/MARR/DEAT as '2 SOUR' - if ($level === '1') { - $html .= '<br>'; - switch ($WT_TREE->getPreference('PREFER_LEVEL2_SOURCES')) { - case '2': // records - $level1_checked = 'checked'; - $level2_checked = ''; - break; - case '1': // facts - $level1_checked = ''; - $level2_checked = 'checked'; - break; - case '0': // none - default: - $level1_checked = ''; - $level2_checked = ''; - break; - } + case 'SOUR': + //-- checkboxes to apply '1 SOUR' to BIRT/MARR/DEAT as '2 SOUR' + if ($level === '1') { + $html .= '<br>'; + switch ($WT_TREE->getPreference('PREFER_LEVEL2_SOURCES')) { + case '2': // records + $level1_checked = 'checked'; + $level2_checked = ''; + break; + case '1': // facts + $level1_checked = ''; + $level2_checked = 'checked'; + break; + case '0': // none + default: + $level1_checked = ''; + $level2_checked = ''; + break; + } if (strpos($bdm, 'B') !== false) { $html .= ' <label><input type="checkbox" name="SOUR_INDI" ' . $level1_checked . ' value="1">' . I18N::translate('Individual') . '</label>'; if (preg_match_all('/(' . WT_REGEX_TAG . ')/', $WT_TREE->getPreference('QUICK_REQUIRED_FACTS'), $matches)) { @@ -923,29 +923,29 @@ class FunctionsEdit { // Show more likely census details at the top of the list. switch ($locale) { - case 'cs': - $census_places = [new CensusOfCzechRepublic]; - break; - case 'en-AU': - case 'en-GB': - $census_places = [new CensusOfEngland, new CensusOfWales, new CensusOfScotland]; - break; - case 'en-US': - $census_places = [new CensusOfUnitedStates]; - break; - case 'fr': - case 'fr-CA': - $census_places = [new CensusOfFrance]; - break; - case 'da': - $census_places = [new CensusOfDenmark]; - break; - case 'de': - $census_places = [new CensusOfDeutschland]; - break; - default: - $census_places = []; - break; + case 'cs': + $census_places = [new CensusOfCzechRepublic]; + break; + case 'en-AU': + case 'en-GB': + $census_places = [new CensusOfEngland, new CensusOfWales, new CensusOfScotland]; + break; + case 'en-US': + $census_places = [new CensusOfUnitedStates]; + break; + case 'fr': + case 'fr-CA': + $census_places = [new CensusOfFrance]; + break; + case 'da': + $census_places = [new CensusOfDenmark]; + break; + case 'de': + $census_places = [new CensusOfDeutschland]; + break; + default: + $census_places = []; + break; } foreach (Census::allCensusPlaces() as $census_place) { if (!in_array($census_place, $census_places)) { @@ -992,46 +992,46 @@ class FunctionsEdit { global $WT_TREE; switch ($tag) { - case 'SOUR': - echo View::make('cards/add-source-citation', [ - 'level' => $level, - 'full_citations' => $WT_TREE->getPreference('FULL_SOURCES'), - ]); - break; + case 'SOUR': + echo View::make('cards/add-source-citation', [ + 'level' => $level, + 'full_citations' => $WT_TREE->getPreference('FULL_SOURCES'), + ]); + break; + + case 'ASSO': + case 'ASSO2': + echo View::make('cards/add-associate', [ + 'level' => $level, + ]); + break; - case 'ASSO': - case 'ASSO2': - echo View::make('cards/add-associate', [ - 'level' => $level, - ]); - break; + case 'NOTE': + echo View::make('cards/add-note', [ + 'level' => $level, + ]); + break; - case 'NOTE': - echo View::make('cards/add-note', [ - 'level' => $level, - ]); - break; + case 'SHARED_NOTE': + echo View::make('cards/add-shared-note', [ + 'level' => $level, + 'parent_tag' => $parent_tag, + ]); + break; - case 'SHARED_NOTE': - echo View::make('cards/add-shared-note', [ - 'level' => $level, - 'parent_tag' => $parent_tag, - ]); - break; + case 'OBJE': + if ($WT_TREE->getPreference('MEDIA_UPLOAD') >= Auth::accessLevel($WT_TREE)) { + echo View::make('cards/add-media-object', [ + 'level' => $level, + ]); + } + break; - case 'OBJE': - if ($WT_TREE->getPreference('MEDIA_UPLOAD') >= Auth::accessLevel($WT_TREE)) { - echo View::make('cards/add-media-object', [ + case 'RESN': + echo View::make('cards/add-restriction', [ 'level' => $level, ]); - } - break; - - case 'RESN': - echo View::make('cards/add-restriction', [ - 'level' => $level, - ]); - break; + break; } } @@ -1107,12 +1107,12 @@ class FunctionsEdit { */ public static function addNewSex() { switch (Filter::post('SEX', '[MF]', 'U')) { - case 'M': - return "\n1 SEX M"; - case 'F': - return "\n1 SEX F"; - default: - return "\n1 SEX U"; + case 'M': + return "\n1 SEX M"; + case 'F': + return "\n1 SEX F"; + default: + return "\n1 SEX U"; } } @@ -1634,43 +1634,43 @@ class FunctionsEdit { } // Add level 3/4 tags as appropriate switch ($key) { - case 'PLAC': - if (preg_match_all('/(' . WT_REGEX_TAG . ')/', $WT_TREE->getPreference('ADVANCED_PLAC_FACTS'), $match)) { - foreach ($match[1] as $tag) { - echo self::addSimpleTag('3 ' . $tag, '', GedcomTag::getLabel($level1tag . ':PLAC:' . $tag)); + case 'PLAC': + if (preg_match_all('/(' . WT_REGEX_TAG . ')/', $WT_TREE->getPreference('ADVANCED_PLAC_FACTS'), $match)) { + foreach ($match[1] as $tag) { + echo self::addSimpleTag('3 ' . $tag, '', GedcomTag::getLabel($level1tag . ':PLAC:' . $tag)); + } } - } - echo self::addSimpleTag('3 MAP'); - echo self::addSimpleTag('4 LATI'); - echo self::addSimpleTag('4 LONG'); - break; - case 'FILE': - echo self::addSimpleTag('3 FORM'); - break; - case 'EVEN': - echo self::addSimpleTag('3 DATE'); - echo self::addSimpleTag('3 PLAC'); - break; - case 'STAT': - if (GedcomCodeTemp::isTagLDS($level1tag)) { - echo self::addSimpleTag('3 DATE', '', GedcomTag::getLabel('STAT:DATE')); - } - break; - case 'DATE': - // TIME is NOT a valid 5.5.1 tag - if (in_array($level1tag, Config::dateAndTime())) { - echo self::addSimpleTag('3 TIME'); - } - break; - case 'HUSB': - case 'WIFE': - echo self::addSimpleTag('3 AGE'); - break; - case 'FAMC': - if ($level1tag === 'ADOP') { - echo self::addSimpleTag('3 ADOP BOTH'); - } - break; + echo self::addSimpleTag('3 MAP'); + echo self::addSimpleTag('4 LATI'); + echo self::addSimpleTag('4 LONG'); + break; + case 'FILE': + echo self::addSimpleTag('3 FORM'); + break; + case 'EVEN': + echo self::addSimpleTag('3 DATE'); + echo self::addSimpleTag('3 PLAC'); + break; + case 'STAT': + if (GedcomCodeTemp::isTagLDS($level1tag)) { + echo self::addSimpleTag('3 DATE', '', GedcomTag::getLabel('STAT:DATE')); + } + break; + case 'DATE': + // TIME is NOT a valid 5.5.1 tag + if (in_array($level1tag, Config::dateAndTime())) { + echo self::addSimpleTag('3 TIME'); + } + break; + case 'HUSB': + case 'WIFE': + echo self::addSimpleTag('3 AGE'); + break; + case 'FAMC': + if ($level1tag === 'ADOP') { + echo self::addSimpleTag('3 ADOP BOTH'); + } + break; } } elseif ($key === 'DATE' && $add_date) { echo self::addSimpleTag('2 DATE', $level1tag, GedcomTag::getLabel($level1tag . ':DATE')); diff --git a/app/Functions/FunctionsImport.php b/app/Functions/FunctionsImport.php index 71426caca2..e69c32085e 100644 --- a/app/Functions/FunctionsImport.php +++ b/app/Functions/FunctionsImport.php @@ -60,477 +60,477 @@ class FunctionsImport { $tag = strtoupper($tag); // Tags should always be upper case switch ($tag) { // Convert PhpGedView tags to WT - case '_PGVU': - $tag = '_WT_USER'; - break; - case '_PGV_OBJS': - $tag = '_WT_OBJE_SORT'; - break; - // Convert FTM-style "TAG_FORMAL_NAME" into "TAG". - case 'ABBREVIATION': - $tag = 'ABBR'; - break; - case 'ADDRESS': - $tag = 'ADDR'; - break; - case 'ADDRESS1': - $tag = 'ADR1'; - break; - case 'ADDRESS2': - $tag = 'ADR2'; - break; - case 'ADDRESS3': - $tag = 'ADR3'; - break; - case 'ADOPTION': - $tag = 'ADOP'; - break; - case 'ADULT_CHRISTENING': - $tag = 'CHRA'; - break; - case 'AFN': - // AFN values are upper case - $data = strtoupper($data); - break; - case 'AGENCY': - $tag = 'AGNC'; - break; - case 'ALIAS': - $tag = 'ALIA'; - break; - case 'ANCESTORS': - $tag = 'ANCE'; - break; - case 'ANCES_INTEREST': - $tag = 'ANCI'; - break; - case 'ANNULMENT': - $tag = 'ANUL'; - break; - case 'ASSOCIATES': - $tag = 'ASSO'; - break; - case 'AUTHOR': - $tag = 'AUTH'; - break; - case 'BAPTISM': - $tag = 'BAPM'; - break; - case 'BAPTISM_LDS': - $tag = 'BAPL'; - break; - case 'BAR_MITZVAH': - $tag = 'BARM'; - break; - case 'BAS_MITZVAH': - $tag = 'BASM'; - break; - case 'BIRTH': - $tag = 'BIRT'; - break; - case 'BLESSING': - $tag = 'BLES'; - break; - case 'BURIAL': - $tag = 'BURI'; - break; - case 'CALL_NUMBER': - $tag = 'CALN'; - break; - case 'CASTE': - $tag = 'CAST'; - break; - case 'CAUSE': - $tag = 'CAUS'; - break; - case 'CENSUS': - $tag = 'CENS'; - break; - case 'CHANGE': - $tag = 'CHAN'; - break; - case 'CHARACTER': - $tag = 'CHAR'; - break; - case 'CHILD': - $tag = 'CHIL'; - break; - case 'CHILDREN_COUNT': - $tag = 'NCHI'; - break; - case 'CHRISTENING': - $tag = 'CHR'; - break; - case 'CONCATENATION': - $tag = 'CONC'; - break; - case 'CONFIRMATION': - $tag = 'CONF'; - break; - case 'CONFIRMATION_LDS': - $tag = 'CONL'; - break; - case 'CONTINUED': - $tag = 'CONT'; - break; - case 'COPYRIGHT': - $tag = 'COPR'; - break; - case 'CORPORATE': - $tag = 'CORP'; - break; - case 'COUNTRY': - $tag = 'CTRY'; - break; - case 'CREMATION': - $tag = 'CREM'; - break; - case 'DATE': - // Preserve text from INT dates - if (strpos($data, '(') !== false) { - list($date, $text) = explode('(', $data, 2); - $text = ' (' . $text; - } else { - $date = $data; - $text = ''; - } - // Capitals - $date = strtoupper($date); - // Temporarily add leading/trailing spaces, to allow efficient matching below - $date = " {$date} "; - // Ensure space digits and letters - $date = preg_replace('/([A-Z])(\d)/', '$1 $2', $date); - $date = preg_replace('/(\d)([A-Z])/', '$1 $2', $date); - // Ensure space before/after calendar escapes - $date = preg_replace('/@#[^@]+@/', ' $0 ', $date); - // "BET." => "BET" - $date = preg_replace('/(\w\w)\./', '$1', $date); - // "CIR" => "ABT" - $date = str_replace(' CIR ', ' ABT ', $date); - $date = str_replace(' APX ', ' ABT ', $date); - // B.C. => BC (temporarily, to allow easier handling of ".") - $date = str_replace(' B.C. ', ' BC ', $date); - // "BET X - Y " => "BET X AND Y" - $date = preg_replace('/^(.* BET .+) - (.+)/', '$1 AND $2', $date); - $date = preg_replace('/^(.* FROM .+) - (.+)/', '$1 TO $2', $date); - // "@#ESC@ FROM X TO Y" => "FROM @#ESC@ X TO @#ESC@ Y" - $date = preg_replace('/^ +(@#[^@]+@) +FROM +(.+) +TO +(.+)/', ' FROM $1 $2 TO $1 $3', $date); - $date = preg_replace('/^ +(@#[^@]+@) +BET +(.+) +AND +(.+)/', ' BET $1 $2 AND $1 $3', $date); - // "@#ESC@ AFT X" => "AFT @#ESC@ X" - $date = preg_replace('/^ +(@#[^@]+@) +(FROM|BET|TO|AND|BEF|AFT|CAL|EST|INT|ABT) +(.+)/', ' $2 $1 $3', $date); - // Ignore any remaining punctuation, e.g. "14-MAY, 1900" => "14 MAY 1900" - // (don't change "/" - it is used in NS/OS dates) - $date = preg_replace('/[.,:;-]/', ' ', $date); - // BC => B.C. - $date = str_replace(' BC ', ' B.C. ', $date); - // Append the "INT" text - $data = $date . $text; - break; - case 'DEATH': - $tag = 'DEAT'; - break; - case '_DEATH_OF_SPOUSE': - $tag = '_DETS'; - break; - case '_DEGREE': - $tag = '_DEG'; - break; - case 'DESCENDANTS': - $tag = 'DESC'; - break; - case 'DESCENDANT_INT': - $tag = 'DESI'; - break; - case 'DESTINATION': - $tag = 'DEST'; - break; - case 'DIVORCE': - $tag = 'DIV'; - break; - case 'DIVORCE_FILED': - $tag = 'DIVF'; - break; - case 'EDUCATION': - $tag = 'EDUC'; - break; - case 'EMIGRATION': - $tag = 'EMIG'; - break; - case 'ENDOWMENT': - $tag = 'ENDL'; - break; - case 'ENGAGEMENT': - $tag = 'ENGA'; - break; - case 'EVENT': - $tag = 'EVEN'; - break; - case 'FACSIMILE': - $tag = 'FAX'; - break; - case 'FAMILY': - $tag = 'FAM'; - break; - case 'FAMILY_CHILD': - $tag = 'FAMC'; - break; - case 'FAMILY_FILE': - $tag = 'FAMF'; - break; - case 'FAMILY_SPOUSE': - $tag = 'FAMS'; - break; - case 'FIRST_COMMUNION': - $tag = 'FCOM'; - break; - case '_FILE': - $tag = 'FILE'; - break; - case 'FORMAT': - $tag = 'FORM'; - case 'FORM': - // Consistent commas - $data = preg_replace('/ *, */', ', ', $data); - break; - case 'GEDCOM': - $tag = 'GEDC'; - break; - case 'GIVEN_NAME': - $tag = 'GIVN'; - break; - case 'GRADUATION': - $tag = 'GRAD'; - break; - case 'HEADER': - $tag = 'HEAD'; - case 'HEAD': - // HEAD records don't have an XREF or DATA - if ($level == '0') { - $xref = ''; - $data = ''; - } - break; - case 'HUSBAND': - $tag = 'HUSB'; - break; - case 'IDENT_NUMBER': - $tag = 'IDNO'; - break; - case 'IMMIGRATION': - $tag = 'IMMI'; - break; - case 'INDIVIDUAL': - $tag = 'INDI'; - break; - case 'LANGUAGE': - $tag = 'LANG'; - break; - case 'LATITUDE': - $tag = 'LATI'; - break; - case 'LONGITUDE': - $tag = 'LONG'; - break; - case 'MARRIAGE': - $tag = 'MARR'; - break; - case 'MARRIAGE_BANN': - $tag = 'MARB'; - break; - case 'MARRIAGE_COUNT': - $tag = 'NMR'; - break; - case 'MARRIAGE_CONTRACT': - $tag = 'MARC'; - break; - case 'MARRIAGE_LICENSE': - $tag = 'MARL'; - break; - case 'MARRIAGE_SETTLEMENT': - $tag = 'MARS'; - break; - case 'MEDIA': - $tag = 'MEDI'; - break; - case '_MEDICAL': - $tag = '_MDCL'; - break; - case '_MILITARY_SERVICE': - $tag = '_MILT'; - break; - case 'NAME': - // Tidy up whitespace - $data = preg_replace('/ +/', ' ', trim($data)); - break; - case 'NAME_PREFIX': - $tag = 'NPFX'; - break; - case 'NAME_SUFFIX': - $tag = 'NSFX'; - break; - case 'NATIONALITY': - $tag = 'NATI'; - break; - case 'NATURALIZATION': - $tag = 'NATU'; - break; - case 'NICKNAME': - $tag = 'NICK'; - break; - case 'OBJECT': - $tag = 'OBJE'; - break; - case 'OCCUPATION': - $tag = 'OCCU'; - break; - case 'ORDINANCE': - $tag = 'ORDI'; - break; - case 'ORDINATION': - $tag = 'ORDN'; - break; - case 'PEDIGREE': - $tag = 'PEDI'; - case 'PEDI': - // PEDI values are lower case - $data = strtolower($data); - break; - case 'PHONE': - $tag = 'PHON'; - break; - case 'PHONETIC': - $tag = 'FONE'; - break; - case 'PHY_DESCRIPTION': - $tag = 'DSCR'; - break; - case 'PLACE': - $tag = 'PLAC'; - case 'PLAC': - // Consistent commas - $data = preg_replace('/ *(،|,) */', ', ', $data); - // The Master Genealogist stores LAT/LONG data in the PLAC field, e.g. Pennsylvania, USA, 395945N0751013W - if (preg_match('/(.*), (\d\d)(\d\d)(\d\d)([NS])(\d\d\d)(\d\d)(\d\d)([EW])$/', $data, $match)) { - $data = - $match[1] . "\n" . - ($level + 1) . " MAP\n" . - ($level + 2) . ' LATI ' . ($match[5] . (round($match[2] + ($match[3] / 60) + ($match[4] / 3600), 4))) . "\n" . - ($level + 2) . ' LONG ' . ($match[9] . (round($match[6] + ($match[7] / 60) + ($match[8] / 3600), 4))); - } - break; - case 'POSTAL_CODE': - $tag = 'POST'; - break; - case 'PROBATE': - $tag = 'PROB'; - break; - case 'PROPERTY': - $tag = 'PROP'; - break; - case 'PUBLICATION': - $tag = 'PUBL'; - break; - case 'QUALITY_OF_DATA': - $tag = 'QUAL'; - break; - case 'REC_FILE_NUMBER': - $tag = 'RFN'; - break; - case 'REC_ID_NUMBER': - $tag = 'RIN'; - break; - case 'REFERENCE': - $tag = 'REFN'; - break; - case 'RELATIONSHIP': - $tag = 'RELA'; - break; - case 'RELIGION': - $tag = 'RELI'; - break; - case 'REPOSITORY': - $tag = 'REPO'; - break; - case 'RESIDENCE': - $tag = 'RESI'; - break; - case 'RESTRICTION': - $tag = 'RESN'; - case 'RESN': - // RESN values are lower case (confidential, privacy, locked, none) - $data = strtolower($data); - if ($data == 'invisible') { - $data = 'confidential'; // From old versions of Legacy. - } - break; - case 'RETIREMENT': - $tag = 'RETI'; - break; - case 'ROMANIZED': - $tag = 'ROMN'; - break; - case 'SEALING_CHILD': - $tag = 'SLGC'; - break; - case 'SEALING_SPOUSE': - $tag = 'SLGS'; - break; - case 'SOC_SEC_NUMBER': - $tag = 'SSN'; - break; - case 'SEX': - $data = strtoupper($data); - break; - case 'SOURCE': - $tag = 'SOUR'; - break; - case 'STATE': - $tag = 'STAE'; - break; - case 'STATUS': - $tag = 'STAT'; - case 'STAT': - if ($data == 'CANCELLED') { - // PhpGedView mis-spells this tag - correct it. - $data = 'CANCELED'; - } - break; - case 'SUBMISSION': - $tag = 'SUBN'; - break; - case 'SUBMITTER': - $tag = 'SUBM'; - break; - case 'SURNAME': - $tag = 'SURN'; - break; - case 'SURN_PREFIX': - $tag = 'SPFX'; - break; - case 'TEMPLE': - $tag = 'TEMP'; - case 'TEMP': - // Temple codes are upper case - $data = strtoupper($data); - break; - case 'TITLE': - $tag = 'TITL'; - break; - case 'TRAILER': - $tag = 'TRLR'; - case 'TRLR': - // TRLR records don't have an XREF or DATA - if ($level == '0') { - $xref = ''; - $data = ''; - } - break; - case 'VERSION': - $tag = 'VERS'; - break; - case 'WEB': - $tag = 'WWW'; - break; + case '_PGVU': + $tag = '_WT_USER'; + break; + case '_PGV_OBJS': + $tag = '_WT_OBJE_SORT'; + break; + // Convert FTM-style "TAG_FORMAL_NAME" into "TAG". + case 'ABBREVIATION': + $tag = 'ABBR'; + break; + case 'ADDRESS': + $tag = 'ADDR'; + break; + case 'ADDRESS1': + $tag = 'ADR1'; + break; + case 'ADDRESS2': + $tag = 'ADR2'; + break; + case 'ADDRESS3': + $tag = 'ADR3'; + break; + case 'ADOPTION': + $tag = 'ADOP'; + break; + case 'ADULT_CHRISTENING': + $tag = 'CHRA'; + break; + case 'AFN': + // AFN values are upper case + $data = strtoupper($data); + break; + case 'AGENCY': + $tag = 'AGNC'; + break; + case 'ALIAS': + $tag = 'ALIA'; + break; + case 'ANCESTORS': + $tag = 'ANCE'; + break; + case 'ANCES_INTEREST': + $tag = 'ANCI'; + break; + case 'ANNULMENT': + $tag = 'ANUL'; + break; + case 'ASSOCIATES': + $tag = 'ASSO'; + break; + case 'AUTHOR': + $tag = 'AUTH'; + break; + case 'BAPTISM': + $tag = 'BAPM'; + break; + case 'BAPTISM_LDS': + $tag = 'BAPL'; + break; + case 'BAR_MITZVAH': + $tag = 'BARM'; + break; + case 'BAS_MITZVAH': + $tag = 'BASM'; + break; + case 'BIRTH': + $tag = 'BIRT'; + break; + case 'BLESSING': + $tag = 'BLES'; + break; + case 'BURIAL': + $tag = 'BURI'; + break; + case 'CALL_NUMBER': + $tag = 'CALN'; + break; + case 'CASTE': + $tag = 'CAST'; + break; + case 'CAUSE': + $tag = 'CAUS'; + break; + case 'CENSUS': + $tag = 'CENS'; + break; + case 'CHANGE': + $tag = 'CHAN'; + break; + case 'CHARACTER': + $tag = 'CHAR'; + break; + case 'CHILD': + $tag = 'CHIL'; + break; + case 'CHILDREN_COUNT': + $tag = 'NCHI'; + break; + case 'CHRISTENING': + $tag = 'CHR'; + break; + case 'CONCATENATION': + $tag = 'CONC'; + break; + case 'CONFIRMATION': + $tag = 'CONF'; + break; + case 'CONFIRMATION_LDS': + $tag = 'CONL'; + break; + case 'CONTINUED': + $tag = 'CONT'; + break; + case 'COPYRIGHT': + $tag = 'COPR'; + break; + case 'CORPORATE': + $tag = 'CORP'; + break; + case 'COUNTRY': + $tag = 'CTRY'; + break; + case 'CREMATION': + $tag = 'CREM'; + break; + case 'DATE': + // Preserve text from INT dates + if (strpos($data, '(') !== false) { + list($date, $text) = explode('(', $data, 2); + $text = ' (' . $text; + } else { + $date = $data; + $text = ''; + } + // Capitals + $date = strtoupper($date); + // Temporarily add leading/trailing spaces, to allow efficient matching below + $date = " {$date} "; + // Ensure space digits and letters + $date = preg_replace('/([A-Z])(\d)/', '$1 $2', $date); + $date = preg_replace('/(\d)([A-Z])/', '$1 $2', $date); + // Ensure space before/after calendar escapes + $date = preg_replace('/@#[^@]+@/', ' $0 ', $date); + // "BET." => "BET" + $date = preg_replace('/(\w\w)\./', '$1', $date); + // "CIR" => "ABT" + $date = str_replace(' CIR ', ' ABT ', $date); + $date = str_replace(' APX ', ' ABT ', $date); + // B.C. => BC (temporarily, to allow easier handling of ".") + $date = str_replace(' B.C. ', ' BC ', $date); + // "BET X - Y " => "BET X AND Y" + $date = preg_replace('/^(.* BET .+) - (.+)/', '$1 AND $2', $date); + $date = preg_replace('/^(.* FROM .+) - (.+)/', '$1 TO $2', $date); + // "@#ESC@ FROM X TO Y" => "FROM @#ESC@ X TO @#ESC@ Y" + $date = preg_replace('/^ +(@#[^@]+@) +FROM +(.+) +TO +(.+)/', ' FROM $1 $2 TO $1 $3', $date); + $date = preg_replace('/^ +(@#[^@]+@) +BET +(.+) +AND +(.+)/', ' BET $1 $2 AND $1 $3', $date); + // "@#ESC@ AFT X" => "AFT @#ESC@ X" + $date = preg_replace('/^ +(@#[^@]+@) +(FROM|BET|TO|AND|BEF|AFT|CAL|EST|INT|ABT) +(.+)/', ' $2 $1 $3', $date); + // Ignore any remaining punctuation, e.g. "14-MAY, 1900" => "14 MAY 1900" + // (don't change "/" - it is used in NS/OS dates) + $date = preg_replace('/[.,:;-]/', ' ', $date); + // BC => B.C. + $date = str_replace(' BC ', ' B.C. ', $date); + // Append the "INT" text + $data = $date . $text; + break; + case 'DEATH': + $tag = 'DEAT'; + break; + case '_DEATH_OF_SPOUSE': + $tag = '_DETS'; + break; + case '_DEGREE': + $tag = '_DEG'; + break; + case 'DESCENDANTS': + $tag = 'DESC'; + break; + case 'DESCENDANT_INT': + $tag = 'DESI'; + break; + case 'DESTINATION': + $tag = 'DEST'; + break; + case 'DIVORCE': + $tag = 'DIV'; + break; + case 'DIVORCE_FILED': + $tag = 'DIVF'; + break; + case 'EDUCATION': + $tag = 'EDUC'; + break; + case 'EMIGRATION': + $tag = 'EMIG'; + break; + case 'ENDOWMENT': + $tag = 'ENDL'; + break; + case 'ENGAGEMENT': + $tag = 'ENGA'; + break; + case 'EVENT': + $tag = 'EVEN'; + break; + case 'FACSIMILE': + $tag = 'FAX'; + break; + case 'FAMILY': + $tag = 'FAM'; + break; + case 'FAMILY_CHILD': + $tag = 'FAMC'; + break; + case 'FAMILY_FILE': + $tag = 'FAMF'; + break; + case 'FAMILY_SPOUSE': + $tag = 'FAMS'; + break; + case 'FIRST_COMMUNION': + $tag = 'FCOM'; + break; + case '_FILE': + $tag = 'FILE'; + break; + case 'FORMAT': + $tag = 'FORM'; + case 'FORM': + // Consistent commas + $data = preg_replace('/ *, */', ', ', $data); + break; + case 'GEDCOM': + $tag = 'GEDC'; + break; + case 'GIVEN_NAME': + $tag = 'GIVN'; + break; + case 'GRADUATION': + $tag = 'GRAD'; + break; + case 'HEADER': + $tag = 'HEAD'; + case 'HEAD': + // HEAD records don't have an XREF or DATA + if ($level == '0') { + $xref = ''; + $data = ''; + } + break; + case 'HUSBAND': + $tag = 'HUSB'; + break; + case 'IDENT_NUMBER': + $tag = 'IDNO'; + break; + case 'IMMIGRATION': + $tag = 'IMMI'; + break; + case 'INDIVIDUAL': + $tag = 'INDI'; + break; + case 'LANGUAGE': + $tag = 'LANG'; + break; + case 'LATITUDE': + $tag = 'LATI'; + break; + case 'LONGITUDE': + $tag = 'LONG'; + break; + case 'MARRIAGE': + $tag = 'MARR'; + break; + case 'MARRIAGE_BANN': + $tag = 'MARB'; + break; + case 'MARRIAGE_COUNT': + $tag = 'NMR'; + break; + case 'MARRIAGE_CONTRACT': + $tag = 'MARC'; + break; + case 'MARRIAGE_LICENSE': + $tag = 'MARL'; + break; + case 'MARRIAGE_SETTLEMENT': + $tag = 'MARS'; + break; + case 'MEDIA': + $tag = 'MEDI'; + break; + case '_MEDICAL': + $tag = '_MDCL'; + break; + case '_MILITARY_SERVICE': + $tag = '_MILT'; + break; + case 'NAME': + // Tidy up whitespace + $data = preg_replace('/ +/', ' ', trim($data)); + break; + case 'NAME_PREFIX': + $tag = 'NPFX'; + break; + case 'NAME_SUFFIX': + $tag = 'NSFX'; + break; + case 'NATIONALITY': + $tag = 'NATI'; + break; + case 'NATURALIZATION': + $tag = 'NATU'; + break; + case 'NICKNAME': + $tag = 'NICK'; + break; + case 'OBJECT': + $tag = 'OBJE'; + break; + case 'OCCUPATION': + $tag = 'OCCU'; + break; + case 'ORDINANCE': + $tag = 'ORDI'; + break; + case 'ORDINATION': + $tag = 'ORDN'; + break; + case 'PEDIGREE': + $tag = 'PEDI'; + case 'PEDI': + // PEDI values are lower case + $data = strtolower($data); + break; + case 'PHONE': + $tag = 'PHON'; + break; + case 'PHONETIC': + $tag = 'FONE'; + break; + case 'PHY_DESCRIPTION': + $tag = 'DSCR'; + break; + case 'PLACE': + $tag = 'PLAC'; + case 'PLAC': + // Consistent commas + $data = preg_replace('/ *(،|,) */', ', ', $data); + // The Master Genealogist stores LAT/LONG data in the PLAC field, e.g. Pennsylvania, USA, 395945N0751013W + if (preg_match('/(.*), (\d\d)(\d\d)(\d\d)([NS])(\d\d\d)(\d\d)(\d\d)([EW])$/', $data, $match)) { + $data = + $match[1] . "\n" . + ($level + 1) . " MAP\n" . + ($level + 2) . ' LATI ' . ($match[5] . (round($match[2] + ($match[3] / 60) + ($match[4] / 3600), 4))) . "\n" . + ($level + 2) . ' LONG ' . ($match[9] . (round($match[6] + ($match[7] / 60) + ($match[8] / 3600), 4))); + } + break; + case 'POSTAL_CODE': + $tag = 'POST'; + break; + case 'PROBATE': + $tag = 'PROB'; + break; + case 'PROPERTY': + $tag = 'PROP'; + break; + case 'PUBLICATION': + $tag = 'PUBL'; + break; + case 'QUALITY_OF_DATA': + $tag = 'QUAL'; + break; + case 'REC_FILE_NUMBER': + $tag = 'RFN'; + break; + case 'REC_ID_NUMBER': + $tag = 'RIN'; + break; + case 'REFERENCE': + $tag = 'REFN'; + break; + case 'RELATIONSHIP': + $tag = 'RELA'; + break; + case 'RELIGION': + $tag = 'RELI'; + break; + case 'REPOSITORY': + $tag = 'REPO'; + break; + case 'RESIDENCE': + $tag = 'RESI'; + break; + case 'RESTRICTION': + $tag = 'RESN'; + case 'RESN': + // RESN values are lower case (confidential, privacy, locked, none) + $data = strtolower($data); + if ($data == 'invisible') { + $data = 'confidential'; // From old versions of Legacy. + } + break; + case 'RETIREMENT': + $tag = 'RETI'; + break; + case 'ROMANIZED': + $tag = 'ROMN'; + break; + case 'SEALING_CHILD': + $tag = 'SLGC'; + break; + case 'SEALING_SPOUSE': + $tag = 'SLGS'; + break; + case 'SOC_SEC_NUMBER': + $tag = 'SSN'; + break; + case 'SEX': + $data = strtoupper($data); + break; + case 'SOURCE': + $tag = 'SOUR'; + break; + case 'STATE': + $tag = 'STAE'; + break; + case 'STATUS': + $tag = 'STAT'; + case 'STAT': + if ($data == 'CANCELLED') { + // PhpGedView mis-spells this tag - correct it. + $data = 'CANCELED'; + } + break; + case 'SUBMISSION': + $tag = 'SUBN'; + break; + case 'SUBMITTER': + $tag = 'SUBM'; + break; + case 'SURNAME': + $tag = 'SURN'; + break; + case 'SURN_PREFIX': + $tag = 'SPFX'; + break; + case 'TEMPLE': + $tag = 'TEMP'; + case 'TEMP': + // Temple codes are upper case + $data = strtoupper($data); + break; + case 'TITLE': + $tag = 'TITL'; + break; + case 'TRAILER': + $tag = 'TRLR'; + case 'TRLR': + // TRLR records don't have an XREF or DATA + if ($level == '0') { + $xref = ''; + $data = ''; + } + break; + case 'VERSION': + $tag = 'VERS'; + break; + case 'WEB': + $tag = 'WWW'; + break; } // Suppress "Y", for facts/events with a DATE or PLAC if ($data == 'y') { @@ -546,40 +546,40 @@ class FunctionsImport { } // Reassemble components back into a single line switch ($tag) { - default: - // Remove tabs and multiple/leading/trailing spaces - if (strpos($data, "\t") !== false) { - $data = str_replace("\t", ' ', $data); - } - if (substr($data, 0, 1) == ' ' || substr($data, -1, 1) == ' ') { - $data = trim($data); - } - while (strpos($data, ' ')) { - $data = str_replace(' ', ' ', $data); - } - $newrec .= ($newrec ? "\n" : '') . $level . ' ' . ($level == '0' && $xref ? $xref . ' ' : '') . $tag . ($data === '' && $tag != 'NOTE' ? '' : ' ' . $data); - break; - case 'NOTE': - case 'TEXT': - case 'DATA': - case 'CONT': - $newrec .= ($newrec ? "\n" : '') . $level . ' ' . ($level == '0' && $xref ? $xref . ' ' : '') . $tag . ($data === '' && $tag != 'NOTE' ? '' : ' ' . $data); - break; - case 'FILE': - // Strip off the user-defined path prefix - $GEDCOM_MEDIA_PATH = $tree->getPreference('GEDCOM_MEDIA_PATH'); - if ($GEDCOM_MEDIA_PATH && strpos($data, $GEDCOM_MEDIA_PATH) === 0) { - $data = substr($data, strlen($GEDCOM_MEDIA_PATH)); - } - // convert backslashes in filenames to forward slashes - $data = preg_replace("/\\\/", '/', $data); + default: + // Remove tabs and multiple/leading/trailing spaces + if (strpos($data, "\t") !== false) { + $data = str_replace("\t", ' ', $data); + } + if (substr($data, 0, 1) == ' ' || substr($data, -1, 1) == ' ') { + $data = trim($data); + } + while (strpos($data, ' ')) { + $data = str_replace(' ', ' ', $data); + } + $newrec .= ($newrec ? "\n" : '') . $level . ' ' . ($level == '0' && $xref ? $xref . ' ' : '') . $tag . ($data === '' && $tag != 'NOTE' ? '' : ' ' . $data); + break; + case 'NOTE': + case 'TEXT': + case 'DATA': + case 'CONT': + $newrec .= ($newrec ? "\n" : '') . $level . ' ' . ($level == '0' && $xref ? $xref . ' ' : '') . $tag . ($data === '' && $tag != 'NOTE' ? '' : ' ' . $data); + break; + case 'FILE': + // Strip off the user-defined path prefix + $GEDCOM_MEDIA_PATH = $tree->getPreference('GEDCOM_MEDIA_PATH'); + if ($GEDCOM_MEDIA_PATH && strpos($data, $GEDCOM_MEDIA_PATH) === 0) { + $data = substr($data, strlen($GEDCOM_MEDIA_PATH)); + } + // convert backslashes in filenames to forward slashes + $data = preg_replace("/\\\/", '/', $data); - $newrec .= ($newrec ? "\n" : '') . $level . ' ' . ($level == '0' && $xref ? $xref . ' ' : '') . $tag . ($data === '' && $tag != 'NOTE' ? '' : ' ' . $data); - break; - case 'CONC': - // Merge CONC lines, to simplify access later on. - $newrec .= ($tree->getPreference('WORD_WRAPPED_NOTES') ? ' ' : '') . $data; - break; + $newrec .= ($newrec ? "\n" : '') . $level . ' ' . ($level == '0' && $xref ? $xref . ' ' : '') . $tag . ($data === '' && $tag != 'NOTE' ? '' : ' ' . $data); + break; + case 'CONC': + // Merge CONC lines, to simplify access later on. + $newrec .= ($tree->getPreference('WORD_WRAPPED_NOTES') ? ' ' : '') . $data; + break; } } @@ -636,139 +636,139 @@ class FunctionsImport { } switch ($type) { - case 'INDI': - // Convert inline media into media objects - $gedrec = self::convertInlineMedia($tree, $gedrec); - - $record = new Individual($xref, $gedrec, null, $tree); - if (preg_match('/\n1 RIN (.+)/', $gedrec, $match)) { - $rin = $match[1]; - } else { - $rin = $xref; - } - Database::prepare( - "INSERT INTO `##individuals` (i_id, i_file, i_rin, i_sex, i_gedcom) VALUES (?, ?, ?, ?, ?)" - )->execute([ - $xref, $tree_id, $rin, $record->getSex(), $gedrec, - ]); - // Update the cross-reference/index tables. - self::updatePlaces($xref, $tree_id, $gedrec); - self::updateDates($xref, $tree_id, $gedrec); - self::updateLinks($xref, $tree_id, $gedrec); - self::updateNames($xref, $tree_id, $record); - break; - case 'FAM': - // Convert inline media into media objects - $gedrec = self::convertInlineMedia($tree, $gedrec); + case 'INDI': + // Convert inline media into media objects + $gedrec = self::convertInlineMedia($tree, $gedrec); - if (preg_match('/\n1 HUSB @(' . WT_REGEX_XREF . ')@/', $gedrec, $match)) { - $husb = $match[1]; - } else { - $husb = ''; - } - if (preg_match('/\n1 WIFE @(' . WT_REGEX_XREF . ')@/', $gedrec, $match)) { - $wife = $match[1]; - } else { - $wife = ''; - } - $nchi = preg_match_all('/\n1 CHIL @(' . WT_REGEX_XREF . ')@/', $gedrec, $match); - if (preg_match('/\n1 NCHI (\d+)/', $gedrec, $match)) { - $nchi = max($nchi, $match[1]); - } - Database::prepare( - "INSERT INTO `##families` (f_id, f_file, f_husb, f_wife, f_gedcom, f_numchil) VALUES (?, ?, ?, ?, ?, ?)" - )->execute([ - $xref, $tree_id, $husb, $wife, $gedrec, $nchi, - ]); - // Update the cross-reference/index tables. - self::updatePlaces($xref, $tree_id, $gedrec); - self::updateDates($xref, $tree_id, $gedrec); - self::updateLinks($xref, $tree_id, $gedrec); - break; - case 'SOUR': - // Convert inline media into media objects - $gedrec = self::convertInlineMedia($tree, $gedrec); + $record = new Individual($xref, $gedrec, null, $tree); + if (preg_match('/\n1 RIN (.+)/', $gedrec, $match)) { + $rin = $match[1]; + } else { + $rin = $xref; + } + Database::prepare( + "INSERT INTO `##individuals` (i_id, i_file, i_rin, i_sex, i_gedcom) VALUES (?, ?, ?, ?, ?)" + )->execute([ + $xref, $tree_id, $rin, $record->getSex(), $gedrec, + ]); + // Update the cross-reference/index tables. + self::updatePlaces($xref, $tree_id, $gedrec); + self::updateDates($xref, $tree_id, $gedrec); + self::updateLinks($xref, $tree_id, $gedrec); + self::updateNames($xref, $tree_id, $record); + break; + case 'FAM': + // Convert inline media into media objects + $gedrec = self::convertInlineMedia($tree, $gedrec); - $record = new Source($xref, $gedrec, null, $tree); - if (preg_match('/\n1 TITL (.+)/', $gedrec, $match)) { - $name = $match[1]; - } elseif (preg_match('/\n1 ABBR (.+)/', $gedrec, $match)) { - $name = $match[1]; - } else { - $name = $xref; - } - Database::prepare( - "INSERT INTO `##sources` (s_id, s_file, s_name, s_gedcom) VALUES (?, ?, LEFT(?, 255), ?)" - )->execute([ - $xref, $tree_id, $name, $gedrec, - ]); - // Update the cross-reference/index tables. - self::updateLinks($xref, $tree_id, $gedrec); - self::updateNames($xref, $tree_id, $record); - break; - case 'REPO': - // Convert inline media into media objects - $gedrec = self::convertInlineMedia($tree, $gedrec); + if (preg_match('/\n1 HUSB @(' . WT_REGEX_XREF . ')@/', $gedrec, $match)) { + $husb = $match[1]; + } else { + $husb = ''; + } + if (preg_match('/\n1 WIFE @(' . WT_REGEX_XREF . ')@/', $gedrec, $match)) { + $wife = $match[1]; + } else { + $wife = ''; + } + $nchi = preg_match_all('/\n1 CHIL @(' . WT_REGEX_XREF . ')@/', $gedrec, $match); + if (preg_match('/\n1 NCHI (\d+)/', $gedrec, $match)) { + $nchi = max($nchi, $match[1]); + } + Database::prepare( + "INSERT INTO `##families` (f_id, f_file, f_husb, f_wife, f_gedcom, f_numchil) VALUES (?, ?, ?, ?, ?, ?)" + )->execute([ + $xref, $tree_id, $husb, $wife, $gedrec, $nchi, + ]); + // Update the cross-reference/index tables. + self::updatePlaces($xref, $tree_id, $gedrec); + self::updateDates($xref, $tree_id, $gedrec); + self::updateLinks($xref, $tree_id, $gedrec); + break; + case 'SOUR': + // Convert inline media into media objects + $gedrec = self::convertInlineMedia($tree, $gedrec); - $record = new Repository($xref, $gedrec, null, $tree); - Database::prepare( - "INSERT INTO `##other` (o_id, o_file, o_type, o_gedcom) VALUES (?, ?, 'REPO', ?)" - )->execute([ - $xref, $tree_id, $gedrec, - ]); - // Update the cross-reference/index tables. - self::updateLinks($xref, $tree_id, $gedrec); - self::updateNames($xref, $tree_id, $record); - break; - case 'NOTE': - $record = new Note($xref, $gedrec, null, $tree); - Database::prepare( - "INSERT INTO `##other` (o_id, o_file, o_type, o_gedcom) VALUES (?, ?, 'NOTE', ?)" - )->execute([ - $xref, $tree_id, $gedrec, - ]); - // Update the cross-reference/index tables. - self::updateLinks($xref, $tree_id, $gedrec); - self::updateNames($xref, $tree_id, $record); - break; - case 'OBJE': - $record = new Media($xref, $gedrec, null, $tree); - Database::prepare( - "INSERT INTO `##media` (m_id, m_file, m_gedcom) VALUES (:m_id, :m_file, :m_gedcom)" - )->execute([ - 'm_id' => $xref, - 'm_file' => $tree_id, - 'm_gedcom' => $gedrec, - ]); + $record = new Source($xref, $gedrec, null, $tree); + if (preg_match('/\n1 TITL (.+)/', $gedrec, $match)) { + $name = $match[1]; + } elseif (preg_match('/\n1 ABBR (.+)/', $gedrec, $match)) { + $name = $match[1]; + } else { + $name = $xref; + } + Database::prepare( + "INSERT INTO `##sources` (s_id, s_file, s_name, s_gedcom) VALUES (?, ?, LEFT(?, 255), ?)" + )->execute([ + $xref, $tree_id, $name, $gedrec, + ]); + // Update the cross-reference/index tables. + self::updateLinks($xref, $tree_id, $gedrec); + self::updateNames($xref, $tree_id, $record); + break; + case 'REPO': + // Convert inline media into media objects + $gedrec = self::convertInlineMedia($tree, $gedrec); - foreach ($record->mediaFiles() as $media_file) { + $record = new Repository($xref, $gedrec, null, $tree); Database::prepare( - "INSERT INTO `##media_file` (m_id, m_file, multimedia_file_refn, multimedia_format, source_media_type, descriptive_title) VALUES (:m_id, :m_file, LEFT(:multimedia_file_refn, 512), LEFT(:multimedia_format, 4), LEFT(:source_media_type, 15), LEFT(:descriptive_title, 248))" + "INSERT INTO `##other` (o_id, o_file, o_type, o_gedcom) VALUES (?, ?, 'REPO', ?)" )->execute([ - 'm_id' => $xref, - 'm_file' => $tree_id, - 'multimedia_file_refn' => $media_file->filename(), - 'multimedia_format' => $media_file->format(), - 'source_media_type' => $media_file->type(), - 'descriptive_title' => $media_file->title(), + $xref, $tree_id, $gedrec, + ]); + // Update the cross-reference/index tables. + self::updateLinks($xref, $tree_id, $gedrec); + self::updateNames($xref, $tree_id, $record); + break; + case 'NOTE': + $record = new Note($xref, $gedrec, null, $tree); + Database::prepare( + "INSERT INTO `##other` (o_id, o_file, o_type, o_gedcom) VALUES (?, ?, 'NOTE', ?)" + )->execute([ + $xref, $tree_id, $gedrec, + ]); + // Update the cross-reference/index tables. + self::updateLinks($xref, $tree_id, $gedrec); + self::updateNames($xref, $tree_id, $record); + break; + case 'OBJE': + $record = new Media($xref, $gedrec, null, $tree); + Database::prepare( + "INSERT INTO `##media` (m_id, m_file, m_gedcom) VALUES (:m_id, :m_file, :m_gedcom)" + )->execute([ + 'm_id' => $xref, + 'm_file' => $tree_id, + 'm_gedcom' => $gedrec, ]); - } - // Update the cross-reference/index tables. - self::updateLinks($xref, $tree_id, $gedrec); - self::updateNames($xref, $tree_id, $record); - break; - default: // HEAD, TRLR, SUBM, SUBN, and custom record types. - // Force HEAD records to have a creation date. - if ($type === 'HEAD' && strpos($gedrec, "\n1 DATE ") === false) { - $gedrec .= "\n1 DATE " . date('j M Y'); - } - Database::prepare( - "INSERT INTO `##other` (o_id, o_file, o_type, o_gedcom) VALUES (?, ?, LEFT(?, 15), ?)" - )->execute([$xref, $tree_id, $type, $gedrec]); - // Update the cross-reference/index tables. - self::updateLinks($xref, $tree_id, $gedrec); - break; + foreach ($record->mediaFiles() as $media_file) { + Database::prepare( + "INSERT INTO `##media_file` (m_id, m_file, multimedia_file_refn, multimedia_format, source_media_type, descriptive_title) VALUES (:m_id, :m_file, LEFT(:multimedia_file_refn, 512), LEFT(:multimedia_format, 4), LEFT(:source_media_type, 15), LEFT(:descriptive_title, 248))" + )->execute([ + 'm_id' => $xref, + 'm_file' => $tree_id, + 'multimedia_file_refn' => $media_file->filename(), + 'multimedia_format' => $media_file->format(), + 'source_media_type' => $media_file->type(), + 'descriptive_title' => $media_file->title(), + ]); + } + + // Update the cross-reference/index tables. + self::updateLinks($xref, $tree_id, $gedrec); + self::updateNames($xref, $tree_id, $record); + break; + default: // HEAD, TRLR, SUBM, SUBN, and custom record types. + // Force HEAD records to have a creation date. + if ($type === 'HEAD' && strpos($gedrec, "\n1 DATE ") === false) { + $gedrec .= "\n1 DATE " . date('j M Y'); + } + Database::prepare( + "INSERT INTO `##other` (o_id, o_file, o_type, o_gedcom) VALUES (?, ?, LEFT(?, 15), ?)" + )->execute([$xref, $tree_id, $type, $gedrec]); + // Update the cross-reference/index tables. + self::updateLinks($xref, $tree_id, $gedrec); + break; } } @@ -1170,21 +1170,21 @@ class FunctionsImport { Database::prepare("DELETE FROM `##link` WHERE l_from=? AND l_file=?")->execute([$gid, $ged_id]); switch ($type) { - case 'INDI': - Database::prepare("DELETE FROM `##individuals` WHERE i_id=? AND i_file=?")->execute([$gid, $ged_id]); - break; - case 'FAM': - Database::prepare("DELETE FROM `##families` WHERE f_id=? AND f_file=?")->execute([$gid, $ged_id]); - break; - case 'SOUR': - Database::prepare("DELETE FROM `##sources` WHERE s_id=? AND s_file=?")->execute([$gid, $ged_id]); - break; - case 'OBJE': - Database::prepare("DELETE FROM `##media` WHERE m_id=? AND m_file=?")->execute([$gid, $ged_id]); - break; - default: - Database::prepare("DELETE FROM `##other` WHERE o_id=? AND o_file=?")->execute([$gid, $ged_id]); - break; + case 'INDI': + Database::prepare("DELETE FROM `##individuals` WHERE i_id=? AND i_file=?")->execute([$gid, $ged_id]); + break; + case 'FAM': + Database::prepare("DELETE FROM `##families` WHERE f_id=? AND f_file=?")->execute([$gid, $ged_id]); + break; + case 'SOUR': + Database::prepare("DELETE FROM `##sources` WHERE s_id=? AND s_file=?")->execute([$gid, $ged_id]); + break; + case 'OBJE': + Database::prepare("DELETE FROM `##media` WHERE m_id=? AND m_file=?")->execute([$gid, $ged_id]); + break; + default: + Database::prepare("DELETE FROM `##other` WHERE o_id=? AND o_file=?")->execute([$gid, $ged_id]); + break; } if (!$delete) { diff --git a/app/Functions/FunctionsMedia.php b/app/Functions/FunctionsMedia.php index 41e774d3df..d4a4cbd1b0 100644 --- a/app/Functions/FunctionsMedia.php +++ b/app/Functions/FunctionsMedia.php @@ -32,17 +32,17 @@ class FunctionsMedia { $val = -1; } switch (substr($val, -1)) { - case 'g': - case 'G': - return (int) $val * 1024 * 1024 * 1024; - case 'm': - case 'M': - return (int) $val * 1024 * 1024; - case 'k': - case 'K': - return (int) $val * 1024; - default: - return (int) $val; + case 'g': + case 'G': + return (int) $val * 1024 * 1024 * 1024; + case 'm': + case 'M': + return (int) $val * 1024 * 1024; + case 'k': + case 'K': + return (int) $val * 1024; + default: + return (int) $val; } } diff --git a/app/Functions/FunctionsPrint.php b/app/Functions/FunctionsPrint.php index 619d6de9fc..70b70435d8 100644 --- a/app/Functions/FunctionsPrint.php +++ b/app/Functions/FunctionsPrint.php @@ -220,25 +220,25 @@ class FunctionsPrint { $age = Date::getAge($parent->getBirthDate(), $birth_date, 2); $deatdate = $parent->getDeathDate(); switch ($parent->getSex()) { - case 'F': - // Highlight mothers who die in childbirth or shortly afterwards - if ($deatdate->isOK() && $deatdate->maximumJulianDay() < $birth_date->minimumJulianDay() + 90) { - $html .= ' <span title="' . GedcomTag::getLabel('_DEAT_PARE', $parent) . '" class="parentdeath">' . $sex . $age . '</span>'; - } else { - $html .= ' <span title="' . I18N::translate('Mother’s age') . '">' . $sex . $age . '</span>'; - } - break; - case 'M': - // Highlight fathers who die before the birth - if ($deatdate->isOK() && $deatdate->maximumJulianDay() < $birth_date->minimumJulianDay()) { - $html .= ' <span title="' . GedcomTag::getLabel('_DEAT_PARE', $parent) . '" class="parentdeath">' . $sex . $age . '</span>'; - } else { - $html .= ' <span title="' . I18N::translate('Father’s age') . '">' . $sex . $age . '</span>'; - } - break; - default: - $html .= ' <span title="' . I18N::translate('Parent’s age') . '">' . $sex . $age . '</span>'; - break; + case 'F': + // Highlight mothers who die in childbirth or shortly afterwards + if ($deatdate->isOK() && $deatdate->maximumJulianDay() < $birth_date->minimumJulianDay() + 90) { + $html .= ' <span title="' . GedcomTag::getLabel('_DEAT_PARE', $parent) . '" class="parentdeath">' . $sex . $age . '</span>'; + } else { + $html .= ' <span title="' . I18N::translate('Mother’s age') . '">' . $sex . $age . '</span>'; + } + break; + case 'M': + // Highlight fathers who die before the birth + if ($deatdate->isOK() && $deatdate->maximumJulianDay() < $birth_date->minimumJulianDay()) { + $html .= ' <span title="' . GedcomTag::getLabel('_DEAT_PARE', $parent) . '" class="parentdeath">' . $sex . $age . '</span>'; + } else { + $html .= ' <span title="' . I18N::translate('Father’s age') . '">' . $sex . $age . '</span>'; + } + break; + default: + $html .= ' <span title="' . I18N::translate('Parent’s age') . '">' . $sex . $age . '</span>'; + break; } } } @@ -533,38 +533,38 @@ class FunctionsPrint { // -- Add from pick list switch ($type) { - case 'INDI': - $addfacts = preg_split('/[, ;:]+/', $WT_TREE->getPreference('INDI_FACTS_ADD'), -1, PREG_SPLIT_NO_EMPTY); - $uniquefacts = preg_split('/[, ;:]+/', $WT_TREE->getPreference('INDI_FACTS_UNIQUE'), -1, PREG_SPLIT_NO_EMPTY); - $quickfacts = preg_split('/[, ;:]+/', $WT_TREE->getPreference('INDI_FACTS_QUICK'), -1, PREG_SPLIT_NO_EMPTY); - break; - case 'FAM': - $addfacts = preg_split('/[, ;:]+/', $WT_TREE->getPreference('FAM_FACTS_ADD'), -1, PREG_SPLIT_NO_EMPTY); - $uniquefacts = preg_split('/[, ;:]+/', $WT_TREE->getPreference('FAM_FACTS_UNIQUE'), -1, PREG_SPLIT_NO_EMPTY); - $quickfacts = preg_split('/[, ;:]+/', $WT_TREE->getPreference('FAM_FACTS_QUICK'), -1, PREG_SPLIT_NO_EMPTY); - break; - case 'SOUR': - $addfacts = preg_split('/[, ;:]+/', $WT_TREE->getPreference('SOUR_FACTS_ADD'), -1, PREG_SPLIT_NO_EMPTY); - $uniquefacts = preg_split('/[, ;:]+/', $WT_TREE->getPreference('SOUR_FACTS_UNIQUE'), -1, PREG_SPLIT_NO_EMPTY); - $quickfacts = preg_split('/[, ;:]+/', $WT_TREE->getPreference('SOUR_FACTS_QUICK'), -1, PREG_SPLIT_NO_EMPTY); - break; - case 'NOTE': - $addfacts = preg_split('/[, ;:]+/', $WT_TREE->getPreference('NOTE_FACTS_ADD'), -1, PREG_SPLIT_NO_EMPTY); - $uniquefacts = preg_split('/[, ;:]+/', $WT_TREE->getPreference('NOTE_FACTS_UNIQUE'), -1, PREG_SPLIT_NO_EMPTY); - $quickfacts = preg_split('/[, ;:]+/', $WT_TREE->getPreference('NOTE_FACTS_QUICK'), -1, PREG_SPLIT_NO_EMPTY); - break; - case 'REPO': - $addfacts = preg_split('/[, ;:]+/', $WT_TREE->getPreference('REPO_FACTS_ADD'), -1, PREG_SPLIT_NO_EMPTY); - $uniquefacts = preg_split('/[, ;:]+/', $WT_TREE->getPreference('REPO_FACTS_UNIQUE'), -1, PREG_SPLIT_NO_EMPTY); - $quickfacts = preg_split('/[, ;:]+/', $WT_TREE->getPreference('REPO_FACTS_QUICK'), -1, PREG_SPLIT_NO_EMPTY); - break; - case 'OBJE': - $addfacts = ['NOTE']; - $uniquefacts = ['_PRIM']; - $quickfacts = []; - break; - default: - return; + case 'INDI': + $addfacts = preg_split('/[, ;:]+/', $WT_TREE->getPreference('INDI_FACTS_ADD'), -1, PREG_SPLIT_NO_EMPTY); + $uniquefacts = preg_split('/[, ;:]+/', $WT_TREE->getPreference('INDI_FACTS_UNIQUE'), -1, PREG_SPLIT_NO_EMPTY); + $quickfacts = preg_split('/[, ;:]+/', $WT_TREE->getPreference('INDI_FACTS_QUICK'), -1, PREG_SPLIT_NO_EMPTY); + break; + case 'FAM': + $addfacts = preg_split('/[, ;:]+/', $WT_TREE->getPreference('FAM_FACTS_ADD'), -1, PREG_SPLIT_NO_EMPTY); + $uniquefacts = preg_split('/[, ;:]+/', $WT_TREE->getPreference('FAM_FACTS_UNIQUE'), -1, PREG_SPLIT_NO_EMPTY); + $quickfacts = preg_split('/[, ;:]+/', $WT_TREE->getPreference('FAM_FACTS_QUICK'), -1, PREG_SPLIT_NO_EMPTY); + break; + case 'SOUR': + $addfacts = preg_split('/[, ;:]+/', $WT_TREE->getPreference('SOUR_FACTS_ADD'), -1, PREG_SPLIT_NO_EMPTY); + $uniquefacts = preg_split('/[, ;:]+/', $WT_TREE->getPreference('SOUR_FACTS_UNIQUE'), -1, PREG_SPLIT_NO_EMPTY); + $quickfacts = preg_split('/[, ;:]+/', $WT_TREE->getPreference('SOUR_FACTS_QUICK'), -1, PREG_SPLIT_NO_EMPTY); + break; + case 'NOTE': + $addfacts = preg_split('/[, ;:]+/', $WT_TREE->getPreference('NOTE_FACTS_ADD'), -1, PREG_SPLIT_NO_EMPTY); + $uniquefacts = preg_split('/[, ;:]+/', $WT_TREE->getPreference('NOTE_FACTS_UNIQUE'), -1, PREG_SPLIT_NO_EMPTY); + $quickfacts = preg_split('/[, ;:]+/', $WT_TREE->getPreference('NOTE_FACTS_QUICK'), -1, PREG_SPLIT_NO_EMPTY); + break; + case 'REPO': + $addfacts = preg_split('/[, ;:]+/', $WT_TREE->getPreference('REPO_FACTS_ADD'), -1, PREG_SPLIT_NO_EMPTY); + $uniquefacts = preg_split('/[, ;:]+/', $WT_TREE->getPreference('REPO_FACTS_UNIQUE'), -1, PREG_SPLIT_NO_EMPTY); + $quickfacts = preg_split('/[, ;:]+/', $WT_TREE->getPreference('REPO_FACTS_QUICK'), -1, PREG_SPLIT_NO_EMPTY); + break; + case 'OBJE': + $addfacts = ['NOTE']; + $uniquefacts = ['_PRIM']; + $quickfacts = []; + break; + default: + return; } $addfacts = array_merge(self::checkFactUnique($uniquefacts, $usedfacts, $type), $addfacts); $quickfacts = array_intersect($quickfacts, $addfacts); diff --git a/app/Functions/FunctionsPrintFacts.php b/app/Functions/FunctionsPrintFacts.php index 9ea444efa6..e9c513a676 100644 --- a/app/Functions/FunctionsPrintFacts.php +++ b/app/Functions/FunctionsPrintFacts.php @@ -63,34 +63,34 @@ class FunctionsPrintFacts { // Some facts don't get printed here ... switch ($fact->getTag()) { - case 'NOTE': - self::printMainNotes($fact, 1); + case 'NOTE': + self::printMainNotes($fact, 1); - return; - case 'SOUR': - self::printMainSources($fact, 1); + return; + case 'SOUR': + self::printMainSources($fact, 1); - return; - case 'OBJE': - self::printMainMedia($fact, 1); + return; + case 'OBJE': + self::printMainMedia($fact, 1); - return; - case 'FAMC': - case 'FAMS': - case 'CHIL': - case 'HUSB': - case 'WIFE': - // These are internal links, not facts - return; - case '_WT_OBJE_SORT': - // These links are used internally to record the sort order. - return; - default: - // Hide unrecognized/custom tags? - if ($fact->getParent()->getTree()->getPreference('HIDE_GEDCOM_ERRORS') === '0' && !GedcomTag::isTag($fact->getTag())) { return; - } - break; + case 'FAMC': + case 'FAMS': + case 'CHIL': + case 'HUSB': + case 'WIFE': + // These are internal links, not facts + return; + case '_WT_OBJE_SORT': + // These links are used internally to record the sort order. + return; + default: + // Hide unrecognized/custom tags? + if ($fact->getParent()->getTree()->getPreference('HIDE_GEDCOM_ERRORS') === '0' && !GedcomTag::isTag($fact->getTag())) { + return; + } + break; } // Who is this fact about? Need it to translate fact label correctly @@ -134,35 +134,35 @@ class FunctionsPrintFacts { } switch ($fact->getTag()) { - case 'EVEN': - case 'FACT': - if (GedcomTag::isTag($type)) { - // Some users (just Meliza?) use "1 EVEN/2 TYPE BIRT". Translate the TYPE. - $label = GedcomTag::getLabel($type, $label_person); - $type = ''; // Do not print this again - } elseif ($type) { - // We don't have a translation for $type - but a custom translation might exist. - $label = I18N::translate(Html::escape($type)); - $type = ''; // Do not print this again - } else { - // An unspecified fact/event - $label = $fact->getLabel(); - } - break; - case 'MARR': - // This is a hack for a proprietory extension. Is it still used/needed? - $utype = strtoupper($type); - if ($utype == 'CIVIL' || $utype == 'PARTNERS' || $utype == 'RELIGIOUS') { - $label = GedcomTag::getLabel('MARR_' . $utype, $label_person); - $type = ''; // Do not print this again - } else { + case 'EVEN': + case 'FACT': + if (GedcomTag::isTag($type)) { + // Some users (just Meliza?) use "1 EVEN/2 TYPE BIRT". Translate the TYPE. + $label = GedcomTag::getLabel($type, $label_person); + $type = ''; // Do not print this again + } elseif ($type) { + // We don't have a translation for $type - but a custom translation might exist. + $label = I18N::translate(Html::escape($type)); + $type = ''; // Do not print this again + } else { + // An unspecified fact/event + $label = $fact->getLabel(); + } + break; + case 'MARR': + // This is a hack for a proprietory extension. Is it still used/needed? + $utype = strtoupper($type); + if ($utype == 'CIVIL' || $utype == 'PARTNERS' || $utype == 'RELIGIOUS') { + $label = GedcomTag::getLabel('MARR_' . $utype, $label_person); + $type = ''; // Do not print this again + } else { + $label = $fact->getLabel(); + } + break; + default: + // Normal fact/event $label = $fact->getLabel(); - } - break; - default: - // Normal fact/event - $label = $fact->getLabel(); - break; + break; } echo '<tr class="', $styleadd, '">'; @@ -173,16 +173,16 @@ class FunctionsPrintFacts { } switch ($fact->getTag()) { - case '_BIRT_CHIL': - $children[$fact->getParent()->getXref()] = true; - $label .= '<br>' . /* I18N: Abbreviation for "number %s" */ I18N::translate('#%s', count($children)); - break; - case '_BIRT_GCHI': - case '_BIRT_GCH1': - case '_BIRT_GCH2': - $grandchildren[$fact->getParent()->getXref()] = true; - $label .= '<br>' . /* I18N: Abbreviation for "number %s" */ I18N::translate('#%s', count($grandchildren)); - break; + case '_BIRT_CHIL': + $children[$fact->getParent()->getXref()] = true; + $label .= '<br>' . /* I18N: Abbreviation for "number %s" */ I18N::translate('#%s', count($children)); + break; + case '_BIRT_GCHI': + case '_BIRT_GCH1': + case '_BIRT_GCH2': + $grandchildren[$fact->getParent()->getXref()] = true; + $label .= '<br>' . /* I18N: Abbreviation for "number %s" */ I18N::translate('#%s', count($grandchildren)); + break; } if ($fact->getFactId() != 'histo' && $fact->canEdit()) { @@ -217,87 +217,87 @@ class FunctionsPrintFacts { // Print the value of this fact/event switch ($fact->getTag()) { - case 'ADDR': - echo $fact->getValue(); - break; - case 'AFN': - echo '<div class="field"><a href="https://familysearch.org/search/tree/results#count=20&query=afn:', rawurlencode($fact->getValue()), '">', Html::escape($fact->getValue()), '</a></div>'; - break; - case 'ASSO': - // we handle this later, in format_asso_rela_record() - break; - case 'EMAIL': - case 'EMAI': - case '_EMAIL': - echo '<div class="field"><a href="mailto:', Html::escape($fact->getValue()), '">', Html::escape($fact->getValue()), '</a></div>'; - break; - case 'RESN': - echo '<div class="field">'; - switch ($fact->getValue()) { - case 'none': - // Note: "1 RESN none" is not valid gedcom. - // However, webtrees privacy rules will interpret it as "show an otherwise private record to public". - echo '<i class="icon-resn-none"></i> ', I18N::translate('Show to visitors'); - break; - case 'privacy': - echo '<i class="icon-class-none"></i> ', I18N::translate('Show to members'); - break; - case 'confidential': - echo '<i class="icon-confidential-none"></i> ', I18N::translate('Show to managers'); - break; - case 'locked': - echo '<i class="icon-locked-none"></i> ', I18N::translate('Only managers can edit'); - break; - default: - echo Html::escape($fact->getValue()); - break; - } + case 'ADDR': + echo $fact->getValue(); + break; + case 'AFN': + echo '<div class="field"><a href="https://familysearch.org/search/tree/results#count=20&query=afn:', rawurlencode($fact->getValue()), '">', Html::escape($fact->getValue()), '</a></div>'; + break; + case 'ASSO': + // we handle this later, in format_asso_rela_record() + break; + case 'EMAIL': + case 'EMAI': + case '_EMAIL': + echo '<div class="field"><a href="mailto:', Html::escape($fact->getValue()), '">', Html::escape($fact->getValue()), '</a></div>'; + break; + case 'RESN': + echo '<div class="field">'; + switch ($fact->getValue()) { + case 'none': + // Note: "1 RESN none" is not valid gedcom. + // However, webtrees privacy rules will interpret it as "show an otherwise private record to public". + echo '<i class="icon-resn-none"></i> ', I18N::translate('Show to visitors'); + break; + case 'privacy': + echo '<i class="icon-class-none"></i> ', I18N::translate('Show to members'); + break; + case 'confidential': + echo '<i class="icon-confidential-none"></i> ', I18N::translate('Show to managers'); + break; + case 'locked': + echo '<i class="icon-locked-none"></i> ', I18N::translate('Only managers can edit'); + break; + default: + echo Html::escape($fact->getValue()); + break; + } echo '</div>'; break; - case 'PUBL': // Publication details might contain URLs. - echo '<div class="field">', Filter::expandUrls($fact->getValue(), $record->getTree()), '</div>'; - break; - case 'REPO': - if (preg_match('/^@(' . WT_REGEX_XREF . ')@$/', $fact->getValue(), $match)) { - self::printRepositoryRecord($match[1]); - } else { - echo '<div class="error">', Html::escape($fact->getValue()), '</div>'; - } - break; - case 'URL': - case '_URL': - case 'WWW': - echo '<div class="field"><a href="', Html::escape($fact->getValue()), '">', Html::escape($fact->getValue()), '</a></div>'; - break; - case 'TEXT': // 0 SOUR / 1 TEXT - echo '<div class="field">', nl2br(Html::escape($fact->getValue()), false), '</div>'; - break; - default: - // Display the value for all other facts/events - switch ($fact->getValue()) { - case '': - // Nothing to display - break; - case 'N': - // Not valid GEDCOM - echo '<div class="field">', I18N::translate('No'), '</div>'; - break; - case 'Y': - // Do not display "Yes". - break; - default: - if (preg_match('/^@(' . WT_REGEX_XREF . ')@$/', $fact->getValue(), $match)) { - $target = GedcomRecord::getInstance($match[1], $fact->getParent()->getTree()); - if ($target) { - echo '<div><a href="', $target->getHtmlUrl(), '">', $target->getFullName(), '</a></div>'; + case 'PUBL': // Publication details might contain URLs. + echo '<div class="field">', Filter::expandUrls($fact->getValue(), $record->getTree()), '</div>'; + break; + case 'REPO': + if (preg_match('/^@(' . WT_REGEX_XREF . ')@$/', $fact->getValue(), $match)) { + self::printRepositoryRecord($match[1]); } else { echo '<div class="error">', Html::escape($fact->getValue()), '</div>'; } - } else { - echo '<div class="field"><span dir="auto">', Html::escape($fact->getValue()), '</span></div>'; - } - break; - } + break; + case 'URL': + case '_URL': + case 'WWW': + echo '<div class="field"><a href="', Html::escape($fact->getValue()), '">', Html::escape($fact->getValue()), '</a></div>'; + break; + case 'TEXT': // 0 SOUR / 1 TEXT + echo '<div class="field">', nl2br(Html::escape($fact->getValue()), false), '</div>'; + break; + default: + // Display the value for all other facts/events + switch ($fact->getValue()) { + case '': + // Nothing to display + break; + case 'N': + // Not valid GEDCOM + echo '<div class="field">', I18N::translate('No'), '</div>'; + break; + case 'Y': + // Do not display "Yes". + break; + default: + if (preg_match('/^@(' . WT_REGEX_XREF . ')@$/', $fact->getValue(), $match)) { + $target = GedcomRecord::getInstance($match[1], $fact->getParent()->getTree()); + if ($target) { + echo '<div><a href="', $target->getHtmlUrl(), '">', $target->getFullName(), '</a></div>'; + } else { + echo '<div class="error">', Html::escape($fact->getValue()), '</div>'; + } + } else { + echo '<div class="field"><span dir="auto">', Html::escape($fact->getValue()), '</span></div>'; + } + break; + } break; } @@ -337,123 +337,123 @@ class FunctionsPrintFacts { preg_match_all('/\n2 (' . WT_REGEX_TAG . ') (.+)/', $fact->getGedcom(), $matches, PREG_SET_ORDER); foreach ($matches as $match) { switch ($match[1]) { - case 'DATE': - case 'TIME': - case 'AGE': - case 'PLAC': - case 'ADDR': - case 'ALIA': - case 'ASSO': - case '_ASSO': - case 'DESC': - case 'RELA': - case 'STAT': - case 'TEMP': - case 'TYPE': - case 'FAMS': - case 'CONT': - // These were already shown at the beginning - break; - case 'NOTE': - case 'OBJE': - case 'SOUR': - // These will be shown at the end - break; - case '_UID': - case 'RIN': - // These don't belong at level 2, so do not display them. - // They are only shown when editing. - break; - case 'EVEN': // 0 SOUR / 1 DATA / 2 EVEN / 3 DATE / 3 PLAC - $events = []; - foreach (preg_split('/ *, */', $match[2]) as $event) { - $events[] = GedcomTag::getLabel($event); - } - if (count($events) == 1) { - echo GedcomTag::getLabelValue('EVEN', $event); - } else { - echo GedcomTag::getLabelValue('EVEN', implode(I18N::$list_separator, $events)); - } - if (preg_match('/\n3 DATE (.+)/', $fact->getGedcom(), $date_match)) { - $date = new Date($date_match[1]); - echo GedcomTag::getLabelValue('DATE', $date->display()); - } - if (preg_match('/\n3 PLAC (.+)/', $fact->getGedcom(), $plac_match)) { - echo GedcomTag::getLabelValue('PLAC', $plac_match[1]); - } - break; - case 'FAMC': // 0 INDI / 1 ADOP / 2 FAMC / 3 ADOP - $family = Family::getInstance(str_replace('@', '', $match[2]), $fact->getParent()->getTree()); - if ($family) { - echo GedcomTag::getLabelValue('FAM', '<a href="' . $family->getHtmlUrl() . '">' . $family->getFullName() . '</a>'); - if (preg_match('/\n3 ADOP (HUSB|WIFE|BOTH)/', $fact->getGedcom(), $match)) { - echo GedcomTag::getLabelValue('ADOP', GedcomCodeAdop::getValue($match[1], $label_person)); + case 'DATE': + case 'TIME': + case 'AGE': + case 'PLAC': + case 'ADDR': + case 'ALIA': + case 'ASSO': + case '_ASSO': + case 'DESC': + case 'RELA': + case 'STAT': + case 'TEMP': + case 'TYPE': + case 'FAMS': + case 'CONT': + // These were already shown at the beginning + break; + case 'NOTE': + case 'OBJE': + case 'SOUR': + // These will be shown at the end + break; + case '_UID': + case 'RIN': + // These don't belong at level 2, so do not display them. + // They are only shown when editing. + break; + case 'EVEN': // 0 SOUR / 1 DATA / 2 EVEN / 3 DATE / 3 PLAC + $events = []; + foreach (preg_split('/ *, */', $match[2]) as $event) { + $events[] = GedcomTag::getLabel($event); + } + if (count($events) == 1) { + echo GedcomTag::getLabelValue('EVEN', $event); + } else { + echo GedcomTag::getLabelValue('EVEN', implode(I18N::$list_separator, $events)); + } + if (preg_match('/\n3 DATE (.+)/', $fact->getGedcom(), $date_match)) { + $date = new Date($date_match[1]); + echo GedcomTag::getLabelValue('DATE', $date->display()); + } + if (preg_match('/\n3 PLAC (.+)/', $fact->getGedcom(), $plac_match)) { + echo GedcomTag::getLabelValue('PLAC', $plac_match[1]); } - } else { - echo GedcomTag::getLabelValue('FAM', '<span class="error">' . $match[2] . '</span>'); - } - break; - case '_WT_USER': - $user = User::findByIdentifier($match[2]); // may not exist - if ($user) { - echo GedcomTag::getLabelValue('_WT_USER', $user->getRealNameHtml()); - } else { - echo GedcomTag::getLabelValue('_WT_USER', Html::escape($match[2])); - } - break; - case 'RESN': - switch ($match[2]) { - case 'none': - // Note: "2 RESN none" is not valid gedcom. - // However, webtrees privacy rules will interpret it as "show an otherwise private fact to public". - echo GedcomTag::getLabelValue('RESN', '<i class="icon-resn-none"></i> ' . I18N::translate('Show to visitors')); - break; - case 'privacy': - echo GedcomTag::getLabelValue('RESN', '<i class="icon-resn-privacy"></i> ' . I18N::translate('Show to members')); - break; - case 'confidential': - echo GedcomTag::getLabelValue('RESN', '<i class="icon-resn-confidential"></i> ' . I18N::translate('Show to managers')); - break; - case 'locked': - echo GedcomTag::getLabelValue('RESN', '<i class="icon-resn-locked"></i> ' . I18N::translate('Only managers can edit')); - break; - default: - echo GedcomTag::getLabelValue('RESN', Html::escape($match[2])); - break; - } break; - case 'CALN': - echo GedcomTag::getLabelValue('CALN', Filter::expandUrls($match[2], $record->getTree())); - break; - case 'FORM': // 0 OBJE / 1 FILE / 2 FORM / 3 TYPE - echo GedcomTag::getLabelValue('FORM', $match[2]); - if (preg_match('/\n3 TYPE (.+)/', $fact->getGedcom(), $type_match)) { - echo GedcomTag::getLabelValue('TYPE', GedcomTag::getFileFormTypeValue($type_match[1])); - } - break; - case 'URL': - case '_URL': - case 'WWW': - $link = '<a href="' . Html::escape($match[2]) . '">' . Html::escape($match[2]) . '</a>'; - echo GedcomTag::getLabelValue($fact->getTag() . ':' . $match[1], $link); - break; - default: - if ($fact->getParent()->getTree()->getPreference('HIDE_GEDCOM_ERRORS') === '1' || GedcomTag::isTag($match[1])) { - if (preg_match('/^@(' . WT_REGEX_XREF . ')@$/', $match[2], $xmatch)) { - // Links - $linked_record = GedcomRecord::getInstance($xmatch[1], $fact->getParent()->getTree()); - if ($linked_record) { - $link = '<a href="' . $linked_record->getHtmlUrl() . '">' . $linked_record->getFullName() . '</a>'; - echo GedcomTag::getLabelValue($fact->getTag() . ':' . $match[1], $link); + case 'FAMC': // 0 INDI / 1 ADOP / 2 FAMC / 3 ADOP + $family = Family::getInstance(str_replace('@', '', $match[2]), $fact->getParent()->getTree()); + if ($family) { + echo GedcomTag::getLabelValue('FAM', '<a href="' . $family->getHtmlUrl() . '">' . $family->getFullName() . '</a>'); + if (preg_match('/\n3 ADOP (HUSB|WIFE|BOTH)/', $fact->getGedcom(), $match)) { + echo GedcomTag::getLabelValue('ADOP', GedcomCodeAdop::getValue($match[1], $label_person)); + } + } else { + echo GedcomTag::getLabelValue('FAM', '<span class="error">' . $match[2] . '</span>'); + } + break; + case '_WT_USER': + $user = User::findByIdentifier($match[2]); // may not exist + if ($user) { + echo GedcomTag::getLabelValue('_WT_USER', $user->getRealNameHtml()); + } else { + echo GedcomTag::getLabelValue('_WT_USER', Html::escape($match[2])); + } + break; + case 'RESN': + switch ($match[2]) { + case 'none': + // Note: "2 RESN none" is not valid gedcom. + // However, webtrees privacy rules will interpret it as "show an otherwise private fact to public". + echo GedcomTag::getLabelValue('RESN', '<i class="icon-resn-none"></i> ' . I18N::translate('Show to visitors')); + break; + case 'privacy': + echo GedcomTag::getLabelValue('RESN', '<i class="icon-resn-privacy"></i> ' . I18N::translate('Show to members')); + break; + case 'confidential': + echo GedcomTag::getLabelValue('RESN', '<i class="icon-resn-confidential"></i> ' . I18N::translate('Show to managers')); + break; + case 'locked': + echo GedcomTag::getLabelValue('RESN', '<i class="icon-resn-locked"></i> ' . I18N::translate('Only managers can edit')); + break; + default: + echo GedcomTag::getLabelValue('RESN', Html::escape($match[2])); + break; + } + break; + case 'CALN': + echo GedcomTag::getLabelValue('CALN', Filter::expandUrls($match[2], $record->getTree())); + break; + case 'FORM': // 0 OBJE / 1 FILE / 2 FORM / 3 TYPE + echo GedcomTag::getLabelValue('FORM', $match[2]); + if (preg_match('/\n3 TYPE (.+)/', $fact->getGedcom(), $type_match)) { + echo GedcomTag::getLabelValue('TYPE', GedcomTag::getFileFormTypeValue($type_match[1])); + } + break; + case 'URL': + case '_URL': + case 'WWW': + $link = '<a href="' . Html::escape($match[2]) . '">' . Html::escape($match[2]) . '</a>'; + echo GedcomTag::getLabelValue($fact->getTag() . ':' . $match[1], $link); + break; + default: + if ($fact->getParent()->getTree()->getPreference('HIDE_GEDCOM_ERRORS') === '1' || GedcomTag::isTag($match[1])) { + if (preg_match('/^@(' . WT_REGEX_XREF . ')@$/', $match[2], $xmatch)) { + // Links + $linked_record = GedcomRecord::getInstance($xmatch[1], $fact->getParent()->getTree()); + if ($linked_record) { + $link = '<a href="' . $linked_record->getHtmlUrl() . '">' . $linked_record->getFullName() . '</a>'; + echo GedcomTag::getLabelValue($fact->getTag() . ':' . $match[1], $link); + } else { + echo GedcomTag::getLabelValue($fact->getTag() . ':' . $match[1], Html::escape($match[2])); + } } else { + // Non links echo GedcomTag::getLabelValue($fact->getTag() . ':' . $match[1], Html::escape($match[2])); } - } else { - // Non links - echo GedcomTag::getLabelValue($fact->getTag() . ':' . $match[1], Html::escape($match[2])); } - } - break; + break; } } echo self::printFactSources($fact->getGedcom(), 2); @@ -800,23 +800,23 @@ class FunctionsPrintFacts { foreach ($rmatches[1] as $rmatch) { echo '<br><span class="label">', GedcomTag::getLabel('RESN'), ':</span> <span class="field">'; switch ($rmatch) { - case 'none': - // Note: "2 RESN none" is not valid gedcom, and the GUI will not let you add it. - // However, webtrees privacy rules will interpret it as "show an otherwise private fact to public". - echo '<i class="icon-resn-none"></i> ', I18N::translate('Show to visitors'); - break; - case 'privacy': - echo '<i class="icon-resn-privacy"></i> ', I18N::translate('Show to members'); - break; - case 'confidential': - echo '<i class="icon-resn-confidential"></i> ', I18N::translate('Show to managers'); - break; - case 'locked': - echo '<i class="icon-resn-locked"></i> ', I18N::translate('Only managers can edit'); - break; - default: - echo $rmatch; - break; + case 'none': + // Note: "2 RESN none" is not valid gedcom, and the GUI will not let you add it. + // However, webtrees privacy rules will interpret it as "show an otherwise private fact to public". + echo '<i class="icon-resn-none"></i> ', I18N::translate('Show to visitors'); + break; + case 'privacy': + echo '<i class="icon-resn-privacy"></i> ', I18N::translate('Show to members'); + break; + case 'confidential': + echo '<i class="icon-resn-confidential"></i> ', I18N::translate('Show to managers'); + break; + case 'locked': + echo '<i class="icon-resn-locked"></i> ', I18N::translate('Only managers can edit'); + break; + default: + echo $rmatch; + break; } echo '</span>'; } @@ -1053,23 +1053,23 @@ class FunctionsPrintFacts { foreach ($matches[1] as $match) { echo '<br><span class="label">', GedcomTag::getLabel('RESN'), ':</span> <span class="field">'; switch ($match) { - case 'none': - // Note: "2 RESN none" is not valid gedcom, and the GUI will not let you add it. - // However, webtrees privacy rules will interpret it as "show an otherwise private fact to public". - echo '<i class="icon-resn-none"></i> ', I18N::translate('Show to visitors'); - break; - case 'privacy': - echo '<i class="icon-resn-privacy"></i> ', I18N::translate('Show to members'); - break; - case 'confidential': - echo '<i class="icon-resn-confidential"></i> ', I18N::translate('Show to managers'); - break; - case 'locked': - echo '<i class="icon-resn-locked"></i> ', I18N::translate('Only managers can edit'); - break; - default: - echo $match; - break; + case 'none': + // Note: "2 RESN none" is not valid gedcom, and the GUI will not let you add it. + // However, webtrees privacy rules will interpret it as "show an otherwise private fact to public". + echo '<i class="icon-resn-none"></i> ', I18N::translate('Show to visitors'); + break; + case 'privacy': + echo '<i class="icon-resn-privacy"></i> ', I18N::translate('Show to members'); + break; + case 'confidential': + echo '<i class="icon-resn-confidential"></i> ', I18N::translate('Show to managers'); + break; + case 'locked': + echo '<i class="icon-resn-locked"></i> ', I18N::translate('Only managers can edit'); + break; + default: + echo $match; + break; } echo '</span>'; } diff --git a/app/Functions/FunctionsPrintLists.php b/app/Functions/FunctionsPrintLists.php index 19d948ab07..c13b21f32a 100644 --- a/app/Functions/FunctionsPrintLists.php +++ b/app/Functions/FunctionsPrintLists.php @@ -1395,37 +1395,37 @@ class FunctionsPrintLists { $html[] = $subhtml; } switch ($style) { - case 1: - return '<ul><li>' . implode('</li><li>', $html) . '</li></ul>'; - case 2: - return implode(I18N::$list_separator, $html); - case 3: - $i = 0; - $count = count($html); - if ($count > 36) { - $col = 4; - } elseif ($count > 18) { - $col = 3; - } elseif ($count > 6) { - $col = 2; - } else { - $col = 1; - } - $newcol = ceil($count / $col); - $html2 = '<table class="list_table"><tr>'; - $html2 .= '<td class="list_value" style="padding: 14px;">'; + case 1: + return '<ul><li>' . implode('</li><li>', $html) . '</li></ul>'; + case 2: + return implode(I18N::$list_separator, $html); + case 3: + $i = 0; + $count = count($html); + if ($count > 36) { + $col = 4; + } elseif ($count > 18) { + $col = 3; + } elseif ($count > 6) { + $col = 2; + } else { + $col = 1; + } + $newcol = ceil($count / $col); + $html2 = '<table class="list_table"><tr>'; + $html2 .= '<td class="list_value" style="padding: 14px;">'; - foreach ($html as $surns) { - $html2 .= $surns . '<br>'; - $i++; - if ($i == $newcol && $i < $count) { - $html2 .= '</td><td class="list_value" style="padding: 14px;">'; - $newcol = $i + ceil($count / $col); + foreach ($html as $surns) { + $html2 .= $surns . '<br>'; + $i++; + if ($i == $newcol && $i < $count) { + $html2 .= '</td><td class="list_value" style="padding: 14px;">'; + $newcol = $i + ceil($count / $col); + } } - } - $html2 .= '</td></tr></table>'; + $html2 .= '</td></tr></table>'; - return $html2; + return $html2; } } /** @@ -1602,14 +1602,14 @@ class FunctionsPrintLists { // Now we've filtered the list, we can sort by event, if required switch ($sort_by) { - case 'anniv': - // Data is already sorted by anniversary date - break; - case 'alpha': - uasort($filtered_events, function (Fact $x, Fact $y) { - return GedcomRecord::compare($x->getParent(), $y->getParent()); - }); - break; + case 'anniv': + // Data is already sorted by anniversary date + break; + case 'alpha': + uasort($filtered_events, function (Fact $x, Fact $y) { + return GedcomRecord::compare($x->getParent(), $y->getParent()); + }); + break; } foreach ($filtered_events as $fact) { diff --git a/app/Functions/FunctionsRtl.php b/app/Functions/FunctionsRtl.php index 8998781532..4f006a5e4f 100644 --- a/app/Functions/FunctionsRtl.php +++ b/app/Functions/FunctionsRtl.php @@ -124,227 +124,227 @@ class FunctionsRtl { $closeParIndex = strpos(self::CLOSE_PARENTHESES, $currentLetter); // Which closing parenthesis is this? switch ($currentLetter) { - case '<': - // Assume this '<' starts an HTML element - $endPos = strpos($workingText, '>'); // look for the terminating '>' - if ($endPos === false) { - $endPos = 0; - } - $currentLen += $endPos; - $element = substr($workingText, 0, $currentLen); - $temp = strtolower(substr($element, 0, 3)); - if (strlen($element) < 7 && $temp == '<br') { - if ($numberState) { - $numberState = false; - if (self::$currentState == 'RTL') { - self::$waitingText .= WT_UTF8_PDF; + case '<': + // Assume this '<' starts an HTML element + $endPos = strpos($workingText, '>'); // look for the terminating '>' + if ($endPos === false) { + $endPos = 0; + } + $currentLen += $endPos; + $element = substr($workingText, 0, $currentLen); + $temp = strtolower(substr($element, 0, 3)); + if (strlen($element) < 7 && $temp == '<br') { + if ($numberState) { + $numberState = false; + if (self::$currentState == 'RTL') { + self::$waitingText .= WT_UTF8_PDF; + } } + self::breakCurrentSpan($result); + } elseif (self::$waitingText == '') { + $result .= $element; + } else { + self::$waitingText .= $element; } - self::breakCurrentSpan($result); - } elseif (self::$waitingText == '') { - $result .= $element; - } else { - self::$waitingText .= $element; - } - $workingText = substr($workingText, $currentLen); - break; - case '&': - // Assume this '&' starts an HTML entity - $endPos = strpos($workingText, ';'); // look for the terminating ';' - if ($endPos === false) { - $endPos = 0; - } - $currentLen += $endPos; - $entity = substr($workingText, 0, $currentLen); - if (strtolower($entity) == ' ') { - $entity .= ' '; // Ensure consistent case for this entity - } - if (self::$waitingText == '') { - $result .= $entity; - } else { - self::$waitingText .= $entity; - } - $workingText = substr($workingText, $currentLen); - break; - case '{': - if (substr($workingText, 1, 1) == '{') { - // Assume this '{{' starts a TCPDF directive - $endPos = strpos($workingText, '}}'); // look for the terminating '}}' + $workingText = substr($workingText, $currentLen); + break; + case '&': + // Assume this '&' starts an HTML entity + $endPos = strpos($workingText, ';'); // look for the terminating ';' if ($endPos === false) { $endPos = 0; } - $currentLen = $endPos + 2; - $directive = substr($workingText, 0, $currentLen); - $workingText = substr($workingText, $currentLen); - $result = $result . self::$waitingText . $directive; - self::$waitingText = ''; + $currentLen += $endPos; + $entity = substr($workingText, 0, $currentLen); + if (strtolower($entity) == ' ') { + $entity .= ' '; // Ensure consistent case for this entity + } + if (self::$waitingText == '') { + $result .= $entity; + } else { + self::$waitingText .= $entity; + } + $workingText = substr($workingText, $currentLen); break; - } - default: - // Look for strings of numbers with optional leading or trailing + or - - // and with optional embedded numeric punctuation - if ($numberState) { - // If we're inside a numeric string, look for reasons to end it - $offset = 0; // Be sure to look at the current character first - $charArray = self::getChar($workingText . "\n", $offset); - if (strpos(self::NUMBERS, $charArray['letter']) === false) { - // This is not a digit. Is it numeric punctuation? - if (substr($workingText . "\n", $offset, 6) == ' ') { - $offset += 6; // This could be numeric punctuation - } elseif (strpos(self::NUMBER_PUNCTUATION, $charArray['letter']) !== false) { - $offset += $charArray['length']; // This could be numeric punctuation + case '{': + if (substr($workingText, 1, 1) == '{') { + // Assume this '{{' starts a TCPDF directive + $endPos = strpos($workingText, '}}'); // look for the terminating '}}' + if ($endPos === false) { + $endPos = 0; } - // If the next character is a digit, the current character is numeric punctuation + $currentLen = $endPos + 2; + $directive = substr($workingText, 0, $currentLen); + $workingText = substr($workingText, $currentLen); + $result = $result . self::$waitingText . $directive; + self::$waitingText = ''; + break; + } + default: + // Look for strings of numbers with optional leading or trailing + or - + // and with optional embedded numeric punctuation + if ($numberState) { + // If we're inside a numeric string, look for reasons to end it + $offset = 0; // Be sure to look at the current character first $charArray = self::getChar($workingText . "\n", $offset); if (strpos(self::NUMBERS, $charArray['letter']) === false) { - // This is not a digit. End the run of digits and punctuation. - $numberState = false; - if (self::$currentState == 'RTL') { - if (strpos(self::NUMBER_PREFIX, $currentLetter) === false) { - $currentLetter = WT_UTF8_PDF . $currentLetter; - } else { - $currentLetter = $currentLetter . WT_UTF8_PDF; // Include a trailing + or - in the run + // This is not a digit. Is it numeric punctuation? + if (substr($workingText . "\n", $offset, 6) == ' ') { + $offset += 6; // This could be numeric punctuation + } elseif (strpos(self::NUMBER_PUNCTUATION, $charArray['letter']) !== false) { + $offset += $charArray['length']; // This could be numeric punctuation + } + // If the next character is a digit, the current character is numeric punctuation + $charArray = self::getChar($workingText . "\n", $offset); + if (strpos(self::NUMBERS, $charArray['letter']) === false) { + // This is not a digit. End the run of digits and punctuation. + $numberState = false; + if (self::$currentState == 'RTL') { + if (strpos(self::NUMBER_PREFIX, $currentLetter) === false) { + $currentLetter = WT_UTF8_PDF . $currentLetter; + } else { + $currentLetter = $currentLetter . WT_UTF8_PDF; // Include a trailing + or - in the run + } } } } - } - } else { - // If we're outside a numeric string, look for reasons to start it - if (strpos(self::NUMBER_PREFIX, $currentLetter) !== false) { - // This might be a number lead-in - $offset = $currentLen; - $nextChar = substr($workingText . "\n", $offset, 1); - if (strpos(self::NUMBERS, $nextChar) !== false) { - $numberState = true; // We found a digit: the lead-in is therefore numeric + } else { + // If we're outside a numeric string, look for reasons to start it + if (strpos(self::NUMBER_PREFIX, $currentLetter) !== false) { + // This might be a number lead-in + $offset = $currentLen; + $nextChar = substr($workingText . "\n", $offset, 1); + if (strpos(self::NUMBERS, $nextChar) !== false) { + $numberState = true; // We found a digit: the lead-in is therefore numeric + if (self::$currentState == 'RTL') { + $currentLetter = WT_UTF8_LRE . $currentLetter; + } + } + } elseif (strpos(self::NUMBERS, $currentLetter) !== false) { + $numberState = true; // The current letter is a digit if (self::$currentState == 'RTL') { $currentLetter = WT_UTF8_LRE . $currentLetter; } } - } elseif (strpos(self::NUMBERS, $currentLetter) !== false) { - $numberState = true; // The current letter is a digit - if (self::$currentState == 'RTL') { - $currentLetter = WT_UTF8_LRE . $currentLetter; - } } - } - - // Determine the directionality of the current UTF-8 character - $newState = self::$currentState; - while (true) { - if (I18N::scriptDirection(I18N::textScript($currentLetter)) === 'rtl') { - if (self::$currentState == '') { - $newState = 'RTL'; - break; - } - if (self::$currentState == 'RTL') { - break; - } - // Switch to RTL only if this isn't a solitary RTL letter - $tempText = substr($workingText, $currentLen); - while ($tempText != '') { - $nextCharArray = self::getChar($tempText, 0); - $nextLetter = $nextCharArray['letter']; - $nextLen = $nextCharArray['length']; - $tempText = substr($tempText, $nextLen); - - if (I18N::scriptDirection(I18N::textScript($nextLetter)) === 'rtl') { + // Determine the directionality of the current UTF-8 character + $newState = self::$currentState; + while (true) { + if (I18N::scriptDirection(I18N::textScript($currentLetter)) === 'rtl') { + if (self::$currentState == '') { $newState = 'RTL'; - break 2; + break; } - if (strpos(self::PUNCTUATION, $nextLetter) !== false || strpos(self::OPEN_PARENTHESES, $nextLetter) !== false) { - $newState = 'RTL'; - break 2; + if (self::$currentState == 'RTL') { + break; } + // Switch to RTL only if this isn't a solitary RTL letter + $tempText = substr($workingText, $currentLen); + while ($tempText != '') { + $nextCharArray = self::getChar($tempText, 0); + $nextLetter = $nextCharArray['letter']; + $nextLen = $nextCharArray['length']; + $tempText = substr($tempText, $nextLen); - if ($nextLetter === ' ') { - break; + if (I18N::scriptDirection(I18N::textScript($nextLetter)) === 'rtl') { + $newState = 'RTL'; + break 2; + } + + if (strpos(self::PUNCTUATION, $nextLetter) !== false || strpos(self::OPEN_PARENTHESES, $nextLetter) !== false) { + $newState = 'RTL'; + break 2; + } + + if ($nextLetter === ' ') { + break; + } + $nextLetter .= substr($tempText . "\n", 0, 5); + if ($nextLetter === ' ') { + break; + } } - $nextLetter .= substr($tempText . "\n", 0, 5); - if ($nextLetter === ' ') { - break; + // This is a solitary RTL letter : wrap it in UTF8 control codes to force LTR directionality + $currentLetter = WT_UTF8_LRO . $currentLetter . WT_UTF8_PDF; + $newState = 'LTR'; + break; + } + if (($currentLen != 1) || ($currentLetter >= 'A' && $currentLetter <= 'Z') || ($currentLetter >= 'a' && $currentLetter <= 'z')) { + // Since it’s neither Hebrew nor Arabic, this UTF-8 character or ASCII letter must be LTR + $newState = 'LTR'; + break; + } + if ($closeParIndex !== false) { + // This closing parenthesis has to inherit the matching opening parenthesis' directionality + if (!empty($openParDirection[$closeParIndex]) && $openParDirection[$closeParIndex] != '?') { + $newState = $openParDirection[$closeParIndex]; } + $openParDirection[$closeParIndex] = ''; + break; } - // This is a solitary RTL letter : wrap it in UTF8 control codes to force LTR directionality - $currentLetter = WT_UTF8_LRO . $currentLetter . WT_UTF8_PDF; - $newState = 'LTR'; - break; - } - if (($currentLen != 1) || ($currentLetter >= 'A' && $currentLetter <= 'Z') || ($currentLetter >= 'a' && $currentLetter <= 'z')) { - // Since it’s neither Hebrew nor Arabic, this UTF-8 character or ASCII letter must be LTR - $newState = 'LTR'; - break; - } - if ($closeParIndex !== false) { - // This closing parenthesis has to inherit the matching opening parenthesis' directionality - if (!empty($openParDirection[$closeParIndex]) && $openParDirection[$closeParIndex] != '?') { - $newState = $openParDirection[$closeParIndex]; + if ($openParIndex !== false) { + // Opening parentheses always inherit the following directionality + self::$waitingText .= $currentLetter; + $workingText = substr($workingText, $currentLen); + while (true) { + if ($workingText === '') { + break; + } + if (substr($workingText, 0, 1) === ' ') { + // Spaces following this left parenthesis inherit the following directionality too + self::$waitingText .= ' '; + $workingText = substr($workingText, 1); + continue; + } + if (substr($workingText, 0, 6) === ' ') { + // Spaces following this left parenthesis inherit the following directionality too + self::$waitingText .= ' '; + $workingText = substr($workingText, 6); + continue; + } + break; + } + $openParDirection[$openParIndex] = '?'; + break 2; // double break because we're waiting for more information } - $openParDirection[$closeParIndex] = ''; - break; - } - if ($openParIndex !== false) { - // Opening parentheses always inherit the following directionality + + // We have a digit or a "normal" special character. + // + // When this character is not at the start of the input string, it inherits the preceding directionality; + // at the start of the input string, it assumes the following directionality. + // + // Exceptions to this rule will be handled later during final clean-up. + // self::$waitingText .= $currentLetter; $workingText = substr($workingText, $currentLen); - while (true) { - if ($workingText === '') { - break; - } - if (substr($workingText, 0, 1) === ' ') { - // Spaces following this left parenthesis inherit the following directionality too - self::$waitingText .= ' '; - $workingText = substr($workingText, 1); - continue; - } - if (substr($workingText, 0, 6) === ' ') { - // Spaces following this left parenthesis inherit the following directionality too - self::$waitingText .= ' '; - $workingText = substr($workingText, 6); - continue; - } - break; + if (self::$currentState != '') { + $result .= self::$waitingText; + self::$waitingText = ''; } - $openParDirection[$openParIndex] = '?'; break 2; // double break because we're waiting for more information } - - // We have a digit or a "normal" special character. - // - // When this character is not at the start of the input string, it inherits the preceding directionality; - // at the start of the input string, it assumes the following directionality. - // - // Exceptions to this rule will be handled later during final clean-up. - // + if ($newState != self::$currentState) { + // A direction change has occurred + self::finishCurrentSpan($result, false); + self::$previousState = self::$currentState; + self::$currentState = $newState; + self::beginCurrentSpan($result); + } self::$waitingText .= $currentLetter; $workingText = substr($workingText, $currentLen); - if (self::$currentState != '') { - $result .= self::$waitingText; - self::$waitingText = ''; - } - break 2; // double break because we're waiting for more information - } - if ($newState != self::$currentState) { - // A direction change has occurred - self::finishCurrentSpan($result, false); - self::$previousState = self::$currentState; - self::$currentState = $newState; - self::beginCurrentSpan($result); - } - self::$waitingText .= $currentLetter; - $workingText = substr($workingText, $currentLen); - $result .= self::$waitingText; - self::$waitingText = ''; + $result .= self::$waitingText; + self::$waitingText = ''; - foreach ($openParDirection as $index => $value) { - // Since we now know the proper direction, remember it for all waiting opening parentheses - if ($value === '?') { - $openParDirection[$index] = self::$currentState; + foreach ($openParDirection as $index => $value) { + // Since we now know the proper direction, remember it for all waiting opening parentheses + if ($value === '?') { + $openParDirection[$index] = self::$currentState; + } } - } - break; + break; } } @@ -461,34 +461,34 @@ class FunctionsRtl { // Finally, correct '<LTR>', '</LTR>', '<RTL>', and '</RTL>' switch ($direction) { - case 'BOTH': - case 'both': - // LTR text: <span dir="ltr"> text </span> - // RTL text: <span dir="rtl"> text </span> - $sLTR = '<span dir="ltr" ' . $class . '>' . $nothing; - $eLTR = $nothing . '</span>'; - $sRTL = '<span dir="rtl" ' . $class . '>' . $nothing; - $eRTL = $nothing . '</span>'; - break; - case 'LTR': - case 'ltr': - // LTR text: <span dir="ltr"> text </span> - // RTL text: text - $sLTR = '<span dir="ltr" ' . $class . '>' . $nothing; - $eLTR = $nothing . '</span>'; - $sRTL = ''; - $eRTL = ''; - break; - case 'RTL': - case 'rtl': - default: - // LTR text: text - // RTL text: <span dir="rtl"> text </span> - $sLTR = ''; - $eLTR = ''; - $sRTL = '<span dir="rtl" ' . $class . '>' . $nothing; - $eRTL = $nothing . '</span>'; - break; + case 'BOTH': + case 'both': + // LTR text: <span dir="ltr"> text </span> + // RTL text: <span dir="rtl"> text </span> + $sLTR = '<span dir="ltr" ' . $class . '>' . $nothing; + $eLTR = $nothing . '</span>'; + $sRTL = '<span dir="rtl" ' . $class . '>' . $nothing; + $eRTL = $nothing . '</span>'; + break; + case 'LTR': + case 'ltr': + // LTR text: <span dir="ltr"> text </span> + // RTL text: text + $sLTR = '<span dir="ltr" ' . $class . '>' . $nothing; + $eLTR = $nothing . '</span>'; + $sRTL = ''; + $eRTL = ''; + break; + case 'RTL': + case 'rtl': + default: + // LTR text: text + // RTL text: <span dir="rtl"> text </span> + $sLTR = ''; + $eLTR = ''; + $sRTL = '<span dir="rtl" ' . $class . '>' . $nothing; + $eRTL = $nothing . '</span>'; + break; } $result = str_replace([self::$startLTR, self::$endLTR, self::$startRTL, self::$endRTL], [$sLTR, $eLTR, $sRTL, $eRTL], $result); diff --git a/app/GedcomCode/GedcomCodeAdop.php b/app/GedcomCode/GedcomCodeAdop.php index e839e3beeb..3dfad11357 100644 --- a/app/GedcomCode/GedcomCodeAdop.php +++ b/app/GedcomCode/GedcomCodeAdop.php @@ -42,35 +42,35 @@ class GedcomCodeAdop { } switch ($type) { - case 'BOTH': - switch ($sex) { - case 'M': - return I18N::translateContext('MALE', 'Adopted by both parents'); - case 'F': - return I18N::translateContext('FEMALE', 'Adopted by both parents'); + case 'BOTH': + switch ($sex) { + case 'M': + return I18N::translateContext('MALE', 'Adopted by both parents'); + case 'F': + return I18N::translateContext('FEMALE', 'Adopted by both parents'); + default: + return I18N::translate('Adopted by both parents'); + } + case 'HUSB': + switch ($sex) { + case 'M': + return I18N::translateContext('MALE', 'Adopted by father'); + case 'F': + return I18N::translateContext('FEMALE', 'Adopted by father'); + default: + return I18N::translate('Adopted by father'); + } + case 'WIFE': + switch ($sex) { + case 'M': + return I18N::translateContext('MALE', 'Adopted by mother'); + case 'F': + return I18N::translateContext('FEMALE', 'Adopted by mother'); + default: + return I18N::translate('Adopted by mother'); + } default: - return I18N::translate('Adopted by both parents'); - } - case 'HUSB': - switch ($sex) { - case 'M': - return I18N::translateContext('MALE', 'Adopted by father'); - case 'F': - return I18N::translateContext('FEMALE', 'Adopted by father'); - default: - return I18N::translate('Adopted by father'); - } - case 'WIFE': - switch ($sex) { - case 'M': - return I18N::translateContext('MALE', 'Adopted by mother'); - case 'F': - return I18N::translateContext('FEMALE', 'Adopted by mother'); - default: - return I18N::translate('Adopted by mother'); - } - default: - return $type; + return $type; } } diff --git a/app/GedcomCode/GedcomCodeName.php b/app/GedcomCode/GedcomCodeName.php index a11a3c72c6..3055ddc543 100644 --- a/app/GedcomCode/GedcomCodeName.php +++ b/app/GedcomCode/GedcomCodeName.php @@ -42,109 +42,109 @@ class GedcomCodeName { } switch ($type) { - case 'adopted': - switch ($sex) { - case 'M': - /* I18N: The name given to a child by its adoptive parents */ - return I18N::translateContext('MALE', 'adopted name'); - case 'F': - /* I18N: The name given to a child by its adoptive parents */ - return I18N::translateContext('FEMALE', 'adopted name'); + case 'adopted': + switch ($sex) { + case 'M': + /* I18N: The name given to a child by its adoptive parents */ + return I18N::translateContext('MALE', 'adopted name'); + case 'F': + /* I18N: The name given to a child by its adoptive parents */ + return I18N::translateContext('FEMALE', 'adopted name'); + default: + /* I18N: The name given to a child by its adoptive parents */ + return I18N::translate('adopted name'); + } + case 'aka': + switch ($sex) { + case 'M': + /* I18N: The name by which an individual is also known. e.g. a professional name or a stage name */ + return I18N::translateContext('MALE', 'also known as'); + case 'F': + /* I18N: The name by which an individual is also known. e.g. a professional name or a stage name */ + return I18N::translateContext('FEMALE', 'also known as'); + default: + /* I18N: The name by which an individual is also known. e.g. a professional name or a stage name */ + return I18N::translate('also known as'); + } + case 'birth': + switch ($sex) { + case 'M': + /* I18N: The name given to an individual at their birth */ + return I18N::translateContext('MALE', 'birth name'); + case 'F': + /* I18N: The name given to an individual at their birth */ + return I18N::translateContext('FEMALE', 'birth name'); + default: + /* I18N: The name given to an individual at their birth */ + return I18N::translate('birth name'); + } + case 'change': + switch ($sex) { + case 'M': + /* I18N: A name chosen by an individual, to replace their existing name (whether legal or otherwise) */ + return I18N::translateContext('MALE', 'change of name'); + case 'F': + /* I18N: A name chosen by an individual, to replace their existing name (whether legal or otherwise) */ + return I18N::translateContext('FEMALE', 'change of name'); + default: + /* I18N: A name chosen by an individual, to replace their existing name (whether legal or otherwise) */ + return I18N::translate('change of name'); + } + case 'estate': + switch ($sex) { + case 'M': + /* I18N: A name given to an individual, from the farm or estate on which they lived or worked */ + return I18N::translateContext('MALE', 'estate name'); + case 'F': + /* I18N: A name given to an individual, from the farm or estate on which they lived or worked */ + return I18N::translateContext('FEMALE', 'estate name'); + default: + /* I18N: A name given to an individual, from the farm or estate on which they lived or worked */ + return I18N::translate('estate name'); + } + case 'immigrant': + switch ($sex) { + case 'M': + /* I18N: A name taken on immigration - e.g. migrants to the USA frequently anglicized their names */ + return I18N::translateContext('MALE', 'immigration name'); + case 'F': + /* I18N: A name taken on immigration - e.g. migrants to the USA frequently anglicized their names */ + return I18N::translateContext('FEMALE', 'immigration name'); + default: + /* I18N: A name taken on immigration - e.g. migrants to the USA frequently anglicized their names */ + return I18N::translate('immigration name'); + } + case 'maiden': + // Only women have “maiden” names! + return + /* I18N: A woman’s name, before she marries (in cultures where women take their new husband’s name on marriage) */ + I18N::translate('maiden name'); + case 'married': + switch ($sex) { + case 'M': + /* I18N: A name taken on marriage - usually the wife takes the husband’s surname */ + return I18N::translateContext('MALE', 'married name'); + case 'F': + /* I18N: A name taken on marriage - usually the wife takes the husband’s surname */ + return I18N::translateContext('FEMALE', 'married name'); + default: + /* I18N: A name taken on marriage - usually the wife takes the husband’s surname */ + return I18N::translate('married name'); + } + case 'religious': + switch ($sex) { + case 'M': + /* I18N: A name taken when entering a religion or a religious order */ + return I18N::translateContext('MALE', 'religious name'); + case 'F': + /* I18N: A name taken when entering a religion or a religious order */ + return I18N::translateContext('FEMALE', 'religious name'); + default: + /* I18N: A name taken when entering a religion or a religious order */ + return I18N::translate('religious name'); + } default: - /* I18N: The name given to a child by its adoptive parents */ - return I18N::translate('adopted name'); - } - case 'aka': - switch ($sex) { - case 'M': - /* I18N: The name by which an individual is also known. e.g. a professional name or a stage name */ - return I18N::translateContext('MALE', 'also known as'); - case 'F': - /* I18N: The name by which an individual is also known. e.g. a professional name or a stage name */ - return I18N::translateContext('FEMALE', 'also known as'); - default: - /* I18N: The name by which an individual is also known. e.g. a professional name or a stage name */ - return I18N::translate('also known as'); - } - case 'birth': - switch ($sex) { - case 'M': - /* I18N: The name given to an individual at their birth */ - return I18N::translateContext('MALE', 'birth name'); - case 'F': - /* I18N: The name given to an individual at their birth */ - return I18N::translateContext('FEMALE', 'birth name'); - default: - /* I18N: The name given to an individual at their birth */ - return I18N::translate('birth name'); - } - case 'change': - switch ($sex) { - case 'M': - /* I18N: A name chosen by an individual, to replace their existing name (whether legal or otherwise) */ - return I18N::translateContext('MALE', 'change of name'); - case 'F': - /* I18N: A name chosen by an individual, to replace their existing name (whether legal or otherwise) */ - return I18N::translateContext('FEMALE', 'change of name'); - default: - /* I18N: A name chosen by an individual, to replace their existing name (whether legal or otherwise) */ - return I18N::translate('change of name'); - } - case 'estate': - switch ($sex) { - case 'M': - /* I18N: A name given to an individual, from the farm or estate on which they lived or worked */ - return I18N::translateContext('MALE', 'estate name'); - case 'F': - /* I18N: A name given to an individual, from the farm or estate on which they lived or worked */ - return I18N::translateContext('FEMALE', 'estate name'); - default: - /* I18N: A name given to an individual, from the farm or estate on which they lived or worked */ - return I18N::translate('estate name'); - } - case 'immigrant': - switch ($sex) { - case 'M': - /* I18N: A name taken on immigration - e.g. migrants to the USA frequently anglicized their names */ - return I18N::translateContext('MALE', 'immigration name'); - case 'F': - /* I18N: A name taken on immigration - e.g. migrants to the USA frequently anglicized their names */ - return I18N::translateContext('FEMALE', 'immigration name'); - default: - /* I18N: A name taken on immigration - e.g. migrants to the USA frequently anglicized their names */ - return I18N::translate('immigration name'); - } - case 'maiden': - // Only women have “maiden” names! - return - /* I18N: A woman’s name, before she marries (in cultures where women take their new husband’s name on marriage) */ - I18N::translate('maiden name'); - case 'married': - switch ($sex) { - case 'M': - /* I18N: A name taken on marriage - usually the wife takes the husband’s surname */ - return I18N::translateContext('MALE', 'married name'); - case 'F': - /* I18N: A name taken on marriage - usually the wife takes the husband’s surname */ - return I18N::translateContext('FEMALE', 'married name'); - default: - /* I18N: A name taken on marriage - usually the wife takes the husband’s surname */ - return I18N::translate('married name'); - } - case 'religious': - switch ($sex) { - case 'M': - /* I18N: A name taken when entering a religion or a religious order */ - return I18N::translateContext('MALE', 'religious name'); - case 'F': - /* I18N: A name taken when entering a religion or a religious order */ - return I18N::translateContext('FEMALE', 'religious name'); - default: - /* I18N: A name taken when entering a religion or a religious order */ - return I18N::translate('religious name'); - } - default: - return $type; + return $type; } } diff --git a/app/GedcomCode/GedcomCodePedi.php b/app/GedcomCode/GedcomCodePedi.php index 8f28e5d03b..0b2e10ec2e 100644 --- a/app/GedcomCode/GedcomCodePedi.php +++ b/app/GedcomCode/GedcomCodePedi.php @@ -42,57 +42,57 @@ class GedcomCodePedi { } switch ($type) { - case 'birth': - switch ($sex) { - case 'M': - return I18N::translateContext('Male pedigree', 'Birth'); - case 'F': - return I18N::translateContext('Female pedigree', 'Birth'); - default: - return I18N::translateContext('Pedigree', 'Birth'); - } - case 'adopted': - switch ($sex) { - case 'M': - return I18N::translateContext('Male pedigree', 'Adopted'); - case 'F': - return I18N::translateContext('Female pedigree', 'Adopted'); - default: - return I18N::translateContext('Pedigree', 'Adopted'); - } - case 'foster': - switch ($sex) { - case 'M': - return I18N::translateContext('Male pedigree', 'Foster'); - case 'F': - return I18N::translateContext('Female pedigree', 'Foster'); - default: - return I18N::translateContext('Pedigree', 'Foster'); - } - case 'sealing': - switch ($sex) { - case 'M': + case 'birth': + switch ($sex) { + case 'M': + return I18N::translateContext('Male pedigree', 'Birth'); + case 'F': + return I18N::translateContext('Female pedigree', 'Birth'); + default: + return I18N::translateContext('Pedigree', 'Birth'); + } + case 'adopted': + switch ($sex) { + case 'M': + return I18N::translateContext('Male pedigree', 'Adopted'); + case 'F': + return I18N::translateContext('Female pedigree', 'Adopted'); + default: + return I18N::translateContext('Pedigree', 'Adopted'); + } + case 'foster': + switch ($sex) { + case 'M': + return I18N::translateContext('Male pedigree', 'Foster'); + case 'F': + return I18N::translateContext('Female pedigree', 'Foster'); + default: + return I18N::translateContext('Pedigree', 'Foster'); + } + case 'sealing': + switch ($sex) { + case 'M': + return + /* I18N: “sealing” is a ceremony in the Mormon church. */ + I18N::translateContext('Male pedigree', 'Sealing'); + case 'F': + return + /* I18N: “sealing” is a ceremony in the Mormon church. */ + I18N::translateContext('Female pedigree', 'Sealing'); + default: + return + /* I18N: “sealing” is a ceremony in the Mormon church. */ + I18N::translateContext('Pedigree', 'Sealing'); + } + case 'rada': + // Not standard GEDCOM - a webtrees extension + // This is an arabic word which does not exist in other languages. + // So, it will not have any inflected forms. return - /* I18N: “sealing” is a ceremony in the Mormon church. */ - I18N::translateContext('Male pedigree', 'Sealing'); - case 'F': - return - /* I18N: “sealing” is a ceremony in the Mormon church. */ - I18N::translateContext('Female pedigree', 'Sealing'); + /* I18N: This is an Arabic word, pronounced “ra DAH”. It is child-to-parent pedigree, established by wet-nursing. */ + I18N::translate('Rada'); default: - return - /* I18N: “sealing” is a ceremony in the Mormon church. */ - I18N::translateContext('Pedigree', 'Sealing'); - } - case 'rada': - // Not standard GEDCOM - a webtrees extension - // This is an arabic word which does not exist in other languages. - // So, it will not have any inflected forms. - return - /* I18N: This is an Arabic word, pronounced “ra DAH”. It is child-to-parent pedigree, established by wet-nursing. */ - I18N::translate('Rada'); - default: - return $type; + return $type; } } @@ -122,23 +122,23 @@ class GedcomCodePedi { */ public static function getChildFamilyLabel($pedi) { switch ($pedi) { - case '': - case 'birth': - return I18N::translate('Family with parents'); - case 'adopted': - return I18N::translate('Family with adoptive parents'); - case 'foster': - return I18N::translate('Family with foster parents'); - case 'sealing': - return - /* I18N: “sealing” is a Mormon ceremony. */ - I18N::translate('Family with sealing parents'); - case 'rada': - return - /* I18N: “rada” is an Arabic word, pronounced “ra DAH”. It is child-to-parent pedigree, established by wet-nursing. */ - I18N::translate('Family with rada parents'); - default: - return I18N::translate('Family with parents') . ' - ' . $pedi; + case '': + case 'birth': + return I18N::translate('Family with parents'); + case 'adopted': + return I18N::translate('Family with adoptive parents'); + case 'foster': + return I18N::translate('Family with foster parents'); + case 'sealing': + return + /* I18N: “sealing” is a Mormon ceremony. */ + I18N::translate('Family with sealing parents'); + case 'rada': + return + /* I18N: “rada” is an Arabic word, pronounced “ra DAH”. It is child-to-parent pedigree, established by wet-nursing. */ + I18N::translate('Family with rada parents'); + default: + return I18N::translate('Family with parents') . ' - ' . $pedi; } } @@ -152,16 +152,16 @@ class GedcomCodePedi { */ public static function createNewFamcPedi($pedi, $xref) { switch ($pedi) { - case '': - return "1 FAMC @$xref@"; - case 'adopted': - return "1 FAMC @$xref@\n2 PEDI $pedi\n1 ADOP\n2 FAMC @$xref@\n3 ADOP BOTH"; - case 'sealing': - return "1 FAMC @$xref@\n2 PEDI $pedi\n1 SLGC\n2 FAMC @$xref@"; - case 'foster': - return "1 FAMC @$xref@\n2 PEDI $pedi\n1 EVEN\n2 TYPE $pedi"; - default: - return "1 FAMC @$xref@\n2 PEDI $pedi"; + case '': + return "1 FAMC @$xref@"; + case 'adopted': + return "1 FAMC @$xref@\n2 PEDI $pedi\n1 ADOP\n2 FAMC @$xref@\n3 ADOP BOTH"; + case 'sealing': + return "1 FAMC @$xref@\n2 PEDI $pedi\n1 SLGC\n2 FAMC @$xref@"; + case 'foster': + return "1 FAMC @$xref@\n2 PEDI $pedi\n1 EVEN\n2 TYPE $pedi"; + default: + return "1 FAMC @$xref@\n2 PEDI $pedi"; } } } diff --git a/app/GedcomCode/GedcomCodeQuay.php b/app/GedcomCode/GedcomCodeQuay.php index c1439a78ca..f62382a4cc 100644 --- a/app/GedcomCode/GedcomCodeQuay.php +++ b/app/GedcomCode/GedcomCodeQuay.php @@ -33,24 +33,24 @@ class GedcomCodeQuay { */ public static function getValue($type) { switch ($type) { - case '3': - return - /* I18N: Quality of source information - GEDCOM tag “QUAY 3” */ - I18N::translate('primary evidence'); - case '2': - return - /* I18N: Quality of source information - GEDCOM tag “QUAY 2” */ - I18N::translate('secondary evidence'); - case '1': - return - /* I18N: Quality of source information - GEDCOM tag “QUAY 1” */ - I18N::translate('questionable evidence'); - case '0': - return - /* I18N: Quality of source information - GEDCOM tag “QUAY 0” */ - I18N::translate('unreliable evidence'); - default: - return $type; + case '3': + return + /* I18N: Quality of source information - GEDCOM tag “QUAY 3” */ + I18N::translate('primary evidence'); + case '2': + return + /* I18N: Quality of source information - GEDCOM tag “QUAY 2” */ + I18N::translate('secondary evidence'); + case '1': + return + /* I18N: Quality of source information - GEDCOM tag “QUAY 1” */ + I18N::translate('questionable evidence'); + case '0': + return + /* I18N: Quality of source information - GEDCOM tag “QUAY 0” */ + I18N::translate('unreliable evidence'); + default: + return $type; } } diff --git a/app/GedcomCode/GedcomCodeStat.php b/app/GedcomCode/GedcomCodeStat.php index d4e6cbdddb..8608907624 100644 --- a/app/GedcomCode/GedcomCodeStat.php +++ b/app/GedcomCode/GedcomCodeStat.php @@ -30,21 +30,21 @@ class GedcomCodeStat { */ public static function statusCodes($tag) { switch ($tag) { - case 'BAPL': - case 'CONL': - // LDS_BAPTISM_DATE_STATUS - return ['CHILD', 'COMPLETED', 'EXCLUDED', 'INFANT', 'PRE-1970', 'STILLBORN', 'SUBMITTED', 'UNCLEARED']; - case 'ENDL': - // LDS_ENDOWMENT_DATE_STATUS - return ['CHILD', 'COMPLETED', 'EXCLUDED', 'INFANT', 'PRE-1970', 'STILLBORN', 'SUBMITTED', 'UNCLEARED']; - case 'SLGC': - // LDS_CHILD_SEALING_DATE_STATUS - return ['BIC', 'COMPLETED', 'EXCLUDED', 'PRE-1970', 'STILLBORN', 'SUBMITTED', 'UNCLEARED']; - case 'SLGS': - // LDS_SPOUSE_SEALING_DATE_STATUS - return ['CANCELED', 'COMPLETED', 'DNS', 'DNS/CAN', 'EXCLUDED', 'PRE-1970', 'SUBMITTED', 'UNCLEARED']; - default: - throw new \InvalidArgumentException('Internal error - bad argument to GedcomCodeStat::statusCodes("' . $tag . '")'); + case 'BAPL': + case 'CONL': + // LDS_BAPTISM_DATE_STATUS + return ['CHILD', 'COMPLETED', 'EXCLUDED', 'INFANT', 'PRE-1970', 'STILLBORN', 'SUBMITTED', 'UNCLEARED']; + case 'ENDL': + // LDS_ENDOWMENT_DATE_STATUS + return ['CHILD', 'COMPLETED', 'EXCLUDED', 'INFANT', 'PRE-1970', 'STILLBORN', 'SUBMITTED', 'UNCLEARED']; + case 'SLGC': + // LDS_CHILD_SEALING_DATE_STATUS + return ['BIC', 'COMPLETED', 'EXCLUDED', 'PRE-1970', 'STILLBORN', 'SUBMITTED', 'UNCLEARED']; + case 'SLGS': + // LDS_SPOUSE_SEALING_DATE_STATUS + return ['CANCELED', 'COMPLETED', 'DNS', 'DNS/CAN', 'EXCLUDED', 'PRE-1970', 'SUBMITTED', 'UNCLEARED']; + default: + throw new \InvalidArgumentException('Internal error - bad argument to GedcomCodeStat::statusCodes("' . $tag . '")'); } } @@ -57,61 +57,61 @@ class GedcomCodeStat { */ public static function statusName($status_code) { switch ($status_code) { - case 'BIC': - return - /* I18N: LDS sealing status; see http://en.wikipedia.org/wiki/Sealing_(Latter_Day_Saints) */ - I18N::translate('Born in the covenant'); - case 'CANCELED': - return - /* I18N: LDS sealing status; see http://en.wikipedia.org/wiki/Sealing_(Latter_Day_Saints) */ - I18N::translate('Sealing canceled (divorce)'); - case 'CHILD': - return - /* I18N: LDS sealing status; see http://en.wikipedia.org/wiki/Sealing_(Latter_Day_Saints) */ - I18N::translate('Died as a child: exempt'); - case 'CLEARED': - // This status appears in PhpGedView, but not in the GEDCOM 5.5.1 specification. - return - /* I18N: LDS sealing status; see http://en.wikipedia.org/wiki/Sealing_(Latter_Day_Saints) */ - I18N::translate('Cleared but not yet completed'); - case 'COMPLETED': - return - /* I18N: LDS sealing status; see http://en.wikipedia.org/wiki/Sealing_(Latter_Day_Saints) */ - I18N::translate('Completed; date unknown'); - case 'DNS': - return - /* I18N: LDS sealing status; see http://en.wikipedia.org/wiki/Sealing_(Latter_Day_Saints) */ - I18N::translate('Do not seal: unauthorized'); - case 'DNS/CAN': - return - /* I18N: LDS sealing status; see http://en.wikipedia.org/wiki/Sealing_(Latter_Day_Saints) */ - I18N::translate('Do not seal, previous sealing canceled'); - case 'EXCLUDED': - return - /* I18N: LDS sealing status; see http://en.wikipedia.org/wiki/Sealing_(Latter_Day_Saints) */ - I18N::translate('Excluded from this submission'); - case 'INFANT': - return - /* I18N: LDS sealing status; see http://en.wikipedia.org/wiki/Sealing_(Latter_Day_Saints) */ - I18N::translate('Died as an infant: exempt'); - case 'PRE-1970': - return - /* I18N: LDS sealing status; see http://en.wikipedia.org/wiki/Sealing_(Latter_Day_Saints) */ - I18N::translate('Completed before 1970; date not available'); - case 'STILLBORN': - return - /* I18N: LDS sealing status; see http://en.wikipedia.org/wiki/Sealing_(Latter_Day_Saints) */ - I18N::translate('Stillborn: exempt'); - case 'SUBMITTED': - return - /* I18N: LDS sealing status; see http://en.wikipedia.org/wiki/Sealing_(Latter_Day_Saints) */ - I18N::translate('Submitted but not yet cleared'); - case 'UNCLEARED': - return - /* I18N: LDS sealing status; see http://en.wikipedia.org/wiki/Sealing_(Latter_Day_Saints) */ - I18N::translate('Uncleared: insufficient data'); - default: - return $status_code; + case 'BIC': + return + /* I18N: LDS sealing status; see http://en.wikipedia.org/wiki/Sealing_(Latter_Day_Saints) */ + I18N::translate('Born in the covenant'); + case 'CANCELED': + return + /* I18N: LDS sealing status; see http://en.wikipedia.org/wiki/Sealing_(Latter_Day_Saints) */ + I18N::translate('Sealing canceled (divorce)'); + case 'CHILD': + return + /* I18N: LDS sealing status; see http://en.wikipedia.org/wiki/Sealing_(Latter_Day_Saints) */ + I18N::translate('Died as a child: exempt'); + case 'CLEARED': + // This status appears in PhpGedView, but not in the GEDCOM 5.5.1 specification. + return + /* I18N: LDS sealing status; see http://en.wikipedia.org/wiki/Sealing_(Latter_Day_Saints) */ + I18N::translate('Cleared but not yet completed'); + case 'COMPLETED': + return + /* I18N: LDS sealing status; see http://en.wikipedia.org/wiki/Sealing_(Latter_Day_Saints) */ + I18N::translate('Completed; date unknown'); + case 'DNS': + return + /* I18N: LDS sealing status; see http://en.wikipedia.org/wiki/Sealing_(Latter_Day_Saints) */ + I18N::translate('Do not seal: unauthorized'); + case 'DNS/CAN': + return + /* I18N: LDS sealing status; see http://en.wikipedia.org/wiki/Sealing_(Latter_Day_Saints) */ + I18N::translate('Do not seal, previous sealing canceled'); + case 'EXCLUDED': + return + /* I18N: LDS sealing status; see http://en.wikipedia.org/wiki/Sealing_(Latter_Day_Saints) */ + I18N::translate('Excluded from this submission'); + case 'INFANT': + return + /* I18N: LDS sealing status; see http://en.wikipedia.org/wiki/Sealing_(Latter_Day_Saints) */ + I18N::translate('Died as an infant: exempt'); + case 'PRE-1970': + return + /* I18N: LDS sealing status; see http://en.wikipedia.org/wiki/Sealing_(Latter_Day_Saints) */ + I18N::translate('Completed before 1970; date not available'); + case 'STILLBORN': + return + /* I18N: LDS sealing status; see http://en.wikipedia.org/wiki/Sealing_(Latter_Day_Saints) */ + I18N::translate('Stillborn: exempt'); + case 'SUBMITTED': + return + /* I18N: LDS sealing status; see http://en.wikipedia.org/wiki/Sealing_(Latter_Day_Saints) */ + I18N::translate('Submitted but not yet cleared'); + case 'UNCLEARED': + return + /* I18N: LDS sealing status; see http://en.wikipedia.org/wiki/Sealing_(Latter_Day_Saints) */ + I18N::translate('Uncleared: insufficient data'); + default: + return $status_code; } } diff --git a/app/GedcomCode/GedcomCodeTemp.php b/app/GedcomCode/GedcomCodeTemp.php index abb051722e..75aaa00598 100644 --- a/app/GedcomCode/GedcomCodeTemp.php +++ b/app/GedcomCode/GedcomCodeTemp.php @@ -77,318 +77,318 @@ class GedcomCodeTemp { */ public static function templeName($temple_code) { switch ($temple_code) { - case 'ABA': - return /* I18N: Location of an LDS church temple */ I18N::translate('Aba, Nigeria'); - case 'ACCRA': - return /* I18N: Location of an LDS church temple */ I18N::translate('Accra, Ghana'); - case 'ADELA': - return /* I18N: Location of an LDS church temple */ I18N::translate('Adelaide, Australia'); - case 'ALBER': - return /* I18N: Location of an LDS church temple */ I18N::translate('Cardston, Alberta, Canada'); - case 'ALBUQ': - return /* I18N: Location of an LDS church temple */ I18N::translate('Albuquerque, New Mexico, United States'); - case 'ANCHO': - return /* I18N: Location of an LDS church temple */ I18N::translate('Anchorage, Alaska, United States'); - case 'APIA': - return /* I18N: Location of an LDS church temple */ I18N::translate('Apia, Samoa'); - case 'ARIZO': - return /* I18N: Location of an LDS church temple */ I18N::translate('Mesa, Arizona, United States'); - case 'ASUNC': - return /* I18N: Location of an LDS church temple */ I18N::translate('Asuncion, Paraguay'); - case 'ATLAN': - return /* I18N: Location of an LDS church temple */ I18N::translate('Atlanta, Georgia, United States'); - case 'BAIRE': - return /* I18N: Location of an LDS church temple */ I18N::translate('Buenos Aires, Argentina'); - case 'BILLI': - return /* I18N: Location of an LDS church temple */ I18N::translate('Billings, Montana, United States'); - case 'BIRMI': - return /* I18N: Location of an LDS church temple */ I18N::translate('Birmingham, Alabama, United States'); - case 'BISMA': - return /* I18N: Location of an LDS church temple */ I18N::translate('Bismarck, North Dakota, United States'); - case 'BOGOT': - return /* I18N: Location of an LDS church temple */ I18N::translate('Bogota, Colombia'); - case 'BOISE': - return /* I18N: Location of an LDS church temple */ I18N::translate('Boise, Idaho, United States'); - case 'BOSTO': - return /* I18N: Location of an LDS church temple */ I18N::translate('Boston, Massachusetts, United States'); - case 'BOUNT': - return /* I18N: Location of an LDS church temple */ I18N::translate('Bountiful, Utah, United States'); - case 'BRIGH': - return /* I18N: Location of an LDS church temple */ I18N::translate('Brigham City, Utah, United States'); - case 'BRISB': - return /* I18N: Location of an LDS church temple */ I18N::translate('Brisbane, Australia'); - case 'BROUG': - return /* I18N: Location of an LDS church temple */ I18N::translate('Baton Rouge, Louisiana, United States'); - case 'CALGA': - return /* I18N: Location of an LDS church temple */ I18N::translate('Calgary, Alberta, Canada'); - case 'CAMPI': - return /* I18N: Location of an LDS church temple */ I18N::translate('Campinas, Brazil'); - case 'CARAC': - return /* I18N: Location of an LDS church temple */ I18N::translate('Caracas, Venezuela'); - case 'CEBUP': - return /* I18N: Location of an LDS church temple */ I18N::translate('Cebu City, Philippines'); - case 'CHICA': - return /* I18N: Location of an LDS church temple */ I18N::translate('Chicago, Illinois, United States'); - case 'CIUJU': - return /* I18N: Location of an LDS church temple */ I18N::translate('Ciudad Juarez, Mexico'); - case 'COCHA': - return /* I18N: Location of an LDS church temple */ I18N::translate('Cochabamba, Bolivia'); - case 'COLJU': - return /* I18N: Location of an LDS church temple */ I18N::translate('Colonia Juarez, Mexico'); - case 'COLSC': - return /* I18N: Location of an LDS church temple */ I18N::translate('Columbia, South Carolina, United States'); - case 'COLUM': - return /* I18N: Location of an LDS church temple */ I18N::translate('Columbus, Ohio, United States'); - case 'COPEN': - return /* I18N: Location of an LDS church temple */ I18N::translate('Copenhagen, Denmark'); - case 'CORDO': - return /* I18N: Location of an LDS church temple */ I18N::translate('Cordoba, Argentina'); - case 'CRIVE': - return /* I18N: Location of an LDS church temple */ I18N::translate('Columbia River, Washington, United States'); - case 'CURIT': - return /* I18N: Location of an LDS church temple */ I18N::translate('Curitiba, Brazil'); - case 'DALLA': - return /* I18N: Location of an LDS church temple */ I18N::translate('Dallas, Texas, United States'); - case 'DENVE': - return /* I18N: Location of an LDS church temple */ I18N::translate('Denver, Colorado, United States'); - case 'DETRO': - return /* I18N: Location of an LDS church temple */ I18N::translate('Detroit, Michigan, United States'); - case 'DRAPE': - return /* I18N: Location of an LDS church temple */ I18N::translate('Draper, Utah, United States'); - case 'EDMON': - return /* I18N: Location of an LDS church temple */ I18N::translate('Edmonton, Alberta, Canada'); - case 'EHOUS': - return /* I18N: Location of an historic LDS church temple - http://en.wikipedia.org/wiki/Endowment_house */ I18N::translate('Endowment House'); - case 'FORTL': - return /* I18N: Location of an LDS church temple */ I18N::translate('Fort Lauderdale, Florida, United States'); - case 'FRANK': - return /* I18N: Location of an LDS church temple */ I18N::translate('Frankfurt am Main, Germany'); - case 'FREIB': - return /* I18N: Location of an LDS church temple */ I18N::translate('Freiburg, Germany'); - case 'FRESN': - return /* I18N: Location of an LDS church temple */ I18N::translate('Fresno, California, United States'); - case 'FUKUO': - return /* I18N: Location of an LDS church temple */ I18N::translate('Fukuoka, Japan'); - case 'GILAV': - return /* I18N: Location of an LDS church temple */ I18N::translate('Gila Valley, Arizona, United States'); - case 'GILBE': - return /* I18N: Location of an LDS church temple */ I18N::translate('Gilbert, Arizona, United States'); - case 'GUADA': - return /* I18N: Location of an LDS church temple */ I18N::translate('Guadalajara, Mexico'); - case 'GUATE': - return /* I18N: Location of an LDS church temple */ I18N::translate('Guatemala City, Guatemala'); - case 'GUAYA': - return /* I18N: Location of an LDS church temple */ I18N::translate('Guayaquil, Ecuador'); - case 'HAGUE': - return /* I18N: Location of an LDS church temple */ I18N::translate('The Hague, Netherlands'); - case 'HALIF': - return /* I18N: Location of an LDS church temple */ I18N::translate('Halifax, Nova Scotia, Canada'); - case 'HARTF': - return /* I18N: Location of an LDS church temple */ I18N::translate('Hartford, Connecticut, United States'); - case 'HAWAI': - return /* I18N: Location of an LDS church temple */ I18N::translate('Laie, Hawaii, United States'); - case 'HELSI': - return /* I18N: Location of an LDS church temple */ I18N::translate('Helsinki, Finland'); - case 'HERMO': - return /* I18N: Location of an LDS church temple */ I18N::translate('Hermosillo, Mexico'); - case 'HKONG': - return /* I18N: Location of an LDS church temple */ I18N::translate('Hong Kong'); - case 'HOUST': - return /* I18N: Location of an LDS church temple */ I18N::translate('Houston, Texas, United States'); - case 'IFALL': - return /* I18N: Location of an LDS church temple */ I18N::translate('Idaho Falls, Idaho, United States'); - case 'INDIA': - return /* I18N: Location of an LDS church temple */ I18N::translate('Indianapolis, Indiana, United States'); - case 'JOHAN': - return /* I18N: Location of an LDS church temple */ I18N::translate('Johannesburg, South Africa'); - case 'JRIVE': - return /* I18N: Location of an LDS church temple */ I18N::translate('Jordan River, Utah, United States'); - case 'KANSA': - return /* I18N: Location of an LDS church temple */ I18N::translate('Kansas City, Missouri, United States'); - case 'KONA': - return /* I18N: Location of an LDS church temple */ I18N::translate('Kona, Hawaii, United States'); - case 'KYIV': - return /* I18N: Location of an LDS church temple */ I18N::translate('Kiev, Ukraine'); - case 'LANGE': - return /* I18N: Location of an LDS church temple */ I18N::translate('Los Angeles, California, United States'); - case 'LIMA': - return /* I18N: Location of an LDS church temple */ I18N::translate('Lima, Peru'); - case 'LOGAN': - return /* I18N: Location of an LDS church temple */ I18N::translate('Logan, Utah, United States'); - case 'LONDO': - return /* I18N: Location of an LDS church temple */ I18N::translate('London, England'); - case 'LOUIS': - return /* I18N: Location of an LDS church temple */ I18N::translate('Louisville, Kentucky, United States'); - case 'LUBBO': - return /* I18N: Location of an LDS church temple */ I18N::translate('Lubbock, Texas, United States'); - case 'LVEGA': - return /* I18N: Location of an LDS church temple */ I18N::translate('Las Vegas, Nevada, United States'); - case 'MADRI': - return /* I18N: Location of an LDS church temple */ I18N::translate('Madrid, Spain'); - case 'MANAU': - return /* I18N: Location of an LDS church temple */ I18N::translate('Manaus, Brazil'); - case 'MANHA': - return /* I18N: Location of an LDS church temple */ I18N::translate('Manhattan, New York, United States'); - case 'MANIL': - return /* I18N: Location of an LDS church temple */ I18N::translate('Manila, Philippines'); - case 'MANTI': - return /* I18N: Location of an LDS church temple */ I18N::translate('Manti, Utah, United States'); - case 'MEDFO': - return /* I18N: Location of an LDS church temple */ I18N::translate('Medford, Oregon, United States'); - case 'MELBO': - return /* I18N: Location of an LDS church temple */ I18N::translate('Melbourne, Australia'); - case 'MEMPH': - return /* I18N: Location of an LDS church temple */ I18N::translate('Memphis, Tennessee, United States'); - case 'MERID': - return /* I18N: Location of an LDS church temple */ I18N::translate('Merida, Mexico'); - case 'MEXIC': - return /* I18N: Location of an LDS church temple */ I18N::translate('Mexico City, Mexico'); - case 'MNTVD': - return /* I18N: Location of an LDS church temple */ I18N::translate('Montevideo, Uruguay'); - case 'MONTE': - return /* I18N: Location of an LDS church temple */ I18N::translate('Monterrey, Mexico'); - case 'MONTI': - return /* I18N: Location of an LDS church temple */ I18N::translate('Monticello, Utah, United States'); - case 'MONTR': - return /* I18N: Location of an LDS church temple */ I18N::translate('Montreal, Quebec, Canada'); - case 'MTIMP': - return /* I18N: Location of an LDS church temple */ I18N::translate('Mount Timpanogos, Utah, United States'); - case 'NASHV': - return /* I18N: Location of an LDS church temple */ I18N::translate('Nashville, Tennessee, United States'); - case 'NAUV2': - return /* I18N: Location of an LDS church temple */ I18N::translate('Nauvoo (new), Illinois, United States'); - case 'NAUVO': - return /* I18N: Location of an historic LDS church temple */ I18N::translate('Nauvoo (original), Illinois, United States'); - case 'NBEAC': - return /* I18N: Location of an LDS church temple */ I18N::translate('Newport Beach, California, United States'); - case 'NUKUA': - return /* I18N: Location of an LDS church temple */ I18N::translate('Nuku’Alofa, Tonga'); - case 'NYORK': - return /* I18N: Location of an historic LDS church temple */ I18N::translate('New York, New York, United States'); - case 'NZEAL': - return /* I18N: Location of an LDS church temple */ I18N::translate('Hamilton, New Zealand'); - case 'OAKLA': - return /* I18N: Location of an LDS church temple */ I18N::translate('Oakland, California, United States'); - case 'OAXAC': - return /* I18N: Location of an LDS church temple */ I18N::translate('Oaxaca, Mexico'); - case 'OGDEN': - return /* I18N: Location of an LDS church temple */ I18N::translate('Ogden, Utah, United States'); - case 'OKLAH': - return /* I18N: Location of an LDS church temple */ I18N::translate('Oklahoma City, Oklahoma, United States'); - case 'OQUIR': - return /* I18N: Location of an LDS church temple */ I18N::translate('Oquirrh Mountain, Utah, United States'); - case 'ORLAN': - return /* I18N: Location of an LDS church temple */ I18N::translate('Orlando, Florida, United States'); - case 'PALEG': - return /* I18N: Location of an LDS church temple */ I18N::translate('Porto Alegre, Brazil'); - case 'PALMY': - return /* I18N: Location of an LDS church temple */ I18N::translate('Palmyra, New York, United States'); - case 'PANAM': - return /* I18N: Location of an LDS church temple */ I18N::translate('Panama City, Panama'); - case 'PAPEE': - return /* I18N: Location of an LDS church temple */ I18N::translate('Papeete, Tahiti'); - case 'PAYSO': - return /* I18N: Location of an LDS church temple */ I18N::translate('Payson, Utah, United States'); - case 'PERTH': - return /* I18N: Location of an LDS church temple */ I18N::translate('Perth, Australia'); - case 'PHOEN': - return /* I18N: Location of an LDS church temple */ I18N::translate('Phoenix, Arizona, United States'); - case 'POFFI': - return /* I18N: I18N: Location of an historic LDS church temple - http://en.wikipedia.org/wiki/President_of_the_Church */ I18N::translate('President’s Office'); - case 'PORTL': - return /* I18N: Location of an LDS church temple */ I18N::translate('Portland, Oregon, United States'); - case 'PREST': - return /* I18N: Location of an LDS church temple */ I18N::translate('Preston, England'); - case 'PROCC': - return /* I18N: Location of an LDS church temple */ I18N::translate('Provo City Center, Utah, United States'); - case 'PROVO': - return /* I18N: Location of an LDS church temple */ I18N::translate('Provo, Utah, United States'); - case 'QUETZ': - return /* I18N: Location of an LDS church temple */ I18N::translate('Quetzaltenango, Guatemala'); - case 'RALEI': - return /* I18N: Location of an LDS church temple */ I18N::translate('Raleigh, North Carolina, United States'); - case 'RECIF': - return /* I18N: Location of an LDS church temple */ I18N::translate('Recife, Brazil'); - case 'REDLA': - return /* I18N: Location of an LDS church temple */ I18N::translate('Redlands, California, United States'); - case 'REGIN': - return /* I18N: Location of an LDS church temple */ I18N::translate('Regina, Saskatchewan, Canada'); - case 'RENO': - return /* I18N: Location of an LDS church temple */ I18N::translate('Reno, Nevada, United States'); - case 'REXBU': - return /* I18N: Location of an LDS church temple */ I18N::translate('Rexburg, Idaho, United States'); - case 'SACRA': - return /* I18N: Location of an LDS church temple */ I18N::translate('Sacramento, California, United States'); - case 'SANSA': - return /* I18N: Location of an LDS church temple */ I18N::translate('San Salvador, El Salvador'); - case 'SANTI': - return /* I18N: Location of an LDS church temple */ I18N::translate('Santiago, Chile'); - case 'SANTO': - return /* I18N: Location of an LDS church temple */ I18N::translate('San Antonio, Texas, United States'); - case 'SDIEG': - return /* I18N: Location of an LDS church temple */ I18N::translate('San Diego, California, United States'); - case 'SDOMI': - return /* I18N: Location of an LDS church temple */ I18N::translate('Santo Domingo, Dominican Republic'); - case 'SEATT': - return /* I18N: Location of an LDS church temple */ I18N::translate('Seattle, Washington, United States'); - case 'SEOUL': - return /* I18N: Location of an LDS church temple */ I18N::translate('Seoul, Korea'); - case 'SGEOR': - return /* I18N: Location of an LDS church temple */ I18N::translate('St. George, Utah, United States'); - case 'SJOSE': - return /* I18N: Location of an LDS church temple */ I18N::translate('San Jose, Costa Rica'); - case 'SLAKE': - return /* I18N: Location of an LDS church temple */ I18N::translate('Salt Lake City, Utah, United States'); - case 'SLOUI': - return /* I18N: Location of an LDS church temple */ I18N::translate('St. Louis, Missouri, United States'); - case 'SNOWF': - return /* I18N: Location of an LDS church temple */ I18N::translate('Snowflake, Arizona, United States'); - case 'SPAUL': - return /* I18N: Location of an LDS church temple */ I18N::translate('Sao Paulo, Brazil'); - case 'SPMIN': - return /* I18N: Location of an LDS church temple */ I18N::translate('St. Paul, Minnesota, United States'); - case 'SPOKA': - return /* I18N: Location of an LDS church temple */ I18N::translate('Spokane, Washington, United States'); - case 'STOCK': - return /* I18N: Location of an LDS church temple */ I18N::translate('Stockholm, Sweden'); - case 'SUVA': - return /* I18N: Location of an LDS church temple */ I18N::translate('Suva, Fiji'); - case 'SWISS': - return /* I18N: Location of an LDS church temple */ I18N::translate('Bern, Switzerland'); - case 'SYDNE': - return /* I18N: Location of an LDS church temple */ I18N::translate('Sydney, Australia'); - case 'TAIPE': - return /* I18N: Location of an LDS church temple */ I18N::translate('Taipei, Taiwan'); - case 'TAMPI': - return /* I18N: Location of an LDS church temple */ I18N::translate('Tampico, Mexico'); - case 'TEGUC': - return /* I18N: Location of an LDS church temple */ I18N::translate('Tegucigalpa, Honduras'); - case 'TGUTI': - return /* I18N: Location of an LDS church temple */ I18N::translate('Tuxtla Gutierrez, Mexico'); - case 'TIJUA': - return /* I18N: Location of an LDS church temple */ I18N::translate('Tijuana, Mexico'); - case 'TOKYO': - return /* I18N: Location of an LDS church temple */ I18N::translate('Tokyo, Japan'); - case 'TORNO': - return /* I18N: Location of an LDS church temple */ I18N::translate('Toronto, Ontario, Canada'); - case 'TRUJI': - return /* I18N: Location of an LDS church temple */ I18N::translate('Trujillo, Peru'); - case 'TWINF': - return /* I18N: Location of an LDS church temple */ I18N::translate('Twin Falls, Idaho, United States'); - case 'VANCO': - return /* I18N: Location of an LDS church temple */ I18N::translate('Vancouver, British Columbia, Canada'); - case 'VERAC': - return /* I18N: Location of an LDS church temple */ I18N::translate('Veracruz, Mexico'); - case 'VERNA': - return /* I18N: Location of an LDS church temple */ I18N::translate('Vernal, Utah, United States'); - case 'VILLA': - return /* I18N: Location of an LDS church temple */ I18N::translate('Villa Hermosa, Mexico'); - case 'WASHI': - return /* I18N: Location of an LDS church temple */ I18N::translate('Washington, District of Columbia, United States'); - case 'WINTE': - return /* I18N: Location of an LDS church temple */ I18N::translate('Winter Quarters, Nebraska, United States'); - default: - return $temple_code; + case 'ABA': + return /* I18N: Location of an LDS church temple */ I18N::translate('Aba, Nigeria'); + case 'ACCRA': + return /* I18N: Location of an LDS church temple */ I18N::translate('Accra, Ghana'); + case 'ADELA': + return /* I18N: Location of an LDS church temple */ I18N::translate('Adelaide, Australia'); + case 'ALBER': + return /* I18N: Location of an LDS church temple */ I18N::translate('Cardston, Alberta, Canada'); + case 'ALBUQ': + return /* I18N: Location of an LDS church temple */ I18N::translate('Albuquerque, New Mexico, United States'); + case 'ANCHO': + return /* I18N: Location of an LDS church temple */ I18N::translate('Anchorage, Alaska, United States'); + case 'APIA': + return /* I18N: Location of an LDS church temple */ I18N::translate('Apia, Samoa'); + case 'ARIZO': + return /* I18N: Location of an LDS church temple */ I18N::translate('Mesa, Arizona, United States'); + case 'ASUNC': + return /* I18N: Location of an LDS church temple */ I18N::translate('Asuncion, Paraguay'); + case 'ATLAN': + return /* I18N: Location of an LDS church temple */ I18N::translate('Atlanta, Georgia, United States'); + case 'BAIRE': + return /* I18N: Location of an LDS church temple */ I18N::translate('Buenos Aires, Argentina'); + case 'BILLI': + return /* I18N: Location of an LDS church temple */ I18N::translate('Billings, Montana, United States'); + case 'BIRMI': + return /* I18N: Location of an LDS church temple */ I18N::translate('Birmingham, Alabama, United States'); + case 'BISMA': + return /* I18N: Location of an LDS church temple */ I18N::translate('Bismarck, North Dakota, United States'); + case 'BOGOT': + return /* I18N: Location of an LDS church temple */ I18N::translate('Bogota, Colombia'); + case 'BOISE': + return /* I18N: Location of an LDS church temple */ I18N::translate('Boise, Idaho, United States'); + case 'BOSTO': + return /* I18N: Location of an LDS church temple */ I18N::translate('Boston, Massachusetts, United States'); + case 'BOUNT': + return /* I18N: Location of an LDS church temple */ I18N::translate('Bountiful, Utah, United States'); + case 'BRIGH': + return /* I18N: Location of an LDS church temple */ I18N::translate('Brigham City, Utah, United States'); + case 'BRISB': + return /* I18N: Location of an LDS church temple */ I18N::translate('Brisbane, Australia'); + case 'BROUG': + return /* I18N: Location of an LDS church temple */ I18N::translate('Baton Rouge, Louisiana, United States'); + case 'CALGA': + return /* I18N: Location of an LDS church temple */ I18N::translate('Calgary, Alberta, Canada'); + case 'CAMPI': + return /* I18N: Location of an LDS church temple */ I18N::translate('Campinas, Brazil'); + case 'CARAC': + return /* I18N: Location of an LDS church temple */ I18N::translate('Caracas, Venezuela'); + case 'CEBUP': + return /* I18N: Location of an LDS church temple */ I18N::translate('Cebu City, Philippines'); + case 'CHICA': + return /* I18N: Location of an LDS church temple */ I18N::translate('Chicago, Illinois, United States'); + case 'CIUJU': + return /* I18N: Location of an LDS church temple */ I18N::translate('Ciudad Juarez, Mexico'); + case 'COCHA': + return /* I18N: Location of an LDS church temple */ I18N::translate('Cochabamba, Bolivia'); + case 'COLJU': + return /* I18N: Location of an LDS church temple */ I18N::translate('Colonia Juarez, Mexico'); + case 'COLSC': + return /* I18N: Location of an LDS church temple */ I18N::translate('Columbia, South Carolina, United States'); + case 'COLUM': + return /* I18N: Location of an LDS church temple */ I18N::translate('Columbus, Ohio, United States'); + case 'COPEN': + return /* I18N: Location of an LDS church temple */ I18N::translate('Copenhagen, Denmark'); + case 'CORDO': + return /* I18N: Location of an LDS church temple */ I18N::translate('Cordoba, Argentina'); + case 'CRIVE': + return /* I18N: Location of an LDS church temple */ I18N::translate('Columbia River, Washington, United States'); + case 'CURIT': + return /* I18N: Location of an LDS church temple */ I18N::translate('Curitiba, Brazil'); + case 'DALLA': + return /* I18N: Location of an LDS church temple */ I18N::translate('Dallas, Texas, United States'); + case 'DENVE': + return /* I18N: Location of an LDS church temple */ I18N::translate('Denver, Colorado, United States'); + case 'DETRO': + return /* I18N: Location of an LDS church temple */ I18N::translate('Detroit, Michigan, United States'); + case 'DRAPE': + return /* I18N: Location of an LDS church temple */ I18N::translate('Draper, Utah, United States'); + case 'EDMON': + return /* I18N: Location of an LDS church temple */ I18N::translate('Edmonton, Alberta, Canada'); + case 'EHOUS': + return /* I18N: Location of an historic LDS church temple - http://en.wikipedia.org/wiki/Endowment_house */ I18N::translate('Endowment House'); + case 'FORTL': + return /* I18N: Location of an LDS church temple */ I18N::translate('Fort Lauderdale, Florida, United States'); + case 'FRANK': + return /* I18N: Location of an LDS church temple */ I18N::translate('Frankfurt am Main, Germany'); + case 'FREIB': + return /* I18N: Location of an LDS church temple */ I18N::translate('Freiburg, Germany'); + case 'FRESN': + return /* I18N: Location of an LDS church temple */ I18N::translate('Fresno, California, United States'); + case 'FUKUO': + return /* I18N: Location of an LDS church temple */ I18N::translate('Fukuoka, Japan'); + case 'GILAV': + return /* I18N: Location of an LDS church temple */ I18N::translate('Gila Valley, Arizona, United States'); + case 'GILBE': + return /* I18N: Location of an LDS church temple */ I18N::translate('Gilbert, Arizona, United States'); + case 'GUADA': + return /* I18N: Location of an LDS church temple */ I18N::translate('Guadalajara, Mexico'); + case 'GUATE': + return /* I18N: Location of an LDS church temple */ I18N::translate('Guatemala City, Guatemala'); + case 'GUAYA': + return /* I18N: Location of an LDS church temple */ I18N::translate('Guayaquil, Ecuador'); + case 'HAGUE': + return /* I18N: Location of an LDS church temple */ I18N::translate('The Hague, Netherlands'); + case 'HALIF': + return /* I18N: Location of an LDS church temple */ I18N::translate('Halifax, Nova Scotia, Canada'); + case 'HARTF': + return /* I18N: Location of an LDS church temple */ I18N::translate('Hartford, Connecticut, United States'); + case 'HAWAI': + return /* I18N: Location of an LDS church temple */ I18N::translate('Laie, Hawaii, United States'); + case 'HELSI': + return /* I18N: Location of an LDS church temple */ I18N::translate('Helsinki, Finland'); + case 'HERMO': + return /* I18N: Location of an LDS church temple */ I18N::translate('Hermosillo, Mexico'); + case 'HKONG': + return /* I18N: Location of an LDS church temple */ I18N::translate('Hong Kong'); + case 'HOUST': + return /* I18N: Location of an LDS church temple */ I18N::translate('Houston, Texas, United States'); + case 'IFALL': + return /* I18N: Location of an LDS church temple */ I18N::translate('Idaho Falls, Idaho, United States'); + case 'INDIA': + return /* I18N: Location of an LDS church temple */ I18N::translate('Indianapolis, Indiana, United States'); + case 'JOHAN': + return /* I18N: Location of an LDS church temple */ I18N::translate('Johannesburg, South Africa'); + case 'JRIVE': + return /* I18N: Location of an LDS church temple */ I18N::translate('Jordan River, Utah, United States'); + case 'KANSA': + return /* I18N: Location of an LDS church temple */ I18N::translate('Kansas City, Missouri, United States'); + case 'KONA': + return /* I18N: Location of an LDS church temple */ I18N::translate('Kona, Hawaii, United States'); + case 'KYIV': + return /* I18N: Location of an LDS church temple */ I18N::translate('Kiev, Ukraine'); + case 'LANGE': + return /* I18N: Location of an LDS church temple */ I18N::translate('Los Angeles, California, United States'); + case 'LIMA': + return /* I18N: Location of an LDS church temple */ I18N::translate('Lima, Peru'); + case 'LOGAN': + return /* I18N: Location of an LDS church temple */ I18N::translate('Logan, Utah, United States'); + case 'LONDO': + return /* I18N: Location of an LDS church temple */ I18N::translate('London, England'); + case 'LOUIS': + return /* I18N: Location of an LDS church temple */ I18N::translate('Louisville, Kentucky, United States'); + case 'LUBBO': + return /* I18N: Location of an LDS church temple */ I18N::translate('Lubbock, Texas, United States'); + case 'LVEGA': + return /* I18N: Location of an LDS church temple */ I18N::translate('Las Vegas, Nevada, United States'); + case 'MADRI': + return /* I18N: Location of an LDS church temple */ I18N::translate('Madrid, Spain'); + case 'MANAU': + return /* I18N: Location of an LDS church temple */ I18N::translate('Manaus, Brazil'); + case 'MANHA': + return /* I18N: Location of an LDS church temple */ I18N::translate('Manhattan, New York, United States'); + case 'MANIL': + return /* I18N: Location of an LDS church temple */ I18N::translate('Manila, Philippines'); + case 'MANTI': + return /* I18N: Location of an LDS church temple */ I18N::translate('Manti, Utah, United States'); + case 'MEDFO': + return /* I18N: Location of an LDS church temple */ I18N::translate('Medford, Oregon, United States'); + case 'MELBO': + return /* I18N: Location of an LDS church temple */ I18N::translate('Melbourne, Australia'); + case 'MEMPH': + return /* I18N: Location of an LDS church temple */ I18N::translate('Memphis, Tennessee, United States'); + case 'MERID': + return /* I18N: Location of an LDS church temple */ I18N::translate('Merida, Mexico'); + case 'MEXIC': + return /* I18N: Location of an LDS church temple */ I18N::translate('Mexico City, Mexico'); + case 'MNTVD': + return /* I18N: Location of an LDS church temple */ I18N::translate('Montevideo, Uruguay'); + case 'MONTE': + return /* I18N: Location of an LDS church temple */ I18N::translate('Monterrey, Mexico'); + case 'MONTI': + return /* I18N: Location of an LDS church temple */ I18N::translate('Monticello, Utah, United States'); + case 'MONTR': + return /* I18N: Location of an LDS church temple */ I18N::translate('Montreal, Quebec, Canada'); + case 'MTIMP': + return /* I18N: Location of an LDS church temple */ I18N::translate('Mount Timpanogos, Utah, United States'); + case 'NASHV': + return /* I18N: Location of an LDS church temple */ I18N::translate('Nashville, Tennessee, United States'); + case 'NAUV2': + return /* I18N: Location of an LDS church temple */ I18N::translate('Nauvoo (new), Illinois, United States'); + case 'NAUVO': + return /* I18N: Location of an historic LDS church temple */ I18N::translate('Nauvoo (original), Illinois, United States'); + case 'NBEAC': + return /* I18N: Location of an LDS church temple */ I18N::translate('Newport Beach, California, United States'); + case 'NUKUA': + return /* I18N: Location of an LDS church temple */ I18N::translate('Nuku’Alofa, Tonga'); + case 'NYORK': + return /* I18N: Location of an historic LDS church temple */ I18N::translate('New York, New York, United States'); + case 'NZEAL': + return /* I18N: Location of an LDS church temple */ I18N::translate('Hamilton, New Zealand'); + case 'OAKLA': + return /* I18N: Location of an LDS church temple */ I18N::translate('Oakland, California, United States'); + case 'OAXAC': + return /* I18N: Location of an LDS church temple */ I18N::translate('Oaxaca, Mexico'); + case 'OGDEN': + return /* I18N: Location of an LDS church temple */ I18N::translate('Ogden, Utah, United States'); + case 'OKLAH': + return /* I18N: Location of an LDS church temple */ I18N::translate('Oklahoma City, Oklahoma, United States'); + case 'OQUIR': + return /* I18N: Location of an LDS church temple */ I18N::translate('Oquirrh Mountain, Utah, United States'); + case 'ORLAN': + return /* I18N: Location of an LDS church temple */ I18N::translate('Orlando, Florida, United States'); + case 'PALEG': + return /* I18N: Location of an LDS church temple */ I18N::translate('Porto Alegre, Brazil'); + case 'PALMY': + return /* I18N: Location of an LDS church temple */ I18N::translate('Palmyra, New York, United States'); + case 'PANAM': + return /* I18N: Location of an LDS church temple */ I18N::translate('Panama City, Panama'); + case 'PAPEE': + return /* I18N: Location of an LDS church temple */ I18N::translate('Papeete, Tahiti'); + case 'PAYSO': + return /* I18N: Location of an LDS church temple */ I18N::translate('Payson, Utah, United States'); + case 'PERTH': + return /* I18N: Location of an LDS church temple */ I18N::translate('Perth, Australia'); + case 'PHOEN': + return /* I18N: Location of an LDS church temple */ I18N::translate('Phoenix, Arizona, United States'); + case 'POFFI': + return /* I18N: I18N: Location of an historic LDS church temple - http://en.wikipedia.org/wiki/President_of_the_Church */ I18N::translate('President’s Office'); + case 'PORTL': + return /* I18N: Location of an LDS church temple */ I18N::translate('Portland, Oregon, United States'); + case 'PREST': + return /* I18N: Location of an LDS church temple */ I18N::translate('Preston, England'); + case 'PROCC': + return /* I18N: Location of an LDS church temple */ I18N::translate('Provo City Center, Utah, United States'); + case 'PROVO': + return /* I18N: Location of an LDS church temple */ I18N::translate('Provo, Utah, United States'); + case 'QUETZ': + return /* I18N: Location of an LDS church temple */ I18N::translate('Quetzaltenango, Guatemala'); + case 'RALEI': + return /* I18N: Location of an LDS church temple */ I18N::translate('Raleigh, North Carolina, United States'); + case 'RECIF': + return /* I18N: Location of an LDS church temple */ I18N::translate('Recife, Brazil'); + case 'REDLA': + return /* I18N: Location of an LDS church temple */ I18N::translate('Redlands, California, United States'); + case 'REGIN': + return /* I18N: Location of an LDS church temple */ I18N::translate('Regina, Saskatchewan, Canada'); + case 'RENO': + return /* I18N: Location of an LDS church temple */ I18N::translate('Reno, Nevada, United States'); + case 'REXBU': + return /* I18N: Location of an LDS church temple */ I18N::translate('Rexburg, Idaho, United States'); + case 'SACRA': + return /* I18N: Location of an LDS church temple */ I18N::translate('Sacramento, California, United States'); + case 'SANSA': + return /* I18N: Location of an LDS church temple */ I18N::translate('San Salvador, El Salvador'); + case 'SANTI': + return /* I18N: Location of an LDS church temple */ I18N::translate('Santiago, Chile'); + case 'SANTO': + return /* I18N: Location of an LDS church temple */ I18N::translate('San Antonio, Texas, United States'); + case 'SDIEG': + return /* I18N: Location of an LDS church temple */ I18N::translate('San Diego, California, United States'); + case 'SDOMI': + return /* I18N: Location of an LDS church temple */ I18N::translate('Santo Domingo, Dominican Republic'); + case 'SEATT': + return /* I18N: Location of an LDS church temple */ I18N::translate('Seattle, Washington, United States'); + case 'SEOUL': + return /* I18N: Location of an LDS church temple */ I18N::translate('Seoul, Korea'); + case 'SGEOR': + return /* I18N: Location of an LDS church temple */ I18N::translate('St. George, Utah, United States'); + case 'SJOSE': + return /* I18N: Location of an LDS church temple */ I18N::translate('San Jose, Costa Rica'); + case 'SLAKE': + return /* I18N: Location of an LDS church temple */ I18N::translate('Salt Lake City, Utah, United States'); + case 'SLOUI': + return /* I18N: Location of an LDS church temple */ I18N::translate('St. Louis, Missouri, United States'); + case 'SNOWF': + return /* I18N: Location of an LDS church temple */ I18N::translate('Snowflake, Arizona, United States'); + case 'SPAUL': + return /* I18N: Location of an LDS church temple */ I18N::translate('Sao Paulo, Brazil'); + case 'SPMIN': + return /* I18N: Location of an LDS church temple */ I18N::translate('St. Paul, Minnesota, United States'); + case 'SPOKA': + return /* I18N: Location of an LDS church temple */ I18N::translate('Spokane, Washington, United States'); + case 'STOCK': + return /* I18N: Location of an LDS church temple */ I18N::translate('Stockholm, Sweden'); + case 'SUVA': + return /* I18N: Location of an LDS church temple */ I18N::translate('Suva, Fiji'); + case 'SWISS': + return /* I18N: Location of an LDS church temple */ I18N::translate('Bern, Switzerland'); + case 'SYDNE': + return /* I18N: Location of an LDS church temple */ I18N::translate('Sydney, Australia'); + case 'TAIPE': + return /* I18N: Location of an LDS church temple */ I18N::translate('Taipei, Taiwan'); + case 'TAMPI': + return /* I18N: Location of an LDS church temple */ I18N::translate('Tampico, Mexico'); + case 'TEGUC': + return /* I18N: Location of an LDS church temple */ I18N::translate('Tegucigalpa, Honduras'); + case 'TGUTI': + return /* I18N: Location of an LDS church temple */ I18N::translate('Tuxtla Gutierrez, Mexico'); + case 'TIJUA': + return /* I18N: Location of an LDS church temple */ I18N::translate('Tijuana, Mexico'); + case 'TOKYO': + return /* I18N: Location of an LDS church temple */ I18N::translate('Tokyo, Japan'); + case 'TORNO': + return /* I18N: Location of an LDS church temple */ I18N::translate('Toronto, Ontario, Canada'); + case 'TRUJI': + return /* I18N: Location of an LDS church temple */ I18N::translate('Trujillo, Peru'); + case 'TWINF': + return /* I18N: Location of an LDS church temple */ I18N::translate('Twin Falls, Idaho, United States'); + case 'VANCO': + return /* I18N: Location of an LDS church temple */ I18N::translate('Vancouver, British Columbia, Canada'); + case 'VERAC': + return /* I18N: Location of an LDS church temple */ I18N::translate('Veracruz, Mexico'); + case 'VERNA': + return /* I18N: Location of an LDS church temple */ I18N::translate('Vernal, Utah, United States'); + case 'VILLA': + return /* I18N: Location of an LDS church temple */ I18N::translate('Villa Hermosa, Mexico'); + case 'WASHI': + return /* I18N: Location of an LDS church temple */ I18N::translate('Washington, District of Columbia, United States'); + case 'WINTE': + return /* I18N: Location of an LDS church temple */ I18N::translate('Winter Quarters, Nebraska, United States'); + default: + return $temple_code; } } diff --git a/app/GedcomRecord.php b/app/GedcomRecord.php index 375c763eac..6c824fc88a 100644 --- a/app/GedcomRecord.php +++ b/app/GedcomRecord.php @@ -198,27 +198,27 @@ class GedcomRecord { } switch ($type) { - case 'INDI': - $record = new Individual($xref, $gedcom, $pending, $tree); - break; - case 'FAM': - $record = new Family($xref, $gedcom, $pending, $tree); - break; - case 'SOUR': - $record = new Source($xref, $gedcom, $pending, $tree); - break; - case 'OBJE': - $record = new Media($xref, $gedcom, $pending, $tree); - break; - case 'REPO': - $record = new Repository($xref, $gedcom, $pending, $tree); - break; - case 'NOTE': - $record = new Note($xref, $gedcom, $pending, $tree); - break; - default: - $record = new self($xref, $gedcom, $pending, $tree); - break; + case 'INDI': + $record = new Individual($xref, $gedcom, $pending, $tree); + break; + case 'FAM': + $record = new Family($xref, $gedcom, $pending, $tree); + break; + case 'SOUR': + $record = new Source($xref, $gedcom, $pending, $tree); + break; + case 'OBJE': + $record = new Media($xref, $gedcom, $pending, $tree); + break; + case 'REPO': + $record = new Repository($xref, $gedcom, $pending, $tree); + break; + case 'NOTE': + $record = new Note($xref, $gedcom, $pending, $tree); + break; + default: + $record = new self($xref, $gedcom, $pending, $tree); + break; } // Store it in the cache @@ -428,31 +428,31 @@ class GedcomRecord { // CACHING: this function can take three different parameters, // and therefore needs three different caches for the result. switch ($access_level) { - case Auth::PRIV_PRIVATE: // visitor - if ($this->disp_public === null) { - $this->disp_public = $this->canShowRecord(Auth::PRIV_PRIVATE); - } + case Auth::PRIV_PRIVATE: // visitor + if ($this->disp_public === null) { + $this->disp_public = $this->canShowRecord(Auth::PRIV_PRIVATE); + } - return $this->disp_public; - case Auth::PRIV_USER: // member - if ($this->disp_user === null) { - $this->disp_user = $this->canShowRecord(Auth::PRIV_USER); - } + return $this->disp_public; + case Auth::PRIV_USER: // member + if ($this->disp_user === null) { + $this->disp_user = $this->canShowRecord(Auth::PRIV_USER); + } - return $this->disp_user; - case Auth::PRIV_NONE: // admin - if ($this->disp_none === null) { - $this->disp_none = $this->canShowRecord(Auth::PRIV_NONE); - } + return $this->disp_user; + case Auth::PRIV_NONE: // admin + if ($this->disp_none === null) { + $this->disp_none = $this->canShowRecord(Auth::PRIV_NONE); + } - return $this->disp_none; - case Auth::PRIV_HIDE: // hidden from admins - // We use this value to bypass privacy checks. For example, - // when downloading data or when calculating privacy itself. - return true; - default: - // Should never get here. - return false; + return $this->disp_none; + case Auth::PRIV_HIDE: // hidden from admins + // We use this value to bypass privacy checks. For example, + // when downloading data or when calculating privacy itself. + return true; + default: + // Should never get here. + return false; } } @@ -809,10 +809,10 @@ class GedcomRecord { } if ($event->getDate()->isOK() || !$event->getPlace()->isEmpty()) { switch ($style) { - case 1: - return '<br><em>' . $event->getLabel() . ' ' . FunctionsPrint::formatFactDate($event, $this, false, false) . $joiner . FunctionsPrint::formatFactPlace($event) . '</em>'; - case 2: - return '<dl><dt class="label">' . $event->getLabel() . '</dt><dd class="field">' . FunctionsPrint::formatFactDate($event, $this, false, false) . $joiner . FunctionsPrint::formatFactPlace($event) . '</dd></dl>'; + case 1: + return '<br><em>' . $event->getLabel() . ' ' . FunctionsPrint::formatFactDate($event, $this, false, false) . $joiner . FunctionsPrint::formatFactPlace($event) . '</em>'; + case 2: + return '<dl><dt class="label">' . $event->getLabel() . '</dt><dd class="field">' . FunctionsPrint::formatFactDate($event, $this, false, false) . $joiner . FunctionsPrint::formatFactPlace($event) . '</dd></dl>'; } } } diff --git a/app/GedcomTag.php b/app/GedcomTag.php index 1a8ba7edfb..5348d44672 100644 --- a/app/GedcomTag.php +++ b/app/GedcomTag.php @@ -116,1274 +116,1274 @@ class GedcomTag { } switch ($tag) { - case 'ABBR': - return /* I18N: gedcom tag ABBR */ I18N::translate('Abbreviation'); - case 'ADDR': - return /* I18N: gedcom tag ADDR */ I18N::translate('Address'); - case 'ADR1': - return I18N::translate('Address line 1'); - case 'ADR2': - return I18N::translate('Address line 2'); - case 'ADOP': - return /* I18N: gedcom tag ADOP */ I18N::translate('Adoption'); - case 'ADOP:DATE': - return I18N::translate('Date of adoption'); - case 'ADOP:PLAC': - return I18N::translate('Place of adoption'); - case 'AFN': - return /* I18N: gedcom tag AFN */ I18N::translate('Ancestral file number'); - case 'AGE': - return /* I18N: gedcom tag AGE */ I18N::translate('Age'); - case 'AGNC': - return /* I18N: gedcom tag AGNC */ I18N::translate('Agency'); - case 'ALIA': - return /* I18N: gedcom tag ALIA */ I18N::translate('Alias'); - case 'ANCE': - return /* I18N: gedcom tag ANCE */ I18N::translate('Generations of ancestors'); - case 'ANCI': - return /* I18N: gedcom tag ANCI */ I18N::translate('Ancestors interest'); - case 'ANUL': - return /* I18N: gedcom tag ANUL */ I18N::translate('Annulment'); - case 'ASSO': - return /* I18N: gedcom tag ASSO */ I18N::translate('Associate'); /* see also _ASSO */ - case 'AUTH': - return /* I18N: gedcom tag AUTH */ I18N::translate('Author'); - case 'BAPL': - return /* I18N: gedcom tag BAPL. LDS = Church of Latter Day Saints. */ I18N::translate('LDS baptism'); - case 'BAPL:DATE': - return /* I18N: LDS = Church of Latter Day Saints. */ I18N::translate('Date of LDS baptism'); - case 'BAPL:PLAC': - return /* I18N: LDS = Church of Latter Day Saints. */ I18N::translate('Place of LDS baptism'); - case 'BAPM': - return /* I18N: gedcom tag BAPM */ I18N::translate('Baptism'); - case 'BAPM:DATE': - return I18N::translate('Date of baptism'); - case 'BAPM:PLAC': - return I18N::translate('Place of baptism'); - case 'BARM': - return /* I18N: gedcom tag BARM */ I18N::translate('Bar mitzvah'); - case 'BARM:DATE': - return I18N::translate('Date of bar mitzvah'); - case 'BARM:PLAC': - return I18N::translate('Place of bar mitzvah'); - case 'BASM': - return /* I18N: gedcom tag BASM */ I18N::translate('Bat mitzvah'); - case 'BASM:DATE': - return I18N::translate('Date of bat mitzvah'); - case 'BASM:PLAC': - return I18N::translate('Place of bat mitzvah'); - case 'BIRT': - return /* I18N: gedcom tag BIRT */ I18N::translate('Birth'); - case 'BIRT:DATE': - return I18N::translate('Date of birth'); - case 'BIRT:PLAC': - return I18N::translate('Place of birth'); - case 'BLES': - return /* I18N: gedcom tag BLES */ I18N::translate('Blessing'); - case 'BLES:DATE': - return I18N::translate('Date of blessing'); - case 'BLES:PLAC': - return I18N::translate('Place of blessing'); - case 'BLOB': - return /* I18N: gedcom tag BLOB */ I18N::translate('Binary data object'); - case 'BURI': - return /* I18N: gedcom tag BURI */ I18N::translate('Burial'); - case 'BURI:DATE': - return I18N::translate('Date of burial'); - case 'BURI:PLAC': - return I18N::translate('Place of burial'); - case 'CALN': - return /* I18N: gedcom tag CALN */ I18N::translate('Call number'); - case 'CAST': - return /* I18N: gedcom tag CAST */ I18N::translate('Caste'); - case 'CAUS': - return /* I18N: gedcom tag CAUS */ I18N::translate('Cause'); - case 'CEME': - return /* I18N: gedcom tag CEME */ I18N::translate('Cemetery'); - case 'CENS': - return /* I18N: gedcom tag CENS */ I18N::translate('Census'); - case 'CENS:DATE': - return I18N::translate('Census date'); - case 'CENS:PLAC': - return I18N::translate('Census place'); - case '_UPD': // Family Tree Builder uses "1 _UPD 14 APR 2012 00:14:10 GMT-5" instead of 1 CHAN/2 DATE/3 TIME - case 'CHAN': - return /* I18N: gedcom tag CHAN */ I18N::translate('Last change'); - case 'CHAN:DATE': - return /* I18N: gedcom tag CHAN:DATE */ I18N::translate('Date of last change'); - case 'CHAN:_WT_USER': - return /* I18N: gedcom tag CHAN:_WT_USER */ I18N::translate('Author of last change'); - case 'CHAR': - return /* I18N: gedcom tag CHAR */ I18N::translate('Character set'); - case 'CHIL': - return /* I18N: gedcom tag CHIL */ I18N::translate('Child'); - case 'CHR': - return /* I18N: gedcom tag CHR */ I18N::translate('Christening'); - case 'CHR:DATE': - return I18N::translate('Date of christening'); - case 'CHR:PLAC': - return I18N::translate('Place of christening'); - case 'CHRA': - return /* I18N: gedcom tag CHRA */ I18N::translate('Adult christening'); - case 'CITN': - return /* I18N: gedcom tag CITN */ I18N::translate('Citizenship'); - case 'CITY': - return /* I18N: gedcom tag CITY */ I18N::translate('City'); - case 'COMM': - return /* I18N: gedcom tag COMM */ I18N::translate('Comment'); - case 'CONC': - return /* I18N: gedcom tag CONC */ I18N::translate('Concatenation'); - case 'CONT': - return /* I18N: gedcom tag CONT */ I18N::translate('Continued'); - case 'CONF': - return /* I18N: gedcom tag CONF */ I18N::translate('Confirmation'); - case 'CONF:DATE': - return I18N::translate('Date of confirmation'); - case 'CONF:PLAC': - return I18N::translate('Place of confirmation'); - case 'CONL': - return /* I18N: gedcom tag CONL. LDS = Church of Latter Day Saints. */ I18N::translate('LDS confirmation'); - case 'COPR': - return /* I18N: gedcom tag COPR */ I18N::translate('Copyright'); - case 'CORP': - return /* I18N: gedcom tag CORP */ I18N::translate('Corporation'); - case 'CREM': - return /* I18N: gedcom tag CREM */ I18N::translate('Cremation'); - case 'CREM:DATE': - return I18N::translate('Date of cremation'); - case 'CREM:PLAC': - return I18N::translate('Place of cremation'); - case 'CTRY': - return /* I18N: gedcom tag CTRY */ I18N::translate('Country'); - case 'DATA': - return /* I18N: gedcom tag DATA */ I18N::translate('Data'); - case 'DATA:DATE': - return I18N::translate('Date of entry in original source'); - case '_DATE': // Family Tree Builder uses OBJE:_DATE - case 'DATE': - return /* I18N: gedcom tag DATE */ I18N::translate('Date'); - case 'DEAT': - return /* I18N: gedcom tag DEAT */ I18N::translate('Death'); - case 'DEAT:CAUS': - return I18N::translate('Cause of death'); - case 'DEAT:DATE': - return I18N::translate('Date of death'); - case 'DEAT:PLAC': - return I18N::translate('Place of death'); - case 'DESC': - return /* I18N: gedcom tag DESC */ - I18N::translate('Descendants'); - case 'DESI': - return /* I18N: gedcom tag DESI */ I18N::translate('Descendants interest'); - case 'DEST': - return /* I18N: gedcom tag DEST */ I18N::translate('Destination'); - case 'DIV': - return /* I18N: gedcom tag DIV */ I18N::translate('Divorce'); - case 'DIVF': - return /* I18N: gedcom tag DIVF */ I18N::translate('Divorce filed'); - case 'DSCR': - return /* I18N: gedcom tag DSCR */ I18N::translate('Description'); - case 'EDUC': - return /* I18N: gedcom tag EDUC */ I18N::translate('Education'); - case 'EDUC:AGNC': - return I18N::translate('School or college'); - case 'EMAI': - case 'EMAL': - case 'EMAIL': - return /* I18N: gedcom tag EMAIL */ I18N::translate('Email address'); - case 'EMIG': - return /* I18N: gedcom tag EMIG */ I18N::translate('Emigration'); - case 'EMIG:DATE': - return I18N::translate('Date of emigration'); - case 'EMIG:PLAC': - return I18N::translate('Place of emigration'); - case 'ENDL': - return /* I18N: gedcom tag ENDL. LDS = Church of Latter Day Saints. */ I18N::translate('LDS endowment'); - case 'ENDL:DATE': - return /* I18N: LDS = Church of Latter Day Saints. */ I18N::translate('Date of LDS endowment'); - case 'ENDL:PLAC': - return /* I18N: LDS = Church of Latter Day Saints. */ I18N::translate('Place of LDS endowment'); - case 'ENGA': - return /* I18N: gedcom tag ENGA */ I18N::translate('Engagement'); - case 'ENGA:DATE': - return I18N::translate('Date of engagement'); - case 'ENGA:PLAC': - return I18N::translate('Place of engagement'); - case 'EVEN': - return /* I18N: gedcom tag EVEN */ I18N::translate('Event'); - case 'EVEN:DATE': - return I18N::translate('Date of event'); - case 'EVEN:PLAC': - return I18N::translate('Place of event'); - case 'EVEN:TYPE': - return I18N::translate('Type of event'); - case 'FACT': - return /* I18N: gedcom tag FACT */ I18N::translate('Fact'); - case 'FACT:TYPE': - return I18N::translate('Type of fact'); - case 'FAM': - return /* I18N: gedcom tag FAM */ I18N::translate('Family'); - case 'FAMC': - return /* I18N: gedcom tag FAMC */ I18N::translate('Family as a child'); - case 'FAMF': - return /* I18N: gedcom tag FAMF */ I18N::translate('Family file'); - case 'FAMS': - return /* I18N: gedcom tag FAMS */ I18N::translate('Family as a spouse'); - case 'FAMS:CENS:DATE': - return I18N::translate('Spouse census date'); - case 'FAMS:CENS:PLAC': - return I18N::translate('Spouse census place'); - case 'FAMS:DIV:DATE': - return I18N::translate('Date of divorce'); - case 'FAMS:MARR:DATE': - return I18N::translate('Date of marriage'); - case 'FAMS:MARR:PLAC': - return I18N::translate('Place of marriage'); - case 'FAMS:NOTE': - return I18N::translate('Spouse note'); - case 'FAMS:SLGS:DATE': - return /* I18N: LDS = Church of Latter Day Saints. */ I18N::translate('Date of LDS spouse sealing'); - case 'FAMS:SLGS:PLAC': - return /* I18N: LDS = Church of Latter Day Saints. */ I18N::translate('Place of LDS spouse sealing'); - case 'FAX': - return /* I18N: gedcom tag FAX */ I18N::translate('Fax'); - case 'FCOM': - return /* I18N: gedcom tag FCOM */ I18N::translate('First communion'); - case 'FCOM:DATE': - return I18N::translate('Date of first communion'); - case 'FCOM:PLAC': - return I18N::translate('Place of first communion'); - case 'FILE': - return /* I18N: gedcom tag FILE */ I18N::translate('Filename'); - case 'FONE': - return /* I18N: gedcom tag FONE */ I18N::translate('Phonetic'); - case 'FORM': - return /* I18N: gedcom tag FORM */ I18N::translate('Format'); - case 'GEDC': - return /* I18N: gedcom tag GEDC */ I18N::translate('GEDCOM file'); - case 'GIVN': - return /* I18N: gedcom tag GIVN */ I18N::translate('Given names'); - case 'GRAD': - return /* I18N: gedcom tag GRAD */ I18N::translate('Graduation'); - case 'HEAD': - return /* I18N: gedcom tag HEAD */ I18N::translate('Header'); - case 'HUSB': - return /* I18N: gedcom tag HUSB */ I18N::translate('Husband'); - case 'IDNO': - return /* I18N: gedcom tag IDNO */ I18N::translate('Identification number'); - case 'IMMI': - return /* I18N: gedcom tag IMMI */ I18N::translate('Immigration'); - case 'IMMI:DATE': - return I18N::translate('Date of immigration'); - case 'IMMI:PLAC': - return I18N::translate('Place of immigration'); - case 'INDI': - return /* I18N: gedcom tag INDI */ I18N::translate('Individual'); - case 'INFL': - return /* I18N: gedcom tag INFL */ I18N::translate('Infant'); - case 'LANG': - return /* I18N: gedcom tag LANG */ I18N::translate('Language'); - case 'LATI': - return /* I18N: gedcom tag LATI */ I18N::translate('Latitude'); - case 'LEGA': - return /* I18N: gedcom tag LEGA */ I18N::translate('Legatee'); - case 'LONG': - return /* I18N: gedcom tag LONG */ I18N::translate('Longitude'); - case 'MAP': - return /* I18N: gedcom tag MAP */ I18N::translate('Map'); - case 'MARB': - return /* I18N: gedcom tag MARB */ I18N::translate('Marriage banns'); - case 'MARB:DATE': - return I18N::translate('Date of marriage banns'); - case 'MARB:PLAC': - return I18N::translate('Place of marriage banns'); - case 'MARC': - return /* I18N: gedcom tag MARC */ I18N::translate('Marriage contract'); - case 'MARL': - return /* I18N: gedcom tag MARL */ I18N::translate('Marriage license'); - case 'MARR': - return /* I18N: gedcom tag MARR */ I18N::translate('Marriage'); - case 'MARR:DATE': - return I18N::translate('Date of marriage'); - case 'MARR:PLAC': - return I18N::translate('Place of marriage'); - case 'MARR_CIVIL': - return I18N::translate('Civil marriage'); - case 'MARR_PARTNERS': - return I18N::translate('Registered partnership'); - case 'MARR_RELIGIOUS': - return I18N::translate('Religious marriage'); - case 'MARR_UNKNOWN': - return I18N::translate('Marriage type unknown'); - case 'MARS': - return /* I18N: gedcom tag MARS */ I18N::translate('Marriage settlement'); - case 'MEDI': - return /* I18N: gedcom tag MEDI */ I18N::translate('Media type'); - case 'NAME': - if ($record instanceof Repository) { - return /* I18N: gedcom tag REPO:NAME */ I18N::translateContext('Repository', 'Name'); - } else { - return /* I18N: gedcom tag NAME */ I18N::translate('Name'); - } - case 'NAME:FONE': - return I18N::translate('Phonetic name'); - case 'NAME:_HEB': - return I18N::translate('Name in Hebrew'); - case 'NATI': - return /* I18N: gedcom tag NATI */ I18N::translate('Nationality'); - case 'NATU': - return /* I18N: gedcom tag NATU */ I18N::translate('Naturalization'); - case 'NATU:DATE': - return I18N::translate('Date of naturalization'); - case 'NATU:PLAC': - return I18N::translate('Place of naturalization'); - case 'NCHI': - return /* I18N: gedcom tag NCHI */ I18N::translate('Number of children'); - case 'NICK': - return /* I18N: gedcom tag NICK */ I18N::translate('Nickname'); - case 'NMR': - return /* I18N: gedcom tag NMR */ I18N::translate('Number of marriages'); - case 'NOTE': - return /* I18N: gedcom tag NOTE */ I18N::translate('Note'); - case 'NPFX': - return /* I18N: gedcom tag NPFX */ I18N::translate('Name prefix'); - case 'NSFX': - return /* I18N: gedcom tag NSFX */ I18N::translate('Name suffix'); - case 'OBJE': - return /* I18N: gedcom tag OBJE */ I18N::translate('Media object'); - case 'OCCU': - return /* I18N: gedcom tag OCCU */ I18N::translate('Occupation'); - case 'OCCU:AGNC': - return I18N::translate('Employer'); - case 'ORDI': - return /* I18N: gedcom tag ORDI */ I18N::translate('Ordinance'); - case 'ORDN': - return /* I18N: gedcom tag ORDN */ I18N::translate('Ordination'); - case 'ORDN:AGNC': - return I18N::translate('Religious institution'); - case 'ORDN:DATE': - return I18N::translate('Date of ordination'); - case 'ORDN:PLAC': - return I18N::translate('Place of ordination'); - case 'PAGE': - return /* I18N: gedcom tag PAGE */ I18N::translate('Citation details'); - case 'PEDI': - return /* I18N: gedcom tag PEDI */ I18N::translate('Relationship to parents'); - case 'PHON': - return /* I18N: gedcom tag PHON */ I18N::translate('Phone'); - case '_PLACE': // Family Tree Builder uses OBJE:_PLACE - case 'PLAC': - return /* I18N: gedcom tag PLAC */ I18N::translate('Place'); - case 'PLAC:FONE': - return I18N::translate('Phonetic place'); - case 'PLAC:ROMN': - return I18N::translate('Romanized place'); - case 'PLAC:_HEB': - return I18N::translate('Place in Hebrew'); - case 'POST': - return /* I18N: gedcom tag POST */ I18N::translate('Postal code'); - case 'PROB': - return /* I18N: gedcom tag PROB */ I18N::translate('Probate'); - case 'PROP': - return /* I18N: gedcom tag PROP */ I18N::translate('Property'); - case 'PUBL': - return /* I18N: gedcom tag PUBL */ I18N::translate('Publication'); - case 'QUAY': - return /* I18N: gedcom tag QUAY */ I18N::translate('Quality of data'); - case 'REFN': - return /* I18N: gedcom tag REFN */ I18N::translate('Reference number'); - case 'RELA': - return /* I18N: gedcom tag RELA */ I18N::translate('Relationship'); - case 'RELI': - return /* I18N: gedcom tag RELI */ I18N::translate('Religion'); - case 'REPO': - return /* I18N: gedcom tag REPO */ I18N::translate('Repository'); - case 'RESI': - return /* I18N: gedcom tag RESI */ I18N::translate('Residence'); - case 'RESI:DATE': - return I18N::translate('Date of residence'); - case 'RESI:PLAC': - return I18N::translate('Place of residence'); - case 'RESN': - return /* I18N: gedcom tag RESN */ I18N::translate('Restriction'); - case 'RETI': - return /* I18N: gedcom tag RETI */ I18N::translate('Retirement'); - case 'RETI:AGNC': - return I18N::translate('Employer'); - case 'RFN': - return /* I18N: gedcom tag RFN */ I18N::translate('Record file number'); - case '_PHOTO_RIN': // Family Tree Builder uses "0 OBJE/1 _PHOTO_RIN" - case '_PRIN': // Family Tree Builder uses "0 _ALBUM/1 _PHOTO/2 _PRIN" - case 'RIN': - return /* I18N: gedcom tag RIN */ I18N::translate('Record ID number'); - case 'ROLE': - return /* I18N: gedcom tag ROLE */ I18N::translate('Role'); - case 'ROMN': - return /* I18N: gedcom tag ROMN */ I18N::translate('Romanized'); - case 'SERV': - return /* I18N: gedcom tag SERV */ I18N::translate('Remote server'); - case 'SEX': - return /* I18N: gedcom tag SEX */ I18N::translate('Gender'); - case 'SHARED_NOTE': - return I18N::translate('Shared note'); - case 'SLGC': - return /* I18N: gedcom tag SLGC. LDS = Church of Latter Day Saints. */ I18N::translate('LDS child sealing'); - case 'SLGC:DATE': - return /* I18N: LDS = Church of Latter Day Saints. */ I18N::translate('Date of LDS child sealing'); - case 'SLGC:PLAC': - return /* I18N: LDS = Church of Latter Day Saints. */ I18N::translate('Place of LDS child sealing'); - case 'SLGS': - return /* I18N: gedcom tag SLGS. LDS = Church of Latter Day Saints. */ I18N::translate('LDS spouse sealing'); - case 'SOUR': - return /* I18N: gedcom tag SOUR */ I18N::translate('Source'); - case 'SPFX': - return /* I18N: gedcom tag SPFX */ I18N::translate('Surname prefix'); - case 'SSN': - return /* I18N: gedcom tag SSN */ I18N::translate('Social security number'); - case 'STAE': - return /* I18N: gedcom tag STAE */ I18N::translate('State'); - case 'STAT': - return /* I18N: gedcom tag STAT */ I18N::translate('Status'); - case 'STAT:DATE': - return I18N::translate('Status change date'); - case 'SUBM': - return /* I18N: gedcom tag SUBM */ I18N::translate('Submitter'); - case 'SUBN': - return /* I18N: gedcom tag SUBN */ I18N::translate('Submission'); - case 'SURN': - return /* I18N: gedcom tag SURN */ I18N::translate('Surname'); - case 'TEMP': - return /* I18N: gedcom tag TEMP */ I18N::translate('Temple'); - case 'TEXT': - return /* I18N: gedcom tag TEXT */ I18N::translate('Text'); - case 'TIME': - return /* I18N: gedcom tag TIME */ I18N::translate('Time'); - case 'TITL': - return /* I18N: gedcom tag TITL */ I18N::translate('Title'); - case 'TITL:FONE': - return I18N::translate('Phonetic title'); - case 'TITL:ROMN': - return I18N::translate('Romanized title'); - case 'TITL:_HEB': - return I18N::translate('Title in Hebrew'); - case 'TRLR': - return /* I18N: gedcom tag TRLR */ I18N::translate('Trailer'); - case 'TYPE': - return /* I18N: gedcom tag TYPE */ I18N::translate('Type'); - case 'URL': - return /* I18N: gedcom tag URL (A web address / URL) */ I18N::translate('URL'); - case 'VERS': - return /* I18N: gedcom tag VERS */ I18N::translate('Version'); - case 'WIFE': - return /* I18N: gedcom tag WIFE */ I18N::translate('Wife'); - case 'WILL': - return /* I18N: gedcom tag WILL */ I18N::translate('Will'); - case 'WWW': - return /* I18N: gedcom tag WWW (A web address / URL) */ I18N::translate('URL'); - case '_ADOP_CHIL': - switch ($sex) { - case 'M': - return I18N::translate('Adoption of a son'); - case 'F': - return I18N::translate('Adoption of a daughter'); + case 'ABBR': + return /* I18N: gedcom tag ABBR */ I18N::translate('Abbreviation'); + case 'ADDR': + return /* I18N: gedcom tag ADDR */ I18N::translate('Address'); + case 'ADR1': + return I18N::translate('Address line 1'); + case 'ADR2': + return I18N::translate('Address line 2'); + case 'ADOP': + return /* I18N: gedcom tag ADOP */ I18N::translate('Adoption'); + case 'ADOP:DATE': + return I18N::translate('Date of adoption'); + case 'ADOP:PLAC': + return I18N::translate('Place of adoption'); + case 'AFN': + return /* I18N: gedcom tag AFN */ I18N::translate('Ancestral file number'); + case 'AGE': + return /* I18N: gedcom tag AGE */ I18N::translate('Age'); + case 'AGNC': + return /* I18N: gedcom tag AGNC */ I18N::translate('Agency'); + case 'ALIA': + return /* I18N: gedcom tag ALIA */ I18N::translate('Alias'); + case 'ANCE': + return /* I18N: gedcom tag ANCE */ I18N::translate('Generations of ancestors'); + case 'ANCI': + return /* I18N: gedcom tag ANCI */ I18N::translate('Ancestors interest'); + case 'ANUL': + return /* I18N: gedcom tag ANUL */ I18N::translate('Annulment'); + case 'ASSO': + return /* I18N: gedcom tag ASSO */ I18N::translate('Associate'); /* see also _ASSO */ + case 'AUTH': + return /* I18N: gedcom tag AUTH */ I18N::translate('Author'); + case 'BAPL': + return /* I18N: gedcom tag BAPL. LDS = Church of Latter Day Saints. */ I18N::translate('LDS baptism'); + case 'BAPL:DATE': + return /* I18N: LDS = Church of Latter Day Saints. */ I18N::translate('Date of LDS baptism'); + case 'BAPL:PLAC': + return /* I18N: LDS = Church of Latter Day Saints. */ I18N::translate('Place of LDS baptism'); + case 'BAPM': + return /* I18N: gedcom tag BAPM */ I18N::translate('Baptism'); + case 'BAPM:DATE': + return I18N::translate('Date of baptism'); + case 'BAPM:PLAC': + return I18N::translate('Place of baptism'); + case 'BARM': + return /* I18N: gedcom tag BARM */ I18N::translate('Bar mitzvah'); + case 'BARM:DATE': + return I18N::translate('Date of bar mitzvah'); + case 'BARM:PLAC': + return I18N::translate('Place of bar mitzvah'); + case 'BASM': + return /* I18N: gedcom tag BASM */ I18N::translate('Bat mitzvah'); + case 'BASM:DATE': + return I18N::translate('Date of bat mitzvah'); + case 'BASM:PLAC': + return I18N::translate('Place of bat mitzvah'); + case 'BIRT': + return /* I18N: gedcom tag BIRT */ I18N::translate('Birth'); + case 'BIRT:DATE': + return I18N::translate('Date of birth'); + case 'BIRT:PLAC': + return I18N::translate('Place of birth'); + case 'BLES': + return /* I18N: gedcom tag BLES */ I18N::translate('Blessing'); + case 'BLES:DATE': + return I18N::translate('Date of blessing'); + case 'BLES:PLAC': + return I18N::translate('Place of blessing'); + case 'BLOB': + return /* I18N: gedcom tag BLOB */ I18N::translate('Binary data object'); + case 'BURI': + return /* I18N: gedcom tag BURI */ I18N::translate('Burial'); + case 'BURI:DATE': + return I18N::translate('Date of burial'); + case 'BURI:PLAC': + return I18N::translate('Place of burial'); + case 'CALN': + return /* I18N: gedcom tag CALN */ I18N::translate('Call number'); + case 'CAST': + return /* I18N: gedcom tag CAST */ I18N::translate('Caste'); + case 'CAUS': + return /* I18N: gedcom tag CAUS */ I18N::translate('Cause'); + case 'CEME': + return /* I18N: gedcom tag CEME */ I18N::translate('Cemetery'); + case 'CENS': + return /* I18N: gedcom tag CENS */ I18N::translate('Census'); + case 'CENS:DATE': + return I18N::translate('Census date'); + case 'CENS:PLAC': + return I18N::translate('Census place'); + case '_UPD': // Family Tree Builder uses "1 _UPD 14 APR 2012 00:14:10 GMT-5" instead of 1 CHAN/2 DATE/3 TIME + case 'CHAN': + return /* I18N: gedcom tag CHAN */ I18N::translate('Last change'); + case 'CHAN:DATE': + return /* I18N: gedcom tag CHAN:DATE */ I18N::translate('Date of last change'); + case 'CHAN:_WT_USER': + return /* I18N: gedcom tag CHAN:_WT_USER */ I18N::translate('Author of last change'); + case 'CHAR': + return /* I18N: gedcom tag CHAR */ I18N::translate('Character set'); + case 'CHIL': + return /* I18N: gedcom tag CHIL */ I18N::translate('Child'); + case 'CHR': + return /* I18N: gedcom tag CHR */ I18N::translate('Christening'); + case 'CHR:DATE': + return I18N::translate('Date of christening'); + case 'CHR:PLAC': + return I18N::translate('Place of christening'); + case 'CHRA': + return /* I18N: gedcom tag CHRA */ I18N::translate('Adult christening'); + case 'CITN': + return /* I18N: gedcom tag CITN */ I18N::translate('Citizenship'); + case 'CITY': + return /* I18N: gedcom tag CITY */ I18N::translate('City'); + case 'COMM': + return /* I18N: gedcom tag COMM */ I18N::translate('Comment'); + case 'CONC': + return /* I18N: gedcom tag CONC */ I18N::translate('Concatenation'); + case 'CONT': + return /* I18N: gedcom tag CONT */ I18N::translate('Continued'); + case 'CONF': + return /* I18N: gedcom tag CONF */ I18N::translate('Confirmation'); + case 'CONF:DATE': + return I18N::translate('Date of confirmation'); + case 'CONF:PLAC': + return I18N::translate('Place of confirmation'); + case 'CONL': + return /* I18N: gedcom tag CONL. LDS = Church of Latter Day Saints. */ I18N::translate('LDS confirmation'); + case 'COPR': + return /* I18N: gedcom tag COPR */ I18N::translate('Copyright'); + case 'CORP': + return /* I18N: gedcom tag CORP */ I18N::translate('Corporation'); + case 'CREM': + return /* I18N: gedcom tag CREM */ I18N::translate('Cremation'); + case 'CREM:DATE': + return I18N::translate('Date of cremation'); + case 'CREM:PLAC': + return I18N::translate('Place of cremation'); + case 'CTRY': + return /* I18N: gedcom tag CTRY */ I18N::translate('Country'); + case 'DATA': + return /* I18N: gedcom tag DATA */ I18N::translate('Data'); + case 'DATA:DATE': + return I18N::translate('Date of entry in original source'); + case '_DATE': // Family Tree Builder uses OBJE:_DATE + case 'DATE': + return /* I18N: gedcom tag DATE */ I18N::translate('Date'); + case 'DEAT': + return /* I18N: gedcom tag DEAT */ I18N::translate('Death'); + case 'DEAT:CAUS': + return I18N::translate('Cause of death'); + case 'DEAT:DATE': + return I18N::translate('Date of death'); + case 'DEAT:PLAC': + return I18N::translate('Place of death'); + case 'DESC': + return /* I18N: gedcom tag DESC */ + I18N::translate('Descendants'); + case 'DESI': + return /* I18N: gedcom tag DESI */ I18N::translate('Descendants interest'); + case 'DEST': + return /* I18N: gedcom tag DEST */ I18N::translate('Destination'); + case 'DIV': + return /* I18N: gedcom tag DIV */ I18N::translate('Divorce'); + case 'DIVF': + return /* I18N: gedcom tag DIVF */ I18N::translate('Divorce filed'); + case 'DSCR': + return /* I18N: gedcom tag DSCR */ I18N::translate('Description'); + case 'EDUC': + return /* I18N: gedcom tag EDUC */ I18N::translate('Education'); + case 'EDUC:AGNC': + return I18N::translate('School or college'); + case 'EMAI': + case 'EMAL': + case 'EMAIL': + return /* I18N: gedcom tag EMAIL */ I18N::translate('Email address'); + case 'EMIG': + return /* I18N: gedcom tag EMIG */ I18N::translate('Emigration'); + case 'EMIG:DATE': + return I18N::translate('Date of emigration'); + case 'EMIG:PLAC': + return I18N::translate('Place of emigration'); + case 'ENDL': + return /* I18N: gedcom tag ENDL. LDS = Church of Latter Day Saints. */ I18N::translate('LDS endowment'); + case 'ENDL:DATE': + return /* I18N: LDS = Church of Latter Day Saints. */ I18N::translate('Date of LDS endowment'); + case 'ENDL:PLAC': + return /* I18N: LDS = Church of Latter Day Saints. */ I18N::translate('Place of LDS endowment'); + case 'ENGA': + return /* I18N: gedcom tag ENGA */ I18N::translate('Engagement'); + case 'ENGA:DATE': + return I18N::translate('Date of engagement'); + case 'ENGA:PLAC': + return I18N::translate('Place of engagement'); + case 'EVEN': + return /* I18N: gedcom tag EVEN */ I18N::translate('Event'); + case 'EVEN:DATE': + return I18N::translate('Date of event'); + case 'EVEN:PLAC': + return I18N::translate('Place of event'); + case 'EVEN:TYPE': + return I18N::translate('Type of event'); + case 'FACT': + return /* I18N: gedcom tag FACT */ I18N::translate('Fact'); + case 'FACT:TYPE': + return I18N::translate('Type of fact'); + case 'FAM': + return /* I18N: gedcom tag FAM */ I18N::translate('Family'); + case 'FAMC': + return /* I18N: gedcom tag FAMC */ I18N::translate('Family as a child'); + case 'FAMF': + return /* I18N: gedcom tag FAMF */ I18N::translate('Family file'); + case 'FAMS': + return /* I18N: gedcom tag FAMS */ I18N::translate('Family as a spouse'); + case 'FAMS:CENS:DATE': + return I18N::translate('Spouse census date'); + case 'FAMS:CENS:PLAC': + return I18N::translate('Spouse census place'); + case 'FAMS:DIV:DATE': + return I18N::translate('Date of divorce'); + case 'FAMS:MARR:DATE': + return I18N::translate('Date of marriage'); + case 'FAMS:MARR:PLAC': + return I18N::translate('Place of marriage'); + case 'FAMS:NOTE': + return I18N::translate('Spouse note'); + case 'FAMS:SLGS:DATE': + return /* I18N: LDS = Church of Latter Day Saints. */ I18N::translate('Date of LDS spouse sealing'); + case 'FAMS:SLGS:PLAC': + return /* I18N: LDS = Church of Latter Day Saints. */ I18N::translate('Place of LDS spouse sealing'); + case 'FAX': + return /* I18N: gedcom tag FAX */ I18N::translate('Fax'); + case 'FCOM': + return /* I18N: gedcom tag FCOM */ I18N::translate('First communion'); + case 'FCOM:DATE': + return I18N::translate('Date of first communion'); + case 'FCOM:PLAC': + return I18N::translate('Place of first communion'); + case 'FILE': + return /* I18N: gedcom tag FILE */ I18N::translate('Filename'); + case 'FONE': + return /* I18N: gedcom tag FONE */ I18N::translate('Phonetic'); + case 'FORM': + return /* I18N: gedcom tag FORM */ I18N::translate('Format'); + case 'GEDC': + return /* I18N: gedcom tag GEDC */ I18N::translate('GEDCOM file'); + case 'GIVN': + return /* I18N: gedcom tag GIVN */ I18N::translate('Given names'); + case 'GRAD': + return /* I18N: gedcom tag GRAD */ I18N::translate('Graduation'); + case 'HEAD': + return /* I18N: gedcom tag HEAD */ I18N::translate('Header'); + case 'HUSB': + return /* I18N: gedcom tag HUSB */ I18N::translate('Husband'); + case 'IDNO': + return /* I18N: gedcom tag IDNO */ I18N::translate('Identification number'); + case 'IMMI': + return /* I18N: gedcom tag IMMI */ I18N::translate('Immigration'); + case 'IMMI:DATE': + return I18N::translate('Date of immigration'); + case 'IMMI:PLAC': + return I18N::translate('Place of immigration'); + case 'INDI': + return /* I18N: gedcom tag INDI */ I18N::translate('Individual'); + case 'INFL': + return /* I18N: gedcom tag INFL */ I18N::translate('Infant'); + case 'LANG': + return /* I18N: gedcom tag LANG */ I18N::translate('Language'); + case 'LATI': + return /* I18N: gedcom tag LATI */ I18N::translate('Latitude'); + case 'LEGA': + return /* I18N: gedcom tag LEGA */ I18N::translate('Legatee'); + case 'LONG': + return /* I18N: gedcom tag LONG */ I18N::translate('Longitude'); + case 'MAP': + return /* I18N: gedcom tag MAP */ I18N::translate('Map'); + case 'MARB': + return /* I18N: gedcom tag MARB */ I18N::translate('Marriage banns'); + case 'MARB:DATE': + return I18N::translate('Date of marriage banns'); + case 'MARB:PLAC': + return I18N::translate('Place of marriage banns'); + case 'MARC': + return /* I18N: gedcom tag MARC */ I18N::translate('Marriage contract'); + case 'MARL': + return /* I18N: gedcom tag MARL */ I18N::translate('Marriage license'); + case 'MARR': + return /* I18N: gedcom tag MARR */ I18N::translate('Marriage'); + case 'MARR:DATE': + return I18N::translate('Date of marriage'); + case 'MARR:PLAC': + return I18N::translate('Place of marriage'); + case 'MARR_CIVIL': + return I18N::translate('Civil marriage'); + case 'MARR_PARTNERS': + return I18N::translate('Registered partnership'); + case 'MARR_RELIGIOUS': + return I18N::translate('Religious marriage'); + case 'MARR_UNKNOWN': + return I18N::translate('Marriage type unknown'); + case 'MARS': + return /* I18N: gedcom tag MARS */ I18N::translate('Marriage settlement'); + case 'MEDI': + return /* I18N: gedcom tag MEDI */ I18N::translate('Media type'); + case 'NAME': + if ($record instanceof Repository) { + return /* I18N: gedcom tag REPO:NAME */ I18N::translateContext('Repository', 'Name'); + } else { + return /* I18N: gedcom tag NAME */ I18N::translate('Name'); + } + case 'NAME:FONE': + return I18N::translate('Phonetic name'); + case 'NAME:_HEB': + return I18N::translate('Name in Hebrew'); + case 'NATI': + return /* I18N: gedcom tag NATI */ I18N::translate('Nationality'); + case 'NATU': + return /* I18N: gedcom tag NATU */ I18N::translate('Naturalization'); + case 'NATU:DATE': + return I18N::translate('Date of naturalization'); + case 'NATU:PLAC': + return I18N::translate('Place of naturalization'); + case 'NCHI': + return /* I18N: gedcom tag NCHI */ I18N::translate('Number of children'); + case 'NICK': + return /* I18N: gedcom tag NICK */ I18N::translate('Nickname'); + case 'NMR': + return /* I18N: gedcom tag NMR */ I18N::translate('Number of marriages'); + case 'NOTE': + return /* I18N: gedcom tag NOTE */ I18N::translate('Note'); + case 'NPFX': + return /* I18N: gedcom tag NPFX */ I18N::translate('Name prefix'); + case 'NSFX': + return /* I18N: gedcom tag NSFX */ I18N::translate('Name suffix'); + case 'OBJE': + return /* I18N: gedcom tag OBJE */ I18N::translate('Media object'); + case 'OCCU': + return /* I18N: gedcom tag OCCU */ I18N::translate('Occupation'); + case 'OCCU:AGNC': + return I18N::translate('Employer'); + case 'ORDI': + return /* I18N: gedcom tag ORDI */ I18N::translate('Ordinance'); + case 'ORDN': + return /* I18N: gedcom tag ORDN */ I18N::translate('Ordination'); + case 'ORDN:AGNC': + return I18N::translate('Religious institution'); + case 'ORDN:DATE': + return I18N::translate('Date of ordination'); + case 'ORDN:PLAC': + return I18N::translate('Place of ordination'); + case 'PAGE': + return /* I18N: gedcom tag PAGE */ I18N::translate('Citation details'); + case 'PEDI': + return /* I18N: gedcom tag PEDI */ I18N::translate('Relationship to parents'); + case 'PHON': + return /* I18N: gedcom tag PHON */ I18N::translate('Phone'); + case '_PLACE': // Family Tree Builder uses OBJE:_PLACE + case 'PLAC': + return /* I18N: gedcom tag PLAC */ I18N::translate('Place'); + case 'PLAC:FONE': + return I18N::translate('Phonetic place'); + case 'PLAC:ROMN': + return I18N::translate('Romanized place'); + case 'PLAC:_HEB': + return I18N::translate('Place in Hebrew'); + case 'POST': + return /* I18N: gedcom tag POST */ I18N::translate('Postal code'); + case 'PROB': + return /* I18N: gedcom tag PROB */ I18N::translate('Probate'); + case 'PROP': + return /* I18N: gedcom tag PROP */ I18N::translate('Property'); + case 'PUBL': + return /* I18N: gedcom tag PUBL */ I18N::translate('Publication'); + case 'QUAY': + return /* I18N: gedcom tag QUAY */ I18N::translate('Quality of data'); + case 'REFN': + return /* I18N: gedcom tag REFN */ I18N::translate('Reference number'); + case 'RELA': + return /* I18N: gedcom tag RELA */ I18N::translate('Relationship'); + case 'RELI': + return /* I18N: gedcom tag RELI */ I18N::translate('Religion'); + case 'REPO': + return /* I18N: gedcom tag REPO */ I18N::translate('Repository'); + case 'RESI': + return /* I18N: gedcom tag RESI */ I18N::translate('Residence'); + case 'RESI:DATE': + return I18N::translate('Date of residence'); + case 'RESI:PLAC': + return I18N::translate('Place of residence'); + case 'RESN': + return /* I18N: gedcom tag RESN */ I18N::translate('Restriction'); + case 'RETI': + return /* I18N: gedcom tag RETI */ I18N::translate('Retirement'); + case 'RETI:AGNC': + return I18N::translate('Employer'); + case 'RFN': + return /* I18N: gedcom tag RFN */ I18N::translate('Record file number'); + case '_PHOTO_RIN': // Family Tree Builder uses "0 OBJE/1 _PHOTO_RIN" + case '_PRIN': // Family Tree Builder uses "0 _ALBUM/1 _PHOTO/2 _PRIN" + case 'RIN': + return /* I18N: gedcom tag RIN */ I18N::translate('Record ID number'); + case 'ROLE': + return /* I18N: gedcom tag ROLE */ I18N::translate('Role'); + case 'ROMN': + return /* I18N: gedcom tag ROMN */ I18N::translate('Romanized'); + case 'SERV': + return /* I18N: gedcom tag SERV */ I18N::translate('Remote server'); + case 'SEX': + return /* I18N: gedcom tag SEX */ I18N::translate('Gender'); + case 'SHARED_NOTE': + return I18N::translate('Shared note'); + case 'SLGC': + return /* I18N: gedcom tag SLGC. LDS = Church of Latter Day Saints. */ I18N::translate('LDS child sealing'); + case 'SLGC:DATE': + return /* I18N: LDS = Church of Latter Day Saints. */ I18N::translate('Date of LDS child sealing'); + case 'SLGC:PLAC': + return /* I18N: LDS = Church of Latter Day Saints. */ I18N::translate('Place of LDS child sealing'); + case 'SLGS': + return /* I18N: gedcom tag SLGS. LDS = Church of Latter Day Saints. */ I18N::translate('LDS spouse sealing'); + case 'SOUR': + return /* I18N: gedcom tag SOUR */ I18N::translate('Source'); + case 'SPFX': + return /* I18N: gedcom tag SPFX */ I18N::translate('Surname prefix'); + case 'SSN': + return /* I18N: gedcom tag SSN */ I18N::translate('Social security number'); + case 'STAE': + return /* I18N: gedcom tag STAE */ I18N::translate('State'); + case 'STAT': + return /* I18N: gedcom tag STAT */ I18N::translate('Status'); + case 'STAT:DATE': + return I18N::translate('Status change date'); + case 'SUBM': + return /* I18N: gedcom tag SUBM */ I18N::translate('Submitter'); + case 'SUBN': + return /* I18N: gedcom tag SUBN */ I18N::translate('Submission'); + case 'SURN': + return /* I18N: gedcom tag SURN */ I18N::translate('Surname'); + case 'TEMP': + return /* I18N: gedcom tag TEMP */ I18N::translate('Temple'); + case 'TEXT': + return /* I18N: gedcom tag TEXT */ I18N::translate('Text'); + case 'TIME': + return /* I18N: gedcom tag TIME */ I18N::translate('Time'); + case 'TITL': + return /* I18N: gedcom tag TITL */ I18N::translate('Title'); + case 'TITL:FONE': + return I18N::translate('Phonetic title'); + case 'TITL:ROMN': + return I18N::translate('Romanized title'); + case 'TITL:_HEB': + return I18N::translate('Title in Hebrew'); + case 'TRLR': + return /* I18N: gedcom tag TRLR */ I18N::translate('Trailer'); + case 'TYPE': + return /* I18N: gedcom tag TYPE */ I18N::translate('Type'); + case 'URL': + return /* I18N: gedcom tag URL (A web address / URL) */ I18N::translate('URL'); + case 'VERS': + return /* I18N: gedcom tag VERS */ I18N::translate('Version'); + case 'WIFE': + return /* I18N: gedcom tag WIFE */ I18N::translate('Wife'); + case 'WILL': + return /* I18N: gedcom tag WILL */ I18N::translate('Will'); + case 'WWW': + return /* I18N: gedcom tag WWW (A web address / URL) */ I18N::translate('URL'); + case '_ADOP_CHIL': + switch ($sex) { + case 'M': + return I18N::translate('Adoption of a son'); + case 'F': + return I18N::translate('Adoption of a daughter'); + default: + return I18N::translate('Adoption of a child'); + } + case '_ADOP_GCHI': + switch ($sex) { + case 'M': + return I18N::translate('Adoption of a grandson'); + case 'F': + return I18N::translate('Adoption of a granddaughter'); + default: + return I18N::translate('Adoption of a grandchild'); + } + case '_ADOP_GCH1': + switch ($sex) { + case 'M': + return I18N::translateContext('daughter’s son', 'Adoption of a grandson'); + case 'F': + return I18N::translateContext('daughter’s daughter', 'Adoption of a granddaughter'); + default: + return I18N::translate('Adoption of a grandchild'); + } + case '_ADOP_GCH2': + switch ($sex) { + case 'M': + return I18N::translateContext('son’s son', 'Adoption of a grandson'); + case 'F': + return I18N::translateContext('son’s daughter', 'Adoption of a granddaughter'); + default: + return I18N::translate('Adoption of a grandchild'); + } + case '_ADOP_HSIB': + switch ($sex) { + case 'M': + return I18N::translate('Adoption of a half-brother'); + case 'F': + return I18N::translate('Adoption of a half-sister'); + default: + return I18N::translate('Adoption of a half-sibling'); + } + case '_ADOP_SIBL': + switch ($sex) { + case 'M': + return I18N::translate('Adoption of a brother'); + case 'F': + return I18N::translate('Adoption of a sister'); + default: + return I18N::translate('Adoption of a sibling'); + } + case '_ADPF': + switch ($sex) { + case 'M': + return /* I18N: gedcom tag _ADPF */ I18N::translateContext('MALE', 'Adopted by father'); + case 'F': + return /* I18N: gedcom tag _ADPF */ I18N::translateContext('FEMALE', 'Adopted by father'); + default: + return /* I18N: gedcom tag _ADPF */ I18N::translate('Adopted by father'); + } + case '_ADPM': + switch ($sex) { + case 'M': + return /* I18N: gedcom tag _ADPM */ I18N::translateContext('MALE', 'Adopted by mother'); + case 'F': + return /* I18N: gedcom tag _ADPM */ I18N::translateContext('FEMALE', 'Adopted by mother'); + default: + return /* I18N: gedcom tag _ADPM */ I18N::translate('Adopted by mother'); + } + case '_AKA': + case '_AKAN': + switch ($sex) { + case 'M': + return /* I18N: gedcom tag _AKA */ I18N::translateContext('MALE', 'Also known as'); + case 'F': + return /* I18N: gedcom tag _AKA */ I18N::translateContext('FEMALE', 'Also known as'); + default: + return /* I18N: gedcom tag _AKA */ I18N::translate('Also known as'); + } + case '_ALBUM': // Family Tree Builder uses OBJE:_ALBUM + return /* I18N: gedcom tag _ALBUM */ I18N::translate('Album'); + case '_ASSO': + return /* I18N: gedcom tag _ASSO */ I18N::translate('Associate'); /* see also ASSO */ + case '_BAPM_CHIL': + switch ($sex) { + case 'M': + return I18N::translate('Baptism of a son'); + case 'F': + return I18N::translate('Baptism of a daughter'); + default: + return I18N::translate('Baptism of a child'); + } + case '_BAPM_GCHI': + switch ($sex) { + case 'M': + return I18N::translate('Baptism of a grandson'); + case 'F': + return I18N::translate('Baptism of a granddaughter'); + default: + return I18N::translate('Baptism of a grandchild'); + } + case '_BAPM_GCH1': + switch ($sex) { + case 'M': + return I18N::translateContext('daughter’s son', 'Baptism of a grandson'); + case 'F': + return I18N::translateContext('daughter’s daughter', 'Baptism of a granddaughter'); + default: + return I18N::translate('Baptism of a grandchild'); + } + case '_BAPM_GCH2': + switch ($sex) { + case 'M': + return I18N::translateContext('son’s son', 'Baptism of a grandson'); + case 'F': + return I18N::translateContext('son’s daughter', 'Baptism of a granddaughter'); + default: + return I18N::translate('Baptism of a grandchild'); + } + case '_BAPM_HSIB': + switch ($sex) { + case 'M': + return I18N::translate('Baptism of a half-brother'); + case 'F': + return I18N::translate('Baptism of a half-sister'); + default: + return I18N::translate('Baptism of a half-sibling'); + } + case '_BAPM_SIBL': + switch ($sex) { + case 'M': + return I18N::translate('Baptism of a brother'); + case 'F': + return I18N::translate('Baptism of a sister'); + default: + return I18N::translate('Baptism of a sibling'); + } + case '_BIBL': + return /* I18N: gedcom tag _BIBL */ I18N::translate('Bibliography'); + case '_BIRT_CHIL': + switch ($sex) { + case 'M': + return I18N::translate('Birth of a son'); + case 'F': + return I18N::translate('Birth of a daughter'); + default: + return I18N::translate('Birth of a child'); + } + case '_BIRT_GCHI': + switch ($sex) { + case 'M': + return I18N::translate('Birth of a grandson'); + case 'F': + return I18N::translate('Birth of a granddaughter'); + default: + return I18N::translate('Birth of a grandchild'); + } + case '_BIRT_GCH1': + switch ($sex) { + case 'M': + return I18N::translateContext('daughter’s son', 'Birth of a grandson'); + case 'F': + return I18N::translateContext('daughter’s daughter', 'Birth of a granddaughter'); + default: + return I18N::translate('Birth of a grandchild'); + } + case '_BIRT_GCH2': + switch ($sex) { + case 'M': + return I18N::translateContext('son’s son', 'Birth of a grandson'); + case 'F': + return I18N::translateContext('son’s daughter', 'Birth of a granddaughter'); + default: + return I18N::translate('Birth of a grandchild'); + } + case '_BIRT_HSIB': + switch ($sex) { + case 'M': + return I18N::translate('Birth of a half-brother'); + case 'F': + return I18N::translate('Birth of a half-sister'); + default: + return I18N::translate('Birth of a half-sibling'); + } + case '_BIRT_SIBL': + switch ($sex) { + case 'M': + return I18N::translate('Birth of a brother'); + case 'F': + return I18N::translate('Birth of a sister'); + default: + return I18N::translate('Birth of a sibling'); + } + case '_BRTM': + return /* I18N: gedcom tag _BRTM */ I18N::translate('Brit milah'); + case '_BRTM:DATE': + return I18N::translate('Date of brit milah'); + case '_BRTM:PLAC': + return I18N::translate('Place of brit milah'); + case '_BURI_CHIL': + switch ($sex) { + case 'M': + return I18N::translate('Burial of a son'); + case 'F': + return I18N::translate('Burial of a daughter'); + default: + return I18N::translate('Burial of a child'); + } + case '_BURI_GCHI': + switch ($sex) { + case 'M': + return I18N::translate('Burial of a grandson'); + case 'F': + return I18N::translate('Burial of a granddaughter'); + default: + return I18N::translate('Burial of a grandchild'); + } + case '_BURI_GCH1': + switch ($sex) { + case 'M': + return I18N::translateContext('daughter’s son', 'Burial of a grandson'); + case 'F': + return I18N::translateContext('daughter’s daughter', 'Burial of a granddaughter'); + default: + return I18N::translate('Burial of a grandchild'); + } + case '_BURI_GCH2': + switch ($sex) { + case 'M': + return I18N::translateContext('son’s son', 'Burial of a grandson'); + case 'F': + return I18N::translateContext('son’s daughter', 'Burial of a granddaughter'); + default: + return I18N::translate('Burial of a grandchild'); + } + case '_BURI_GPAR': + switch ($sex) { + case 'M': + return I18N::translate('Burial of a grandfather'); + case 'F': + return I18N::translate('Burial of a grandmother'); + default: + return I18N::translate('Burial of a grandparent'); + } + case '_BURI_GPA1': + switch ($sex) { + case 'M': + return I18N::translate('Burial of a paternal grandfather'); + case 'F': + return I18N::translate('Burial of a paternal grandmother'); + default: + return I18N::translate('Burial of a paternal grandparent'); + } + case '_BURI_GPA2': + switch ($sex) { + case 'M': + return I18N::translate('Burial of a maternal grandfather'); + case 'F': + return I18N::translate('Burial of a maternal grandmother'); + default: + return I18N::translate('Burial of a maternal grandparent'); + } + case '_BURI_HSIB': + switch ($sex) { + case 'M': + return I18N::translate('Burial of a half-brother'); + case 'F': + return I18N::translate('Burial of a half-sister'); + default: + return I18N::translate('Burial of a half-sibling'); + } + case '_BURI_PARE': + switch ($sex) { + case 'M': + return I18N::translate('Burial of a father'); + case 'F': + return I18N::translate('Burial of a mother'); + default: + return I18N::translate('Burial of a parent'); + } + case '_BURI_SIBL': + switch ($sex) { + case 'M': + return I18N::translate('Burial of a brother'); + case 'F': + return I18N::translate('Burial of a sister'); + default: + return I18N::translate('Burial of a sibling'); + } + case '_BURI_SPOU': + switch ($sex) { + case 'M': + return I18N::translate('Burial of a husband'); + case 'F': + return I18N::translate('Burial of a wife'); + default: + return I18N::translate('Burial of a spouse'); + } + case '_CHR_CHIL': + switch ($sex) { + case 'M': + return I18N::translate('Christening of a son'); + case 'F': + return I18N::translate('Christening of a daughter'); + default: + return I18N::translate('Christening of a child'); + } + case '_CHR_GCHI': + switch ($sex) { + case 'M': + return I18N::translate('Christening of a grandson'); + case 'F': + return I18N::translate('Christening of a granddaughter'); + default: + return I18N::translate('Christening of a grandchild'); + } + case '_CHR_GCH1': + switch ($sex) { + case 'M': + return I18N::translateContext('daughter’s son', 'Christening of a grandson'); + case 'F': + return I18N::translateContext('daughter’s daughter', 'Christening of a granddaughter'); + default: + return I18N::translate('Christening of a grandchild'); + } + case '_CHR_GCH2': + switch ($sex) { + case 'M': + return I18N::translateContext('son’s son', 'Christening of a grandson'); + case 'F': + return I18N::translateContext('son’s daughter', 'Christening of a granddaughter'); + default: + return I18N::translate('Christening of a grandchild'); + } + case '_CHR_HSIB': + switch ($sex) { + case 'M': + return I18N::translate('Christening of a half-brother'); + case 'F': + return I18N::translate('Christening of a half-sister'); + default: + return I18N::translate('Christening of a half-sibling'); + } + case '_CHR_SIBL': + switch ($sex) { + case 'M': + return I18N::translate('Christening of a brother'); + case 'F': + return I18N::translate('Christening of a sister'); + default: + return I18N::translate('Christening of a sibling'); + } + case '_COML': + return /* I18N: gedcom tag _COML */ I18N::translate('Common law marriage'); + case '_CREM_CHIL': + switch ($sex) { + case 'M': + return I18N::translate('Cremation of a son'); + case 'F': + return I18N::translate('Cremation of a daughter'); + default: + return I18N::translate('Cremation of a child'); + } + case '_CREM_GCHI': + switch ($sex) { + case 'M': + return I18N::translate('Cremation of a grandson'); + case 'F': + return I18N::translate('Cremation of a granddaughter'); + default: + return I18N::translate('Cremation of a grandchild'); + } + case '_CREM_GCH1': + switch ($sex) { + case 'M': + return I18N::translateContext('daughter’s son', 'Cremation of a grandson'); + case 'F': + return I18N::translateContext('daughter’s daughter', 'Cremation of a granddaughter'); + default: + return I18N::translate('Cremation of a grandchild'); + } + case '_CREM_GCH2': + switch ($sex) { + case 'M': + return I18N::translateContext('son’s son', 'Cremation of a grandson'); + case 'F': + return I18N::translateContext('son’s daughter', 'Cremation of a granddaughter'); + default: + return I18N::translate('Cremation of a grandchild'); + } + case '_CREM_GPAR': + switch ($sex) { + case 'M': + return I18N::translate('Cremation of a grandfather'); + case 'F': + return I18N::translate('Cremation of a grandmother'); + default: + return I18N::translate('Cremation of a grand-parent'); + } + case '_CREM_GPA1': + switch ($sex) { + case 'M': + return I18N::translate('Cremation of a paternal grandfather'); + case 'F': + return I18N::translate('Cremation of a paternal grandmother'); + default: + return I18N::translate('Cremation of a grand-parent'); + } + case '_CREM_GPA2': + switch ($sex) { + case 'M': + return I18N::translate('Cremation of a maternal grandfather'); + case 'F': + return I18N::translate('Cremation of a maternal grandmother'); + default: + return I18N::translate('Cremation of a grand-parent'); + } + case '_CREM_HSIB': + switch ($sex) { + case 'M': + return I18N::translate('Cremation of a half-brother'); + case 'F': + return I18N::translate('Cremation of a half-sister'); + default: + return I18N::translate('Cremation of a half-sibling'); + } + case '_CREM_PARE': + switch ($sex) { + case 'M': + return I18N::translate('Cremation of a father'); + case 'F': + return I18N::translate('Cremation of a mother'); + default: + return I18N::translate('Cremation of a parent'); + } + case '_CREM_SIBL': + switch ($sex) { + case 'M': + return I18N::translate('Cremation of a brother'); + case 'F': + return I18N::translate('Cremation of a sister'); + default: + return I18N::translate('Cremation of a sibling'); + } + case '_CREM_SPOU': + switch ($sex) { + case 'M': + return I18N::translate('Cremation of a husband'); + case 'F': + return I18N::translate('Cremation of a wife'); + default: + return I18N::translate('Cremation of a spouse'); + } + case '_DBID': + return /* I18N: gedcom tag _DBID */ I18N::translate('Linked database ID'); + case '_DEAT_CHIL': + switch ($sex) { + case 'M': + return I18N::translate('Death of a son'); + case 'F': + return I18N::translate('Death of a daughter'); + default: + return I18N::translate('Death of a child'); + } + case '_DEAT_GCHI': + switch ($sex) { + case 'M': + return I18N::translate('Death of a grandson'); + case 'F': + return I18N::translate('Death of a granddaughter'); + default: + return I18N::translate('Death of a grandchild'); + } + case '_DEAT_GCH1': + switch ($sex) { + case 'M': + return I18N::translateContext('daughter’s son', 'Death of a grandson'); + case 'F': + return I18N::translateContext('daughter’s daughter', 'Death of a granddaughter'); + default: + return I18N::translate('Death of a grandchild'); + } + case '_DEAT_GCH2': + switch ($sex) { + case 'M': + return I18N::translateContext('son’s son', 'Death of a grandson'); + case 'F': + return I18N::translateContext('son’s daughter', 'Death of a granddaughter'); + default: + return I18N::translate('Death of a grandchild'); + } + case '_DEAT_GPAR': + switch ($sex) { + case 'M': + return I18N::translate('Death of a grandfather'); + case 'F': + return I18N::translate('Death of a grandmother'); + default: + return I18N::translate('Death of a grand-parent'); + } + case '_DEAT_GPA1': + switch ($sex) { + case 'M': + return I18N::translate('Death of a paternal grandfather'); + case 'F': + return I18N::translate('Death of a paternal grandmother'); + default: + return I18N::translate('Death of a grand-parent'); + } + case '_DEAT_GPA2': + switch ($sex) { + case 'M': + return I18N::translate('Death of a maternal grandfather'); + case 'F': + return I18N::translate('Death of a maternal grandmother'); + default: + return I18N::translate('Death of a grand-parent'); + } + case '_DEAT_HSIB': + switch ($sex) { + case 'M': + return I18N::translate('Death of a half-brother'); + case 'F': + return I18N::translate('Death of a half-sister'); + default: + return I18N::translate('Death of a half-sibling'); + } + case '_DEAT_PARE': + switch ($sex) { + case 'M': + return I18N::translate('Death of a father'); + case 'F': + return I18N::translate('Death of a mother'); + default: + return I18N::translate('Death of a parent'); + } + case '_DEAT_SIBL': + switch ($sex) { + case 'M': + return I18N::translate('Death of a brother'); + case 'F': + return I18N::translate('Death of a sister'); + default: + return I18N::translate('Death of a sibling'); + } + case '_DEAT_SPOU': + switch ($sex) { + case 'M': + return I18N::translate('Death of a husband'); + case 'F': + return I18N::translate('Death of a wife'); + default: + return I18N::translate('Death of a spouse'); + } + case '_DEG': + return /* I18N: gedcom tag _DEG */ I18N::translate('Degree'); + case '_DETS': + return /* I18N: gedcom tag _DETS */ I18N::translate('Death of one spouse'); + case '_DNA': + return /* I18N: gedcom tag _DNA (from FTM 2010) */ I18N::translate('DNA markers'); + case '_EMAIL': + return /* I18N: gedcom tag _EMAIL */ I18N::translate('Email address'); + case '_EYEC': + return /* I18N: gedcom tag _EYEC */ I18N::translate('Eye color'); + case '_FA1': + return I18N::translate('Fact 1'); + case '_FA2': + return I18N::translate('Fact 2'); + case '_FA3': + return I18N::translate('Fact 3'); + case '_FA4': + return I18N::translate('Fact 4'); + case '_FA5': + return I18N::translate('Fact 5'); + case '_FA6': + return I18N::translate('Fact 6'); + case '_FA7': + return I18N::translate('Fact 7'); + case '_FA8': + return I18N::translate('Fact 8'); + case '_FA9': + return I18N::translate('Fact 9'); + case '_FA10': + return I18N::translate('Fact 10'); + case '_FA11': + return I18N::translate('Fact 11'); + case '_FA12': + return I18N::translate('Fact 12'); + case '_FA13': + return I18N::translate('Fact 13'); + case '_FNRL': + return /* I18N: gedcom tag _FNRL */ I18N::translate('Funeral'); + case '_FREL': + return /* I18N: gedcom tag _FREL */ I18N::translate('Relationship to father'); + case '_GEDF': + return /* I18N: gedcom tag _GEDF */ I18N::translate('GEDCOM file'); + case '_GODP': + return /* I18N: gedcom tag _GODP */ I18N::translate('Godparent'); + case '_HAIR': + return /* I18N: gedcom tag _HAIR */ I18N::translate('Hair color'); + case '_HEB': + return /* I18N: gedcom tag _HEB */ I18N::translate('Hebrew'); + case '_HEIG': + return /* I18N: gedcom tag _HEIG */ I18N::translate('Height'); + case '_HNM': + return /* I18N: gedcom tag _HNM */ I18N::translate('Hebrew name'); + case '_HOL': + return /* I18N: gedcom tag _HOL */ I18N::translate('Holocaust'); + case '_INTE': + switch ($sex) { + case 'M': + return /* I18N: gedcom tag _INTE */ I18N::translateContext('MALE', 'Interred'); + case 'F': + return /* I18N: gedcom tag _INTE */ I18N::translateContext('FEMALE', 'Interred'); + default: + return /* I18N: gedcom tag _INTE */ I18N::translate('Interred'); + } + case '_LOC': + return /* I18N: gedcom tag _LOC */ I18N::translate('Location'); + case '_MARI': + return /* I18N: gedcom tag _MARI */ I18N::translate('Marriage intention'); + case '_MARNM': + return /* I18N: gedcom tag _MARNM */ I18N::translate('Married name'); + case '_PRIM': + return /* I18N: gedcom tag _PRIM */ I18N::translate('Highlighted image'); + case '_MARNM_SURN': + return I18N::translate('Married surname'); + case '_MARR_CHIL': + switch ($sex) { + case 'M': + return I18N::translate('Marriage of a son'); + case 'F': + return I18N::translate('Marriage of a daughter'); + default: + return I18N::translate('Marriage of a child'); + } + case '_MARR_FAMC': + return /* I18N: ...to each other */ I18N::translate('Marriage of parents'); + case '_MARR_GCHI': + switch ($sex) { + case 'M': + return I18N::translate('Marriage of a grandson'); + case 'F': + return I18N::translate('Marriage of a granddaughter'); + default: + return I18N::translate('Marriage of a grandchild'); + } + case '_MARR_GCH1': + switch ($sex) { + case 'M': + return I18N::translateContext('daughter’s son', 'Marriage of a grandson'); + case 'F': + return I18N::translateContext('daughter’s daughter', 'Marriage of a granddaughter'); + default: + return I18N::translate('Marriage of a grandchild'); + } + case '_MARR_GCH2': + switch ($sex) { + case 'M': + return I18N::translateContext('son’s son', 'Marriage of a grandson'); + case 'F': + return I18N::translateContext('son’s daughter', 'Marriage of a granddaughter'); + default: + return I18N::translate('Marriage of a grandchild'); + } + case '_MARR_HSIB': + switch ($sex) { + case 'M': + return I18N::translate('Marriage of a half-brother'); + case 'F': + return I18N::translate('Marriage of a half-sister'); + default: + return I18N::translate('Marriage of a half-sibling'); + } + case '_MARR_PARE': + switch ($sex) { + case 'M': + return /* I18N: ...to another spouse */ I18N::translate('Marriage of a father'); + case 'F': + return /* I18N: ...to another spouse */ I18N::translate('Marriage of a mother'); + default: + return /* I18N: ...to another spouse */ I18N::translate('Marriage of a parent'); + } + case '_MARR_SIBL': + switch ($sex) { + case 'M': + return I18N::translate('Marriage of a brother'); + case 'F': + return I18N::translate('Marriage of a sister'); + default: + return I18N::translate('Marriage of a sibling'); + } + case '_MBON': + return /* I18N: gedcom tag _MBON */ I18N::translate('Marriage bond'); + case '_MDCL': + return /* I18N: gedcom tag _MDCL */ I18N::translate('Medical'); + case '_MEDC': + return /* I18N: gedcom tag _MEDC */ I18N::translate('Medical condition'); + case '_MEND': + return /* I18N: gedcom tag _MEND */ I18N::translate('Marriage ending status'); + case '_MILI': + return /* I18N: gedcom tag _MILI */ I18N::translate('Military'); + case '_MILT': + return /* I18N: gedcom tag _MILT */ I18N::translate('Military service'); + case '_MREL': + return /* I18N: gedcom tag _MREL */ I18N::translate('Relationship to mother'); + case '_MSTAT': + return /* I18N: gedcom tag _MSTAT */ I18N::translate('Marriage beginning status'); + case '_NAME': + return /* I18N: gedcom tag _NAME */ I18N::translate('Mailing name'); + case '_NAMS': + return /* I18N: gedcom tag _NAMS */ I18N::translate('Namesake'); + case '_NLIV': + return /* I18N: gedcom tag _NLIV */ I18N::translate('Not living'); + case '_NMAR': + switch ($sex) { + case 'M': + return /* I18N: gedcom tag _NMAR */ I18N::translateContext('MALE', 'Never married'); + case 'F': + return /* I18N: gedcom tag _NMAR */ I18N::translateContext('FEMALE', 'Never married'); + default: + return /* I18N: gedcom tag _NMAR */ I18N::translate('Never married'); + } + case '_NMR': + switch ($sex) { + case 'M': + return /* I18N: gedcom tag _NMR */ I18N::translateContext('MALE', 'Not married'); + case 'F': + return /* I18N: gedcom tag _NMR */ I18N::translateContext('FEMALE', 'Not married'); + default: + return /* I18N: gedcom tag _NMR */ I18N::translate('Not married'); + } + case '_PHOTO': // Family Tree Builder uses "0 _ALBUM/1_PHOTO" + return I18N::translate('Photo'); + case '_WT_USER': + return I18N::translate('by'); + case '_PRMN': + return /* I18N: gedcom tag _PRMN */ I18N::translate('Permanent number'); + case '_RNAME': // Family Tree Builder user "1 NAME / 2 _RNAME" + switch ($sex) { + case 'M': + return I18N::translateContext('MALE', 'Religious name'); + case 'F': + return I18N::translateContext('FEMALE', 'Religious name'); + default: + return I18N::translate('Religious name'); + } + case '_SCBK': + return /* I18N: gedcom tag _SCBK */ I18N::translate('Scrapbook'); + case '_SEPR': + return /* I18N: gedcom tag _SEPR */ I18N::translate('Separated'); + case '_SSHOW': + return /* I18N: gedcom tag _SSHOW */ I18N::translate('Slide show'); + case '_STAT': + return /* I18N: gedcom tag _STAT */ I18N::translate('Marriage status'); + case '_SUBQ': + return /* I18N: gedcom tag _SUBQ */ I18N::translate('Short version'); + case '_TODO': + return /* I18N: gedcom tag _TODO */ I18N::translate('Research task'); + case '_TYPE': + return /* I18N: gedcom tag _TYPE */ I18N::translate('Media type'); + case '_UID': + return /* I18N: gedcom tag _UID */ I18N::translate('Unique identifier'); + case '_URL': + return /* I18N: gedcom tag _URL */ I18N::translate('URL'); + case '_WEIG': + return /* I18N: gedcom tag _WEIG */ I18N::translate('Weight'); + case '_WITN': + return /* I18N: gedcom tag _WITN */ I18N::translate('Witness'); + case '_WT_OBJE_SORT': + return /* I18N: gedcom tag _WT_OBJE_SORT */ I18N::translate('Re-order media'); + case '_YART': + return /* I18N: gedcom tag _YART - A yahrzeit is a special anniversary of death in the Hebrew faith/calendar. */ I18N::translate('Yahrzeit'); + // Brit milah applies only to males, no need for male/female translations + case '__BRTM_CHIL': + return I18N::translate('Brit milah of a son'); + case '__BRTM_GCHI': + return I18N::translate('Brit milah of a grandson'); + case '__BRTM_GCH1': + return I18N::translateContext('daughter’s son', 'Brit milah of a grandson'); + case '__BRTM_GCH2': + return I18N::translateContext('son’s son', 'Brit milah of a grandson'); + case '__BRTM_HSIB': + return I18N::translate('Brit milah of a half-brother'); + case '__BRTM_SIBL': + return I18N::translate('Brit milah of a brother'); + case '_FILESIZE': // Family Tree Builder uses OBJE:_FILESIZE + case '__FILE_SIZE__': // This pseudo-tag is generated internally to present information about a media object + return I18N::translate('File size'); + case '__IMAGE_SIZE__': // This pseudo-tag is generated internally to present information about a media object + return I18N::translate('Image dimensions'); default: - return I18N::translate('Adoption of a child'); - } - case '_ADOP_GCHI': - switch ($sex) { - case 'M': - return I18N::translate('Adoption of a grandson'); - case 'F': - return I18N::translate('Adoption of a granddaughter'); - default: - return I18N::translate('Adoption of a grandchild'); - } - case '_ADOP_GCH1': - switch ($sex) { - case 'M': - return I18N::translateContext('daughter’s son', 'Adoption of a grandson'); - case 'F': - return I18N::translateContext('daughter’s daughter', 'Adoption of a granddaughter'); - default: - return I18N::translate('Adoption of a grandchild'); - } - case '_ADOP_GCH2': - switch ($sex) { - case 'M': - return I18N::translateContext('son’s son', 'Adoption of a grandson'); - case 'F': - return I18N::translateContext('son’s daughter', 'Adoption of a granddaughter'); - default: - return I18N::translate('Adoption of a grandchild'); - } - case '_ADOP_HSIB': - switch ($sex) { - case 'M': - return I18N::translate('Adoption of a half-brother'); - case 'F': - return I18N::translate('Adoption of a half-sister'); - default: - return I18N::translate('Adoption of a half-sibling'); - } - case '_ADOP_SIBL': - switch ($sex) { - case 'M': - return I18N::translate('Adoption of a brother'); - case 'F': - return I18N::translate('Adoption of a sister'); - default: - return I18N::translate('Adoption of a sibling'); - } - case '_ADPF': - switch ($sex) { - case 'M': - return /* I18N: gedcom tag _ADPF */ I18N::translateContext('MALE', 'Adopted by father'); - case 'F': - return /* I18N: gedcom tag _ADPF */ I18N::translateContext('FEMALE', 'Adopted by father'); - default: - return /* I18N: gedcom tag _ADPF */ I18N::translate('Adopted by father'); - } - case '_ADPM': - switch ($sex) { - case 'M': - return /* I18N: gedcom tag _ADPM */ I18N::translateContext('MALE', 'Adopted by mother'); - case 'F': - return /* I18N: gedcom tag _ADPM */ I18N::translateContext('FEMALE', 'Adopted by mother'); - default: - return /* I18N: gedcom tag _ADPM */ I18N::translate('Adopted by mother'); - } - case '_AKA': - case '_AKAN': - switch ($sex) { - case 'M': - return /* I18N: gedcom tag _AKA */ I18N::translateContext('MALE', 'Also known as'); - case 'F': - return /* I18N: gedcom tag _AKA */ I18N::translateContext('FEMALE', 'Also known as'); - default: - return /* I18N: gedcom tag _AKA */ I18N::translate('Also known as'); - } - case '_ALBUM': // Family Tree Builder uses OBJE:_ALBUM - return /* I18N: gedcom tag _ALBUM */ I18N::translate('Album'); - case '_ASSO': - return /* I18N: gedcom tag _ASSO */ I18N::translate('Associate'); /* see also ASSO */ - case '_BAPM_CHIL': - switch ($sex) { - case 'M': - return I18N::translate('Baptism of a son'); - case 'F': - return I18N::translate('Baptism of a daughter'); - default: - return I18N::translate('Baptism of a child'); - } - case '_BAPM_GCHI': - switch ($sex) { - case 'M': - return I18N::translate('Baptism of a grandson'); - case 'F': - return I18N::translate('Baptism of a granddaughter'); - default: - return I18N::translate('Baptism of a grandchild'); - } - case '_BAPM_GCH1': - switch ($sex) { - case 'M': - return I18N::translateContext('daughter’s son', 'Baptism of a grandson'); - case 'F': - return I18N::translateContext('daughter’s daughter', 'Baptism of a granddaughter'); - default: - return I18N::translate('Baptism of a grandchild'); - } - case '_BAPM_GCH2': - switch ($sex) { - case 'M': - return I18N::translateContext('son’s son', 'Baptism of a grandson'); - case 'F': - return I18N::translateContext('son’s daughter', 'Baptism of a granddaughter'); - default: - return I18N::translate('Baptism of a grandchild'); - } - case '_BAPM_HSIB': - switch ($sex) { - case 'M': - return I18N::translate('Baptism of a half-brother'); - case 'F': - return I18N::translate('Baptism of a half-sister'); - default: - return I18N::translate('Baptism of a half-sibling'); - } - case '_BAPM_SIBL': - switch ($sex) { - case 'M': - return I18N::translate('Baptism of a brother'); - case 'F': - return I18N::translate('Baptism of a sister'); - default: - return I18N::translate('Baptism of a sibling'); - } - case '_BIBL': - return /* I18N: gedcom tag _BIBL */ I18N::translate('Bibliography'); - case '_BIRT_CHIL': - switch ($sex) { - case 'M': - return I18N::translate('Birth of a son'); - case 'F': - return I18N::translate('Birth of a daughter'); - default: - return I18N::translate('Birth of a child'); - } - case '_BIRT_GCHI': - switch ($sex) { - case 'M': - return I18N::translate('Birth of a grandson'); - case 'F': - return I18N::translate('Birth of a granddaughter'); - default: - return I18N::translate('Birth of a grandchild'); - } - case '_BIRT_GCH1': - switch ($sex) { - case 'M': - return I18N::translateContext('daughter’s son', 'Birth of a grandson'); - case 'F': - return I18N::translateContext('daughter’s daughter', 'Birth of a granddaughter'); - default: - return I18N::translate('Birth of a grandchild'); - } - case '_BIRT_GCH2': - switch ($sex) { - case 'M': - return I18N::translateContext('son’s son', 'Birth of a grandson'); - case 'F': - return I18N::translateContext('son’s daughter', 'Birth of a granddaughter'); - default: - return I18N::translate('Birth of a grandchild'); - } - case '_BIRT_HSIB': - switch ($sex) { - case 'M': - return I18N::translate('Birth of a half-brother'); - case 'F': - return I18N::translate('Birth of a half-sister'); - default: - return I18N::translate('Birth of a half-sibling'); - } - case '_BIRT_SIBL': - switch ($sex) { - case 'M': - return I18N::translate('Birth of a brother'); - case 'F': - return I18N::translate('Birth of a sister'); - default: - return I18N::translate('Birth of a sibling'); - } - case '_BRTM': - return /* I18N: gedcom tag _BRTM */ I18N::translate('Brit milah'); - case '_BRTM:DATE': - return I18N::translate('Date of brit milah'); - case '_BRTM:PLAC': - return I18N::translate('Place of brit milah'); - case '_BURI_CHIL': - switch ($sex) { - case 'M': - return I18N::translate('Burial of a son'); - case 'F': - return I18N::translate('Burial of a daughter'); - default: - return I18N::translate('Burial of a child'); - } - case '_BURI_GCHI': - switch ($sex) { - case 'M': - return I18N::translate('Burial of a grandson'); - case 'F': - return I18N::translate('Burial of a granddaughter'); - default: - return I18N::translate('Burial of a grandchild'); - } - case '_BURI_GCH1': - switch ($sex) { - case 'M': - return I18N::translateContext('daughter’s son', 'Burial of a grandson'); - case 'F': - return I18N::translateContext('daughter’s daughter', 'Burial of a granddaughter'); - default: - return I18N::translate('Burial of a grandchild'); - } - case '_BURI_GCH2': - switch ($sex) { - case 'M': - return I18N::translateContext('son’s son', 'Burial of a grandson'); - case 'F': - return I18N::translateContext('son’s daughter', 'Burial of a granddaughter'); - default: - return I18N::translate('Burial of a grandchild'); - } - case '_BURI_GPAR': - switch ($sex) { - case 'M': - return I18N::translate('Burial of a grandfather'); - case 'F': - return I18N::translate('Burial of a grandmother'); - default: - return I18N::translate('Burial of a grandparent'); - } - case '_BURI_GPA1': - switch ($sex) { - case 'M': - return I18N::translate('Burial of a paternal grandfather'); - case 'F': - return I18N::translate('Burial of a paternal grandmother'); - default: - return I18N::translate('Burial of a paternal grandparent'); - } - case '_BURI_GPA2': - switch ($sex) { - case 'M': - return I18N::translate('Burial of a maternal grandfather'); - case 'F': - return I18N::translate('Burial of a maternal grandmother'); - default: - return I18N::translate('Burial of a maternal grandparent'); - } - case '_BURI_HSIB': - switch ($sex) { - case 'M': - return I18N::translate('Burial of a half-brother'); - case 'F': - return I18N::translate('Burial of a half-sister'); - default: - return I18N::translate('Burial of a half-sibling'); - } - case '_BURI_PARE': - switch ($sex) { - case 'M': - return I18N::translate('Burial of a father'); - case 'F': - return I18N::translate('Burial of a mother'); - default: - return I18N::translate('Burial of a parent'); - } - case '_BURI_SIBL': - switch ($sex) { - case 'M': - return I18N::translate('Burial of a brother'); - case 'F': - return I18N::translate('Burial of a sister'); - default: - return I18N::translate('Burial of a sibling'); - } - case '_BURI_SPOU': - switch ($sex) { - case 'M': - return I18N::translate('Burial of a husband'); - case 'F': - return I18N::translate('Burial of a wife'); - default: - return I18N::translate('Burial of a spouse'); - } - case '_CHR_CHIL': - switch ($sex) { - case 'M': - return I18N::translate('Christening of a son'); - case 'F': - return I18N::translate('Christening of a daughter'); - default: - return I18N::translate('Christening of a child'); - } - case '_CHR_GCHI': - switch ($sex) { - case 'M': - return I18N::translate('Christening of a grandson'); - case 'F': - return I18N::translate('Christening of a granddaughter'); - default: - return I18N::translate('Christening of a grandchild'); - } - case '_CHR_GCH1': - switch ($sex) { - case 'M': - return I18N::translateContext('daughter’s son', 'Christening of a grandson'); - case 'F': - return I18N::translateContext('daughter’s daughter', 'Christening of a granddaughter'); - default: - return I18N::translate('Christening of a grandchild'); - } - case '_CHR_GCH2': - switch ($sex) { - case 'M': - return I18N::translateContext('son’s son', 'Christening of a grandson'); - case 'F': - return I18N::translateContext('son’s daughter', 'Christening of a granddaughter'); - default: - return I18N::translate('Christening of a grandchild'); - } - case '_CHR_HSIB': - switch ($sex) { - case 'M': - return I18N::translate('Christening of a half-brother'); - case 'F': - return I18N::translate('Christening of a half-sister'); - default: - return I18N::translate('Christening of a half-sibling'); - } - case '_CHR_SIBL': - switch ($sex) { - case 'M': - return I18N::translate('Christening of a brother'); - case 'F': - return I18N::translate('Christening of a sister'); - default: - return I18N::translate('Christening of a sibling'); - } - case '_COML': - return /* I18N: gedcom tag _COML */ I18N::translate('Common law marriage'); - case '_CREM_CHIL': - switch ($sex) { - case 'M': - return I18N::translate('Cremation of a son'); - case 'F': - return I18N::translate('Cremation of a daughter'); - default: - return I18N::translate('Cremation of a child'); - } - case '_CREM_GCHI': - switch ($sex) { - case 'M': - return I18N::translate('Cremation of a grandson'); - case 'F': - return I18N::translate('Cremation of a granddaughter'); - default: - return I18N::translate('Cremation of a grandchild'); - } - case '_CREM_GCH1': - switch ($sex) { - case 'M': - return I18N::translateContext('daughter’s son', 'Cremation of a grandson'); - case 'F': - return I18N::translateContext('daughter’s daughter', 'Cremation of a granddaughter'); - default: - return I18N::translate('Cremation of a grandchild'); - } - case '_CREM_GCH2': - switch ($sex) { - case 'M': - return I18N::translateContext('son’s son', 'Cremation of a grandson'); - case 'F': - return I18N::translateContext('son’s daughter', 'Cremation of a granddaughter'); - default: - return I18N::translate('Cremation of a grandchild'); - } - case '_CREM_GPAR': - switch ($sex) { - case 'M': - return I18N::translate('Cremation of a grandfather'); - case 'F': - return I18N::translate('Cremation of a grandmother'); - default: - return I18N::translate('Cremation of a grand-parent'); - } - case '_CREM_GPA1': - switch ($sex) { - case 'M': - return I18N::translate('Cremation of a paternal grandfather'); - case 'F': - return I18N::translate('Cremation of a paternal grandmother'); - default: - return I18N::translate('Cremation of a grand-parent'); - } - case '_CREM_GPA2': - switch ($sex) { - case 'M': - return I18N::translate('Cremation of a maternal grandfather'); - case 'F': - return I18N::translate('Cremation of a maternal grandmother'); - default: - return I18N::translate('Cremation of a grand-parent'); - } - case '_CREM_HSIB': - switch ($sex) { - case 'M': - return I18N::translate('Cremation of a half-brother'); - case 'F': - return I18N::translate('Cremation of a half-sister'); - default: - return I18N::translate('Cremation of a half-sibling'); - } - case '_CREM_PARE': - switch ($sex) { - case 'M': - return I18N::translate('Cremation of a father'); - case 'F': - return I18N::translate('Cremation of a mother'); - default: - return I18N::translate('Cremation of a parent'); - } - case '_CREM_SIBL': - switch ($sex) { - case 'M': - return I18N::translate('Cremation of a brother'); - case 'F': - return I18N::translate('Cremation of a sister'); - default: - return I18N::translate('Cremation of a sibling'); - } - case '_CREM_SPOU': - switch ($sex) { - case 'M': - return I18N::translate('Cremation of a husband'); - case 'F': - return I18N::translate('Cremation of a wife'); - default: - return I18N::translate('Cremation of a spouse'); - } - case '_DBID': - return /* I18N: gedcom tag _DBID */ I18N::translate('Linked database ID'); - case '_DEAT_CHIL': - switch ($sex) { - case 'M': - return I18N::translate('Death of a son'); - case 'F': - return I18N::translate('Death of a daughter'); - default: - return I18N::translate('Death of a child'); - } - case '_DEAT_GCHI': - switch ($sex) { - case 'M': - return I18N::translate('Death of a grandson'); - case 'F': - return I18N::translate('Death of a granddaughter'); - default: - return I18N::translate('Death of a grandchild'); - } - case '_DEAT_GCH1': - switch ($sex) { - case 'M': - return I18N::translateContext('daughter’s son', 'Death of a grandson'); - case 'F': - return I18N::translateContext('daughter’s daughter', 'Death of a granddaughter'); - default: - return I18N::translate('Death of a grandchild'); - } - case '_DEAT_GCH2': - switch ($sex) { - case 'M': - return I18N::translateContext('son’s son', 'Death of a grandson'); - case 'F': - return I18N::translateContext('son’s daughter', 'Death of a granddaughter'); - default: - return I18N::translate('Death of a grandchild'); - } - case '_DEAT_GPAR': - switch ($sex) { - case 'M': - return I18N::translate('Death of a grandfather'); - case 'F': - return I18N::translate('Death of a grandmother'); - default: - return I18N::translate('Death of a grand-parent'); - } - case '_DEAT_GPA1': - switch ($sex) { - case 'M': - return I18N::translate('Death of a paternal grandfather'); - case 'F': - return I18N::translate('Death of a paternal grandmother'); - default: - return I18N::translate('Death of a grand-parent'); - } - case '_DEAT_GPA2': - switch ($sex) { - case 'M': - return I18N::translate('Death of a maternal grandfather'); - case 'F': - return I18N::translate('Death of a maternal grandmother'); - default: - return I18N::translate('Death of a grand-parent'); - } - case '_DEAT_HSIB': - switch ($sex) { - case 'M': - return I18N::translate('Death of a half-brother'); - case 'F': - return I18N::translate('Death of a half-sister'); - default: - return I18N::translate('Death of a half-sibling'); - } - case '_DEAT_PARE': - switch ($sex) { - case 'M': - return I18N::translate('Death of a father'); - case 'F': - return I18N::translate('Death of a mother'); - default: - return I18N::translate('Death of a parent'); - } - case '_DEAT_SIBL': - switch ($sex) { - case 'M': - return I18N::translate('Death of a brother'); - case 'F': - return I18N::translate('Death of a sister'); - default: - return I18N::translate('Death of a sibling'); - } - case '_DEAT_SPOU': - switch ($sex) { - case 'M': - return I18N::translate('Death of a husband'); - case 'F': - return I18N::translate('Death of a wife'); - default: - return I18N::translate('Death of a spouse'); - } - case '_DEG': - return /* I18N: gedcom tag _DEG */ I18N::translate('Degree'); - case '_DETS': - return /* I18N: gedcom tag _DETS */ I18N::translate('Death of one spouse'); - case '_DNA': - return /* I18N: gedcom tag _DNA (from FTM 2010) */ I18N::translate('DNA markers'); - case '_EMAIL': - return /* I18N: gedcom tag _EMAIL */ I18N::translate('Email address'); - case '_EYEC': - return /* I18N: gedcom tag _EYEC */ I18N::translate('Eye color'); - case '_FA1': - return I18N::translate('Fact 1'); - case '_FA2': - return I18N::translate('Fact 2'); - case '_FA3': - return I18N::translate('Fact 3'); - case '_FA4': - return I18N::translate('Fact 4'); - case '_FA5': - return I18N::translate('Fact 5'); - case '_FA6': - return I18N::translate('Fact 6'); - case '_FA7': - return I18N::translate('Fact 7'); - case '_FA8': - return I18N::translate('Fact 8'); - case '_FA9': - return I18N::translate('Fact 9'); - case '_FA10': - return I18N::translate('Fact 10'); - case '_FA11': - return I18N::translate('Fact 11'); - case '_FA12': - return I18N::translate('Fact 12'); - case '_FA13': - return I18N::translate('Fact 13'); - case '_FNRL': - return /* I18N: gedcom tag _FNRL */ I18N::translate('Funeral'); - case '_FREL': - return /* I18N: gedcom tag _FREL */ I18N::translate('Relationship to father'); - case '_GEDF': - return /* I18N: gedcom tag _GEDF */ I18N::translate('GEDCOM file'); - case '_GODP': - return /* I18N: gedcom tag _GODP */ I18N::translate('Godparent'); - case '_HAIR': - return /* I18N: gedcom tag _HAIR */ I18N::translate('Hair color'); - case '_HEB': - return /* I18N: gedcom tag _HEB */ I18N::translate('Hebrew'); - case '_HEIG': - return /* I18N: gedcom tag _HEIG */ I18N::translate('Height'); - case '_HNM': - return /* I18N: gedcom tag _HNM */ I18N::translate('Hebrew name'); - case '_HOL': - return /* I18N: gedcom tag _HOL */ I18N::translate('Holocaust'); - case '_INTE': - switch ($sex) { - case 'M': - return /* I18N: gedcom tag _INTE */ I18N::translateContext('MALE', 'Interred'); - case 'F': - return /* I18N: gedcom tag _INTE */ I18N::translateContext('FEMALE', 'Interred'); - default: - return /* I18N: gedcom tag _INTE */ I18N::translate('Interred'); - } - case '_LOC': - return /* I18N: gedcom tag _LOC */ I18N::translate('Location'); - case '_MARI': - return /* I18N: gedcom tag _MARI */ I18N::translate('Marriage intention'); - case '_MARNM': - return /* I18N: gedcom tag _MARNM */ I18N::translate('Married name'); - case '_PRIM': - return /* I18N: gedcom tag _PRIM */ I18N::translate('Highlighted image'); - case '_MARNM_SURN': - return I18N::translate('Married surname'); - case '_MARR_CHIL': - switch ($sex) { - case 'M': - return I18N::translate('Marriage of a son'); - case 'F': - return I18N::translate('Marriage of a daughter'); - default: - return I18N::translate('Marriage of a child'); - } - case '_MARR_FAMC': - return /* I18N: ...to each other */ I18N::translate('Marriage of parents'); - case '_MARR_GCHI': - switch ($sex) { - case 'M': - return I18N::translate('Marriage of a grandson'); - case 'F': - return I18N::translate('Marriage of a granddaughter'); - default: - return I18N::translate('Marriage of a grandchild'); - } - case '_MARR_GCH1': - switch ($sex) { - case 'M': - return I18N::translateContext('daughter’s son', 'Marriage of a grandson'); - case 'F': - return I18N::translateContext('daughter’s daughter', 'Marriage of a granddaughter'); - default: - return I18N::translate('Marriage of a grandchild'); - } - case '_MARR_GCH2': - switch ($sex) { - case 'M': - return I18N::translateContext('son’s son', 'Marriage of a grandson'); - case 'F': - return I18N::translateContext('son’s daughter', 'Marriage of a granddaughter'); - default: - return I18N::translate('Marriage of a grandchild'); - } - case '_MARR_HSIB': - switch ($sex) { - case 'M': - return I18N::translate('Marriage of a half-brother'); - case 'F': - return I18N::translate('Marriage of a half-sister'); - default: - return I18N::translate('Marriage of a half-sibling'); - } - case '_MARR_PARE': - switch ($sex) { - case 'M': - return /* I18N: ...to another spouse */ I18N::translate('Marriage of a father'); - case 'F': - return /* I18N: ...to another spouse */ I18N::translate('Marriage of a mother'); - default: - return /* I18N: ...to another spouse */ I18N::translate('Marriage of a parent'); - } - case '_MARR_SIBL': - switch ($sex) { - case 'M': - return I18N::translate('Marriage of a brother'); - case 'F': - return I18N::translate('Marriage of a sister'); - default: - return I18N::translate('Marriage of a sibling'); - } - case '_MBON': - return /* I18N: gedcom tag _MBON */ I18N::translate('Marriage bond'); - case '_MDCL': - return /* I18N: gedcom tag _MDCL */ I18N::translate('Medical'); - case '_MEDC': - return /* I18N: gedcom tag _MEDC */ I18N::translate('Medical condition'); - case '_MEND': - return /* I18N: gedcom tag _MEND */ I18N::translate('Marriage ending status'); - case '_MILI': - return /* I18N: gedcom tag _MILI */ I18N::translate('Military'); - case '_MILT': - return /* I18N: gedcom tag _MILT */ I18N::translate('Military service'); - case '_MREL': - return /* I18N: gedcom tag _MREL */ I18N::translate('Relationship to mother'); - case '_MSTAT': - return /* I18N: gedcom tag _MSTAT */ I18N::translate('Marriage beginning status'); - case '_NAME': - return /* I18N: gedcom tag _NAME */ I18N::translate('Mailing name'); - case '_NAMS': - return /* I18N: gedcom tag _NAMS */ I18N::translate('Namesake'); - case '_NLIV': - return /* I18N: gedcom tag _NLIV */ I18N::translate('Not living'); - case '_NMAR': - switch ($sex) { - case 'M': - return /* I18N: gedcom tag _NMAR */ I18N::translateContext('MALE', 'Never married'); - case 'F': - return /* I18N: gedcom tag _NMAR */ I18N::translateContext('FEMALE', 'Never married'); - default: - return /* I18N: gedcom tag _NMAR */ I18N::translate('Never married'); - } - case '_NMR': - switch ($sex) { - case 'M': - return /* I18N: gedcom tag _NMR */ I18N::translateContext('MALE', 'Not married'); - case 'F': - return /* I18N: gedcom tag _NMR */ I18N::translateContext('FEMALE', 'Not married'); - default: - return /* I18N: gedcom tag _NMR */ I18N::translate('Not married'); - } - case '_PHOTO': // Family Tree Builder uses "0 _ALBUM/1_PHOTO" - return I18N::translate('Photo'); - case '_WT_USER': - return I18N::translate('by'); - case '_PRMN': - return /* I18N: gedcom tag _PRMN */ I18N::translate('Permanent number'); - case '_RNAME': // Family Tree Builder user "1 NAME / 2 _RNAME" - switch ($sex) { - case 'M': - return I18N::translateContext('MALE', 'Religious name'); - case 'F': - return I18N::translateContext('FEMALE', 'Religious name'); - default: - return I18N::translate('Religious name'); - } - case '_SCBK': - return /* I18N: gedcom tag _SCBK */ I18N::translate('Scrapbook'); - case '_SEPR': - return /* I18N: gedcom tag _SEPR */ I18N::translate('Separated'); - case '_SSHOW': - return /* I18N: gedcom tag _SSHOW */ I18N::translate('Slide show'); - case '_STAT': - return /* I18N: gedcom tag _STAT */ I18N::translate('Marriage status'); - case '_SUBQ': - return /* I18N: gedcom tag _SUBQ */ I18N::translate('Short version'); - case '_TODO': - return /* I18N: gedcom tag _TODO */ I18N::translate('Research task'); - case '_TYPE': - return /* I18N: gedcom tag _TYPE */ I18N::translate('Media type'); - case '_UID': - return /* I18N: gedcom tag _UID */ I18N::translate('Unique identifier'); - case '_URL': - return /* I18N: gedcom tag _URL */ I18N::translate('URL'); - case '_WEIG': - return /* I18N: gedcom tag _WEIG */ I18N::translate('Weight'); - case '_WITN': - return /* I18N: gedcom tag _WITN */ I18N::translate('Witness'); - case '_WT_OBJE_SORT': - return /* I18N: gedcom tag _WT_OBJE_SORT */ I18N::translate('Re-order media'); - case '_YART': - return /* I18N: gedcom tag _YART - A yahrzeit is a special anniversary of death in the Hebrew faith/calendar. */ I18N::translate('Yahrzeit'); - // Brit milah applies only to males, no need for male/female translations - case '__BRTM_CHIL': - return I18N::translate('Brit milah of a son'); - case '__BRTM_GCHI': - return I18N::translate('Brit milah of a grandson'); - case '__BRTM_GCH1': - return I18N::translateContext('daughter’s son', 'Brit milah of a grandson'); - case '__BRTM_GCH2': - return I18N::translateContext('son’s son', 'Brit milah of a grandson'); - case '__BRTM_HSIB': - return I18N::translate('Brit milah of a half-brother'); - case '__BRTM_SIBL': - return I18N::translate('Brit milah of a brother'); - case '_FILESIZE': // Family Tree Builder uses OBJE:_FILESIZE - case '__FILE_SIZE__': // This pseudo-tag is generated internally to present information about a media object - return I18N::translate('File size'); - case '__IMAGE_SIZE__': // This pseudo-tag is generated internally to present information about a media object - return I18N::translate('Image dimensions'); - default: - // If no specialisation exists (e.g. DEAT:CAUS), then look for the general (CAUS) - if (strpos($tag, ':')) { - list(, $tag) = explode(':', $tag, 2); + // If no specialisation exists (e.g. DEAT:CAUS), then look for the general (CAUS) + if (strpos($tag, ':')) { + list(, $tag) = explode(':', $tag, 2); - return self::getLabel($tag, $record); - } + return self::getLabel($tag, $record); + } - // Still no translation? Highlight this as an error - return '<span class="error" title="' . I18N::translate('Unrecognized GEDCOM code') . '">' . Html::escape($tag) . '</span>'; + // Still no translation? Highlight this as an error + return '<span class="error" title="' . I18N::translate('Unrecognized GEDCOM code') . '">' . Html::escape($tag) . '</span>'; } } @@ -1414,69 +1414,69 @@ class GedcomTag { */ public static function getPicklistFacts($fact_type) { switch ($fact_type) { - case 'INDI': - $tags = [ - // Facts, attributes for individuals (no links to FAMs) - 'RESN', 'NAME', 'SEX', 'BIRT', 'CHR', 'DEAT', 'BURI', 'CREM', - 'ADOP', 'BAPM', 'BARM', 'BASM', 'BLES', 'CHRA', 'CONF', 'FCOM', 'ORDN', - 'NATU', 'EMIG', 'IMMI', 'CENS', 'PROB', 'WILL', 'GRAD', 'RETI', 'EVEN', - 'CAST', 'DSCR', 'EDUC', 'IDNO', 'NATI', 'NCHI', 'NMR', - 'OCCU', 'PROP', 'RELI', 'RESI', 'SSN', 'TITL', 'FACT', - 'BAPL', 'CONL', 'ENDL', 'SLGC', - 'SUBM', 'ASSO', 'ALIA', 'ANCI', 'DESI', 'RFN', 'AFN', - 'REFN', 'RIN', 'CHAN', 'NOTE', 'SHARED_NOTE', 'SOUR', 'OBJE', - // non standard tags - '_BRTM', '_DEG', '_DNA', '_EYEC', '_FNRL', '_HAIR', '_HEIG', '_HNM', - '_HOL', '_INTE', '_MDCL', '_MEDC', '_MILI', '_MILT', '_NAME', '_NAMS', - '_NLIV', '_NMAR', '_PRMN', '_TODO', '_UID', '_WEIG', '_YART', - ]; - break; - case 'FAM': - $tags = [ - // Facts for families, left out HUSB, WIFE & CHIL links - 'RESN', 'ANUL', 'CENS', 'DIV', 'DIVF', 'ENGA', 'MARB', 'MARC', - 'MARR', 'MARL', 'MARS', 'RESI', 'EVEN', 'NCHI', 'SUBM', 'SLGS', - 'REFN', 'RIN', 'CHAN', 'NOTE', 'SHARED_NOTE', 'SOUR', 'OBJE', - // non standard tags - '_NMR', 'MARR_CIVIL', 'MARR_RELIGIOUS', 'MARR_PARTNERS', 'MARR_UNKNOWN', - '_COML', '_MBON', '_MARI', '_SEPR', '_TODO', - ]; - break; - case 'SOUR': - $tags = [ - // Facts for sources - 'DATA', 'AUTH', 'TITL', 'ABBR', 'PUBL', 'TEXT', 'REPO', 'REFN', 'RIN', - 'CHAN', 'NOTE', 'SHARED_NOTE', 'OBJE', - 'RESN', - ]; - break; - case 'REPO': - $tags = [ - // Facts for repositories - 'NAME', 'ADDR', 'PHON', 'EMAIL', 'FAX', 'WWW', - 'NOTE', 'SHARED_NOTE', 'REFN', 'RIN', 'CHAN', - 'RESN', - ]; - break; - case 'PLAC': - $tags = [ - // Facts for places - 'FONE', 'ROMN', - // non standard tags - '_HEB', - ]; - break; - case 'NAME': - $tags = [ - // Facts subordinate to NAME - 'FONE', 'ROMN', - // non standard tags - '_HEB', '_AKA', '_MARNM', - ]; - break; - default: - $tags = []; + case 'INDI': + $tags = [ + // Facts, attributes for individuals (no links to FAMs) + 'RESN', 'NAME', 'SEX', 'BIRT', 'CHR', 'DEAT', 'BURI', 'CREM', + 'ADOP', 'BAPM', 'BARM', 'BASM', 'BLES', 'CHRA', 'CONF', 'FCOM', 'ORDN', + 'NATU', 'EMIG', 'IMMI', 'CENS', 'PROB', 'WILL', 'GRAD', 'RETI', 'EVEN', + 'CAST', 'DSCR', 'EDUC', 'IDNO', 'NATI', 'NCHI', 'NMR', + 'OCCU', 'PROP', 'RELI', 'RESI', 'SSN', 'TITL', 'FACT', + 'BAPL', 'CONL', 'ENDL', 'SLGC', + 'SUBM', 'ASSO', 'ALIA', 'ANCI', 'DESI', 'RFN', 'AFN', + 'REFN', 'RIN', 'CHAN', 'NOTE', 'SHARED_NOTE', 'SOUR', 'OBJE', + // non standard tags + '_BRTM', '_DEG', '_DNA', '_EYEC', '_FNRL', '_HAIR', '_HEIG', '_HNM', + '_HOL', '_INTE', '_MDCL', '_MEDC', '_MILI', '_MILT', '_NAME', '_NAMS', + '_NLIV', '_NMAR', '_PRMN', '_TODO', '_UID', '_WEIG', '_YART', + ]; + break; + case 'FAM': + $tags = [ + // Facts for families, left out HUSB, WIFE & CHIL links + 'RESN', 'ANUL', 'CENS', 'DIV', 'DIVF', 'ENGA', 'MARB', 'MARC', + 'MARR', 'MARL', 'MARS', 'RESI', 'EVEN', 'NCHI', 'SUBM', 'SLGS', + 'REFN', 'RIN', 'CHAN', 'NOTE', 'SHARED_NOTE', 'SOUR', 'OBJE', + // non standard tags + '_NMR', 'MARR_CIVIL', 'MARR_RELIGIOUS', 'MARR_PARTNERS', 'MARR_UNKNOWN', + '_COML', '_MBON', '_MARI', '_SEPR', '_TODO', + ]; break; + case 'SOUR': + $tags = [ + // Facts for sources + 'DATA', 'AUTH', 'TITL', 'ABBR', 'PUBL', 'TEXT', 'REPO', 'REFN', 'RIN', + 'CHAN', 'NOTE', 'SHARED_NOTE', 'OBJE', + 'RESN', + ]; + break; + case 'REPO': + $tags = [ + // Facts for repositories + 'NAME', 'ADDR', 'PHON', 'EMAIL', 'FAX', 'WWW', + 'NOTE', 'SHARED_NOTE', 'REFN', 'RIN', 'CHAN', + 'RESN', + ]; + break; + case 'PLAC': + $tags = [ + // Facts for places + 'FONE', 'ROMN', + // non standard tags + '_HEB', + ]; + break; + case 'NAME': + $tags = [ + // Facts subordinate to NAME + 'FONE', 'ROMN', + // non standard tags + '_HEB', '_AKA', '_MARNM', + ]; + break; + default: + $tags = []; + break; } $facts = []; @@ -1497,42 +1497,42 @@ class GedcomTag { */ public static function getFileFormTypeValue($type) { switch (strtolower($type)) { - case 'audio': - return /* I18N: Type of media object */ I18N::translate('Audio'); - case 'book': - return /* I18N: Type of media object */ I18N::translate('Book'); - case 'card': - return /* I18N: Type of media object */ I18N::translate('Card'); - case 'certificate': - return /* I18N: Type of media object */ I18N::translate('Certificate'); - case 'coat': - return /* I18N: Type of media object */ I18N::translate('Coat of arms'); - case 'document': - return /* I18N: Type of media object */ I18N::translate('Document'); - case 'electronic': - return /* I18N: Type of media object */ I18N::translate('Electronic'); - case 'fiche': - return /* I18N: Type of media object */ I18N::translate('Microfiche'); - case 'film': - return /* I18N: Type of media object */ I18N::translate('Microfilm'); - case 'magazine': - return /* I18N: Type of media object */ I18N::translate('Magazine'); - case 'manuscript': - return /* I18N: Type of media object */ I18N::translate('Manuscript'); - case 'map': - return /* I18N: Type of media object */ I18N::translate('Map'); - case 'newspaper': - return /* I18N: Type of media object */ I18N::translate('Newspaper'); - case 'photo': - return /* I18N: Type of media object */ I18N::translate('Photo'); - case 'tombstone': - return /* I18N: Type of media object */ I18N::translate('Tombstone'); - case 'video': - return /* I18N: Type of media object */ I18N::translate('Video'); - case 'painting': - return /* I18N: Type of media object */ I18N::translate('Painting'); - default: - return /* I18N: Type of media object */ I18N::translate('Other'); + case 'audio': + return /* I18N: Type of media object */ I18N::translate('Audio'); + case 'book': + return /* I18N: Type of media object */ I18N::translate('Book'); + case 'card': + return /* I18N: Type of media object */ I18N::translate('Card'); + case 'certificate': + return /* I18N: Type of media object */ I18N::translate('Certificate'); + case 'coat': + return /* I18N: Type of media object */ I18N::translate('Coat of arms'); + case 'document': + return /* I18N: Type of media object */ I18N::translate('Document'); + case 'electronic': + return /* I18N: Type of media object */ I18N::translate('Electronic'); + case 'fiche': + return /* I18N: Type of media object */ I18N::translate('Microfiche'); + case 'film': + return /* I18N: Type of media object */ I18N::translate('Microfilm'); + case 'magazine': + return /* I18N: Type of media object */ I18N::translate('Magazine'); + case 'manuscript': + return /* I18N: Type of media object */ I18N::translate('Manuscript'); + case 'map': + return /* I18N: Type of media object */ I18N::translate('Map'); + case 'newspaper': + return /* I18N: Type of media object */ I18N::translate('Newspaper'); + case 'photo': + return /* I18N: Type of media object */ I18N::translate('Photo'); + case 'tombstone': + return /* I18N: Type of media object */ I18N::translate('Tombstone'); + case 'video': + return /* I18N: Type of media object */ I18N::translate('Video'); + case 'painting': + return /* I18N: Type of media object */ I18N::translate('Painting'); + default: + return /* I18N: Type of media object */ I18N::translate('Other'); } } diff --git a/app/Http/Controllers/AdminController.php b/app/Http/Controllers/AdminController.php index 9f11efc5b5..58c8609e03 100644 --- a/app/Http/Controllers/AdminController.php +++ b/app/Http/Controllers/AdminController.php @@ -749,14 +749,14 @@ class AdminController extends BaseController { foreach ($differences as $difference) { switch ($difference[1]) { - case MyersDiff::DELETE: - $diff_lines[] = '<del>' . $difference[0] . '</del>'; - break; - case MyersDiff::INSERT: - $diff_lines[] = '<ins>' . $difference[0] . '</ins>'; - break; - default: - $diff_lines[] = $difference[0]; + case MyersDiff::DELETE: + $diff_lines[] = '<del>' . $difference[0] . '</del>'; + break; + case MyersDiff::INSERT: + $diff_lines[] = '<ins>' . $difference[0] . '</ins>'; + break; + default: + $diff_lines[] = $difference[0]; } } @@ -1599,12 +1599,12 @@ class AdminController extends BaseController { // Datatables numbers columns 0, 1, 2 // MySQL numbers columns 1, 2, 3 switch ($value['dir']) { - case 'asc': - $order_by .= (1 + $value['column']) . ' ASC '; - break; - case 'desc': - $order_by .= (1 + $value['column']) . ' DESC '; - break; + case 'asc': + $order_by .= (1 + $value['column']) . ' ASC '; + break; + case 'desc': + $order_by .= (1 + $value['column']) . ' DESC '; + break; } } } else { diff --git a/app/Http/Controllers/EditController.php b/app/Http/Controllers/EditController.php index 5ad128e9b5..49ce8116b2 100644 --- a/app/Http/Controllers/EditController.php +++ b/app/Http/Controllers/EditController.php @@ -190,77 +190,77 @@ class EditController extends BaseController { $file_location = $request->get('file_location'); switch ($file_location) { - case 'url': - $remote = $request->get('remote'); + case 'url': + $remote = $request->get('remote'); - if (strpos($remote, '://') !== false) { - return $remote; - } else { - return ''; - } + if (strpos($remote, '://') !== false) { + return $remote; + } else { + return ''; + } - case 'unused': - $unused = $request->get('unused'); - $unused = str_replace('\\', '/', $unused); + case 'unused': + $unused = $request->get('unused'); + $unused = str_replace('\\', '/', $unused); - if (strpos($unused, '../') !== false) { - return ''; - } + if (strpos($unused, '../') !== false) { + return ''; + } - return $unused; + return $unused; - case 'upload': - default: - $media_folder = $tree->getPreference('MEDIA_DIRECTORY'); - $folder = $request->get('folder', ''); - $auto = $request->get('auto', '0'); - $new_file = $request->get('new_file', ''); + case 'upload': + default: + $media_folder = $tree->getPreference('MEDIA_DIRECTORY'); + $folder = $request->get('folder', ''); + $auto = $request->get('auto', '0'); + $new_file = $request->get('new_file', ''); - $uploaded_file = $request->files->get('file'); - if ($uploaded_file === null) { - return ''; - } + $uploaded_file = $request->files->get('file'); + if ($uploaded_file === null) { + return ''; + } - // The filename - $new_file = str_replace('\\', '/', $new_file); - if ($new_file !== '' && strpos($new_file, '/') === false) { - $file = $new_file; - } else { - $file = $uploaded_file->getClientOriginalName(); - } + // The filename + $new_file = str_replace('\\', '/', $new_file); + if ($new_file !== '' && strpos($new_file, '/') === false) { + $file = $new_file; + } else { + $file = $uploaded_file->getClientOriginalName(); + } - // The folder - $folder = str_replace('\\', '/', $folder); - $folder = trim($folder, '/'); - if ($folder !== '') { - $folder .= '/'; - } + // The folder + $folder = str_replace('\\', '/', $folder); + $folder = trim($folder, '/'); + if ($folder !== '') { + $folder .= '/'; + } - // Invalid path? - if (strpos($folder, '../') !== false || !File::mkdir(WT_DATA_DIR . $media_folder . $folder)) { - $auto = '1'; - } + // Invalid path? + if (strpos($folder, '../') !== false || !File::mkdir(WT_DATA_DIR . $media_folder . $folder)) { + $auto = '1'; + } - // Generate a unique name for the file? - if ($auto === '1' || file_exists(WT_DATA_DIR . $media_folder . $folder . $file)) { - $folder = ''; - $extension = $uploaded_file->guessExtension(); - $file = sha1_file($uploaded_file->getPathname()) . '.' . $extension; - } + // Generate a unique name for the file? + if ($auto === '1' || file_exists(WT_DATA_DIR . $media_folder . $folder . $file)) { + $folder = ''; + $extension = $uploaded_file->guessExtension(); + $file = sha1_file($uploaded_file->getPathname()) . '.' . $extension; + } - try { - //if ($uploaded_file->isValid()) { - // $uploaded_file->move(WT_DATA_DIR . $media_folder . $folder, $file); - if (is_uploaded_file($_FILES['file']['tmp_name'])) { - move_uploaded_file($_FILES['file']['tmp_name'], WT_DATA_DIR . $media_folder . $folder . $file); + try { + //if ($uploaded_file->isValid()) { + // $uploaded_file->move(WT_DATA_DIR . $media_folder . $folder, $file); + if (is_uploaded_file($_FILES['file']['tmp_name'])) { + move_uploaded_file($_FILES['file']['tmp_name'], WT_DATA_DIR . $media_folder . $folder . $file); - return $folder . $file; + return $folder . $file; + } + } catch (FileException $ex) { + DebugBar::addThrowable($ex); } - } catch (FileException $ex) { - DebugBar::addThrowable($ex); - } - return ''; + return ''; } } diff --git a/app/Http/Controllers/SetupController.php b/app/Http/Controllers/SetupController.php index 5b8bfb7f41..3275ddd2c0 100644 --- a/app/Http/Controllers/SetupController.php +++ b/app/Http/Controllers/SetupController.php @@ -103,25 +103,25 @@ class SetupController extends BaseController { } switch ($step) { - default: - case 1: - return $this->viewResponse('setup/step-1-language', $data); - case 2: - return $this->viewResponse('setup/step-2-server-checks', $data); - case 3: - return $this->viewResponse('setup/step-3-database-connection', $data); - case 4: - return $this->viewResponse('setup/step-4-database-name', $data); - case 5: - return $this->viewResponse('setup/step-5-administrator', $data); - case 6: - $error = $this->createConfigFile($data['dbhost'], $data['dbport'], $data['dbuser'], $data['dbpass'], $data['dbname'], $data['tblpfx'], $data['wtname'], $data['wtuser'], $data['wtpass'], $data['wtemail']); + default: + case 1: + return $this->viewResponse('setup/step-1-language', $data); + case 2: + return $this->viewResponse('setup/step-2-server-checks', $data); + case 3: + return $this->viewResponse('setup/step-3-database-connection', $data); + case 4: + return $this->viewResponse('setup/step-4-database-name', $data); + case 5: + return $this->viewResponse('setup/step-5-administrator', $data); + case 6: + $error = $this->createConfigFile($data['dbhost'], $data['dbport'], $data['dbuser'], $data['dbpass'], $data['dbname'], $data['tblpfx'], $data['wtname'], $data['wtuser'], $data['wtpass'], $data['wtemail']); - if ($error === '') { - return new RedirectResponse(Html::url('index.php', [])); - } else { - return $this->viewResponse('setup/step-6-failed', ['error' => $error]); - } + if ($error === '') { + return new RedirectResponse(Html::url('index.php', [])); + } else { + return $this->viewResponse('setup/step-6-failed', ['error' => $error]); + } } } @@ -371,24 +371,24 @@ class SetupController extends BaseController { $memory_limit = ini_get('memory_limit'); switch (substr($memory_limit, -1)) { - case 'k': - case 'K': - $memory_limit = substr($memory_limit, 0, -1) / 1024; - break; - case 'm': - case 'M': - $memory_limit = substr($memory_limit, 0, -1); - break; - case 'g': - case 'G': - $memory_limit = substr($memory_limit, 0, -1) * 1024; - break; - case 't': - case 'T': - $memory_limit = substr($memory_limit, 0, -1) * 1024 * 1024; - break; - default: - $memory_limit = $memory_limit / 1024 / 1024; + case 'k': + case 'K': + $memory_limit = substr($memory_limit, 0, -1) / 1024; + break; + case 'm': + case 'M': + $memory_limit = substr($memory_limit, 0, -1); + break; + case 'g': + case 'G': + $memory_limit = substr($memory_limit, 0, -1) * 1024; + break; + case 't': + case 'T': + $memory_limit = substr($memory_limit, 0, -1) * 1024 * 1024; + break; + default: + $memory_limit = $memory_limit / 1024 / 1024; } return (int) $memory_limit; diff --git a/app/I18N.php b/app/I18N.php index 8220805d62..5ecefcf68c 100644 --- a/app/I18N.php +++ b/app/I18N.php @@ -144,13 +144,13 @@ class I18N { public static function collation() { $collation = self::$locale->collation(); switch ($collation) { - case 'croatian_ci': - case 'german2_ci': - case 'vietnamese_ci': - // Only available in MySQL 5.6 - return 'utf8_unicode_ci'; - default: - return 'utf8_' . $collation; + case 'croatian_ci': + case 'german2_ci': + case 'vietnamese_ci': + // Only available in MySQL 5.6 + return 'utf8_unicode_ci'; + default: + return 'utf8_' . $collation; } } @@ -238,15 +238,15 @@ class I18N { */ public static function gedcomAge($string) { switch ($string) { - case 'STILLBORN': - // I18N: Description of an individual’s age at an event. For example, Died 14 Jan 1900 (stillborn) - return self::translate('(stillborn)'); - case 'INFANT': - // I18N: Description of an individual’s age at an event. For example, Died 14 Jan 1900 (in infancy) - return self::translate('(in infancy)'); - case 'CHILD': - // I18N: Description of an individual’s age at an event. For example, Died 14 Jan 1900 (in childhood) - return self::translate('(in childhood)'); + case 'STILLBORN': + // I18N: Description of an individual’s age at an event. For example, Died 14 Jan 1900 (stillborn) + return self::translate('(stillborn)'); + case 'INFANT': + // I18N: Description of an individual’s age at an event. For example, Died 14 Jan 1900 (in infancy) + return self::translate('(in infancy)'); + case 'CHILD': + // I18N: Description of an individual’s age at an event. For example, Died 14 Jan 1900 (in childhood) + return self::translate('(in childhood)'); } $age = []; if (preg_match('/(\d+)y/', $string, $match)) { @@ -562,13 +562,13 @@ class I18N { */ public static function scriptDirection($script) { switch ($script) { - case 'Arab': - case 'Hebr': - case 'Mong': - case 'Thaa': - return 'rtl'; - default: - return 'ltr'; + case 'Arab': + case 'Hebr': + case 'Mong': + case 'Thaa': + return 'rtl'; + default: + return 'ltr'; } } @@ -787,15 +787,15 @@ class I18N { */ public static function defaultCalendar() { switch (self::$locale->languageTag()) { - case 'ar': - return new ArabicCalendar; - case 'fa': - return new PersianCalendar; - case 'he': - case 'yi': - return new JewishCalendar; - default: - return new GregorianCalendar; + case 'ar': + return new ArabicCalendar; + case 'fa': + return new PersianCalendar; + case 'he': + case 'yi': + return new JewishCalendar; + default: + return new GregorianCalendar; } } } diff --git a/app/Individual.php b/app/Individual.php index f8cc2358a3..43fc193499 100644 --- a/app/Individual.php +++ b/app/Individual.php @@ -853,33 +853,33 @@ class Individual extends GedcomRecord { public function getPrimaryChildFamily() { $families = $this->getChildFamilies(); switch (count($families)) { - case 0: - return null; - case 1: - return $families[0]; - default: - // If there is more than one FAMC record, choose the preferred parents: - // a) records with '2 _PRIMARY' - foreach ($families as $famid => $fam) { - if (preg_match("/\n1 FAMC @{$famid}@\n(?:[2-9].*\n)*(?:2 _PRIMARY Y)/", $this->getGedcom())) { - return $fam; + case 0: + return null; + case 1: + return $families[0]; + default: + // If there is more than one FAMC record, choose the preferred parents: + // a) records with '2 _PRIMARY' + foreach ($families as $famid => $fam) { + if (preg_match("/\n1 FAMC @{$famid}@\n(?:[2-9].*\n)*(?:2 _PRIMARY Y)/", $this->getGedcom())) { + return $fam; + } } - } - // b) records with '2 PEDI birt' - foreach ($families as $famid => $fam) { - if (preg_match("/\n1 FAMC @{$famid}@\n(?:[2-9].*\n)*(?:2 PEDI birth)/", $this->getGedcom())) { - return $fam; + // b) records with '2 PEDI birt' + foreach ($families as $famid => $fam) { + if (preg_match("/\n1 FAMC @{$famid}@\n(?:[2-9].*\n)*(?:2 PEDI birth)/", $this->getGedcom())) { + return $fam; + } } - } - // c) records with no '2 PEDI' - foreach ($families as $famid => $fam) { - if (!preg_match("/\n1 FAMC @{$famid}@\n(?:[2-9].*\n)*(?:2 PEDI)/", $this->getGedcom())) { - return $fam; + // c) records with no '2 PEDI' + foreach ($families as $famid => $fam) { + if (!preg_match("/\n1 FAMC @{$famid}@\n(?:[2-9].*\n)*(?:2 PEDI)/", $this->getGedcom())) { + return $fam; + } } - } - // d) any record - return $families[0]; + // d) any record + return $families[0]; } } diff --git a/app/Mail.php b/app/Mail.php index ac842f511f..cd12ee94a3 100644 --- a/app/Mail.php +++ b/app/Mail.php @@ -79,30 +79,30 @@ class Mail { */ public static function transport() { switch (Site::getPreference('SMTP_ACTIVE')) { - case 'internal': - return Swift_MailTransport::newInstance(); - case 'sendmail': - return Swift_SendmailTransport::newInstance(); - case 'external': - $transport = Swift_SmtpTransport::newInstance() - ->setHost(Site::getPreference('SMTP_HOST')) - ->setPort(Site::getPreference('SMTP_PORT')) - ->setLocalDomain(Site::getPreference('SMTP_HELO')); + case 'internal': + return Swift_MailTransport::newInstance(); + case 'sendmail': + return Swift_SendmailTransport::newInstance(); + case 'external': + $transport = Swift_SmtpTransport::newInstance() + ->setHost(Site::getPreference('SMTP_HOST')) + ->setPort(Site::getPreference('SMTP_PORT')) + ->setLocalDomain(Site::getPreference('SMTP_HELO')); - if (Site::getPreference('SMTP_AUTH') === '1') { - $transport - ->setUsername(Site::getPreference('SMTP_AUTH_USER')) - ->setPassword(Site::getPreference('SMTP_AUTH_PASS')); - } + if (Site::getPreference('SMTP_AUTH') === '1') { + $transport + ->setUsername(Site::getPreference('SMTP_AUTH_USER')) + ->setPassword(Site::getPreference('SMTP_AUTH_PASS')); + } - if (Site::getPreference('SMTP_SSL') !== 'none') { - $transport->setEncryption(Site::getPreference('SMTP_SSL')); - } + if (Site::getPreference('SMTP_SSL') !== 'none') { + $transport->setEncryption(Site::getPreference('SMTP_SSL')); + } - return $transport; - default: - // For testing - return Swift_NullTransport::newInstance(); + return $transport; + default: + // For testing + return Swift_NullTransport::newInstance(); } } } diff --git a/app/MediaFile.php b/app/MediaFile.php index f5bc08bf48..2f0f682238 100644 --- a/app/MediaFile.php +++ b/app/MediaFile.php @@ -387,56 +387,56 @@ class MediaFile { public function mimeType() { // Themes contain icon definitions for some/all of these mime-types switch ($this->extension()) { - case 'bmp': - return 'image/bmp'; - case 'doc': - return 'application/msword'; - case 'docx': - return 'application/msword'; - case 'ged': - return 'text/x-gedcom'; - case 'gif': - return 'image/gif'; - case 'htm': - return 'text/html'; - case 'html': - return 'text/html'; - case 'jpeg': - return 'image/jpeg'; - case 'jpg': - return 'image/jpeg'; - case 'mov': - return 'video/quicktime'; - case 'mp3': - return 'audio/mpeg'; - case 'mp4': - return 'video/mp4'; - case 'ogv': - return 'video/ogg'; - case 'pdf': - return 'application/pdf'; - case 'png': - return 'image/png'; - case 'rar': - return 'application/x-rar-compressed'; - case 'swf': - return 'application/x-shockwave-flash'; - case 'svg': - return 'image/svg'; - case 'tif': - return 'image/tiff'; - case 'tiff': - return 'image/tiff'; - case 'xls': - return 'application/vnd-ms-excel'; - case 'xlsx': - return 'application/vnd-ms-excel'; - case 'wmv': - return 'video/x-ms-wmv'; - case 'zip': - return 'application/zip'; - default: - return 'application/octet-stream'; + case 'bmp': + return 'image/bmp'; + case 'doc': + return 'application/msword'; + case 'docx': + return 'application/msword'; + case 'ged': + return 'text/x-gedcom'; + case 'gif': + return 'image/gif'; + case 'htm': + return 'text/html'; + case 'html': + return 'text/html'; + case 'jpeg': + return 'image/jpeg'; + case 'jpg': + return 'image/jpeg'; + case 'mov': + return 'video/quicktime'; + case 'mp3': + return 'audio/mpeg'; + case 'mp4': + return 'video/mp4'; + case 'ogv': + return 'video/ogg'; + case 'pdf': + return 'application/pdf'; + case 'png': + return 'image/png'; + case 'rar': + return 'application/x-rar-compressed'; + case 'swf': + return 'application/x-shockwave-flash'; + case 'svg': + return 'image/svg'; + case 'tif': + return 'image/tiff'; + case 'tiff': + return 'image/tiff'; + case 'xls': + return 'application/vnd-ms-excel'; + case 'xlsx': + return 'application/vnd-ms-excel'; + case 'wmv': + return 'video/x-ms-wmv'; + case 'zip': + return 'application/zip'; + default: + return 'application/octet-stream'; } } } diff --git a/app/Module/BatchUpdate/BatchUpdateBasePlugin.php b/app/Module/BatchUpdate/BatchUpdateBasePlugin.php index 6143726d49..7ab6e19103 100644 --- a/app/Module/BatchUpdate/BatchUpdateBasePlugin.php +++ b/app/Module/BatchUpdate/BatchUpdateBasePlugin.php @@ -101,14 +101,14 @@ class BatchUpdateBasePlugin { foreach ($differences as $difference) { switch ($difference[1]) { - case MyersDiff::DELETE: - $diff_lines[] = self::decorateDeletedText($difference[0]); - break; - case MyersDiff::INSERT: - $diff_lines[] = self::decorateInsertedText($difference[0]); - break; - default: - $diff_lines[] = $difference[0]; + case MyersDiff::DELETE: + $diff_lines[] = self::decorateDeletedText($difference[0]); + break; + case MyersDiff::INSERT: + $diff_lines[] = self::decorateInsertedText($difference[0]); + break; + default: + $diff_lines[] = $difference[0]; } } diff --git a/app/Module/BatchUpdate/BatchUpdateMarriedNamesPlugin.php b/app/Module/BatchUpdate/BatchUpdateMarriedNamesPlugin.php index 0684500f8f..486291012e 100644 --- a/app/Module/BatchUpdate/BatchUpdateMarriedNamesPlugin.php +++ b/app/Module/BatchUpdate/BatchUpdateMarriedNamesPlugin.php @@ -74,15 +74,15 @@ class BatchUpdateMarriedNamesPlugin extends BatchUpdateBasePlugin { $married_names = []; foreach (self::surnamesToAdd($xref, $gedrec) as $surname) { switch ($this->surname) { - case 'add': - $married_names[] = "\n2 _MARNM " . str_replace('/', '', $wife_name) . ' /' . $surname . '/'; - break; - case 'replace': - if ($SURNAME_TRADITION === 'polish') { - $surname = preg_replace(['/ski$/', '/cki$/', '/dzki$/'], ['ska', 'cka', 'dzka'], $surname); - } - $married_names[] = "\n2 _MARNM " . preg_replace('!/.*/!', '/' . $surname . '/', $wife_name); - break; + case 'add': + $married_names[] = "\n2 _MARNM " . str_replace('/', '', $wife_name) . ' /' . $surname . '/'; + break; + case 'replace': + if ($SURNAME_TRADITION === 'polish') { + $surname = preg_replace(['/ski$/', '/cki$/', '/dzki$/'], ['ska', 'cka', 'dzka'], $surname); + } + $married_names[] = "\n2 _MARNM " . preg_replace('!/.*/!', '/' . $surname . '/', $wife_name); + break; } } diff --git a/app/Module/BatchUpdate/BatchUpdateSearchReplacePlugin.php b/app/Module/BatchUpdate/BatchUpdateSearchReplacePlugin.php index 151d581a10..364c25cd9f 100644 --- a/app/Module/BatchUpdate/BatchUpdateSearchReplacePlugin.php +++ b/app/Module/BatchUpdate/BatchUpdateSearchReplacePlugin.php @@ -108,28 +108,28 @@ class BatchUpdateSearchReplacePlugin extends BatchUpdateBasePlugin { $this->error = ''; switch ($this->method) { - case 'exact': - $this->regex = preg_quote($this->search, '/'); - break; - case 'words': - $this->regex = '\b' . preg_quote($this->search, '/') . '\b'; - break; - case 'wildcards': - $this->regex = '\b' . str_replace(['\*', '\?'], ['.*', '.'], preg_quote($this->search, '/')) . '\b'; - break; - case 'regex': - $this->regex = $this->search; - // Check for invalid regular expressions. - // A valid regex on a null string returns zero. - // An invalid regex on a null string returns false and throws a warning. - try { - preg_match('/' . $this->search . '/', null); - } catch (\ErrorException $ex) { - DebugBar::addThrowable($ex); + case 'exact': + $this->regex = preg_quote($this->search, '/'); + break; + case 'words': + $this->regex = '\b' . preg_quote($this->search, '/') . '\b'; + break; + case 'wildcards': + $this->regex = '\b' . str_replace(['\*', '\?'], ['.*', '.'], preg_quote($this->search, '/')) . '\b'; + break; + case 'regex': + $this->regex = $this->search; + // Check for invalid regular expressions. + // A valid regex on a null string returns zero. + // An invalid regex on a null string returns false and throws a warning. + try { + preg_match('/' . $this->search . '/', null); + } catch (\ErrorException $ex) { + DebugBar::addThrowable($ex); - $this->error = '<div class="alert alert-danger">' . /* I18N: http://en.wikipedia.org/wiki/Regular_expression */ I18N::translate('The regular expression appears to contain an error. It can’t be used.') . '</div>'; - } - break; + $this->error = '<div class="alert alert-danger">' . /* I18N: http://en.wikipedia.org/wiki/Regular_expression */ I18N::translate('The regular expression appears to contain an error. It can’t be used.') . '</div>'; + } + break; } } diff --git a/app/Module/BatchUpdateModule.php b/app/Module/BatchUpdateModule.php index f665c587c2..e78ea31ab9 100644 --- a/app/Module/BatchUpdateModule.php +++ b/app/Module/BatchUpdateModule.php @@ -95,13 +95,13 @@ class BatchUpdateModule extends AbstractModule implements ModuleConfigInterface */ public function modAction($mod_action) { switch ($mod_action) { - case 'admin_batch_update': - echo $this->main(); - break; + case 'admin_batch_update': + echo $this->main(); + break; - default: - http_response_code(404); - break; + default: + http_response_code(404); + break; } } @@ -126,36 +126,36 @@ class BatchUpdateModule extends AbstractModule implements ModuleConfigInterface $this->getAllXrefs(); switch ($this->action) { - case 'update': - $record = self::getLatestRecord($this->xref, $this->all_xrefs[$this->xref]); - if ($this->PLUGIN->doesRecordNeedUpdate($this->xref, $record)) { - $newrecord = $this->PLUGIN->updateRecord($this->xref, $record); - if ($newrecord != $record) { - if ($newrecord) { - GedcomRecord::getInstance($this->xref, $WT_TREE)->updateRecord($newrecord, !$this->PLUGIN->chan); - } else { - GedcomRecord::getInstance($this->xref, $WT_TREE)->deleteRecord(); - } - } - } - $this->xref = $this->findNextXref($this->xref); - break; - case 'update_all': - foreach ($this->all_xrefs as $xref => $type) { - $record = self::getLatestRecord($xref, $type); - if ($this->PLUGIN->doesRecordNeedUpdate($xref, $record)) { - $newrecord = $this->PLUGIN->updateRecord($xref, $record); + case 'update': + $record = self::getLatestRecord($this->xref, $this->all_xrefs[$this->xref]); + if ($this->PLUGIN->doesRecordNeedUpdate($this->xref, $record)) { + $newrecord = $this->PLUGIN->updateRecord($this->xref, $record); if ($newrecord != $record) { if ($newrecord) { - GedcomRecord::getInstance($xref, $WT_TREE)->updateRecord($newrecord, !$this->PLUGIN->chan); + GedcomRecord::getInstance($this->xref, $WT_TREE)->updateRecord($newrecord, !$this->PLUGIN->chan); } else { - GedcomRecord::getInstance($xref, $WT_TREE)->deleteRecord(); + GedcomRecord::getInstance($this->xref, $WT_TREE)->deleteRecord(); } } } - } - $this->xref = ''; - break; + $this->xref = $this->findNextXref($this->xref); + break; + case 'update_all': + foreach ($this->all_xrefs as $xref => $type) { + $record = self::getLatestRecord($xref, $type); + if ($this->PLUGIN->doesRecordNeedUpdate($xref, $record)) { + $newrecord = $this->PLUGIN->updateRecord($xref, $record); + if ($newrecord != $record) { + if ($newrecord) { + GedcomRecord::getInstance($xref, $WT_TREE)->updateRecord($newrecord, !$this->PLUGIN->chan); + } else { + GedcomRecord::getInstance($xref, $WT_TREE)->deleteRecord(); + } + } + } + } + $this->xref = ''; + break; } // Make sure that our requested record really does need updating. @@ -313,28 +313,28 @@ class BatchUpdateModule extends AbstractModule implements ModuleConfigInterface $vars = []; foreach ($this->PLUGIN->getRecordTypesToUpdate() as $type) { switch ($type) { - case 'INDI': - $sql[] = "SELECT i_id, 'INDI' FROM `##individuals` WHERE i_file=?"; - $vars[] = $WT_TREE->getTreeId(); - break; - case 'FAM': - $sql[] = "SELECT f_id, 'FAM' FROM `##families` WHERE f_file=?"; - $vars[] = $WT_TREE->getTreeId(); - break; - case 'SOUR': - $sql[] = "SELECT s_id, 'SOUR' FROM `##sources` WHERE s_file=?"; - $vars[] = $WT_TREE->getTreeId(); - break; - case 'OBJE': - $sql[] = "SELECT m_id, 'OBJE' FROM `##media` WHERE m_file=?"; - $vars[] = $WT_TREE->getTreeId(); - break; - default: - $sql[] = "SELECT o_id, ? FROM `##other` WHERE o_type=? AND o_file=?"; - $vars[] = $type; - $vars[] = $type; - $vars[] = $WT_TREE->getTreeId(); - break; + case 'INDI': + $sql[] = "SELECT i_id, 'INDI' FROM `##individuals` WHERE i_file=?"; + $vars[] = $WT_TREE->getTreeId(); + break; + case 'FAM': + $sql[] = "SELECT f_id, 'FAM' FROM `##families` WHERE f_file=?"; + $vars[] = $WT_TREE->getTreeId(); + break; + case 'SOUR': + $sql[] = "SELECT s_id, 'SOUR' FROM `##sources` WHERE s_file=?"; + $vars[] = $WT_TREE->getTreeId(); + break; + case 'OBJE': + $sql[] = "SELECT m_id, 'OBJE' FROM `##media` WHERE m_file=?"; + $vars[] = $WT_TREE->getTreeId(); + break; + default: + $sql[] = "SELECT o_id, ? FROM `##other` WHERE o_type=? AND o_file=?"; + $vars[] = $type; + $vars[] = $type; + $vars[] = $WT_TREE->getTreeId(); + break; } } $this->all_xrefs = Database::prepare(implode(' UNION ', $sql) . ' ORDER BY 1 ASC') @@ -410,20 +410,20 @@ class BatchUpdateModule extends AbstractModule implements ModuleConfigInterface global $WT_TREE; switch ($type) { - case 'INDI': - return Individual::getInstance($xref, $WT_TREE)->getGedcom(); - case 'FAM': - return Family::getInstance($xref, $WT_TREE)->getGedcom(); - case 'SOUR': - return Source::getInstance($xref, $WT_TREE)->getGedcom(); - case 'REPO': - return Repository::getInstance($xref, $WT_TREE)->getGedcom(); - case 'OBJE': - return Media::getInstance($xref, $WT_TREE)->getGedcom(); - case 'NOTE': - return Note::getInstance($xref, $WT_TREE)->getGedcom(); - default: - return GedcomRecord::getInstance($xref, $WT_TREE)->getGedcom(); + case 'INDI': + return Individual::getInstance($xref, $WT_TREE)->getGedcom(); + case 'FAM': + return Family::getInstance($xref, $WT_TREE)->getGedcom(); + case 'SOUR': + return Source::getInstance($xref, $WT_TREE)->getGedcom(); + case 'REPO': + return Repository::getInstance($xref, $WT_TREE)->getGedcom(); + case 'OBJE': + return Media::getInstance($xref, $WT_TREE)->getGedcom(); + case 'NOTE': + return Note::getInstance($xref, $WT_TREE)->getGedcom(); + default: + return GedcomRecord::getInstance($xref, $WT_TREE)->getGedcom(); } } diff --git a/app/Module/CensusAssistantModule.php b/app/Module/CensusAssistantModule.php index 64e3de5e26..f3b84f8298 100644 --- a/app/Module/CensusAssistantModule.php +++ b/app/Module/CensusAssistantModule.php @@ -57,28 +57,28 @@ class CensusAssistantModule extends AbstractModule { global $WT_TREE; switch ($mod_action) { - case 'census-header': - header('Content-Type: text/html; charset=utf8'); - $census = Filter::get('census'); - echo $this->censusTableHeader(new $census); - break; + case 'census-header': + header('Content-Type: text/html; charset=utf8'); + $census = Filter::get('census'); + echo $this->censusTableHeader(new $census); + break; - case 'census-individual': - header('Content-Type: text/html; charset=utf8'); - $census = Filter::get('census'); - $individual = Individual::getInstance(Filter::get('xref'), $WT_TREE); - $head = Individual::getInstance(Filter::get('head'), $WT_TREE); - echo $this->censusTableRow(new $census, $individual, $head); - break; + case 'census-individual': + header('Content-Type: text/html; charset=utf8'); + $census = Filter::get('census'); + $individual = Individual::getInstance(Filter::get('xref'), $WT_TREE); + $head = Individual::getInstance(Filter::get('head'), $WT_TREE); + echo $this->censusTableRow(new $census, $individual, $head); + break; - case 'media_find': - self::mediaFind(); - break; - case 'media_query_3a': - self::mediaQuery(); - break; - default: - http_response_code(404); + case 'media_find': + self::mediaFind(); + break; + case 'media_query_3a': + self::mediaQuery(); + break; + default: + http_response_code(404); } } diff --git a/app/Module/ChartsBlockModule.php b/app/Module/ChartsBlockModule.php index 8ef100a05e..8cea5d1659 100644 --- a/app/Module/ChartsBlockModule.php +++ b/app/Module/ChartsBlockModule.php @@ -77,57 +77,57 @@ class ChartsBlockModule extends AbstractModule implements ModuleBlockInterface { if ($person) { $content = ''; switch ($type) { - case 'pedigree': - $title = I18N::translate('Pedigree of %s', $person->getFullName()); - $chartController = new HourglassController($person->getXref()); - $controller->addInlineJavascript($chartController->setupJavascript()); - $content .= '<table cellspacing="0" cellpadding="0" border="0"><tr>'; - $content .= '<td class="myCharts">'; - ob_start(); - FunctionsPrint::printPedigreePerson($person); - $content .= ob_get_clean(); - $content .= '</td>'; - $content .= '<td>'; - ob_start(); - $chartController->printPersonPedigree($person, 1); - $content .= ob_get_clean(); - $content .= '</td>'; - $content .= '</tr></table>'; - break; - case 'descendants': - $title = I18N::translate('Descendants of %s', $person->getFullName()); - $chartController = new HourglassController($person->getXref()); - $controller->addInlineJavascript($chartController->setupJavascript()); - ob_start(); - $chartController->printDescendency($person, 1, false); - $content .= ob_get_clean(); - break; - case 'hourglass': - $title = I18N::translate('Hourglass chart of %s', $person->getFullName()); - $chartController = new HourglassController($person->getXref()); - $controller->addInlineJavascript($chartController->setupJavascript()); - $content .= '<table cellspacing="0" cellpadding="0" border="0"><tr>'; - $content .= '<td>'; - ob_start(); - $chartController->printDescendency($person, 1, false); - $content .= ob_get_clean(); - $content .= '</td>'; - $content .= '<td>'; - ob_start(); - $chartController->printPersonPedigree($person, 1); - $content .= ob_get_clean(); - $content .= '</td>'; - $content .= '</tr></table>'; - break; - case 'treenav': - $title = I18N::translate('Interactive tree of %s', $person->getFullName()); - $mod = new InteractiveTreeModule(WT_MODULES_DIR . 'tree'); - $tv = new TreeView; - $content .= '<script>$("head").append(\'<link rel="stylesheet" href="' . $mod->css() . '" type="text/css" />\');</script>'; - $content .= '<script src="' . $mod->js() . '"></script>'; - list($html, $js) = $tv->drawViewport($person, 2); - $content .= $html . '<script>' . $js . '</script>'; - break; + case 'pedigree': + $title = I18N::translate('Pedigree of %s', $person->getFullName()); + $chartController = new HourglassController($person->getXref()); + $controller->addInlineJavascript($chartController->setupJavascript()); + $content .= '<table cellspacing="0" cellpadding="0" border="0"><tr>'; + $content .= '<td class="myCharts">'; + ob_start(); + FunctionsPrint::printPedigreePerson($person); + $content .= ob_get_clean(); + $content .= '</td>'; + $content .= '<td>'; + ob_start(); + $chartController->printPersonPedigree($person, 1); + $content .= ob_get_clean(); + $content .= '</td>'; + $content .= '</tr></table>'; + break; + case 'descendants': + $title = I18N::translate('Descendants of %s', $person->getFullName()); + $chartController = new HourglassController($person->getXref()); + $controller->addInlineJavascript($chartController->setupJavascript()); + ob_start(); + $chartController->printDescendency($person, 1, false); + $content .= ob_get_clean(); + break; + case 'hourglass': + $title = I18N::translate('Hourglass chart of %s', $person->getFullName()); + $chartController = new HourglassController($person->getXref()); + $controller->addInlineJavascript($chartController->setupJavascript()); + $content .= '<table cellspacing="0" cellpadding="0" border="0"><tr>'; + $content .= '<td>'; + ob_start(); + $chartController->printDescendency($person, 1, false); + $content .= ob_get_clean(); + $content .= '</td>'; + $content .= '<td>'; + ob_start(); + $chartController->printPersonPedigree($person, 1); + $content .= ob_get_clean(); + $content .= '</td>'; + $content .= '</tr></table>'; + break; + case 'treenav': + $title = I18N::translate('Interactive tree of %s', $person->getFullName()); + $mod = new InteractiveTreeModule(WT_MODULES_DIR . 'tree'); + $tv = new TreeView; + $content .= '<script>$("head").append(\'<link rel="stylesheet" href="' . $mod->css() . '" type="text/css" />\');</script>'; + $content .= '<script src="' . $mod->js() . '"></script>'; + list($html, $js) = $tv->drawViewport($person, 2); + $content .= $html . '<script>' . $js . '</script>'; + break; } } else { $content = I18N::translate('You must select an individual and a chart type in the block preferences'); diff --git a/app/Module/ClippingsCart/ClippingsCartController.php b/app/Module/ClippingsCart/ClippingsCartController.php index 2a885f7189..7e16b06577 100644 --- a/app/Module/ClippingsCart/ClippingsCartController.php +++ b/app/Module/ClippingsCart/ClippingsCartController.php @@ -187,19 +187,19 @@ class ClippingsCartController { } switch ($this->privatize_export) { - case 'gedadmin': - $access_level = Auth::PRIV_NONE; - break; - case 'user': - $access_level = Auth::PRIV_USER; - break; - case 'visitor': - $access_level = Auth::PRIV_PRIVATE; - break; - case 'none': - default: - $access_level = Auth::PRIV_HIDE; - break; + case 'gedadmin': + $access_level = Auth::PRIV_NONE; + break; + case 'user': + $access_level = Auth::PRIV_USER; + break; + case 'visitor': + $access_level = Auth::PRIV_PRIVATE; + break; + case 'none': + default: + $access_level = Auth::PRIV_HIDE; + break; } foreach (array_keys($this->cart[$WT_TREE->getTreeId()]) as $xref) { @@ -231,28 +231,28 @@ class ClippingsCartController { $record = utf8_decode($record); } switch ($object::RECORD_TYPE) { - case 'INDI': - case 'FAM': - $filetext .= $record . "\n"; - $filetext .= "1 SOUR @WEBTREES@\n"; - $filetext .= '2 PAGE ' . WT_BASE_URL . $object->getRawUrl() . "\n"; - break; - case 'SOUR': - $filetext .= $record . "\n"; - $filetext .= '1 NOTE ' . WT_BASE_URL . $object->getRawUrl() . "\n"; - break; - case 'OBJE': - // Add the file to the archive - if (file_exists($object->getServerFilename())) { - $fp = fopen($object->getServerFilename(), 'r'); - $zip_filesystem->writeStream($path . $object->getFilename(), $fp); - fclose($fp); - } - $filetext .= $record . "\n"; - break; - default: - $filetext .= $record . "\n"; - break; + case 'INDI': + case 'FAM': + $filetext .= $record . "\n"; + $filetext .= "1 SOUR @WEBTREES@\n"; + $filetext .= '2 PAGE ' . WT_BASE_URL . $object->getRawUrl() . "\n"; + break; + case 'SOUR': + $filetext .= $record . "\n"; + $filetext .= '1 NOTE ' . WT_BASE_URL . $object->getRawUrl() . "\n"; + break; + case 'OBJE': + // Add the file to the archive + if (file_exists($object->getServerFilename())) { + $fp = fopen($object->getServerFilename(), 'r'); + $zip_filesystem->writeStream($path . $object->getFilename(), $fp); + fclose($fp); + } + $filetext .= $record . "\n"; + break; + default: + $filetext .= $record . "\n"; + break; } } } @@ -402,22 +402,22 @@ class ClippingsCartController { $b = GedcomRecord::getInstance($b, $WT_TREE); if ($a && $b) { switch ($a::RECORD_TYPE) { - case 'INDI': $t1 = 1; break; - case 'FAM': $t1 = 2; break; - case 'SOUR': $t1 = 3; break; - case 'REPO': $t1 = 4; break; - case 'OBJE': $t1 = 5; break; - case 'NOTE': $t1 = 6; break; - default: $t1 = 7; break; + case 'INDI': $t1 = 1; break; + case 'FAM': $t1 = 2; break; + case 'SOUR': $t1 = 3; break; + case 'REPO': $t1 = 4; break; + case 'OBJE': $t1 = 5; break; + case 'NOTE': $t1 = 6; break; + default: $t1 = 7; break; } switch ($b::RECORD_TYPE) { - case 'INDI': $t2 = 1; break; - case 'FAM': $t2 = 2; break; - case 'SOUR': $t2 = 3; break; - case 'REPO': $t2 = 4; break; - case 'OBJE': $t2 = 5; break; - case 'NOTE': $t2 = 6; break; - default: $t2 = 7; break; + case 'INDI': $t2 = 1; break; + case 'FAM': $t2 = 2; break; + case 'SOUR': $t2 = 3; break; + case 'REPO': $t2 = 4; break; + case 'OBJE': $t2 = 5; break; + case 'NOTE': $t2 = 6; break; + default: $t2 = 7; break; } if ($t1 != $t2) { return $t1 - $t2; diff --git a/app/Module/ClippingsCartModule.php b/app/Module/ClippingsCartModule.php index 660cdc141f..3ad78c8584 100644 --- a/app/Module/ClippingsCartModule.php +++ b/app/Module/ClippingsCartModule.php @@ -62,36 +62,36 @@ class ClippingsCartModule extends AbstractModule implements ModuleMenuInterface, */ public function modAction($mod_action) { switch ($mod_action) { - case 'ajax': - $html = $this->getSidebarAjaxContent(); - header('Content-Type: text/html; charset=UTF-8'); - echo $html; - break; - case 'index': - global $controller, $WT_TREE; + case 'ajax': + $html = $this->getSidebarAjaxContent(); + header('Content-Type: text/html; charset=UTF-8'); + echo $html; + break; + case 'index': + global $controller, $WT_TREE; - $MAX_PEDIGREE_GENERATIONS = $WT_TREE->getPreference('MAX_PEDIGREE_GENERATIONS'); + $MAX_PEDIGREE_GENERATIONS = $WT_TREE->getPreference('MAX_PEDIGREE_GENERATIONS'); - $clip_ctrl = new ClippingsCartController; - $cart = Session::get('cart'); + $clip_ctrl = new ClippingsCartController; + $cart = Session::get('cart'); - $controller = new PageController; - $controller - ->setPageTitle($this->getTitle()) - ->pageHeader(); + $controller = new PageController; + $controller + ->setPageTitle($this->getTitle()) + ->pageHeader(); - echo '<script>'; - echo 'function radAncestors(elementid) {var radFamilies=document.getElementById(elementid);radFamilies.checked=true;}'; - echo '</script>'; - echo '<div class="clipping-cart">'; + echo '<script>'; + echo 'function radAncestors(elementid) {var radFamilies=document.getElementById(elementid);radFamilies.checked=true;}'; + echo '</script>'; + echo '<div class="clipping-cart">'; - if (!$cart[$WT_TREE->getTreeId()]) { - echo '<h2>', I18N::translate('Family tree clippings cart'), '</h2>'; - } + if (!$cart[$WT_TREE->getTreeId()]) { + echo '<h2>', I18N::translate('Family tree clippings cart'), '</h2>'; + } - if ($clip_ctrl->action == 'add') { - $record = GedcomRecord::getInstance($clip_ctrl->id, $WT_TREE); - if ($clip_ctrl->type === 'FAM') { ?> + if ($clip_ctrl->action == 'add') { + $record = GedcomRecord::getInstance($clip_ctrl->id, $WT_TREE); + if ($clip_ctrl->type === 'FAM') { ?> <form class="wt-page-options wt-page-options-clipping-cart hidden-print" action="module.php"> <input type="hidden" name="mod" value="clippings"> <input type="hidden" name="mod_action" value="index"> @@ -117,14 +117,14 @@ class ClippingsCartModule extends AbstractModule implements ModuleMenuInterface, <td class="optionbox"> <input type="radio" name="others" value="members" checked> <?= /* I18N: %s is a family (husband + wife) */ - I18N::translate('%s and their children', $record->getFullName()) ?> + I18N::translate('%s and their children', $record->getFullName()) ?> </td> </tr> <tr> <td class="optionbox"> <input type="radio" name="others" value="descendants"> <?= /* I18N: %s is a family (husband + wife) */ - I18N::translate('%s and their descendants', $record->getFullName()) ?> + I18N::translate('%s and their descendants', $record->getFullName()) ?> </td> </tr> </tbody> @@ -166,14 +166,14 @@ class ClippingsCartModule extends AbstractModule implements ModuleMenuInterface, <label> <input type="radio" name="others" value="parents"> <?php - if ($record->getSex() === 'F') { - echo /* I18N: %s is a woman's name */ - I18N::translate('%s, her parents and siblings', $record->getFullName()); - } else { - echo /* I18N: %s is a man's name */ - I18N::translate('%s, his parents and siblings', $record->getFullName()); - } - ?> + if ($record->getSex() === 'F') { + echo /* I18N: %s is a woman's name */ + I18N::translate('%s, her parents and siblings', $record->getFullName()); + } else { + echo /* I18N: %s is a man's name */ + I18N::translate('%s, his parents and siblings', $record->getFullName()); + } + ?> </label> </td> </tr> @@ -182,14 +182,14 @@ class ClippingsCartModule extends AbstractModule implements ModuleMenuInterface, <label> <input type="radio" name="others" value="members"> <?php - if ($record->getSex() === 'F') { - echo /* I18N: %s is a woman's name */ - I18N::translate('%s, her spouses and children', $record->getFullName()); - } else { - echo /* I18N: %s is a man's name */ - I18N::translate('%s, his spouses and children', $record->getFullName()); - } - ?> + if ($record->getSex() === 'F') { + echo /* I18N: %s is a woman's name */ + I18N::translate('%s, her spouses and children', $record->getFullName()); + } else { + echo /* I18N: %s is a man's name */ + I18N::translate('%s, his spouses and children', $record->getFullName()); + } + ?> </label> </td> </tr> @@ -198,18 +198,18 @@ class ClippingsCartModule extends AbstractModule implements ModuleMenuInterface, <label> <input type="radio" name="others" value="ancestors" id="ancestors"> <?php - if ($record->getSex() === 'F') { - echo /* I18N: %s is a woman's name */ - I18N::translate('%s and her ancestors', $record->getFullName()); - } else { - echo /* I18N: %s is a man's name */ - I18N::translate('%s and his ancestors', $record->getFullName()); - } - ?> + if ($record->getSex() === 'F') { + echo /* I18N: %s is a woman's name */ + I18N::translate('%s and her ancestors', $record->getFullName()); + } else { + echo /* I18N: %s is a man's name */ + I18N::translate('%s and his ancestors', $record->getFullName()); + } + ?> </label> <br> <?= I18N::translate('Number of generations') ?> - <input type="text" size="5" name="level1" value="<?= $MAX_PEDIGREE_GENERATIONS ?>" onfocus="radAncestors('ancestors');"> + <input type="text" size="5" name="level1" value="<?= $MAX_PEDIGREE_GENERATIONS ?>" onfocus="radAncestors('ancestors');"> </td> </tr> <tr> @@ -217,18 +217,18 @@ class ClippingsCartModule extends AbstractModule implements ModuleMenuInterface, <label> <input type="radio" name="others" value="ancestorsfamilies" id="ancestorsfamilies"> <?php - if ($record->getSex() === 'F') { - echo /* I18N: %s is a woman's name */ - I18N::translate('%s, her ancestors and their families', $record->getFullName()); - } else { - echo /* I18N: %s is a man's name */ - I18N::translate('%s, his ancestors and their families', $record->getFullName()); - } - ?> + if ($record->getSex() === 'F') { + echo /* I18N: %s is a woman's name */ + I18N::translate('%s, her ancestors and their families', $record->getFullName()); + } else { + echo /* I18N: %s is a man's name */ + I18N::translate('%s, his ancestors and their families', $record->getFullName()); + } + ?> </label> <br> <?= I18N::translate('Number of generations') ?> - <input type="text" size="5" name="level2" value="<?= $MAX_PEDIGREE_GENERATIONS ?>" onfocus="radAncestors('ancestorsfamilies');"> + <input type="text" size="5" name="level2" value="<?= $MAX_PEDIGREE_GENERATIONS ?>" onfocus="radAncestors('ancestorsfamilies');"> </td> </tr> <tr> @@ -236,18 +236,18 @@ class ClippingsCartModule extends AbstractModule implements ModuleMenuInterface, <label> <input type="radio" name="others" value="descendants" id="descendants"> <?php - if ($record->getSex() === 'F') { - echo /* I18N: %s is a woman's name */ - I18N::translate('%s, her spouses and descendants', $record->getFullName()); - } else { - echo /* I18N: %s is a man's name */ - I18N::translate('%s, his spouses and descendants', $record->getFullName()); - } - ?> + if ($record->getSex() === 'F') { + echo /* I18N: %s is a woman's name */ + I18N::translate('%s, her spouses and descendants', $record->getFullName()); + } else { + echo /* I18N: %s is a man's name */ + I18N::translate('%s, his spouses and descendants', $record->getFullName()); + } + ?> </label> <br> <?= I18N::translate('Number of generations') ?> - <input type="text" size="5" name="level3" value="<?= $MAX_PEDIGREE_GENERATIONS ?>" onfocus="radAncestors('descendants');"> + <input type="text" size="5" name="level3" value="<?= $MAX_PEDIGREE_GENERATIONS ?>" onfocus="radAncestors('descendants');"> </td> </tr> </tbody> @@ -290,7 +290,7 @@ class ClippingsCartModule extends AbstractModule implements ModuleMenuInterface, <label> <input type="radio" name="others" value="linked"> <?= /* I18N: %s is the name of a source */ - I18N::translate('%s and the individuals that reference it.', $record->getFullName()) ?> + I18N::translate('%s and the individuals that reference it.', $record->getFullName()) ?> </label> </td> </tr> @@ -306,14 +306,14 @@ class ClippingsCartModule extends AbstractModule implements ModuleMenuInterface, </form> </div> <?php } - } + } - if (!$cart[$WT_TREE->getTreeId()]) { - if ($clip_ctrl->action != 'add') { - echo '<div class="center">'; - echo I18N::translate('The clippings cart allows you to take extracts from this family tree and download them as a GEDCOM file.'); - echo '</div>'; - ?> + if (!$cart[$WT_TREE->getTreeId()]) { + if ($clip_ctrl->action != 'add') { + echo '<div class="center">'; + echo I18N::translate('The clippings cart allows you to take extracts from this family tree and download them as a GEDCOM file.'); + echo '</div>'; + ?> <form class="wt-page-options wt-page-options-clipping-cart hidden-print" name="addin" action="module.php"> <input type="hidden" name="mod" value="clippings"> <input type="hidden" name="mod_action" value="index"> @@ -340,17 +340,17 @@ class ClippingsCartModule extends AbstractModule implements ModuleMenuInterface, </form> </div> <?php - } - echo '<div class="center">'; - // -- end new lines - echo I18N::translate('Your clippings cart is empty.'); - echo '</div>'; - } else { - // Keep track of the INDI from the parent page, otherwise it will - // get lost after ajax updates - $pid = Filter::get('pid', WT_REGEX_XREF); + } + echo '<div class="center">'; + // -- end new lines + echo I18N::translate('Your clippings cart is empty.'); + echo '</div>'; + } else { + // Keep track of the INDI from the parent page, otherwise it will + // get lost after ajax updates + $pid = Filter::get('pid', WT_REGEX_XREF); - if ($clip_ctrl->action !== 'download' && $clip_ctrl->action !== 'add') { ?> + if ($clip_ctrl->action !== 'download' && $clip_ctrl->action !== 'add') { ?> <form class="wt-page-options wt-page-options-clipping-cart hidden-print" action="module.php"> <input type="hidden" name="mod" value="clippings"> <input type="hidden" name="mod_action" value="index"> @@ -460,32 +460,32 @@ class ClippingsCartModule extends AbstractModule implements ModuleMenuInterface, </thead> <tbody> <?php - foreach (array_keys($cart[$WT_TREE->getTreeId()]) as $xref) { - $record = GedcomRecord::getInstance($xref, $WT_TREE); - if ($record) { - switch ($record::RECORD_TYPE) { - case 'INDI': - $icon = 'icon-indis'; - break; - case 'FAM': - $icon = 'icon-sfamily'; - break; - case 'SOUR': - $icon = 'icon-source'; - break; - case 'REPO': - $icon = 'icon-repository'; - break; - case 'NOTE': - $icon = 'icon-note'; - break; - case 'OBJE': - $icon = 'icon-media'; - break; - default: - $icon = 'icon-clippings'; - break; - } + foreach (array_keys($cart[$WT_TREE->getTreeId()]) as $xref) { + $record = GedcomRecord::getInstance($xref, $WT_TREE); + if ($record) { + switch ($record::RECORD_TYPE) { + case 'INDI': + $icon = 'icon-indis'; + break; + case 'FAM': + $icon = 'icon-sfamily'; + break; + case 'SOUR': + $icon = 'icon-source'; + break; + case 'REPO': + $icon = 'icon-repository'; + break; + case 'NOTE': + $icon = 'icon-note'; + break; + case 'OBJE': + $icon = 'icon-media'; + break; + default: + $icon = 'icon-clippings'; + break; + } ?> <tr> <td class="list_value"> @@ -505,9 +505,9 @@ class ClippingsCartModule extends AbstractModule implements ModuleMenuInterface, <?php } break; - default: - http_response_code(404); - break; + default: + http_response_code(404); + break; } } @@ -667,12 +667,12 @@ class ClippingsCartModule extends AbstractModule implements ModuleMenuInterface, $record = GedcomRecord::getInstance($xref, $WT_TREE); if ($record instanceof Individual || $record instanceof Family) { switch ($record::RECORD_TYPE) { - case 'INDI': - $icon = 'icon-indis'; - break; - case 'FAM': - $icon = 'icon-sfamily'; - break; + case 'INDI': + $icon = 'icon-indis'; + break; + case 'FAM': + $icon = 'icon-sfamily'; + break; } $out .= '<li>'; if (!empty($icon)) { diff --git a/app/Module/DescendancyModule.php b/app/Module/DescendancyModule.php index ee16c30686..40f0a4c9c2 100644 --- a/app/Module/DescendancyModule.php +++ b/app/Module/DescendancyModule.php @@ -51,19 +51,19 @@ class DescendancyModule extends AbstractModule implements ModuleSidebarInterface header('Content-Type: text/html; charset=UTF-8'); switch ($mod_action) { - case 'search': - $search = Filter::get('search'); - echo $this->search($search, $WT_TREE); - break; - case 'descendants': - $individual = Individual::getInstance(Filter::get('xref', WT_REGEX_XREF), $WT_TREE); - if ($individual) { - echo $this->loadSpouses($individual, 1); - } - break; - default: - http_response_code(404); - break; + case 'search': + $search = Filter::get('search'); + echo $this->search($search, $WT_TREE); + break; + case 'descendants': + $individual = Individual::getInstance(Filter::get('xref', WT_REGEX_XREF), $WT_TREE); + if ($individual) { + echo $this->loadSpouses($individual, 1); + } + break; + default: + http_response_code(404); + break; } } diff --git a/app/Module/FamilyTreeFavoritesModule.php b/app/Module/FamilyTreeFavoritesModule.php index 8932730c22..cacff6e9e6 100644 --- a/app/Module/FamilyTreeFavoritesModule.php +++ b/app/Module/FamilyTreeFavoritesModule.php @@ -84,43 +84,43 @@ class FamilyTreeFavoritesModule extends AbstractModule implements ModuleBlockInt $action = Filter::get('action'); switch ($action) { - case 'deletefav': - $favorite_id = Filter::getInteger('favorite_id'); - if ($favorite_id) { - self::deleteFavorite($favorite_id); - } - break; - case 'addfav': - $gid = Filter::get('gid', WT_REGEX_XREF); - $favnote = Filter::get('favnote'); - $url = Filter::getUrl('url'); - $favtitle = Filter::get('favtitle'); + case 'deletefav': + $favorite_id = Filter::getInteger('favorite_id'); + if ($favorite_id) { + self::deleteFavorite($favorite_id); + } + break; + case 'addfav': + $gid = Filter::get('gid', WT_REGEX_XREF); + $favnote = Filter::get('favnote'); + $url = Filter::getUrl('url'); + $favtitle = Filter::get('favtitle'); - if ($gid) { - $record = GedcomRecord::getInstance($gid, $WT_TREE); - if ($record && $record->canShow()) { + if ($gid) { + $record = GedcomRecord::getInstance($gid, $WT_TREE); + if ($record && $record->canShow()) { + self::addFavorite([ + 'user_id' => $ctype === 'user' ? Auth::id() : null, + 'gedcom_id' => $WT_TREE->getTreeId(), + 'gid' => $record->getXref(), + 'type' => $record::RECORD_TYPE, + 'url' => null, + 'note' => $favnote, + 'title' => $favtitle, + ]); + } + } elseif ($url) { self::addFavorite([ 'user_id' => $ctype === 'user' ? Auth::id() : null, 'gedcom_id' => $WT_TREE->getTreeId(), - 'gid' => $record->getXref(), - 'type' => $record::RECORD_TYPE, - 'url' => null, + 'gid' => null, + 'type' => 'URL', + 'url' => $url, 'note' => $favnote, - 'title' => $favtitle, + 'title' => $favtitle ? $favtitle : $url, ]); } - } elseif ($url) { - self::addFavorite([ - 'user_id' => $ctype === 'user' ? Auth::id() : null, - 'gedcom_id' => $WT_TREE->getTreeId(), - 'gid' => null, - 'type' => 'URL', - 'url' => $url, - 'note' => $favnote, - 'title' => $favtitle ? $favtitle : $url, - ]); - } - break; + break; } $userfavs = $this->getFavorites($ctype === 'user' ? Auth::id() : $WT_TREE->getTreeId()); @@ -149,14 +149,14 @@ class FamilyTreeFavoritesModule extends AbstractModule implements ModuleBlockInt if ($record instanceof Individual) { $content .= '<div id="box' . $favorite['gid'] . '.0" class="person_box action_header'; switch ($record->getSex()) { - case 'M': - break; - case 'F': - $content .= 'F'; - break; - default: - $content .= 'NN'; - break; + case 'M': + break; + case 'F': + $content .= 'F'; + break; + default: + $content .= 'NN'; + break; } $content .= '">'; if ($ctype == 'user' || Auth::isManager($WT_TREE)) { diff --git a/app/Module/FrequentlyAskedQuestionsModule.php b/app/Module/FrequentlyAskedQuestionsModule.php index 325b8563a0..18eb241caf 100644 --- a/app/Module/FrequentlyAskedQuestionsModule.php +++ b/app/Module/FrequentlyAskedQuestionsModule.php @@ -49,41 +49,41 @@ class FrequentlyAskedQuestionsModule extends AbstractModule implements ModuleMen */ public function modAction($mod_action) { switch ($mod_action) { - case 'admin_config': - $this->config(); - break; - case 'admin_delete': - if (Auth::isAdmin()) { - $this->delete(); - } - header('Location: module.php?mod=faq&mod_action=admin_config'); - break; - case 'admin_edit': - $this->edit(); - break; - case 'admin_edit_save': - if (Auth::isAdmin()) { - $this->editSave(); - } - header('Location: module.php?mod=faq&mod_action=admin_config'); - break; - case 'admin_movedown': - if (Auth::isAdmin()) { - $this->movedown(); - } - header('Location: module.php?mod=faq&mod_action=admin_config'); - break; - case 'admin_moveup': - if (Auth::isAdmin()) { - $this->moveup(); - } - header('Location: module.php?mod=faq&mod_action=admin_config'); - break; - case 'show': - $this->show(); - break; - default: - http_response_code(404); + case 'admin_config': + $this->config(); + break; + case 'admin_delete': + if (Auth::isAdmin()) { + $this->delete(); + } + header('Location: module.php?mod=faq&mod_action=admin_config'); + break; + case 'admin_edit': + $this->edit(); + break; + case 'admin_edit_save': + if (Auth::isAdmin()) { + $this->editSave(); + } + header('Location: module.php?mod=faq&mod_action=admin_config'); + break; + case 'admin_movedown': + if (Auth::isAdmin()) { + $this->movedown(); + } + header('Location: module.php?mod=faq&mod_action=admin_config'); + break; + case 'admin_moveup': + if (Auth::isAdmin()) { + $this->moveup(); + } + header('Location: module.php?mod=faq&mod_action=admin_config'); + break; + case 'show': + $this->show(); + break; + default: + http_response_code(404); } } diff --git a/app/Module/GoogleMapsModule.php b/app/Module/GoogleMapsModule.php index 8fc9c1a87b..885efdf560 100644 --- a/app/Module/GoogleMapsModule.php +++ b/app/Module/GoogleMapsModule.php @@ -105,39 +105,39 @@ class GoogleMapsModule extends AbstractModule implements ModuleConfigInterface, } switch ($mod_action) { - case 'admin_config': - $this->config(); - break; - case 'pedigree_map': - $this->pedigreeMap(); - break; - case 'admin_places': - $this->adminPlaces(); - break; - case 'admin_place_edit': - $this->adminPlaceEdit(); - break; - case 'admin_place_save': - $this->adminPlaceSave(); - break; - case 'admin_download': - $this->adminDownload(); - break; - case 'admin_upload': - $this->adminUploadForm(); - break; - case 'admin_upload_action': - $this->adminUploadAction(); - break; - case 'admin_import_action': - $this->adminImportAction(); - break; - case 'admin_delete_action': - $this->adminDeleteAction(); - break; - default: - http_response_code(404); - break; + case 'admin_config': + $this->config(); + break; + case 'pedigree_map': + $this->pedigreeMap(); + break; + case 'admin_places': + $this->adminPlaces(); + break; + case 'admin_place_edit': + $this->adminPlaceEdit(); + break; + case 'admin_place_save': + $this->adminPlaceSave(); + break; + case 'admin_download': + $this->adminDownload(); + break; + case 'admin_upload': + $this->adminUploadForm(); + break; + case 'admin_upload_action': + $this->adminUploadAction(); + break; + case 'admin_import_action': + $this->adminImportAction(); + break; + case 'admin_delete_action': + $this->adminDeleteAction(); + break; + default: + http_response_code(404); + break; } } @@ -2712,22 +2712,22 @@ class GoogleMapsModule extends AbstractModule implements ModuleConfigInterface, <?php $coordsAsStr = []; switch ($record->pl_place) { - case 'England': - $coordsAsStr[] = '-4.74361,50.66750|-4.78361,50.59361|-4.91584,50.57722|-5.01750,50.54264|-5.02569,50.47271|-5.04729,50.42750|-5.15208,50.34374|-5.26805,50.27389|-5.43194,50.19326|-5.49584,50.21695|-5.54639,50.20527|-5.71000,50.12916|-5.71681,50.06083|-5.66174,50.03631|-5.58278,50.04777|-5.54166,50.07055|-5.53416,50.11569|-5.47055,50.12499|-5.33361,50.09138|-5.27666,50.05972|-5.25674,50.00514|-5.19306,49.95527|-5.16070,50.00319|-5.06555,50.03750|-5.07090,50.08166|-5.04806,50.17111|-4.95278,50.19333|-4.85750,50.23166|-4.76250,50.31138|-4.67861,50.32583|-4.54334,50.32222|-4.48278,50.32583|-4.42972,50.35139|-4.38000,50.36388|-4.16555,50.37028|-4.11139,50.33027|-4.05708,50.29791|-3.94389,50.31346|-3.87764,50.28139|-3.83653,50.22972|-3.78944,50.21222|-3.70666,50.20972|-3.65195,50.23111|-3.55139,50.43833|-3.49416,50.54639|-3.46181,50.58792|-3.41139,50.61610|-3.24416,50.67444|-3.17347,50.68833|-3.09445,50.69222|-2.97806,50.70638|-2.92750,50.73125|-2.88278,50.73111|-2.82305,50.72027|-2.77139,50.70861|-2.66195,50.67334|-2.56305,50.63222|-2.45861,50.57500|-2.44666,50.62639|-2.39097,50.64166|-2.19722,50.62611|-2.12195,50.60722|-2.05445,50.58569|-1.96437,50.59674|-1.95441,50.66536|-2.06681,50.71430|-1.93416,50.71277|-1.81639,50.72306|-1.68445,50.73888|-1.59278,50.72416|-1.33139,50.79138|-1.11695,50.80694|-1.15889,50.84083|-1.09445,50.84584|-0.92842,50.83966|-0.86584,50.79965|-0.90826,50.77396|-0.78187,50.72722|-0.74611,50.76583|-0.67528,50.78111|-0.57722,50.79527|-0.25500,50.82638|-0.19084,50.82583|-0.13805,50.81833|0.05695,50.78083|0.12334,50.75944|0.22778,50.73944|0.28695,50.76500|0.37195,50.81638|0.43084,50.83111|0.56722,50.84777|0.67889,50.87681|0.71639,50.90500|0.79334,50.93610|0.85666,50.92556|0.97125,50.98111|0.99778,51.01903|1.04555,51.04944|1.10028,51.07361|1.26250,51.10166|1.36889,51.13583|1.41111,51.20111|1.42750,51.33111|1.38556,51.38777|1.19195,51.37861|1.05278,51.36722|0.99916,51.34777|0.90806,51.34069|0.70416,51.37749|0.61972,51.38304|0.55945,51.40596|0.64236,51.44042|0.69750,51.47084|0.59195,51.48777|0.53611,51.48806|0.48916,51.48445|0.45215,51.45562|0.38894,51.44822|0.46500,51.50306|0.65195,51.53680|0.76695,51.52138|0.82084,51.53556|0.87528,51.56110|0.95250,51.60923|0.94695,51.72556|0.90257,51.73465|0.86306,51.71166|0.76140,51.69164|0.70111,51.71847|0.86211,51.77361|0.93236,51.80583|0.98278,51.82527|1.03569,51.77416|1.08834,51.77056|1.13222,51.77694|1.18139,51.78972|1.22361,51.80888|1.26611,51.83916|1.28097,51.88096|1.20834,51.95083|1.16347,52.02361|1.27750,51.98555|1.33125,51.92875|1.39028,51.96999|1.58736,52.08388|1.63000,52.19527|1.68576,52.32630|1.73028,52.41138|1.74945,52.45583|1.74590,52.62021|1.70250,52.71583|1.64528,52.77111|1.50361,52.83749|1.43222,52.87472|1.35250,52.90972|1.28222,52.92750|1.18389,52.93889|0.99472,52.95111|0.94222,52.95083|0.88472,52.96638|0.66722,52.97611|0.54778,52.96618|0.49139,52.93430|0.44431,52.86569|0.42903,52.82403|0.36334,52.78027|0.21778,52.80694|0.16125,52.86250|0.05778,52.88916|0.00211,52.87985|0.03222,52.91722|0.20389,53.02805|0.27666,53.06694|0.33916,53.09236|0.35389,53.18722|0.33958,53.23472|0.23555,53.39944|0.14347,53.47527|0.08528,53.48638|0.02694,53.50972|-0.10084,53.57306|-0.20722,53.63083|-0.26445,53.69083|-0.30166,53.71319|-0.39022,53.70794|-0.51972,53.68527|-0.71653,53.69638|-0.65445,53.72527|-0.60584,53.72972|-0.54916,53.70611|-0.42261,53.71755|-0.35728,53.73056|-0.29389,53.73666|-0.23139,53.72166|-0.10584,53.63166|-0.03472,53.62555|0.04416,53.63916|0.08916,53.62666|0.14945,53.58847|0.12639,53.64527|0.06264,53.70389|-0.12750,53.86388|-0.16916,53.91847|-0.21222,54.00833|-0.20569,54.05153|-0.16111,54.08806|-0.11694,54.13222|-0.20053,54.15171|-0.26250,54.17444|-0.39334,54.27277|-0.42166,54.33222|-0.45750,54.37694|-0.51847,54.44749|-0.56472,54.48000|-0.87584,54.57027|-1.06139,54.61722|-1.16528,54.64972|-1.30445,54.77138|-1.34556,54.87138|-1.41278,54.99944|-1.48292,55.08625|-1.51500,55.14972|-1.56584,55.28722|-1.58097,55.48361|-1.63597,55.58194|-1.69000,55.60556|-1.74695,55.62499|-1.81764,55.63306|-1.97681,55.75416|-2.02166,55.80611|-2.08361,55.78054|-2.22000,55.66499|-2.27916,55.64472|-2.27416,55.57527|-2.21528,55.50583|-2.18278,55.45985|-2.21236,55.42777|-2.46305,55.36111|-2.63055,55.25500|-2.69945,55.17722|-2.96278,55.03889|-3.01500,55.05222|-3.05103,54.97986|-3.13292,54.93139|-3.20861,54.94944|-3.28931,54.93792|-3.39166,54.87639|-3.42916,54.81555|-3.56916,54.64249|-3.61306,54.48861|-3.49305,54.40333|-3.43389,54.34806|-3.41056,54.28014|-3.38055,54.24444|-3.21472,54.09555|-3.15222,54.08194|-2.93097,54.15333|-2.81361,54.22277|-2.81750,54.14277|-2.83361,54.08500|-2.93250,53.95055|-3.05264,53.90764|-3.03708,53.74944|-2.99278,53.73277|-2.89979,53.72499|-2.97729,53.69382|-3.07306,53.59805|-3.10563,53.55993|-3.00678,53.41738|-2.95389,53.36027|-2.85736,53.32083|-2.70493,53.35062|-2.77639,53.29250|-2.89972,53.28916|-2.94250,53.31056|-3.02889,53.38191|-3.07248,53.40936|-3.16695,53.35708|-3.12611,53.32500|-3.08860,53.26001|-3.02000,53.24722|-2.95528,53.21555|-2.91069,53.17014|-2.89389,53.10416|-2.85695,53.03249|-2.77792,52.98514|-2.73109,52.96873|-2.71945,52.91902|-2.79278,52.90207|-2.85069,52.93875|-2.99389,52.95361|-3.08639,52.91611|-3.13014,52.88486|-3.13708,52.79312|-3.06806,52.77027|-3.01111,52.71166|-3.06666,52.63527|-3.11750,52.58666|-3.07089,52.55702|-3.00792,52.56902|-2.98028,52.53083|-3.02736,52.49792|-3.11916,52.49194|-3.19514,52.46722|-3.19611,52.41027|-3.02195,52.34027|-2.95486,52.33117|-2.99750,52.28139|-3.05125,52.23347|-3.07555,52.14804|-3.12222,52.11805|-3.11250,52.06945|-3.08500,52.01930|-3.04528,51.97639|-2.98889,51.92555|-2.91757,51.91569|-2.86639,51.92889|-2.77861,51.88583|-2.65944,51.81806|-2.68334,51.76957|-2.68666,51.71889|-2.66500,51.61500|-2.62916,51.64416|-2.57889,51.67777|-2.46056,51.74666|-2.40389,51.74041|-2.47166,51.72445|-2.55305,51.65722|-2.65334,51.56389|-2.77055,51.48916|-2.85278,51.44472|-2.96000,51.37499|-3.00695,51.30722|-3.01278,51.25632|-3.02834,51.20611|-3.30139,51.18111|-3.39361,51.18138|-3.43729,51.20638|-3.50722,51.22333|-3.57014,51.23027|-3.63222,51.21805|-3.70028,51.23000|-3.79250,51.23916|-3.88389,51.22416|-3.98472,51.21695|-4.11666,51.21222|-4.22805,51.18777|-4.22028,51.11054|-4.23702,51.04659|-4.30361,51.00416|-4.37639,50.99110|-4.42736,51.00958|-4.47445,51.01416|-4.52132,51.01424|-4.54334,50.92694|-4.56139,50.77625|-4.65139,50.71527|-4.74361,50.66750'; - break; - case 'Scotland': - $coordsAsStr[] = '-2.02166,55.80611|-2.07972,55.86722|-2.13028,55.88583|-2.26028,55.91861|-2.37528,55.95694|-2.65722,56.05972|-2.82028,56.05694|-2.86618,56.02840|-2.89555,55.98861|-2.93500,55.96944|-3.01805,55.94944|-3.06750,55.94444|-3.25472,55.97166|-3.45472,55.99194|-3.66416,56.00652|-3.73722,56.05555|-3.57139,56.05360|-3.44111,56.01916|-3.39584,56.01083|-3.34403,56.02333|-3.13903,56.11084|-2.97611,56.19472|-2.91666,56.20499|-2.84695,56.18638|-2.78805,56.18749|-2.67937,56.21465|-2.58403,56.28264|-2.67208,56.32277|-2.76861,56.33180|-2.81528,56.37360|-2.81208,56.43958|-2.91653,56.45014|-2.99555,56.41416|-3.19042,56.35958|-3.27805,56.35750|-3.04055,56.45472|-2.95861,56.45611|-2.72084,56.48888|-2.64084,56.52250|-2.53126,56.57611|-2.48861,56.61416|-2.47805,56.71527|-2.39000,56.77166|-2.31986,56.79638|-2.21972,56.86777|-2.19708,56.94388|-2.16695,57.00055|-2.09334,57.07027|-2.05416,57.21861|-1.95889,57.33250|-1.85584,57.39889|-1.77334,57.45805|-1.78139,57.50555|-1.82195,57.57861|-1.86000,57.62138|-1.92972,57.67777|-2.02222,57.69388|-2.07555,57.69944|-2.14028,57.69056|-2.18611,57.66861|-2.39626,57.66638|-2.51000,57.67166|-2.78639,57.70222|-2.89806,57.70694|-2.96750,57.68027|-3.03847,57.66249|-3.12334,57.67166|-3.22334,57.69166|-3.28625,57.72499|-3.33972,57.72333|-3.48805,57.70945|-3.52222,57.66333|-3.59542,57.63666|-3.64063,57.63881|-3.75414,57.62504|-4.03986,57.55569|-4.19666,57.48584|-4.22889,57.51554|-4.17945,57.56249|-4.11139,57.59833|-4.08078,57.66533|-4.19139,57.67139|-4.25945,57.65527|-4.34361,57.60777|-4.41639,57.60166|-4.29666,57.67444|-4.08528,57.72611|-4.01908,57.70226|-3.96861,57.70250|-3.86556,57.76861|-3.81945,57.80458|-3.80681,57.85819|-3.85055,57.82000|-3.92639,57.80749|-4.04322,57.81438|-4.14973,57.82527|-4.29750,57.84638|-4.36250,57.89777|-4.24306,57.87028|-4.10666,57.85195|-4.01500,57.86777|-3.99166,57.90611|-3.99695,57.95056|-3.84500,58.02000|-3.56611,58.13916|-3.51319,58.16374|-3.45916,58.20305|-3.42028,58.24361|-3.33750,58.27694|-3.20555,58.30625|-3.10972,58.38166|-3.05792,58.45083|-3.02264,58.64653|-3.17639,58.64944|-3.35389,58.66055|-3.36931,58.59555|-3.57611,58.62194|-3.66028,58.61972|-3.71166,58.60374|-3.78264,58.56750|-3.84834,58.56000|-4.08056,58.55527|-4.27722,58.53361|-4.43653,58.54902|-4.50666,58.56777|-4.56055,58.57584|-4.59910,58.53027|-4.66805,58.48833|-4.76146,58.44604|-4.70195,58.50999|-4.70166,58.55861|-4.77014,58.60264|-5.00153,58.62416|-5.10945,58.50833|-5.16472,58.32527|-5.12639,58.28750|-5.07166,58.26472|-5.20361,58.25083|-5.39764,58.25055|-5.27389,58.11722|-5.31514,58.06416|-5.38416,58.08361|-5.45285,58.07416|-5.39805,58.03111|-5.26278,57.97111|-5.19334,57.95069|-5.12750,57.86944|-5.21750,57.90084|-5.33861,57.92083|-5.42876,57.90104|-5.45750,57.85889|-5.64445,57.89972|-5.62555,57.85222|-5.58153,57.81945|-5.60674,57.76618|-5.66305,57.78889|-5.71695,57.86944|-5.76695,57.86472|-5.81708,57.81944|-5.81084,57.63958|-5.69555,57.55944|-5.64361,57.55222|-5.53084,57.52833|-5.65305,57.50875|-5.75000,57.54834|-5.81569,57.57923|-5.85042,57.54972|-5.86695,57.46777|-5.81806,57.36250|-5.75111,57.34333|-5.50334,57.40111|-5.45126,57.41805|-5.49250,57.37083|-5.59884,57.33049|-5.57116,57.28411|-5.51266,57.27745|-5.40514,57.23097|-5.44972,57.22138|-5.49472,57.23888|-5.56066,57.25477|-5.64611,57.23499|-5.64751,57.16161|-5.55028,57.11639|-5.48166,57.11222|-5.40305,57.11062|-5.55945,57.09250|-5.65111,57.11611|-5.72472,57.11306|-5.77361,57.04556|-5.63139,56.98499|-5.56916,56.98972|-5.52403,56.99735|-5.57916,56.98000|-5.64611,56.97222|-5.73374,57.00909|-5.82584,57.00346|-5.91958,56.88708|-5.86528,56.87944|-5.74278,56.89374|-5.66292,56.86924|-5.73306,56.83916|-5.78584,56.83955|-5.85590,56.81430|-5.80208,56.79180|-5.84958,56.74444|-5.90500,56.75666|-5.96694,56.78027|-6.14000,56.75777|-6.19208,56.74888|-6.23452,56.71673|-6.19139,56.67972|-5.91916,56.67388|-5.82622,56.69156|-5.73945,56.71166|-5.55240,56.68886|-5.64861,56.68027|-5.69916,56.68278|-5.88261,56.65666|-5.97472,56.65138|-5.99584,56.61138|-5.93056,56.56972|-5.88416,56.55333|-5.79056,56.53805|-5.67695,56.49389|-5.56389,56.54056|-5.36334,56.66195|-5.23416,56.74333|-5.13236,56.79403|-5.31473,56.65666|-5.37405,56.55925|-5.31826,56.55633|-5.25080,56.55753|-5.37718,56.52112|-5.39866,56.47866|-5.19111,56.46194|-5.11556,56.51277|-5.07014,56.56069|-5.13555,56.48499|-5.22084,56.43583|-5.32764,56.43574|-5.42439,56.43091|-5.52611,56.37360|-5.57139,56.32833|-5.59653,56.25695|-5.57389,56.16000|-5.52000,56.16485|-5.56334,56.11333|-5.60139,56.07638|-5.64222,56.04305|-5.66039,55.98263|-5.62555,56.02055|-5.58014,56.01319|-5.63361,55.96611|-5.67697,55.88844|-5.64750,55.78139|-5.60986,55.75930|-5.66916,55.66166|-5.70166,55.58861|-5.71805,55.51500|-5.75916,55.41750|-5.79528,55.36027|-5.78166,55.29902|-5.73778,55.29222|-5.56694,55.31666|-5.51528,55.36347|-5.55520,55.41440|-5.48639,55.64306|-5.44597,55.70680|-5.38000,55.75027|-5.41889,55.90666|-5.39924,55.99972|-5.33895,56.03456|-5.30594,56.06922|-5.23889,56.11889|-5.03222,56.23250|-4.92229,56.27111|-4.97416,56.23333|-5.07222,56.18695|-5.20069,56.11861|-5.30906,56.00570|-5.34000,55.90201|-5.29250,55.84750|-5.20805,55.84444|-5.22458,55.90175|-5.17334,55.92916|-5.11000,55.90306|-5.01222,55.86694|-4.96195,55.88000|-4.89824,55.98145|-4.84623,56.08632|-4.86636,56.03178|-4.85461,55.98648|-4.77659,55.97977|-4.62723,55.94555|-4.52305,55.91861|-4.70972,55.93403|-4.75166,55.94611|-4.82406,55.94950|-4.87826,55.93653|-4.91639,55.70083|-4.87584,55.68194|-4.81361,55.64555|-4.68722,55.59750|-4.61361,55.49069|-4.63958,55.44264|-4.68250,55.43388|-4.74847,55.41055|-4.83715,55.31882|-4.84778,55.26944|-4.86542,55.22340|-4.93500,55.17860|-5.01250,55.13347|-5.05361,55.04902|-5.17834,54.98888|-5.18563,54.93622|-5.17000,54.89111|-5.11666,54.83180|-5.00500,54.76333|-4.96229,54.68125|-4.92250,54.64055|-4.85723,54.62958|-4.96076,54.79687|-4.92431,54.83708|-4.85222,54.86861|-4.80125,54.85556|-4.74055,54.82166|-4.68084,54.79972|-4.59861,54.78027|-4.55792,54.73903|-4.49639,54.69888|-4.37584,54.67666|-4.34569,54.70916|-4.35973,54.77111|-4.41111,54.82583|-4.42445,54.88152|-4.38479,54.90555|-4.35056,54.85903|-4.09555,54.76777|-3.95361,54.76749|-3.86972,54.80527|-3.81222,54.84888|-3.69250,54.88110|-3.61584,54.87527|-3.57111,54.99083|-3.44528,54.98638|-3.36056,54.97138|-3.14695,54.96500|-3.05103,54.97986|-3.01500,55.05222|-2.96278,55.03889|-2.69945,55.17722|-2.63055,55.25500|-2.46305,55.36111|-2.21236,55.42777|-2.18278,55.45985|-2.21528,55.50583|-2.27416,55.57527|-2.27916,55.64472|-2.22000,55.66499|-2.08361,55.78054|-2.02166,55.80611'; - break; - case 'Ireland': - $coordsAsStr[] = '-8.17166,54.46388|-8.06555,54.37277|-7.94139,54.29944|-7.87576,54.28499|-7.86834,54.22764|-7.81805,54.19916|-7.69972,54.20250|-7.55945,54.12694|-7.31334,54.11250|-7.14584,54.22527|-7.17555,54.28916|-7.16084,54.33666|-7.05834,54.41000|-6.97445,54.40166|-6.92695,54.37916|-6.87305,54.34208|-6.85111,54.28972|-6.73473,54.18361|-6.65556,54.06527|-6.60584,54.04444|-6.44750,54.05833|-6.33889,54.11555|-6.26697,54.09983|-6.17403,54.07222|-6.10834,54.03638|-6.04389,54.03139|-5.96834,54.06389|-5.88500,54.11639|-5.87347,54.20916|-5.82500,54.23958|-5.74611,54.24806|-5.65556,54.22701|-5.60834,54.24972|-5.55916,54.29084|-5.57334,54.37704|-5.64502,54.49267|-5.70472,54.53361|-5.68055,54.57306|-5.59972,54.54194|-5.55097,54.50083|-5.54216,54.44903|-5.54643,54.40527|-5.50672,54.36444|-5.46111,54.38555|-5.43132,54.48596|-5.47945,54.53638|-5.53521,54.65090|-5.57431,54.67722|-5.62916,54.67945|-5.73674,54.67383|-5.80305,54.66138|-5.88257,54.60652|-5.92445,54.63180|-5.86681,54.68972|-5.81903,54.70972|-5.74672,54.72452|-5.68775,54.76335|-5.70931,54.83166|-5.74694,54.85361|-5.79139,54.85139|-6.03611,55.05778|-6.04250,55.10277|-6.03444,55.15458|-6.10125,55.20945|-6.14584,55.22069|-6.25500,55.21194|-6.37639,55.23916|-6.51556,55.23305|-6.61334,55.20722|-6.73028,55.18027|-6.82472,55.16806|-6.88972,55.16777|-6.96695,55.15611|-6.99416,55.11027|-7.05139,55.04680|-7.09500,55.03694|-7.25251,55.07059|-7.32639,55.04527|-7.40639,54.95333|-7.45805,54.85777|-7.55334,54.76277|-7.73916,54.71054|-7.82576,54.73416|-7.92639,54.70054|-7.85236,54.63388|-7.77750,54.62694|-7.83361,54.55389|-7.95084,54.53222|-8.04695,54.50722|-8.17166,54.46388'; - break; - case 'Wales': - $coordsAsStr[] = '-3.08860,53.26001|-3.33639,53.34722|-3.38806,53.34361|-3.60986,53.27944|-3.73014,53.28944|-3.85445,53.28444|-4.01861,53.23750|-4.06639,53.22639|-4.15334,53.22556|-4.19639,53.20611|-4.33028,53.11222|-4.36097,53.02888|-4.55278,52.92889|-4.61889,52.90916|-4.72195,52.83611|-4.72778,52.78139|-4.53945,52.79306|-4.47722,52.85500|-4.41416,52.88472|-4.31292,52.90499|-4.23334,52.91499|-4.13569,52.87888|-4.13056,52.77777|-4.05334,52.71666|-4.10639,52.65084|-4.12597,52.60375|-4.08056,52.55333|-4.05972,52.48584|-4.09666,52.38583|-4.14305,52.32027|-4.19361,52.27638|-4.23166,52.24888|-4.52722,52.13083|-4.66945,52.13027|-4.73695,52.10361|-4.76778,52.06444|-4.84445,52.01388|-5.09945,51.96056|-5.23916,51.91638|-5.25889,51.87056|-5.18500,51.86958|-5.11528,51.83333|-5.10257,51.77895|-5.16111,51.76222|-5.24694,51.73027|-5.19111,51.70888|-5.00739,51.70349|-4.90875,51.71249|-4.86111,51.71334|-4.97061,51.67577|-5.02128,51.66861|-5.05139,51.62028|-5.00528,51.60638|-4.94139,51.59416|-4.89028,51.62694|-4.83569,51.64534|-4.79063,51.63340|-4.69028,51.66666|-4.64584,51.72666|-4.57445,51.73416|-4.43611,51.73722|-4.26222,51.67694|-4.19750,51.67916|-4.06614,51.66804|-4.11639,51.63416|-4.17750,51.62235|-4.25055,51.62861|-4.29208,51.60743|-4.27778,51.55666|-4.20486,51.53527|-3.94972,51.61278|-3.83792,51.61999|-3.78166,51.56750|-3.75160,51.52931|-3.67194,51.47388|-3.54250,51.39777|-3.40334,51.37972|-3.27097,51.38014|-3.16458,51.40909|-3.15166,51.45305|-3.11875,51.48750|-3.02111,51.52527|-2.95472,51.53972|-2.89278,51.53861|-2.84778,51.54500|-2.71472,51.58083|-2.66500,51.61500|-2.68666,51.71889|-2.68334,51.76957|-2.65944,51.81806|-2.77861,51.88583|-2.86639,51.92889|-2.91757,51.91569|-2.98889,51.92555|-3.04528,51.97639|-3.08500,52.01930|-3.11250,52.06945|-3.12222,52.11805|-3.07555,52.14804|-3.05125,52.23347|-2.99750,52.28139|-2.95486,52.33117|-3.02195,52.34027|-3.19611,52.41027|-3.19514,52.46722|-3.11916,52.49194|-3.02736,52.49792|-2.98028,52.53083|-3.00792,52.56902|-3.07089,52.55702|-3.11750,52.58666|-3.06666,52.63527|-3.01111,52.71166|-3.06806,52.77027|-3.13708,52.79312|-3.13014,52.88486|-3.08639,52.91611|-2.99389,52.95361|-2.85069,52.93875|-2.79278,52.90207|-2.71945,52.91902|-2.73109,52.96873|-2.77792,52.98514|-2.85695,53.03249|-2.89389,53.10416|-2.91069,53.17014|-2.95528,53.21555|-3.02000,53.24722|-3.08860,53.26001'; - break; - case 'NC': - $coordsAsStr[] = '-81.65876,36.60938|-81.70390,36.55513|-81.70639,36.50804|-81.74665,36.39777|-81.90723,36.30804|-82.03195,36.12694|-82.08416,36.10146|-82.12826,36.11020|-82.21500,36.15833|-82.36375,36.11347|-82.43472,36.06013|-82.46236,36.01708|-82.56006,35.96263|-82.60042,35.99638|-82.62308,36.06121|-82.73500,36.01833|-82.84612,35.94944|-82.90451,35.88819|-82.93555,35.83846|-83.16000,35.76236|-83.24222,35.71944|-83.49222,35.57111|-83.56847,35.55861|-83.64416,35.56471|-83.73499,35.56638|-83.88222,35.51791|-83.98361,35.44944|-84.03639,35.35444|-84.04964,35.29117|-84.09042,35.25986|-84.15084,35.25388|-84.20521,35.25722|-84.29284,35.22596|-84.32471,34.98701|-83.09778,35.00027|-82.77722,35.09138|-82.59639,35.14972|-82.37999,35.21500|-82.27362,35.20583|-81.41306,35.17416|-81.05915,35.15333|-80.92666,35.10695|-80.78751,34.95610|-80.79334,34.82555|-79.66777,34.80694|-79.11555,34.34527|-78.57222,33.88166|-78.51806,33.87999|-78.43721,33.89804|-78.23735,33.91986|-78.15389,33.91471|-78.06974,33.89500|-78.02597,33.88936|-77.97611,33.94276|-77.95299,33.99243|-77.94499,34.06499|-77.92728,34.11756|-77.92250,33.99194|-77.92264,33.93715|-77.88215,34.06166|-77.86222,34.15083|-77.83501,34.19194|-77.75724,34.28527|-77.68222,34.36555|-77.63667,34.39805|-77.57363,34.43694|-77.45527,34.50403|-77.38173,34.51646|-77.37905,34.56294|-77.38572,34.61260|-77.40944,34.68916|-77.38847,34.73304|-77.33097,34.63992|-77.35024,34.60099|-77.30958,34.55972|-77.09424,34.67742|-76.75994,34.76659|-76.68325,34.79749|-76.66097,34.75781|-76.62611,34.71014|-76.50063,34.73617|-76.48138,34.77638|-76.38305,34.86423|-76.34326,34.88194|-76.27181,34.96263|-76.35125,35.02221|-76.32354,34.97429|-76.45319,34.93524|-76.43395,34.98782|-76.45356,35.06676|-76.52917,35.00444|-76.63382,34.98242|-76.69722,34.94887|-76.75306,34.90526|-76.81636,34.93944|-76.89000,34.95388|-76.93180,34.96957|-76.96501,34.99777|-77.06816,35.14978|-76.97639,35.06806|-76.86722,35.00000|-76.80531,34.98559|-76.72708,35.00152|-76.60402,35.07416|-76.56555,35.11486|-76.57305,35.16013|-76.66489,35.16694|-76.56361,35.23361|-76.48750,35.22582|-76.46889,35.27166|-76.50298,35.30791|-76.83251,35.39222|-77.02305,35.48694|-77.04958,35.52694|-76.91292,35.46166|-76.65250,35.41499|-76.61611,35.45888|-76.63195,35.52249|-76.58820,35.55104|-76.51556,35.53194|-76.56711,35.48494|-76.52251,35.40416|-76.46195,35.37221|-76.13319,35.35986|-76.04111,35.42416|-76.00223,35.46610|-75.97958,35.51666|-75.89362,35.57555|-75.83834,35.56694|-75.78944,35.57138|-75.74076,35.61846|-75.72084,35.69263|-75.72084,35.81451|-75.74917,35.87791|-75.78333,35.91972|-75.85083,35.97527|-75.94333,35.91777|-75.98944,35.88054|-75.98854,35.79110|-75.99388,35.71027|-76.02875,35.65409|-76.10320,35.66041|-76.13563,35.69239|-76.04475,35.68436|-76.04167,35.74916|-76.05305,35.79361|-76.05305,35.87375|-76.02653,35.96222|-76.07751,35.99319|-76.17472,35.99596|-76.27917,35.91915|-76.37986,35.95763|-76.42014,35.97874|-76.55375,35.93971|-76.66222,35.93305|-76.72952,35.93984|-76.73392,36.04760|-76.75384,36.09477|-76.76028,36.14513|-76.74610,36.22818|-76.70458,36.24673|-76.72764,36.16736|-76.71021,36.11752|-76.69117,36.07165|-76.65979,36.03312|-76.49527,36.00958|-76.37138,36.07694|-76.37084,36.14999|-76.21417,36.09471|-76.07591,36.17910|-76.18361,36.26915|-76.19965,36.31739|-76.13986,36.28805|-76.04274,36.21974|-76.00465,36.18110|-75.95287,36.19241|-75.97604,36.31138|-75.93895,36.28381|-75.85271,36.11069|-75.79315,36.07385|-75.79639,36.11804|-75.88333,36.29554|-75.94665,36.37194|-75.98694,36.41166|-76.03473,36.49666|-76.02899,36.55000|-78.44234,36.54986|-78.56594,36.55799|-80.27556,36.55110|-81.15361,36.56499|-81.38722,36.57695|-81.65876,36.60938'; - break; - default: + case 'England': + $coordsAsStr[] = '-4.74361,50.66750|-4.78361,50.59361|-4.91584,50.57722|-5.01750,50.54264|-5.02569,50.47271|-5.04729,50.42750|-5.15208,50.34374|-5.26805,50.27389|-5.43194,50.19326|-5.49584,50.21695|-5.54639,50.20527|-5.71000,50.12916|-5.71681,50.06083|-5.66174,50.03631|-5.58278,50.04777|-5.54166,50.07055|-5.53416,50.11569|-5.47055,50.12499|-5.33361,50.09138|-5.27666,50.05972|-5.25674,50.00514|-5.19306,49.95527|-5.16070,50.00319|-5.06555,50.03750|-5.07090,50.08166|-5.04806,50.17111|-4.95278,50.19333|-4.85750,50.23166|-4.76250,50.31138|-4.67861,50.32583|-4.54334,50.32222|-4.48278,50.32583|-4.42972,50.35139|-4.38000,50.36388|-4.16555,50.37028|-4.11139,50.33027|-4.05708,50.29791|-3.94389,50.31346|-3.87764,50.28139|-3.83653,50.22972|-3.78944,50.21222|-3.70666,50.20972|-3.65195,50.23111|-3.55139,50.43833|-3.49416,50.54639|-3.46181,50.58792|-3.41139,50.61610|-3.24416,50.67444|-3.17347,50.68833|-3.09445,50.69222|-2.97806,50.70638|-2.92750,50.73125|-2.88278,50.73111|-2.82305,50.72027|-2.77139,50.70861|-2.66195,50.67334|-2.56305,50.63222|-2.45861,50.57500|-2.44666,50.62639|-2.39097,50.64166|-2.19722,50.62611|-2.12195,50.60722|-2.05445,50.58569|-1.96437,50.59674|-1.95441,50.66536|-2.06681,50.71430|-1.93416,50.71277|-1.81639,50.72306|-1.68445,50.73888|-1.59278,50.72416|-1.33139,50.79138|-1.11695,50.80694|-1.15889,50.84083|-1.09445,50.84584|-0.92842,50.83966|-0.86584,50.79965|-0.90826,50.77396|-0.78187,50.72722|-0.74611,50.76583|-0.67528,50.78111|-0.57722,50.79527|-0.25500,50.82638|-0.19084,50.82583|-0.13805,50.81833|0.05695,50.78083|0.12334,50.75944|0.22778,50.73944|0.28695,50.76500|0.37195,50.81638|0.43084,50.83111|0.56722,50.84777|0.67889,50.87681|0.71639,50.90500|0.79334,50.93610|0.85666,50.92556|0.97125,50.98111|0.99778,51.01903|1.04555,51.04944|1.10028,51.07361|1.26250,51.10166|1.36889,51.13583|1.41111,51.20111|1.42750,51.33111|1.38556,51.38777|1.19195,51.37861|1.05278,51.36722|0.99916,51.34777|0.90806,51.34069|0.70416,51.37749|0.61972,51.38304|0.55945,51.40596|0.64236,51.44042|0.69750,51.47084|0.59195,51.48777|0.53611,51.48806|0.48916,51.48445|0.45215,51.45562|0.38894,51.44822|0.46500,51.50306|0.65195,51.53680|0.76695,51.52138|0.82084,51.53556|0.87528,51.56110|0.95250,51.60923|0.94695,51.72556|0.90257,51.73465|0.86306,51.71166|0.76140,51.69164|0.70111,51.71847|0.86211,51.77361|0.93236,51.80583|0.98278,51.82527|1.03569,51.77416|1.08834,51.77056|1.13222,51.77694|1.18139,51.78972|1.22361,51.80888|1.26611,51.83916|1.28097,51.88096|1.20834,51.95083|1.16347,52.02361|1.27750,51.98555|1.33125,51.92875|1.39028,51.96999|1.58736,52.08388|1.63000,52.19527|1.68576,52.32630|1.73028,52.41138|1.74945,52.45583|1.74590,52.62021|1.70250,52.71583|1.64528,52.77111|1.50361,52.83749|1.43222,52.87472|1.35250,52.90972|1.28222,52.92750|1.18389,52.93889|0.99472,52.95111|0.94222,52.95083|0.88472,52.96638|0.66722,52.97611|0.54778,52.96618|0.49139,52.93430|0.44431,52.86569|0.42903,52.82403|0.36334,52.78027|0.21778,52.80694|0.16125,52.86250|0.05778,52.88916|0.00211,52.87985|0.03222,52.91722|0.20389,53.02805|0.27666,53.06694|0.33916,53.09236|0.35389,53.18722|0.33958,53.23472|0.23555,53.39944|0.14347,53.47527|0.08528,53.48638|0.02694,53.50972|-0.10084,53.57306|-0.20722,53.63083|-0.26445,53.69083|-0.30166,53.71319|-0.39022,53.70794|-0.51972,53.68527|-0.71653,53.69638|-0.65445,53.72527|-0.60584,53.72972|-0.54916,53.70611|-0.42261,53.71755|-0.35728,53.73056|-0.29389,53.73666|-0.23139,53.72166|-0.10584,53.63166|-0.03472,53.62555|0.04416,53.63916|0.08916,53.62666|0.14945,53.58847|0.12639,53.64527|0.06264,53.70389|-0.12750,53.86388|-0.16916,53.91847|-0.21222,54.00833|-0.20569,54.05153|-0.16111,54.08806|-0.11694,54.13222|-0.20053,54.15171|-0.26250,54.17444|-0.39334,54.27277|-0.42166,54.33222|-0.45750,54.37694|-0.51847,54.44749|-0.56472,54.48000|-0.87584,54.57027|-1.06139,54.61722|-1.16528,54.64972|-1.30445,54.77138|-1.34556,54.87138|-1.41278,54.99944|-1.48292,55.08625|-1.51500,55.14972|-1.56584,55.28722|-1.58097,55.48361|-1.63597,55.58194|-1.69000,55.60556|-1.74695,55.62499|-1.81764,55.63306|-1.97681,55.75416|-2.02166,55.80611|-2.08361,55.78054|-2.22000,55.66499|-2.27916,55.64472|-2.27416,55.57527|-2.21528,55.50583|-2.18278,55.45985|-2.21236,55.42777|-2.46305,55.36111|-2.63055,55.25500|-2.69945,55.17722|-2.96278,55.03889|-3.01500,55.05222|-3.05103,54.97986|-3.13292,54.93139|-3.20861,54.94944|-3.28931,54.93792|-3.39166,54.87639|-3.42916,54.81555|-3.56916,54.64249|-3.61306,54.48861|-3.49305,54.40333|-3.43389,54.34806|-3.41056,54.28014|-3.38055,54.24444|-3.21472,54.09555|-3.15222,54.08194|-2.93097,54.15333|-2.81361,54.22277|-2.81750,54.14277|-2.83361,54.08500|-2.93250,53.95055|-3.05264,53.90764|-3.03708,53.74944|-2.99278,53.73277|-2.89979,53.72499|-2.97729,53.69382|-3.07306,53.59805|-3.10563,53.55993|-3.00678,53.41738|-2.95389,53.36027|-2.85736,53.32083|-2.70493,53.35062|-2.77639,53.29250|-2.89972,53.28916|-2.94250,53.31056|-3.02889,53.38191|-3.07248,53.40936|-3.16695,53.35708|-3.12611,53.32500|-3.08860,53.26001|-3.02000,53.24722|-2.95528,53.21555|-2.91069,53.17014|-2.89389,53.10416|-2.85695,53.03249|-2.77792,52.98514|-2.73109,52.96873|-2.71945,52.91902|-2.79278,52.90207|-2.85069,52.93875|-2.99389,52.95361|-3.08639,52.91611|-3.13014,52.88486|-3.13708,52.79312|-3.06806,52.77027|-3.01111,52.71166|-3.06666,52.63527|-3.11750,52.58666|-3.07089,52.55702|-3.00792,52.56902|-2.98028,52.53083|-3.02736,52.49792|-3.11916,52.49194|-3.19514,52.46722|-3.19611,52.41027|-3.02195,52.34027|-2.95486,52.33117|-2.99750,52.28139|-3.05125,52.23347|-3.07555,52.14804|-3.12222,52.11805|-3.11250,52.06945|-3.08500,52.01930|-3.04528,51.97639|-2.98889,51.92555|-2.91757,51.91569|-2.86639,51.92889|-2.77861,51.88583|-2.65944,51.81806|-2.68334,51.76957|-2.68666,51.71889|-2.66500,51.61500|-2.62916,51.64416|-2.57889,51.67777|-2.46056,51.74666|-2.40389,51.74041|-2.47166,51.72445|-2.55305,51.65722|-2.65334,51.56389|-2.77055,51.48916|-2.85278,51.44472|-2.96000,51.37499|-3.00695,51.30722|-3.01278,51.25632|-3.02834,51.20611|-3.30139,51.18111|-3.39361,51.18138|-3.43729,51.20638|-3.50722,51.22333|-3.57014,51.23027|-3.63222,51.21805|-3.70028,51.23000|-3.79250,51.23916|-3.88389,51.22416|-3.98472,51.21695|-4.11666,51.21222|-4.22805,51.18777|-4.22028,51.11054|-4.23702,51.04659|-4.30361,51.00416|-4.37639,50.99110|-4.42736,51.00958|-4.47445,51.01416|-4.52132,51.01424|-4.54334,50.92694|-4.56139,50.77625|-4.65139,50.71527|-4.74361,50.66750'; + break; + case 'Scotland': + $coordsAsStr[] = '-2.02166,55.80611|-2.07972,55.86722|-2.13028,55.88583|-2.26028,55.91861|-2.37528,55.95694|-2.65722,56.05972|-2.82028,56.05694|-2.86618,56.02840|-2.89555,55.98861|-2.93500,55.96944|-3.01805,55.94944|-3.06750,55.94444|-3.25472,55.97166|-3.45472,55.99194|-3.66416,56.00652|-3.73722,56.05555|-3.57139,56.05360|-3.44111,56.01916|-3.39584,56.01083|-3.34403,56.02333|-3.13903,56.11084|-2.97611,56.19472|-2.91666,56.20499|-2.84695,56.18638|-2.78805,56.18749|-2.67937,56.21465|-2.58403,56.28264|-2.67208,56.32277|-2.76861,56.33180|-2.81528,56.37360|-2.81208,56.43958|-2.91653,56.45014|-2.99555,56.41416|-3.19042,56.35958|-3.27805,56.35750|-3.04055,56.45472|-2.95861,56.45611|-2.72084,56.48888|-2.64084,56.52250|-2.53126,56.57611|-2.48861,56.61416|-2.47805,56.71527|-2.39000,56.77166|-2.31986,56.79638|-2.21972,56.86777|-2.19708,56.94388|-2.16695,57.00055|-2.09334,57.07027|-2.05416,57.21861|-1.95889,57.33250|-1.85584,57.39889|-1.77334,57.45805|-1.78139,57.50555|-1.82195,57.57861|-1.86000,57.62138|-1.92972,57.67777|-2.02222,57.69388|-2.07555,57.69944|-2.14028,57.69056|-2.18611,57.66861|-2.39626,57.66638|-2.51000,57.67166|-2.78639,57.70222|-2.89806,57.70694|-2.96750,57.68027|-3.03847,57.66249|-3.12334,57.67166|-3.22334,57.69166|-3.28625,57.72499|-3.33972,57.72333|-3.48805,57.70945|-3.52222,57.66333|-3.59542,57.63666|-3.64063,57.63881|-3.75414,57.62504|-4.03986,57.55569|-4.19666,57.48584|-4.22889,57.51554|-4.17945,57.56249|-4.11139,57.59833|-4.08078,57.66533|-4.19139,57.67139|-4.25945,57.65527|-4.34361,57.60777|-4.41639,57.60166|-4.29666,57.67444|-4.08528,57.72611|-4.01908,57.70226|-3.96861,57.70250|-3.86556,57.76861|-3.81945,57.80458|-3.80681,57.85819|-3.85055,57.82000|-3.92639,57.80749|-4.04322,57.81438|-4.14973,57.82527|-4.29750,57.84638|-4.36250,57.89777|-4.24306,57.87028|-4.10666,57.85195|-4.01500,57.86777|-3.99166,57.90611|-3.99695,57.95056|-3.84500,58.02000|-3.56611,58.13916|-3.51319,58.16374|-3.45916,58.20305|-3.42028,58.24361|-3.33750,58.27694|-3.20555,58.30625|-3.10972,58.38166|-3.05792,58.45083|-3.02264,58.64653|-3.17639,58.64944|-3.35389,58.66055|-3.36931,58.59555|-3.57611,58.62194|-3.66028,58.61972|-3.71166,58.60374|-3.78264,58.56750|-3.84834,58.56000|-4.08056,58.55527|-4.27722,58.53361|-4.43653,58.54902|-4.50666,58.56777|-4.56055,58.57584|-4.59910,58.53027|-4.66805,58.48833|-4.76146,58.44604|-4.70195,58.50999|-4.70166,58.55861|-4.77014,58.60264|-5.00153,58.62416|-5.10945,58.50833|-5.16472,58.32527|-5.12639,58.28750|-5.07166,58.26472|-5.20361,58.25083|-5.39764,58.25055|-5.27389,58.11722|-5.31514,58.06416|-5.38416,58.08361|-5.45285,58.07416|-5.39805,58.03111|-5.26278,57.97111|-5.19334,57.95069|-5.12750,57.86944|-5.21750,57.90084|-5.33861,57.92083|-5.42876,57.90104|-5.45750,57.85889|-5.64445,57.89972|-5.62555,57.85222|-5.58153,57.81945|-5.60674,57.76618|-5.66305,57.78889|-5.71695,57.86944|-5.76695,57.86472|-5.81708,57.81944|-5.81084,57.63958|-5.69555,57.55944|-5.64361,57.55222|-5.53084,57.52833|-5.65305,57.50875|-5.75000,57.54834|-5.81569,57.57923|-5.85042,57.54972|-5.86695,57.46777|-5.81806,57.36250|-5.75111,57.34333|-5.50334,57.40111|-5.45126,57.41805|-5.49250,57.37083|-5.59884,57.33049|-5.57116,57.28411|-5.51266,57.27745|-5.40514,57.23097|-5.44972,57.22138|-5.49472,57.23888|-5.56066,57.25477|-5.64611,57.23499|-5.64751,57.16161|-5.55028,57.11639|-5.48166,57.11222|-5.40305,57.11062|-5.55945,57.09250|-5.65111,57.11611|-5.72472,57.11306|-5.77361,57.04556|-5.63139,56.98499|-5.56916,56.98972|-5.52403,56.99735|-5.57916,56.98000|-5.64611,56.97222|-5.73374,57.00909|-5.82584,57.00346|-5.91958,56.88708|-5.86528,56.87944|-5.74278,56.89374|-5.66292,56.86924|-5.73306,56.83916|-5.78584,56.83955|-5.85590,56.81430|-5.80208,56.79180|-5.84958,56.74444|-5.90500,56.75666|-5.96694,56.78027|-6.14000,56.75777|-6.19208,56.74888|-6.23452,56.71673|-6.19139,56.67972|-5.91916,56.67388|-5.82622,56.69156|-5.73945,56.71166|-5.55240,56.68886|-5.64861,56.68027|-5.69916,56.68278|-5.88261,56.65666|-5.97472,56.65138|-5.99584,56.61138|-5.93056,56.56972|-5.88416,56.55333|-5.79056,56.53805|-5.67695,56.49389|-5.56389,56.54056|-5.36334,56.66195|-5.23416,56.74333|-5.13236,56.79403|-5.31473,56.65666|-5.37405,56.55925|-5.31826,56.55633|-5.25080,56.55753|-5.37718,56.52112|-5.39866,56.47866|-5.19111,56.46194|-5.11556,56.51277|-5.07014,56.56069|-5.13555,56.48499|-5.22084,56.43583|-5.32764,56.43574|-5.42439,56.43091|-5.52611,56.37360|-5.57139,56.32833|-5.59653,56.25695|-5.57389,56.16000|-5.52000,56.16485|-5.56334,56.11333|-5.60139,56.07638|-5.64222,56.04305|-5.66039,55.98263|-5.62555,56.02055|-5.58014,56.01319|-5.63361,55.96611|-5.67697,55.88844|-5.64750,55.78139|-5.60986,55.75930|-5.66916,55.66166|-5.70166,55.58861|-5.71805,55.51500|-5.75916,55.41750|-5.79528,55.36027|-5.78166,55.29902|-5.73778,55.29222|-5.56694,55.31666|-5.51528,55.36347|-5.55520,55.41440|-5.48639,55.64306|-5.44597,55.70680|-5.38000,55.75027|-5.41889,55.90666|-5.39924,55.99972|-5.33895,56.03456|-5.30594,56.06922|-5.23889,56.11889|-5.03222,56.23250|-4.92229,56.27111|-4.97416,56.23333|-5.07222,56.18695|-5.20069,56.11861|-5.30906,56.00570|-5.34000,55.90201|-5.29250,55.84750|-5.20805,55.84444|-5.22458,55.90175|-5.17334,55.92916|-5.11000,55.90306|-5.01222,55.86694|-4.96195,55.88000|-4.89824,55.98145|-4.84623,56.08632|-4.86636,56.03178|-4.85461,55.98648|-4.77659,55.97977|-4.62723,55.94555|-4.52305,55.91861|-4.70972,55.93403|-4.75166,55.94611|-4.82406,55.94950|-4.87826,55.93653|-4.91639,55.70083|-4.87584,55.68194|-4.81361,55.64555|-4.68722,55.59750|-4.61361,55.49069|-4.63958,55.44264|-4.68250,55.43388|-4.74847,55.41055|-4.83715,55.31882|-4.84778,55.26944|-4.86542,55.22340|-4.93500,55.17860|-5.01250,55.13347|-5.05361,55.04902|-5.17834,54.98888|-5.18563,54.93622|-5.17000,54.89111|-5.11666,54.83180|-5.00500,54.76333|-4.96229,54.68125|-4.92250,54.64055|-4.85723,54.62958|-4.96076,54.79687|-4.92431,54.83708|-4.85222,54.86861|-4.80125,54.85556|-4.74055,54.82166|-4.68084,54.79972|-4.59861,54.78027|-4.55792,54.73903|-4.49639,54.69888|-4.37584,54.67666|-4.34569,54.70916|-4.35973,54.77111|-4.41111,54.82583|-4.42445,54.88152|-4.38479,54.90555|-4.35056,54.85903|-4.09555,54.76777|-3.95361,54.76749|-3.86972,54.80527|-3.81222,54.84888|-3.69250,54.88110|-3.61584,54.87527|-3.57111,54.99083|-3.44528,54.98638|-3.36056,54.97138|-3.14695,54.96500|-3.05103,54.97986|-3.01500,55.05222|-2.96278,55.03889|-2.69945,55.17722|-2.63055,55.25500|-2.46305,55.36111|-2.21236,55.42777|-2.18278,55.45985|-2.21528,55.50583|-2.27416,55.57527|-2.27916,55.64472|-2.22000,55.66499|-2.08361,55.78054|-2.02166,55.80611'; + break; + case 'Ireland': + $coordsAsStr[] = '-8.17166,54.46388|-8.06555,54.37277|-7.94139,54.29944|-7.87576,54.28499|-7.86834,54.22764|-7.81805,54.19916|-7.69972,54.20250|-7.55945,54.12694|-7.31334,54.11250|-7.14584,54.22527|-7.17555,54.28916|-7.16084,54.33666|-7.05834,54.41000|-6.97445,54.40166|-6.92695,54.37916|-6.87305,54.34208|-6.85111,54.28972|-6.73473,54.18361|-6.65556,54.06527|-6.60584,54.04444|-6.44750,54.05833|-6.33889,54.11555|-6.26697,54.09983|-6.17403,54.07222|-6.10834,54.03638|-6.04389,54.03139|-5.96834,54.06389|-5.88500,54.11639|-5.87347,54.20916|-5.82500,54.23958|-5.74611,54.24806|-5.65556,54.22701|-5.60834,54.24972|-5.55916,54.29084|-5.57334,54.37704|-5.64502,54.49267|-5.70472,54.53361|-5.68055,54.57306|-5.59972,54.54194|-5.55097,54.50083|-5.54216,54.44903|-5.54643,54.40527|-5.50672,54.36444|-5.46111,54.38555|-5.43132,54.48596|-5.47945,54.53638|-5.53521,54.65090|-5.57431,54.67722|-5.62916,54.67945|-5.73674,54.67383|-5.80305,54.66138|-5.88257,54.60652|-5.92445,54.63180|-5.86681,54.68972|-5.81903,54.70972|-5.74672,54.72452|-5.68775,54.76335|-5.70931,54.83166|-5.74694,54.85361|-5.79139,54.85139|-6.03611,55.05778|-6.04250,55.10277|-6.03444,55.15458|-6.10125,55.20945|-6.14584,55.22069|-6.25500,55.21194|-6.37639,55.23916|-6.51556,55.23305|-6.61334,55.20722|-6.73028,55.18027|-6.82472,55.16806|-6.88972,55.16777|-6.96695,55.15611|-6.99416,55.11027|-7.05139,55.04680|-7.09500,55.03694|-7.25251,55.07059|-7.32639,55.04527|-7.40639,54.95333|-7.45805,54.85777|-7.55334,54.76277|-7.73916,54.71054|-7.82576,54.73416|-7.92639,54.70054|-7.85236,54.63388|-7.77750,54.62694|-7.83361,54.55389|-7.95084,54.53222|-8.04695,54.50722|-8.17166,54.46388'; + break; + case 'Wales': + $coordsAsStr[] = '-3.08860,53.26001|-3.33639,53.34722|-3.38806,53.34361|-3.60986,53.27944|-3.73014,53.28944|-3.85445,53.28444|-4.01861,53.23750|-4.06639,53.22639|-4.15334,53.22556|-4.19639,53.20611|-4.33028,53.11222|-4.36097,53.02888|-4.55278,52.92889|-4.61889,52.90916|-4.72195,52.83611|-4.72778,52.78139|-4.53945,52.79306|-4.47722,52.85500|-4.41416,52.88472|-4.31292,52.90499|-4.23334,52.91499|-4.13569,52.87888|-4.13056,52.77777|-4.05334,52.71666|-4.10639,52.65084|-4.12597,52.60375|-4.08056,52.55333|-4.05972,52.48584|-4.09666,52.38583|-4.14305,52.32027|-4.19361,52.27638|-4.23166,52.24888|-4.52722,52.13083|-4.66945,52.13027|-4.73695,52.10361|-4.76778,52.06444|-4.84445,52.01388|-5.09945,51.96056|-5.23916,51.91638|-5.25889,51.87056|-5.18500,51.86958|-5.11528,51.83333|-5.10257,51.77895|-5.16111,51.76222|-5.24694,51.73027|-5.19111,51.70888|-5.00739,51.70349|-4.90875,51.71249|-4.86111,51.71334|-4.97061,51.67577|-5.02128,51.66861|-5.05139,51.62028|-5.00528,51.60638|-4.94139,51.59416|-4.89028,51.62694|-4.83569,51.64534|-4.79063,51.63340|-4.69028,51.66666|-4.64584,51.72666|-4.57445,51.73416|-4.43611,51.73722|-4.26222,51.67694|-4.19750,51.67916|-4.06614,51.66804|-4.11639,51.63416|-4.17750,51.62235|-4.25055,51.62861|-4.29208,51.60743|-4.27778,51.55666|-4.20486,51.53527|-3.94972,51.61278|-3.83792,51.61999|-3.78166,51.56750|-3.75160,51.52931|-3.67194,51.47388|-3.54250,51.39777|-3.40334,51.37972|-3.27097,51.38014|-3.16458,51.40909|-3.15166,51.45305|-3.11875,51.48750|-3.02111,51.52527|-2.95472,51.53972|-2.89278,51.53861|-2.84778,51.54500|-2.71472,51.58083|-2.66500,51.61500|-2.68666,51.71889|-2.68334,51.76957|-2.65944,51.81806|-2.77861,51.88583|-2.86639,51.92889|-2.91757,51.91569|-2.98889,51.92555|-3.04528,51.97639|-3.08500,52.01930|-3.11250,52.06945|-3.12222,52.11805|-3.07555,52.14804|-3.05125,52.23347|-2.99750,52.28139|-2.95486,52.33117|-3.02195,52.34027|-3.19611,52.41027|-3.19514,52.46722|-3.11916,52.49194|-3.02736,52.49792|-2.98028,52.53083|-3.00792,52.56902|-3.07089,52.55702|-3.11750,52.58666|-3.06666,52.63527|-3.01111,52.71166|-3.06806,52.77027|-3.13708,52.79312|-3.13014,52.88486|-3.08639,52.91611|-2.99389,52.95361|-2.85069,52.93875|-2.79278,52.90207|-2.71945,52.91902|-2.73109,52.96873|-2.77792,52.98514|-2.85695,53.03249|-2.89389,53.10416|-2.91069,53.17014|-2.95528,53.21555|-3.02000,53.24722|-3.08860,53.26001'; + break; + case 'NC': + $coordsAsStr[] = '-81.65876,36.60938|-81.70390,36.55513|-81.70639,36.50804|-81.74665,36.39777|-81.90723,36.30804|-82.03195,36.12694|-82.08416,36.10146|-82.12826,36.11020|-82.21500,36.15833|-82.36375,36.11347|-82.43472,36.06013|-82.46236,36.01708|-82.56006,35.96263|-82.60042,35.99638|-82.62308,36.06121|-82.73500,36.01833|-82.84612,35.94944|-82.90451,35.88819|-82.93555,35.83846|-83.16000,35.76236|-83.24222,35.71944|-83.49222,35.57111|-83.56847,35.55861|-83.64416,35.56471|-83.73499,35.56638|-83.88222,35.51791|-83.98361,35.44944|-84.03639,35.35444|-84.04964,35.29117|-84.09042,35.25986|-84.15084,35.25388|-84.20521,35.25722|-84.29284,35.22596|-84.32471,34.98701|-83.09778,35.00027|-82.77722,35.09138|-82.59639,35.14972|-82.37999,35.21500|-82.27362,35.20583|-81.41306,35.17416|-81.05915,35.15333|-80.92666,35.10695|-80.78751,34.95610|-80.79334,34.82555|-79.66777,34.80694|-79.11555,34.34527|-78.57222,33.88166|-78.51806,33.87999|-78.43721,33.89804|-78.23735,33.91986|-78.15389,33.91471|-78.06974,33.89500|-78.02597,33.88936|-77.97611,33.94276|-77.95299,33.99243|-77.94499,34.06499|-77.92728,34.11756|-77.92250,33.99194|-77.92264,33.93715|-77.88215,34.06166|-77.86222,34.15083|-77.83501,34.19194|-77.75724,34.28527|-77.68222,34.36555|-77.63667,34.39805|-77.57363,34.43694|-77.45527,34.50403|-77.38173,34.51646|-77.37905,34.56294|-77.38572,34.61260|-77.40944,34.68916|-77.38847,34.73304|-77.33097,34.63992|-77.35024,34.60099|-77.30958,34.55972|-77.09424,34.67742|-76.75994,34.76659|-76.68325,34.79749|-76.66097,34.75781|-76.62611,34.71014|-76.50063,34.73617|-76.48138,34.77638|-76.38305,34.86423|-76.34326,34.88194|-76.27181,34.96263|-76.35125,35.02221|-76.32354,34.97429|-76.45319,34.93524|-76.43395,34.98782|-76.45356,35.06676|-76.52917,35.00444|-76.63382,34.98242|-76.69722,34.94887|-76.75306,34.90526|-76.81636,34.93944|-76.89000,34.95388|-76.93180,34.96957|-76.96501,34.99777|-77.06816,35.14978|-76.97639,35.06806|-76.86722,35.00000|-76.80531,34.98559|-76.72708,35.00152|-76.60402,35.07416|-76.56555,35.11486|-76.57305,35.16013|-76.66489,35.16694|-76.56361,35.23361|-76.48750,35.22582|-76.46889,35.27166|-76.50298,35.30791|-76.83251,35.39222|-77.02305,35.48694|-77.04958,35.52694|-76.91292,35.46166|-76.65250,35.41499|-76.61611,35.45888|-76.63195,35.52249|-76.58820,35.55104|-76.51556,35.53194|-76.56711,35.48494|-76.52251,35.40416|-76.46195,35.37221|-76.13319,35.35986|-76.04111,35.42416|-76.00223,35.46610|-75.97958,35.51666|-75.89362,35.57555|-75.83834,35.56694|-75.78944,35.57138|-75.74076,35.61846|-75.72084,35.69263|-75.72084,35.81451|-75.74917,35.87791|-75.78333,35.91972|-75.85083,35.97527|-75.94333,35.91777|-75.98944,35.88054|-75.98854,35.79110|-75.99388,35.71027|-76.02875,35.65409|-76.10320,35.66041|-76.13563,35.69239|-76.04475,35.68436|-76.04167,35.74916|-76.05305,35.79361|-76.05305,35.87375|-76.02653,35.96222|-76.07751,35.99319|-76.17472,35.99596|-76.27917,35.91915|-76.37986,35.95763|-76.42014,35.97874|-76.55375,35.93971|-76.66222,35.93305|-76.72952,35.93984|-76.73392,36.04760|-76.75384,36.09477|-76.76028,36.14513|-76.74610,36.22818|-76.70458,36.24673|-76.72764,36.16736|-76.71021,36.11752|-76.69117,36.07165|-76.65979,36.03312|-76.49527,36.00958|-76.37138,36.07694|-76.37084,36.14999|-76.21417,36.09471|-76.07591,36.17910|-76.18361,36.26915|-76.19965,36.31739|-76.13986,36.28805|-76.04274,36.21974|-76.00465,36.18110|-75.95287,36.19241|-75.97604,36.31138|-75.93895,36.28381|-75.85271,36.11069|-75.79315,36.07385|-75.79639,36.11804|-75.88333,36.29554|-75.94665,36.37194|-75.98694,36.41166|-76.03473,36.49666|-76.02899,36.55000|-78.44234,36.54986|-78.56594,36.55799|-80.27556,36.55110|-81.15361,36.56499|-81.38722,36.57695|-81.65876,36.60938'; + break; + default: } ?> var coordStr = <?= json_encode($coordsAsStr) ?>; diff --git a/app/Module/HtmlBlockModule.php b/app/Module/HtmlBlockModule.php index 04cb429a40..74ebe99c9c 100644 --- a/app/Module/HtmlBlockModule.php +++ b/app/Module/HtmlBlockModule.php @@ -70,25 +70,25 @@ class HtmlBlockModule extends AbstractModule implements ModuleBlockInterface { * Select GEDCOM */ switch ($gedcom) { - case '__current__': - $stats = new Stats($WT_TREE); - break; - case '__default__': - $tree = Tree::findByName(Site::getPreference('DEFAULT_GEDCOM')); - if ($tree) { - $stats = new Stats($tree); - } else { + case '__current__': $stats = new Stats($WT_TREE); - } - break; - default: - $tree = Tree::findByName($gedcom); - if ($tree) { - $stats = new Stats($tree); - } else { - $stats = new Stats($WT_TREE); - } - break; + break; + case '__default__': + $tree = Tree::findByName(Site::getPreference('DEFAULT_GEDCOM')); + if ($tree) { + $stats = new Stats($tree); + } else { + $stats = new Stats($WT_TREE); + } + break; + default: + $tree = Tree::findByName($gedcom); + if ($tree) { + $stats = new Stats($tree); + } else { + $stats = new Stats($WT_TREE); + } + break; } /* diff --git a/app/Module/IndividualFactsTabModule.php b/app/Module/IndividualFactsTabModule.php index 2f8ed787b0..46436cc5a6 100644 --- a/app/Module/IndividualFactsTabModule.php +++ b/app/Module/IndividualFactsTabModule.php @@ -59,19 +59,19 @@ class IndividualFactsTabModule extends AbstractModule implements ModuleTabInterf // The individual’s own facts foreach ($controller->record->getFacts() as $fact) { switch ($fact->getTag()) { - case 'SEX': - case 'NAME': - case 'SOUR': - case 'OBJE': - case 'NOTE': - case 'FAMC': - case 'FAMS': - break; - default: - if (!array_key_exists('extra_info', Module::getActiveSidebars($controller->record->getTree())) || !ExtraInformationModule::showFact($fact)) { - $indifacts[] = $fact; - } - break; + case 'SEX': + case 'NAME': + case 'SOUR': + case 'OBJE': + case 'NOTE': + case 'FAMC': + case 'FAMS': + break; + default: + if (!array_key_exists('extra_info', Module::getActiveSidebars($controller->record->getTree())) || !ExtraInformationModule::showFact($fact)) { + $indifacts[] = $fact; + } + break; } } @@ -79,19 +79,19 @@ class IndividualFactsTabModule extends AbstractModule implements ModuleTabInterf foreach ($controller->record->getSpouseFamilies() as $family) { foreach ($family->getFacts() as $fact) { switch ($fact->getTag()) { - case 'SOUR': - case 'NOTE': - case 'OBJE': - case 'CHAN': - case '_UID': - case 'RIN': - case 'HUSB': - case 'WIFE': - case 'CHIL': - break; - default: - $indifacts[] = $fact; - break; + case 'SOUR': + case 'NOTE': + case 'OBJE': + case 'CHAN': + case '_UID': + case 'RIN': + case 'HUSB': + case 'WIFE': + case 'CHIL': + break; + default: + $indifacts[] = $fact; + break; } } $spouse = $family->getSpouse($controller->record); @@ -233,27 +233,27 @@ class IndividualFactsTabModule extends AbstractModule implements ModuleTabInterf // Deal with recursion. switch ($option) { - case '_CHIL': - // Add grandchildren - foreach ($family->getChildren() as $child) { - foreach ($child->getSpouseFamilies() as $cfamily) { - switch ($child->getSex()) { - case 'M': - foreach (self::childFacts($person, $cfamily, '_GCHI', 'son') as $fact) { - $facts[] = $fact; - } - break; - case 'F': - foreach (self::childFacts($person, $cfamily, '_GCHI', 'dau') as $fact) { - $facts[] = $fact; - } - break; - default: - foreach (self::childFacts($person, $cfamily, '_GCHI', 'chi') as $fact) { - $facts[] = $fact; + case '_CHIL': + // Add grandchildren + foreach ($family->getChildren() as $child) { + foreach ($child->getSpouseFamilies() as $cfamily) { + switch ($child->getSex()) { + case 'M': + foreach (self::childFacts($person, $cfamily, '_GCHI', 'son') as $fact) { + $facts[] = $fact; + } + break; + case 'F': + foreach (self::childFacts($person, $cfamily, '_GCHI', 'dau') as $fact) { + $facts[] = $fact; + } + break; + default: + foreach (self::childFacts($person, $cfamily, '_GCHI', 'chi') as $fact) { + $facts[] = $fact; + } + break; } - break; - } } } break; @@ -418,24 +418,24 @@ class IndividualFactsTabModule extends AbstractModule implements ModuleTabInterf foreach ($parent->getFacts(WT_EVENTS_DEAT) as $fact) { if ($fact->getDate()->isOK() && Date::compare($birt_date, $fact->getDate()) <= 0 && Date::compare($fact->getDate(), $deat_date) <= 0) { switch ($sosa) { - case 1: - // Convert the event to a close relatives event. - $rela_fact = clone($fact); - $rela_fact->setTag('_' . $fact->getTag() . '_PARE'); - $facts[] = $rela_fact; - break; - case 2: - // Convert the event to a close relatives event - $rela_fact = clone($fact); - $rela_fact->setTag('_' . $fact->getTag() . '_GPA1'); - $facts[] = $rela_fact; - break; - case 3: - // Convert the event to a close relatives event - $rela_fact = clone($fact); - $rela_fact->setTag('_' . $fact->getTag() . '_GPA2'); - $facts[] = $rela_fact; - break; + case 1: + // Convert the event to a close relatives event. + $rela_fact = clone($fact); + $rela_fact->setTag('_' . $fact->getTag() . '_PARE'); + $facts[] = $rela_fact; + break; + case 2: + // Convert the event to a close relatives event + $rela_fact = clone($fact); + $rela_fact->setTag('_' . $fact->getTag() . '_GPA1'); + $facts[] = $rela_fact; + break; + case 3: + // Convert the event to a close relatives event + $rela_fact = clone($fact); + $rela_fact->setTag('_' . $fact->getTag() . '_GPA2'); + $facts[] = $rela_fact; + break; } } } diff --git a/app/Module/IndividualSidebarModule.php b/app/Module/IndividualSidebarModule.php index 189aabf6a9..adfb18f4be 100644 --- a/app/Module/IndividualSidebarModule.php +++ b/app/Module/IndividualSidebarModule.php @@ -46,13 +46,13 @@ class IndividualSidebarModule extends AbstractModule implements ModuleSidebarInt */ public function modAction($mod_action) { switch ($mod_action) { - case 'ajax': - header('Content-Type: text/html; charset=UTF-8'); - echo $this->getSidebarAjaxContent(); - break; - default: - http_response_code(404); - break; + case 'ajax': + header('Content-Type: text/html; charset=UTF-8'); + echo $this->getSidebarAjaxContent(); + break; + default: + http_response_code(404); + break; } } @@ -150,18 +150,18 @@ class IndividualSidebarModule extends AbstractModule implements ModuleSidebarInt $out = '<form method="post" action="module.php?mod=' . $this->getName() . '&mod_action=ajax" onsubmit="return false;"><input type="search" name="sb_indi_name" id="sb_indi_name" placeholder="' . I18N::translate('Search') . '"><p>'; foreach ($initials as $letter => $count) { switch ($letter) { - case '@': - $html = I18N::translateContext('Unknown surname', '…'); - break; - case ',': - $html = I18N::translate('None'); - break; - case ' ': - $html = ' '; - break; - default: - $html = $letter; - break; + case '@': + $html = I18N::translateContext('Unknown surname', '…'); + break; + case ',': + $html = I18N::translate('None'); + break; + case ' ': + $html = ' '; + break; + default: + $html = $letter; + break; } $html = '<a href="module.php?mod=' . $this->getName() . '&mod_action=ajax&alpha=' . urlencode($letter) . '" class="sb_indi_letter">' . $html . '</a>'; $out .= $html . ' '; diff --git a/app/Module/InteractiveTree/TreeView.php b/app/Module/InteractiveTree/TreeView.php index 33b01f70be..51e9d84ab0 100644 --- a/app/Module/InteractiveTree/TreeView.php +++ b/app/Module/InteractiveTree/TreeView.php @@ -70,25 +70,25 @@ class TreeView { $firstLetter = substr($jsonRequest, 0, 1); $jsonRequest = substr($jsonRequest, 1); switch ($firstLetter) { - case 'c': - $fidlist = explode(',', $jsonRequest); - $flist = []; - foreach ($fidlist as $fid) { - $flist[] = Family::getInstance($fid, $WT_TREE); - } - $r[] = $this->drawChildren($flist, 1, true); - break; - case 'p': - $params = explode('@', $jsonRequest); - $fid = $params[0]; - $order = $params[1]; - $f = Family::getInstance($fid, $WT_TREE); - if ($f->getHusband()) { - $r[] = $this->drawPerson($f->getHusband(), 0, 1, $f, $order); - } elseif ($f->getWife()) { - $r[] = $this->drawPerson($f->getWife(), 0, 1, $f, $order); - } - break; + case 'c': + $fidlist = explode(',', $jsonRequest); + $flist = []; + foreach ($fidlist as $fid) { + $flist[] = Family::getInstance($fid, $WT_TREE); + } + $r[] = $this->drawChildren($flist, 1, true); + break; + case 'p': + $params = explode('@', $jsonRequest); + $fid = $params[0]; + $order = $params[1]; + $f = Family::getInstance($fid, $WT_TREE); + if ($f->getHusband()) { + $r[] = $this->drawPerson($f->getHusband(), 0, 1, $f, $order); + } elseif ($f->getWife()) { + $r[] = $this->drawPerson($f->getWife(), 0, 1, $f, $order); + } + break; } } @@ -314,15 +314,15 @@ class TreeView { $family_name = I18N::translateContext('unknown family', 'unknown'); } switch ($individual->getSex()) { - case 'M': - $title = ' title="' . /* I18N: e.g. “Son of [father name & mother name]” */ I18N::translate('Son of %s', $family_name) . '"'; - break; - case 'F': - $title = ' title="' . /* I18N: e.g. “Daughter of [father name & mother name]” */ I18N::translate('Daughter of %s', $family_name) . '"'; - break; - default: - $title = ' title="' . /* I18N: e.g. “Child of [father name & mother name]” */ I18N::translate('Child of %s', $family_name) . '"'; - break; + case 'M': + $title = ' title="' . /* I18N: e.g. “Son of [father name & mother name]” */ I18N::translate('Son of %s', $family_name) . '"'; + break; + case 'F': + $title = ' title="' . /* I18N: e.g. “Daughter of [father name & mother name]” */ I18N::translate('Daughter of %s', $family_name) . '"'; + break; + default: + $title = ' title="' . /* I18N: e.g. “Child of [father name & mother name]” */ I18N::translate('Child of %s', $family_name) . '"'; + break; } $sex = $individual->getSex(); diff --git a/app/Module/InteractiveTreeModule.php b/app/Module/InteractiveTreeModule.php index e2e38037bf..22bd4f8613 100644 --- a/app/Module/InteractiveTreeModule.php +++ b/app/Module/InteractiveTreeModule.php @@ -125,20 +125,20 @@ class InteractiveTreeModule extends AbstractModule implements ModuleTabInterface global $controller, $WT_TREE; switch ($mod_action) { - case 'treeview': - $controller = new ChartController; - $tv = new TreeView('tv'); + case 'treeview': + $controller = new ChartController; + $tv = new TreeView('tv'); - $person = $controller->getSignificantIndividual(); + $person = $controller->getSignificantIndividual(); - list($html, $js) = $tv->drawViewport($person, 4); + list($html, $js) = $tv->drawViewport($person, 4); - $controller - ->setPageTitle(I18N::translate('Interactive tree of %s', $person->getFullName())) - ->pageHeader() - ->addExternalJavascript($this->js()) - ->addInlineJavascript($js) - ->addInlineJavascript(' + $controller + ->setPageTitle(I18N::translate('Interactive tree of %s', $person->getFullName())) + ->pageHeader() + ->addExternalJavascript($this->js()) + ->addInlineJavascript($js) + ->addInlineJavascript(' if (document.createStyleSheet) { document.createStyleSheet("' . $this->css() . '"); // For Internet Explorer } else { @@ -146,38 +146,38 @@ class InteractiveTreeModule extends AbstractModule implements ModuleTabInterface } '); - echo View::make('interactive-tree-page', [ - 'title' => $controller->getPageTitle(), - 'individual' => $controller->root, - 'html' => $html, - //'css' => $this->css(), - //'js' => $this->js(), - ]); + echo View::make('interactive-tree-page', [ + 'title' => $controller->getPageTitle(), + 'individual' => $controller->root, + 'html' => $html, + //'css' => $this->css(), + //'js' => $this->js(), + ]); - break; + break; - case 'getDetails': - header('Content-Type: text/html; charset=UTF-8'); - $pid = Filter::get('pid', WT_REGEX_XREF); - $i = Filter::get('instance'); - $tv = new TreeView($i); - $individual = Individual::getInstance($pid, $WT_TREE); - if ($individual) { - echo $tv->getDetails($individual); - } - break; + case 'getDetails': + header('Content-Type: text/html; charset=UTF-8'); + $pid = Filter::get('pid', WT_REGEX_XREF); + $i = Filter::get('instance'); + $tv = new TreeView($i); + $individual = Individual::getInstance($pid, $WT_TREE); + if ($individual) { + echo $tv->getDetails($individual); + } + break; - case 'getPersons': - header('Content-Type: text/html; charset=UTF-8'); - $q = Filter::get('q'); - $i = Filter::get('instance'); - $tv = new TreeView($i); - echo $tv->getPersons($q); - break; + case 'getPersons': + header('Content-Type: text/html; charset=UTF-8'); + $q = Filter::get('q'); + $i = Filter::get('instance'); + $tv = new TreeView($i); + echo $tv->getPersons($q); + break; - default: - http_response_code(404); - break; + default: + http_response_code(404); + break; } } diff --git a/app/Module/OnThisDayModule.php b/app/Module/OnThisDayModule.php index 1ffb3c3e33..f6c1fb34c8 100644 --- a/app/Module/OnThisDayModule.php +++ b/app/Module/OnThisDayModule.php @@ -68,16 +68,16 @@ class OnThisDayModule extends AbstractModule implements ModuleBlockInterface { $tags = $filter ? 'BIRT MARR' : 'BIRT MARR DEAT'; switch ($infoStyle) { - case 'list': - // Output style 1: Old format, no visible tables, much smaller text. Better suited to right side of page. - $content .= FunctionsPrintLists::eventsList($todayjd, $todayjd, $tags, $filter, $sortStyle); - break; - case 'table': - // Style 2: New format, tables, big text, etc. Not too good on right side of page - ob_start(); - $content .= FunctionsPrintLists::eventsTable($todayjd, $todayjd, $tags, $filter, $sortStyle); - $content .= ob_get_clean(); - break; + case 'list': + // Output style 1: Old format, no visible tables, much smaller text. Better suited to right side of page. + $content .= FunctionsPrintLists::eventsList($todayjd, $todayjd, $tags, $filter, $sortStyle); + break; + case 'table': + // Style 2: New format, tables, big text, etc. Not too good on right side of page + ob_start(); + $content .= FunctionsPrintLists::eventsTable($todayjd, $todayjd, $tags, $filter, $sortStyle); + $content .= ob_get_clean(); + break; } if ($template) { diff --git a/app/Module/RecentChangesModule.php b/app/Module/RecentChangesModule.php index 5ebb6a86b2..32cb059587 100644 --- a/app/Module/RecentChangesModule.php +++ b/app/Module/RecentChangesModule.php @@ -75,12 +75,12 @@ class RecentChangesModule extends AbstractModule implements ModuleBlockInterface $content .= I18N::plural('There have been no changes within the last %s day.', 'There have been no changes within the last %s days.', $days, I18N::number($days)); } else { switch ($infoStyle) { - case 'list': - $content .= $this->changesList($records, $sortStyle, $show_user); - break; - case 'table': - $content .= $this->changesTable($records, $sortStyle, $show_user); - break; + case 'list': + $content .= $this->changesList($records, $sortStyle, $show_user); + break; + case 'table': + $content .= $this->changesTable($records, $sortStyle, $show_user); + break; } } @@ -206,15 +206,15 @@ class RecentChangesModule extends AbstractModule implements ModuleBlockInterface */ private function changesList(array $records, $sort, $show_user) { switch ($sort) { - case 'name': - uasort($records, ['self', 'sortByNameAndChangeDate']); - break; - case 'date_asc': - uasort($records, ['self', 'sortByChangeDateAndName']); - $records = array_reverse($records); - break; - case 'date_desc': - uasort($records, ['self', 'sortByChangeDateAndName']); + case 'name': + uasort($records, ['self', 'sortByNameAndChangeDate']); + break; + case 'date_asc': + uasort($records, ['self', 'sortByChangeDateAndName']); + $records = array_reverse($records); + break; + case 'date_desc': + uasort($records, ['self', 'sortByChangeDateAndName']); } $html = ''; @@ -259,16 +259,16 @@ class RecentChangesModule extends AbstractModule implements ModuleBlockInterface $table_id = 'table-chan-' . Uuid::uuid4(); // lists requires a unique ID in case there are multiple lists per page switch ($sort) { - case 'name': - default: - $aaSorting = "[1,'asc'], [2,'desc']"; - break; - case 'date_asc': - $aaSorting = "[2,'asc'], [1,'asc']"; - break; - case 'date_desc': - $aaSorting = "[2,'desc'], [1,'asc']"; - break; + case 'name': + default: + $aaSorting = "[1,'asc'], [2,'desc']"; + break; + case 'date_asc': + $aaSorting = "[2,'asc'], [1,'asc']"; + break; + case 'date_desc': + $aaSorting = "[2,'desc'], [1,'asc']"; + break; } $html = ''; @@ -302,27 +302,27 @@ class RecentChangesModule extends AbstractModule implements ModuleBlockInterface foreach ($records as $record) { $html .= '<tr><td>'; switch ($record::RECORD_TYPE) { - case 'INDI': - $html .= FontAwesome::semanticIcon('individual', I18N::translate('Individual')); - break; - case 'FAM': - $html .= FontAwesome::semanticicon('family', I18N::translate('Family')); - break; - case 'OBJE': - $html .= FontAwesome::semanticIcon('media', I18N::translate('Media')); - break; - case 'NOTE': - $html .= FontAwesome::semanticIcon('note', I18N::translate('Note')); - break; - case 'SOUR': - $html .= FontAwesome::semanticIcon('source', I18N::translate('Source')); - break; - case 'SUBM': - $html .= FontAwesome::semanticIcon('submitter', I18N::translate('Submitter')); - break; - case 'REPO': - $html .= FontAwesome::semanticIcon('repository', I18N::translate('Repository')); - break; + case 'INDI': + $html .= FontAwesome::semanticIcon('individual', I18N::translate('Individual')); + break; + case 'FAM': + $html .= FontAwesome::semanticicon('family', I18N::translate('Family')); + break; + case 'OBJE': + $html .= FontAwesome::semanticIcon('media', I18N::translate('Media')); + break; + case 'NOTE': + $html .= FontAwesome::semanticIcon('note', I18N::translate('Note')); + break; + case 'SOUR': + $html .= FontAwesome::semanticIcon('source', I18N::translate('Source')); + break; + case 'SUBM': + $html .= FontAwesome::semanticIcon('submitter', I18N::translate('Submitter')); + break; + case 'REPO': + $html .= FontAwesome::semanticIcon('repository', I18N::translate('Repository')); + break; } $html .= '</td>'; $html .= '<td data-sort="' . Html::escape($record->getSortName()) . '">'; diff --git a/app/Module/RelationshipsChartModule.php b/app/Module/RelationshipsChartModule.php index 6ce999e7b2..148785cc44 100644 --- a/app/Module/RelationshipsChartModule.php +++ b/app/Module/RelationshipsChartModule.php @@ -115,15 +115,15 @@ class RelationshipsChartModule extends AbstractModule implements ModuleConfigInt */ public function modAction($mod_action) { switch ($mod_action) { - case 'admin': - if ($_SERVER['REQUEST_METHOD'] === 'POST') { - $this->saveConfig(); - } else { - $this->editConfig(); - } - break; - default: - http_response_code(404); + case 'admin': + if ($_SERVER['REQUEST_METHOD'] === 'POST') { + $this->saveConfig(); + } else { + $this->editConfig(); + } + break; + default: + http_response_code(404); } } diff --git a/app/Module/SiteMapModule.php b/app/Module/SiteMapModule.php index f6d7e31873..dcd01e9dc2 100644 --- a/app/Module/SiteMapModule.php +++ b/app/Module/SiteMapModule.php @@ -54,14 +54,14 @@ class SiteMapModule extends AbstractModule implements ModuleConfigInterface { */ public function modAction($mod_action) { switch ($mod_action) { - case 'admin': - $this->admin(); - break; - case 'generate': - $this->generate(Filter::get('file')); - break; - default: - http_response_code(404); + case 'admin': + $this->admin(); + break; + case 'generate': + $this->generate(Filter::get('file')); + break; + default: + http_response_code(404); } } @@ -162,86 +162,86 @@ class SiteMapModule extends AbstractModule implements ModuleConfigInterface { $data = '<url><loc>' . WT_BASE_URL . 'index.php?ctype=gedcom&ged=' . $tree->getNameUrl() . '</loc></url>' . PHP_EOL; $records = []; switch ($rec_type) { - case 'i': - $rows = Database::prepare( - "SELECT i_id AS xref, i_gedcom AS gedcom" . - " FROM `##individuals`" . - " WHERE i_file = :tree_id" . - " ORDER BY i_id" . - " LIMIT :limit OFFSET :offset" - )->execute([ - 'tree_id' => $ged_id, - 'limit' => self::RECORDS_PER_VOLUME, - 'offset' => self::RECORDS_PER_VOLUME * $volume, - ])->fetchAll(); - foreach ($rows as $row) { - $records[] = Individual::getInstance($row->xref, $tree, $row->gedcom); - } - break; - case 's': - $rows = Database::prepare( - "SELECT s_id AS xref, s_gedcom AS gedcom" . - " FROM `##sources`" . - " WHERE s_file = :tree_id" . - " ORDER BY s_id" . - " LIMIT :limit OFFSET :offset" - )->execute([ - 'tree_id' => $ged_id, - 'limit' => self::RECORDS_PER_VOLUME, - 'offset' => self::RECORDS_PER_VOLUME * $volume, - ])->fetchAll(); - foreach ($rows as $row) { - $records[] = Source::getInstance($row->xref, $tree, $row->gedcom); - } - break; - case 'r': - $rows = Database::prepare( - "SELECT o_id AS xref, o_gedcom AS gedcom" . - " FROM `##other`" . - " WHERE o_file = :tree_id AND o_type = 'REPO'" . - " ORDER BY o_id" . - " LIMIT :limit OFFSET :offset" - )->execute([ - 'tree_id' => $ged_id, - 'limit' => self::RECORDS_PER_VOLUME, - 'offset' => self::RECORDS_PER_VOLUME * $volume, - ])->fetchAll(); - foreach ($rows as $row) { - $records[] = Repository::getInstance($row->xref, $tree, $row->gedcom); - } - break; - case 'n': - $rows = Database::prepare( - "SELECT o_id AS xref, o_gedcom AS gedcom" . - " FROM `##other`" . - " WHERE o_file = :tree_id AND o_type = 'NOTE'" . - " ORDER BY o_id" . - " LIMIT :limit OFFSET :offset" - )->execute([ - 'tree_id' => $ged_id, - 'limit' => self::RECORDS_PER_VOLUME, - 'offset' => self::RECORDS_PER_VOLUME * $volume, - ])->fetchAll(); - foreach ($rows as $row) { - $records[] = Note::getInstance($row->xref, $tree, $row->gedcom); - } - break; - case 'm': - $rows = Database::prepare( - "SELECT m_id AS xref, m_gedcom AS gedcom" . - " FROM `##media`" . - " WHERE m_file = :tree_id" . - " ORDER BY m_id" . - " LIMIT :limit OFFSET :offset" - )->execute([ - 'tree_id' => $ged_id, - 'limit' => self::RECORDS_PER_VOLUME, - 'offset' => self::RECORDS_PER_VOLUME * $volume, - ])->fetchAll(); - foreach ($rows as $row) { - $records[] = Media::getInstance($row->xref, $tree, $row->gedcom); - } - break; + case 'i': + $rows = Database::prepare( + "SELECT i_id AS xref, i_gedcom AS gedcom" . + " FROM `##individuals`" . + " WHERE i_file = :tree_id" . + " ORDER BY i_id" . + " LIMIT :limit OFFSET :offset" + )->execute([ + 'tree_id' => $ged_id, + 'limit' => self::RECORDS_PER_VOLUME, + 'offset' => self::RECORDS_PER_VOLUME * $volume, + ])->fetchAll(); + foreach ($rows as $row) { + $records[] = Individual::getInstance($row->xref, $tree, $row->gedcom); + } + break; + case 's': + $rows = Database::prepare( + "SELECT s_id AS xref, s_gedcom AS gedcom" . + " FROM `##sources`" . + " WHERE s_file = :tree_id" . + " ORDER BY s_id" . + " LIMIT :limit OFFSET :offset" + )->execute([ + 'tree_id' => $ged_id, + 'limit' => self::RECORDS_PER_VOLUME, + 'offset' => self::RECORDS_PER_VOLUME * $volume, + ])->fetchAll(); + foreach ($rows as $row) { + $records[] = Source::getInstance($row->xref, $tree, $row->gedcom); + } + break; + case 'r': + $rows = Database::prepare( + "SELECT o_id AS xref, o_gedcom AS gedcom" . + " FROM `##other`" . + " WHERE o_file = :tree_id AND o_type = 'REPO'" . + " ORDER BY o_id" . + " LIMIT :limit OFFSET :offset" + )->execute([ + 'tree_id' => $ged_id, + 'limit' => self::RECORDS_PER_VOLUME, + 'offset' => self::RECORDS_PER_VOLUME * $volume, + ])->fetchAll(); + foreach ($rows as $row) { + $records[] = Repository::getInstance($row->xref, $tree, $row->gedcom); + } + break; + case 'n': + $rows = Database::prepare( + "SELECT o_id AS xref, o_gedcom AS gedcom" . + " FROM `##other`" . + " WHERE o_file = :tree_id AND o_type = 'NOTE'" . + " ORDER BY o_id" . + " LIMIT :limit OFFSET :offset" + )->execute([ + 'tree_id' => $ged_id, + 'limit' => self::RECORDS_PER_VOLUME, + 'offset' => self::RECORDS_PER_VOLUME * $volume, + ])->fetchAll(); + foreach ($rows as $row) { + $records[] = Note::getInstance($row->xref, $tree, $row->gedcom); + } + break; + case 'm': + $rows = Database::prepare( + "SELECT m_id AS xref, m_gedcom AS gedcom" . + " FROM `##media`" . + " WHERE m_file = :tree_id" . + " ORDER BY m_id" . + " LIMIT :limit OFFSET :offset" + )->execute([ + 'tree_id' => $ged_id, + 'limit' => self::RECORDS_PER_VOLUME, + 'offset' => self::RECORDS_PER_VOLUME * $volume, + ])->fetchAll(); + foreach ($rows as $row) { + $records[] = Media::getInstance($row->xref, $tree, $row->gedcom); + } + break; } foreach ($records as $record) { if ($record->canShowName()) { diff --git a/app/Module/StoriesModule.php b/app/Module/StoriesModule.php index 335f30e6e4..2dad0072e4 100644 --- a/app/Module/StoriesModule.php +++ b/app/Module/StoriesModule.php @@ -50,21 +50,21 @@ class StoriesModule extends AbstractModule implements ModuleTabInterface, Module */ public function modAction($mod_action) { switch ($mod_action) { - case 'admin_edit': - $this->edit(); - break; - case 'admin_delete': - $this->delete(); - $this->config(); - break; - case 'admin_config': - $this->config(); - break; - case 'show_list': - $this->showList(); - break; - default: - http_response_code(404); + case 'admin_edit': + $this->edit(); + break; + case 'admin_delete': + $this->delete(); + $this->config(); + break; + case 'admin_config': + $this->config(); + break; + case 'show_list': + $this->showList(); + break; + default: + http_response_code(404); } } diff --git a/app/Module/TopGivenNamesModule.php b/app/Module/TopGivenNamesModule.php index 388b7f336f..599b4d013f 100644 --- a/app/Module/TopGivenNamesModule.php +++ b/app/Module/TopGivenNamesModule.php @@ -61,23 +61,23 @@ class TopGivenNamesModule extends AbstractModule implements ModuleBlockInterface $stats = new Stats($WT_TREE); switch ($infoStyle) { - case 'list': - $males = $stats->commonGivenMaleTotals([1, $num, 'rcount']); - $females = $stats->commonGivenFemaleTotals([1, $num, 'rcount']); - $content = View::make('blocks/top-given-names-list', [ - 'males' => $males, - 'females' => $females, - ]); - break; - default: - case 'table': - $males = $stats->commonGivenMaleTable([1, $num, 'rcount']); - $females = $stats->commonGivenFemaleTable([1, $num, 'rcount']); - $content = View::make('blocks/top-given-names-table', [ - 'males' => $males, - 'females' => $females, - ]); - break; + case 'list': + $males = $stats->commonGivenMaleTotals([1, $num, 'rcount']); + $females = $stats->commonGivenFemaleTotals([1, $num, 'rcount']); + $content = View::make('blocks/top-given-names-list', [ + 'males' => $males, + 'females' => $females, + ]); + break; + default: + case 'table': + $males = $stats->commonGivenMaleTable([1, $num, 'rcount']); + $females = $stats->commonGivenFemaleTable([1, $num, 'rcount']); + $content = View::make('blocks/top-given-names-table', [ + 'males' => $males, + 'females' => $females, + ]); + break; } if ($template) { diff --git a/app/Module/TopSurnamesModule.php b/app/Module/TopSurnamesModule.php index e1728b647a..547805d08e 100644 --- a/app/Module/TopSurnamesModule.php +++ b/app/Module/TopSurnamesModule.php @@ -84,23 +84,23 @@ class TopSurnamesModule extends AbstractModule implements ModuleBlockInterface { } switch ($infoStyle) { - case 'tagcloud': - uksort($all_surnames, '\Fisharebest\Webtrees\I18N::strcasecmp'); - $content = FunctionsPrintLists::surnameTagCloud($all_surnames, 'indilist.php', true, $WT_TREE); - break; - case 'list': - uasort($all_surnames, '\Fisharebest\Webtrees\Module\TopSurnamesModule::surnameCountSort'); - $content = FunctionsPrintLists::surnameList($all_surnames, 1, true, 'indilist.php', $WT_TREE); - break; - case 'array': - uasort($all_surnames, '\Fisharebest\Webtrees\Module\TopSurnamesModule::surnameCountSort'); - $content = FunctionsPrintLists::surnameList($all_surnames, 2, true, 'indilist.php', $WT_TREE); - break; - case 'table': - default: - uasort($all_surnames, '\Fisharebest\Webtrees\Module\TopSurnamesModule::surnameCountSort'); - $content = FunctionsPrintLists::surnameTable($all_surnames, 'indilist.php', $WT_TREE); - break; + case 'tagcloud': + uksort($all_surnames, '\Fisharebest\Webtrees\I18N::strcasecmp'); + $content = FunctionsPrintLists::surnameTagCloud($all_surnames, 'indilist.php', true, $WT_TREE); + break; + case 'list': + uasort($all_surnames, '\Fisharebest\Webtrees\Module\TopSurnamesModule::surnameCountSort'); + $content = FunctionsPrintLists::surnameList($all_surnames, 1, true, 'indilist.php', $WT_TREE); + break; + case 'array': + uasort($all_surnames, '\Fisharebest\Webtrees\Module\TopSurnamesModule::surnameCountSort'); + $content = FunctionsPrintLists::surnameList($all_surnames, 2, true, 'indilist.php', $WT_TREE); + break; + case 'table': + default: + uasort($all_surnames, '\Fisharebest\Webtrees\Module\TopSurnamesModule::surnameCountSort'); + $content = FunctionsPrintLists::surnameTable($all_surnames, 'indilist.php', $WT_TREE); + break; } if ($template) { diff --git a/app/Module/UserFavoritesModule.php b/app/Module/UserFavoritesModule.php index e84e9e3407..6e3725ab0f 100644 --- a/app/Module/UserFavoritesModule.php +++ b/app/Module/UserFavoritesModule.php @@ -80,22 +80,22 @@ class UserFavoritesModule extends FamilyTreeFavoritesModule { global $WT_TREE; switch ($mod_action) { - case 'menu-add-favorite': - // Process the "add to user favorites" menu item on indi/fam/etc. pages - $record = GedcomRecord::getInstance(Filter::post('xref', WT_REGEX_XREF), $WT_TREE); - if (Auth::check() && $record->canShowName()) { - self::addFavorite([ - 'user_id' => Auth::id(), - 'gedcom_id' => $record->getTree()->getTreeId(), - 'gid' => $record->getXref(), - 'type' => $record::RECORD_TYPE, - 'url' => null, - 'note' => null, - 'title' => null, - ]); - FlashMessages::addMessage(/* I18N: %s is the name of an individual, source or other record */ I18N::translate('“%s” has been added to your favorites.', $record->getFullName())); - } - break; + case 'menu-add-favorite': + // Process the "add to user favorites" menu item on indi/fam/etc. pages + $record = GedcomRecord::getInstance(Filter::post('xref', WT_REGEX_XREF), $WT_TREE); + if (Auth::check() && $record->canShowName()) { + self::addFavorite([ + 'user_id' => Auth::id(), + 'gedcom_id' => $record->getTree()->getTreeId(), + 'gid' => $record->getXref(), + 'type' => $record::RECORD_TYPE, + 'url' => null, + 'note' => null, + 'title' => null, + ]); + FlashMessages::addMessage(/* I18N: %s is the name of an individual, source or other record */ I18N::translate('“%s” has been added to your favorites.', $record->getFullName())); + } + break; } } } diff --git a/app/Module/UserMessagesModule.php b/app/Module/UserMessagesModule.php index f31d4f2bb7..61dc2899bc 100644 --- a/app/Module/UserMessagesModule.php +++ b/app/Module/UserMessagesModule.php @@ -46,15 +46,15 @@ class UserMessagesModule extends AbstractModule implements ModuleBlockInterface */ public function modAction($mod_action) { switch ($mod_action) { - case 'delete': - $stmt = Database::prepare("DELETE FROM `##message` WHERE user_id = :user_id AND message_id = :message_id"); + case 'delete': + $stmt = Database::prepare("DELETE FROM `##message` WHERE user_id = :user_id AND message_id = :message_id"); - foreach (Filter::postArray('message_id') as $id) { - $stmt->execute([ - 'message_id' => $id, - 'user_id' => Auth::id(), - ]); - } + foreach (Filter::postArray('message_id') as $id) { + $stmt->execute([ + 'message_id' => $id, + 'user_id' => Auth::id(), + ]); + } } $ged = Filter::post('ged'); diff --git a/app/Module/YahrzeitModule.php b/app/Module/YahrzeitModule.php index de17d2a26b..3cb3059bf2 100644 --- a/app/Module/YahrzeitModule.php +++ b/app/Module/YahrzeitModule.php @@ -110,23 +110,23 @@ class YahrzeitModule extends AbstractModule implements ModuleBlockInterface { } switch ($infoStyle) { - case 'list': - foreach ($yahrzeits as $yahrzeit) { - if ($yahrzeit->jd >= $startjd && $yahrzeit->jd < $startjd + $days) { - $ind = $yahrzeit->getParent(); - $content .= '<a href="' . $ind->getHtmlUrl() . '" class="list_item name2">' . $ind->getFullName() . '</a>' . $ind->getSexImage(); - $content .= '<div class="indent">'; - $content .= $yahrzeit->getDate()->display(true); - $content .= ', ' . I18N::translate('%s year anniversary', $yahrzeit->anniv); - $content .= '</div>'; + case 'list': + foreach ($yahrzeits as $yahrzeit) { + if ($yahrzeit->jd >= $startjd && $yahrzeit->jd < $startjd + $days) { + $ind = $yahrzeit->getParent(); + $content .= '<a href="' . $ind->getHtmlUrl() . '" class="list_item name2">' . $ind->getFullName() . '</a>' . $ind->getSexImage(); + $content .= '<div class="indent">'; + $content .= $yahrzeit->getDate()->display(true); + $content .= ', ' . I18N::translate('%s year anniversary', $yahrzeit->anniv); + $content .= '</div>'; + } } - } - break; - case 'table': - default: - $table_id = Uuid::uuid4(); // table requires a unique ID - $controller - ->addInlineJavascript(' + break; + case 'table': + default: + $table_id = Uuid::uuid4(); // table requires a unique ID + $controller + ->addInlineJavascript(' $("#' . $table_id . '").dataTable({ dom: \'t\', ' . I18N::datatablesI18N() . ', @@ -148,52 +148,52 @@ class YahrzeitModule extends AbstractModule implements ModuleBlockInterface { }); $("#' . $table_id . '").css("visibility", "visible"); '); - $content = ''; - $content .= '<table id="' . $table_id . '" class="width100" style="visibility:hidden;">'; - $content .= '<thead><tr>'; - $content .= '<th>' . GedcomTag::getLabel('NAME') . '</th>'; - $content .= '<th>' . GedcomTag::getLabel('NAME') . '</th>'; - $content .= '<th>' . I18N::translate('Death') . '</th>'; - $content .= '<th>DEAT</th>'; - $content .= '<th><i class="icon-reminder" title="' . I18N::translate('Anniversary') . '"></i></th>'; - $content .= '<th>' . GedcomTag::getLabel('_YART') . '</th>'; - $content .= '<th>_YART</th>'; - $content .= '</tr></thead><tbody>'; + $content = ''; + $content .= '<table id="' . $table_id . '" class="width100" style="visibility:hidden;">'; + $content .= '<thead><tr>'; + $content .= '<th>' . GedcomTag::getLabel('NAME') . '</th>'; + $content .= '<th>' . GedcomTag::getLabel('NAME') . '</th>'; + $content .= '<th>' . I18N::translate('Death') . '</th>'; + $content .= '<th>DEAT</th>'; + $content .= '<th><i class="icon-reminder" title="' . I18N::translate('Anniversary') . '"></i></th>'; + $content .= '<th>' . GedcomTag::getLabel('_YART') . '</th>'; + $content .= '<th>_YART</th>'; + $content .= '</tr></thead><tbody>'; - foreach ($yahrzeits as $yahrzeit) { - if ($yahrzeit->jd >= $startjd && $yahrzeit->jd < $startjd + $days) { - $content .= '<tr>'; - $ind = $yahrzeit->getParent(); - // Individual name(s) - $name = $ind->getFullName(); - $url = $ind->getHtmlUrl(); - $content .= '<td>'; - $content .= '<a href="' . $url . '">' . $name . '</a>'; - $content .= $ind->getSexImage(); - $addname = $ind->getAddName(); - if ($addname) { - $content .= '<br><a href="' . $url . '">' . $addname . '</a>'; - } - $content .= '</td>'; - $content .= '<td>' . $ind->getSortName() . '</td>'; + foreach ($yahrzeits as $yahrzeit) { + if ($yahrzeit->jd >= $startjd && $yahrzeit->jd < $startjd + $days) { + $content .= '<tr>'; + $ind = $yahrzeit->getParent(); + // Individual name(s) + $name = $ind->getFullName(); + $url = $ind->getHtmlUrl(); + $content .= '<td>'; + $content .= '<a href="' . $url . '">' . $name . '</a>'; + $content .= $ind->getSexImage(); + $addname = $ind->getAddName(); + if ($addname) { + $content .= '<br><a href="' . $url . '">' . $addname . '</a>'; + } + $content .= '</td>'; + $content .= '<td>' . $ind->getSortName() . '</td>'; - // death/yahrzeit event date - $content .= '<td>' . $yahrzeit->getDate()->display() . '</td>'; - $content .= '<td>' . $yahrzeit->getDate()->julianDay() . '</td>'; // sortable date + // death/yahrzeit event date + $content .= '<td>' . $yahrzeit->getDate()->display() . '</td>'; + $content .= '<td>' . $yahrzeit->getDate()->julianDay() . '</td>'; // sortable date - // Anniversary - $content .= '<td>' . $yahrzeit->anniv . '</td>'; + // Anniversary + $content .= '<td>' . $yahrzeit->anniv . '</td>'; - // upcomming yahrzeit dates - switch ($calendar) { - case 'gregorian': - $today = new GregorianDate($yahrzeit->jd); - break; - case 'jewish': - default: - $today = new JewishDate($yahrzeit->jd); - break; - } + // upcomming yahrzeit dates + switch ($calendar) { + case 'gregorian': + $today = new GregorianDate($yahrzeit->jd); + break; + case 'jewish': + default: + $today = new JewishDate($yahrzeit->jd); + break; + } $td = new Date($today->format('%@ %A %O %E')); $content .= '<td>' . $td->display() . '</td>'; $content .= '<td>' . $td->julianDay() . '</td>'; // sortable date diff --git a/app/Note.php b/app/Note.php index d420bb0c66..88830cff9a 100644 --- a/app/Note.php +++ b/app/Note.php @@ -97,11 +97,11 @@ class Note extends GedcomRecord { if ($text) { switch ($this->getTree()->getPreference('FORMAT_TEXT')) { - case 'markdown': - $text = Filter::markdown($text, $this->getTree()); - $text = strip_tags($text); - $text = html_entity_decode($text, ENT_QUOTES, 'UTF-8'); - break; + case 'markdown': + $text = Filter::markdown($text, $this->getTree()); + $text = strip_tags($text); + $text = html_entity_decode($text, ENT_QUOTES, 'UTF-8'); + break; } list($text) = explode("\n", $text); diff --git a/app/Query/QueryMedia.php b/app/Query/QueryMedia.php index 84ae9d3cfc..cb8b5c74c0 100644 --- a/app/Query/QueryMedia.php +++ b/app/Query/QueryMedia.php @@ -107,17 +107,17 @@ class QueryMedia { // Include / exclude subfolders (but always include external) switch ($subfolders) { - case 'include': - $sql .= " AND (multimedia_file_refn LIKE CONCAT(?, '%') $sql_external)"; - $args[] = Database::escapeLike($folder); - break; - case 'exclude': - $sql .= " AND (multimedia_file_refn LIKE CONCAT(?, '%') AND multimedia_file_refn NOT LIKE CONCAT(?, '%/%') $sql_external)"; - $args[] = Database::escapeLike($folder); - $args[] = Database::escapeLike($folder); - break; - default: - throw new \Exception('Bad argument (subfolders=' . $subfolders . ') in QueryMedia::mediaList()'); + case 'include': + $sql .= " AND (multimedia_file_refn LIKE CONCAT(?, '%') $sql_external)"; + $args[] = Database::escapeLike($folder); + break; + case 'exclude': + $sql .= " AND (multimedia_file_refn LIKE CONCAT(?, '%') AND multimedia_file_refn NOT LIKE CONCAT(?, '%/%') $sql_external)"; + $args[] = Database::escapeLike($folder); + $args[] = Database::escapeLike($folder); + break; + default: + throw new \Exception('Bad argument (subfolders=' . $subfolders . ') in QueryMedia::mediaList()'); } // Apply search terms @@ -133,14 +133,14 @@ class QueryMedia { } switch ($sort) { - case 'file': - $sql .= " ORDER BY multimedia_file_refn"; - break; - case 'title': - $sql .= " ORDER BY descriptive_title"; - break; - default: - throw new \Exception('Bad argument (sort=' . $sort . ') in QueryMedia::mediaList()'); + case 'file': + $sql .= " ORDER BY multimedia_file_refn"; + break; + case 'title': + $sql .= " ORDER BY descriptive_title"; + break; + default: + throw new \Exception('Bad argument (sort=' . $sort . ') in QueryMedia::mediaList()'); } $rows = Database::prepare($sql)->execute($args)->fetchAll(); diff --git a/app/Query/QueryName.php b/app/Query/QueryName.php index a717e9a1d5..812c89eaef 100644 --- a/app/Query/QueryName.php +++ b/app/Query/QueryName.php @@ -34,85 +34,85 @@ class QueryName { */ private static function getAlphabetForLocale($locale) { switch ($locale) { - case 'ar': - return [ - 'ا', 'ب', 'ت', 'ث', 'ج', 'ح', 'خ', 'د', 'ذ', 'ر', 'ز', 'س', 'ش', 'ص', 'ض', 'ط', 'ظ', 'ع', 'غ', 'ف', 'ق', 'ك', 'ل', 'م', 'ن', 'ه', 'و', 'ي', 'آ', 'ة', 'ى', 'ی', - ]; - case 'cs': - return [ - 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'CH', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', - ]; - case 'da': - case 'nb': - case 'nn': - return [ - 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'Æ', 'Ø', 'Å', - ]; - case 'el': - return [ - 'Α', 'Β', 'Γ', 'Δ', 'Ε', 'Ζ', 'Η', 'Θ', 'Ι', 'Κ', 'Λ', 'Μ', 'Ν', 'Ξ', 'Ο', 'Π', 'Ρ', 'Σ', 'Τ', 'Υ', 'Φ', 'Χ', 'Ψ', 'Ω', - ]; - case 'es': - return [ - 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'Ñ', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', - ]; - case 'et': - return [ - 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'Š', 'Z', 'Ž', 'T', 'U', 'V', 'W', 'Õ', 'Ä', 'Ö', 'Ü', 'X', 'Y', - ]; - case 'fi': - case 'sv': - return [ - 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'Å', 'Ä', 'Ö', - ]; - case 'he': - return [ - 'א', 'ב', 'ג', 'ד', 'ה', 'ו', 'ז', 'ח', 'ט', 'י', 'כ', 'ל', 'מ', 'נ', 'ס', 'ע', 'פ', 'צ', 'ק', 'ר', 'ש', 'ת', - ]; - case 'hu': - return [ - 'A', 'B', 'C', 'CS', 'D', 'DZ', 'DZS', 'E', 'F', 'G', 'GY', 'H', 'I', 'J', 'K', 'L', 'LY', 'M', 'N', 'NY', 'O', 'Ö', 'P', 'Q', 'R', 'S', 'SZ', 'T', 'TY', 'U', 'Ü', 'V', 'W', 'X', 'Y', 'Z', 'ZS', - ]; - case 'lt': - return [ - 'A', 'Ą', 'B', 'C', 'Č', 'D', 'E', 'Ę', 'Ė', 'F', 'G', 'H', 'I', 'Y', 'Į', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'R', 'S', 'Š', 'T', 'U', 'Ų', 'Ū', 'V', 'Z', 'Ž', - ]; - case 'nl': - return [ - 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'IJ', - ]; - case 'pl': - return [ - 'A', 'B', 'C', 'Ć', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'Ł', 'M', 'N', 'O', 'Ó', 'P', 'Q', 'R', 'S', 'Ś', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'Ź', 'Ż', - ]; - case 'ro': - return [ - 'A', 'Ă', 'Â', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'Î', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'Ş', 'T', 'Ţ', 'U', 'V', 'W', 'X', 'Y', 'Z', - ]; - case 'ru': - return [ - 'А', 'Б', 'В', 'Г', 'Д', 'Е', 'Ё', 'Ж', 'З', 'И', 'Й', 'К', 'Л', 'М', 'Н', 'О', 'П', 'Р', 'С', 'Т', 'У', 'Ф', 'Х', 'Ц', 'Ч', 'Ш', 'Щ', 'Ъ', 'Ы', 'Ь', 'Э', 'Ю', 'Я', - ]; - case 'sk': - return [ - 'A', 'Á', 'Ä', 'B', 'C', 'Č', 'D', 'Ď', 'E', 'É', 'F', 'G', 'H', 'I', 'Í', 'J', 'K', 'L', 'Ľ', 'Ĺ', 'M', 'N', 'Ň', 'O', 'Ó', 'Ô', 'P', 'Q', 'R', 'Ŕ', 'S', 'Š', 'T', 'Ť', 'U', 'Ú', 'V', 'W', 'X', 'Y', 'Ý', 'Z', 'Ž', - ]; - case 'sl': - return [ - 'A', 'B', 'C', 'Č', 'Ć', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'Š', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'Ž', - ]; - case 'sr': - return [ - 'A', 'B', 'C', 'Č', 'Ć', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'Š', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'Ž', - ]; - case 'tr': - return [ - 'A', 'B', 'C', 'Ç', 'D', 'E', 'F', 'G', 'Ğ', 'H', 'I', 'İ', 'J', 'K', 'L', 'M', 'N', 'O', 'Ö', 'P', 'R', 'S', 'Ş', 'T', 'U', 'Ü', 'V', 'Y', 'Z', - ]; - default: - return [ - 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', - ]; + case 'ar': + return [ + 'ا', 'ب', 'ت', 'ث', 'ج', 'ح', 'خ', 'د', 'ذ', 'ر', 'ز', 'س', 'ش', 'ص', 'ض', 'ط', 'ظ', 'ع', 'غ', 'ف', 'ق', 'ك', 'ل', 'م', 'ن', 'ه', 'و', 'ي', 'آ', 'ة', 'ى', 'ی', + ]; + case 'cs': + return [ + 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'CH', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', + ]; + case 'da': + case 'nb': + case 'nn': + return [ + 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'Æ', 'Ø', 'Å', + ]; + case 'el': + return [ + 'Α', 'Β', 'Γ', 'Δ', 'Ε', 'Ζ', 'Η', 'Θ', 'Ι', 'Κ', 'Λ', 'Μ', 'Ν', 'Ξ', 'Ο', 'Π', 'Ρ', 'Σ', 'Τ', 'Υ', 'Φ', 'Χ', 'Ψ', 'Ω', + ]; + case 'es': + return [ + 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'Ñ', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', + ]; + case 'et': + return [ + 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'Š', 'Z', 'Ž', 'T', 'U', 'V', 'W', 'Õ', 'Ä', 'Ö', 'Ü', 'X', 'Y', + ]; + case 'fi': + case 'sv': + return [ + 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'Å', 'Ä', 'Ö', + ]; + case 'he': + return [ + 'א', 'ב', 'ג', 'ד', 'ה', 'ו', 'ז', 'ח', 'ט', 'י', 'כ', 'ל', 'מ', 'נ', 'ס', 'ע', 'פ', 'צ', 'ק', 'ר', 'ש', 'ת', + ]; + case 'hu': + return [ + 'A', 'B', 'C', 'CS', 'D', 'DZ', 'DZS', 'E', 'F', 'G', 'GY', 'H', 'I', 'J', 'K', 'L', 'LY', 'M', 'N', 'NY', 'O', 'Ö', 'P', 'Q', 'R', 'S', 'SZ', 'T', 'TY', 'U', 'Ü', 'V', 'W', 'X', 'Y', 'Z', 'ZS', + ]; + case 'lt': + return [ + 'A', 'Ą', 'B', 'C', 'Č', 'D', 'E', 'Ę', 'Ė', 'F', 'G', 'H', 'I', 'Y', 'Į', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'R', 'S', 'Š', 'T', 'U', 'Ų', 'Ū', 'V', 'Z', 'Ž', + ]; + case 'nl': + return [ + 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'IJ', + ]; + case 'pl': + return [ + 'A', 'B', 'C', 'Ć', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'Ł', 'M', 'N', 'O', 'Ó', 'P', 'Q', 'R', 'S', 'Ś', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'Ź', 'Ż', + ]; + case 'ro': + return [ + 'A', 'Ă', 'Â', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'Î', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'Ş', 'T', 'Ţ', 'U', 'V', 'W', 'X', 'Y', 'Z', + ]; + case 'ru': + return [ + 'А', 'Б', 'В', 'Г', 'Д', 'Е', 'Ё', 'Ж', 'З', 'И', 'Й', 'К', 'Л', 'М', 'Н', 'О', 'П', 'Р', 'С', 'Т', 'У', 'Ф', 'Х', 'Ц', 'Ч', 'Ш', 'Щ', 'Ъ', 'Ы', 'Ь', 'Э', 'Ю', 'Я', + ]; + case 'sk': + return [ + 'A', 'Á', 'Ä', 'B', 'C', 'Č', 'D', 'Ď', 'E', 'É', 'F', 'G', 'H', 'I', 'Í', 'J', 'K', 'L', 'Ľ', 'Ĺ', 'M', 'N', 'Ň', 'O', 'Ó', 'Ô', 'P', 'Q', 'R', 'Ŕ', 'S', 'Š', 'T', 'Ť', 'U', 'Ú', 'V', 'W', 'X', 'Y', 'Ý', 'Z', 'Ž', + ]; + case 'sl': + return [ + 'A', 'B', 'C', 'Č', 'Ć', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'Š', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'Ž', + ]; + case 'sr': + return [ + 'A', 'B', 'C', 'Č', 'Ć', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'Š', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'Ž', + ]; + case 'tr': + return [ + 'A', 'B', 'C', 'Ç', 'D', 'E', 'F', 'G', 'Ğ', 'H', 'I', 'İ', 'J', 'K', 'L', 'M', 'N', 'O', 'Ö', 'P', 'R', 'S', 'Ş', 'T', 'U', 'Ü', 'V', 'Y', 'Z', + ]; + default: + return [ + 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', + ]; } } @@ -126,44 +126,44 @@ class QueryName { public static function initialLetter($name) { $name = I18N::strtoupper($name); switch (WT_LOCALE) { - case 'cs': - if (substr($name, 0, 2) == 'CH') { - return 'CH'; - } - break; - case 'da': - case 'nb': - case 'nn': - if (substr($name, 0, 2) == 'AA') { - return 'Å'; - } - break; - case 'hu': - if (substr($name, 0, 2) == 'CS') { - return 'CS'; - } elseif (substr($name, 0, 3) == 'DZS') { - return 'DZS'; - } elseif (substr($name, 0, 2) == 'DZ') { - return 'DZ'; - } elseif (substr($name, 0, 2) == 'GY') { - return 'GY'; - } elseif (substr($name, 0, 2) == 'LY') { - return 'LY'; - } elseif (substr($name, 0, 2) == 'NY') { - return 'NY'; - } elseif (substr($name, 0, 2) == 'SZ') { - return 'SZ'; - } elseif (substr($name, 0, 2) == 'TY') { - return 'TY'; - } elseif (substr($name, 0, 2) == 'ZS') { - return 'ZS'; - } - break; - case 'nl': - if (substr($name, 0, 2) == 'IJ') { - return 'IJ'; - } - break; + case 'cs': + if (substr($name, 0, 2) == 'CH') { + return 'CH'; + } + break; + case 'da': + case 'nb': + case 'nn': + if (substr($name, 0, 2) == 'AA') { + return 'Å'; + } + break; + case 'hu': + if (substr($name, 0, 2) == 'CS') { + return 'CS'; + } elseif (substr($name, 0, 3) == 'DZS') { + return 'DZS'; + } elseif (substr($name, 0, 2) == 'DZ') { + return 'DZ'; + } elseif (substr($name, 0, 2) == 'GY') { + return 'GY'; + } elseif (substr($name, 0, 2) == 'LY') { + return 'LY'; + } elseif (substr($name, 0, 2) == 'NY') { + return 'NY'; + } elseif (substr($name, 0, 2) == 'SZ') { + return 'SZ'; + } elseif (substr($name, 0, 2) == 'TY') { + return 'TY'; + } elseif (substr($name, 0, 2) == 'ZS') { + return 'ZS'; + } + break; + case 'nl': + if (substr($name, 0, 2) == 'IJ') { + return 'IJ'; + } + break; } // No special rules - just take the first character return mb_substr($name, 0, 1); @@ -191,37 +191,37 @@ class QueryName { */ private static function getInitialSql($field, $letter) { switch (WT_LOCALE) { - case 'cs': - switch ($letter) { - case 'C': return $field . " LIKE 'C%' COLLATE " . I18N::collation() . " AND " . $field . " NOT LIKE 'CH%' COLLATE " . I18N::collation(); - } + case 'cs': + switch ($letter) { + case 'C': return $field . " LIKE 'C%' COLLATE " . I18N::collation() . " AND " . $field . " NOT LIKE 'CH%' COLLATE " . I18N::collation(); + } break; - case 'da': - case 'nb': - case 'nn': - switch ($letter) { - // AA gets listed under Å - case 'A': return $field . " LIKE 'A%' COLLATE " . I18N::collation() . " AND " . $field . " NOT LIKE 'AA%' COLLATE " . I18N::collation(); - case 'Å': return "(" . $field . " LIKE 'Å%' COLLATE " . I18N::collation() . " OR " . $field . " LIKE 'AA%' COLLATE " . I18N::collation() . ")"; - } + case 'da': + case 'nb': + case 'nn': + switch ($letter) { + // AA gets listed under Å + case 'A': return $field . " LIKE 'A%' COLLATE " . I18N::collation() . " AND " . $field . " NOT LIKE 'AA%' COLLATE " . I18N::collation(); + case 'Å': return "(" . $field . " LIKE 'Å%' COLLATE " . I18N::collation() . " OR " . $field . " LIKE 'AA%' COLLATE " . I18N::collation() . ")"; + } break; - case 'hu': - switch ($letter) { - case 'C': return $field . " LIKE 'C%' COLLATE " . I18N::collation() . " AND " . $field . " NOT LIKE 'CS%' COLLATE " . I18N::collation(); - case 'D': return $field . " LIKE 'D%' COLLATE " . I18N::collation() . " AND " . $field . " NOT LIKE 'DZ%' COLLATE " . I18N::collation(); - case 'DZ': return $field . " LIKE 'DZ%' COLLATE " . I18N::collation() . " AND " . $field . " NOT LIKE 'DZS%' COLLATE " . I18N::collation(); - case 'G': return $field . " LIKE 'G%' COLLATE " . I18N::collation() . " AND " . $field . " NOT LIKE 'GY%' COLLATE " . I18N::collation(); - case 'L': return $field . " LIKE 'L%' COLLATE " . I18N::collation() . " AND " . $field . " NOT LIKE 'LY%' COLLATE " . I18N::collation(); - case 'N': return $field . " LIKE 'N%' COLLATE " . I18N::collation() . " AND " . $field . " NOT LIKE 'NY%' COLLATE " . I18N::collation(); - case 'S': return $field . " LIKE 'S%' COLLATE " . I18N::collation() . " AND " . $field . " NOT LIKE 'SZ%' COLLATE " . I18N::collation(); - case 'T': return $field . " LIKE 'T%' COLLATE " . I18N::collation() . " AND " . $field . " NOT LIKE 'TY%' COLLATE " . I18N::collation(); - case 'Z': return $field . " LIKE 'Z%' COLLATE " . I18N::collation() . " AND " . $field . " NOT LIKE 'ZS%' COLLATE " . I18N::collation(); - } + case 'hu': + switch ($letter) { + case 'C': return $field . " LIKE 'C%' COLLATE " . I18N::collation() . " AND " . $field . " NOT LIKE 'CS%' COLLATE " . I18N::collation(); + case 'D': return $field . " LIKE 'D%' COLLATE " . I18N::collation() . " AND " . $field . " NOT LIKE 'DZ%' COLLATE " . I18N::collation(); + case 'DZ': return $field . " LIKE 'DZ%' COLLATE " . I18N::collation() . " AND " . $field . " NOT LIKE 'DZS%' COLLATE " . I18N::collation(); + case 'G': return $field . " LIKE 'G%' COLLATE " . I18N::collation() . " AND " . $field . " NOT LIKE 'GY%' COLLATE " . I18N::collation(); + case 'L': return $field . " LIKE 'L%' COLLATE " . I18N::collation() . " AND " . $field . " NOT LIKE 'LY%' COLLATE " . I18N::collation(); + case 'N': return $field . " LIKE 'N%' COLLATE " . I18N::collation() . " AND " . $field . " NOT LIKE 'NY%' COLLATE " . I18N::collation(); + case 'S': return $field . " LIKE 'S%' COLLATE " . I18N::collation() . " AND " . $field . " NOT LIKE 'SZ%' COLLATE " . I18N::collation(); + case 'T': return $field . " LIKE 'T%' COLLATE " . I18N::collation() . " AND " . $field . " NOT LIKE 'TY%' COLLATE " . I18N::collation(); + case 'Z': return $field . " LIKE 'Z%' COLLATE " . I18N::collation() . " AND " . $field . " NOT LIKE 'ZS%' COLLATE " . I18N::collation(); + } break; - case 'nl': - switch ($letter) { - case 'I': return $field . " LIKE 'I%' COLLATE " . I18N::collation() . " AND " . $field . " NOT LIKE 'IJ%' COLLATE " . I18N::collation(); - } + case 'nl': + switch ($letter) { + case 'I': return $field . " LIKE 'I%' COLLATE " . I18N::collation() . " AND " . $field . " NOT LIKE 'IJ%' COLLATE " . I18N::collation(); + } break; } diff --git a/app/Report/ReportBase.php b/app/Report/ReportBase.php index 32fef4aabf..0f4d26b844 100644 --- a/app/Report/ReportBase.php +++ b/app/Report/ReportBase.php @@ -139,258 +139,258 @@ class ReportBase { */ switch ($this->pageFormat) { // ISO A series - case '4A0': // ISO 216, 1682 mm x 2378 mm - $sizes = [4767.86, 6740.79]; - break; - case '2A0': // ISO 216, 1189 mm x 1682 mm - $sizes = [3370.39, 4767.86]; - break; - case 'A0': // ISO 216, 841 mm x 1189mm - $sizes = [2383.94, 3370.39]; - break; - case 'A1': // ISO 216, 594 mm x 841 mm - $sizes = [1683.78, 2383.94]; - break; - case 'A2': // ISO 216, 420 mm x 594 mm - $sizes = [1190.55, 1683.78]; - break; - case 'A3': // ISO 216, 297 mm x 420 mm - $sizes = [841.89, 1190.55]; - break; - case 'A4': // ISO 216, 210 mm 297 mm - $sizes = [595.28, 841.89]; - break; - case 'A5': // ISO 216, 148 mm x 210 mm - $sizes = [419.53, 595.28]; - break; - case 'A6': // ISO 216, 105 mm x 148 mm - $sizes = [297.64, 419.53]; - break; - case 'A7': // ISO 216, 74 mm x 105 mm - $sizes = [209.76, 297.64]; - break; - case 'A8': // ISO 216, 52 mm x 74 mm - $sizes = [147.40, 209.76]; - break; - case 'A9': // ISO 216, 37 mm x 52 mm - $sizes = [104.88, 147.40]; - break; - case 'A10': // ISO 216, 26 mm x 37 mm - $sizes = [73.70, 104.88]; - break; + case '4A0': // ISO 216, 1682 mm x 2378 mm + $sizes = [4767.86, 6740.79]; + break; + case '2A0': // ISO 216, 1189 mm x 1682 mm + $sizes = [3370.39, 4767.86]; + break; + case 'A0': // ISO 216, 841 mm x 1189mm + $sizes = [2383.94, 3370.39]; + break; + case 'A1': // ISO 216, 594 mm x 841 mm + $sizes = [1683.78, 2383.94]; + break; + case 'A2': // ISO 216, 420 mm x 594 mm + $sizes = [1190.55, 1683.78]; + break; + case 'A3': // ISO 216, 297 mm x 420 mm + $sizes = [841.89, 1190.55]; + break; + case 'A4': // ISO 216, 210 mm 297 mm + $sizes = [595.28, 841.89]; + break; + case 'A5': // ISO 216, 148 mm x 210 mm + $sizes = [419.53, 595.28]; + break; + case 'A6': // ISO 216, 105 mm x 148 mm + $sizes = [297.64, 419.53]; + break; + case 'A7': // ISO 216, 74 mm x 105 mm + $sizes = [209.76, 297.64]; + break; + case 'A8': // ISO 216, 52 mm x 74 mm + $sizes = [147.40, 209.76]; + break; + case 'A9': // ISO 216, 37 mm x 52 mm + $sizes = [104.88, 147.40]; + break; + case 'A10': // ISO 216, 26 mm x 37 mm + $sizes = [73.70, 104.88]; + break; - // ISO B series - case 'B0': // ISO 216, 1000 mm x 1414 mm - $sizes = [2834.65, 4008.19]; - break; - case 'B1': // ISO 216, 707 mm x 1000 mm - $sizes = [2004.09, 2834.65]; - break; - case 'B2': // ISO 216, 500 mm x 707 mm - $sizes = [1417.32, 2004.09]; - break; - case 'B3': // ISO 216, 353 mm x 500 mm - $sizes = [1000.63, 1417.32]; - break; - case 'B4': // ISO 216, 250 mm x 353 mm - $sizes = [708.66, 1000.63]; - break; - case 'B5': // ISO 216, 176 mm x 250 mm - $sizes = [498.90, 708.66]; - break; - case 'B6': // ISO 216, 125 mm x 176 mm - $sizes = [354.33, 498.90]; - break; - case 'B7': // ISO 216, 88 mm x 125 mm - $sizes = [249.45, 354.33]; - break; - case 'B8': // ISO 216, 62 mm x 88 mm - $sizes = [175.75, 249.45]; - break; - case 'B9': // ISO 216, 44 mm x 62 mm - $sizes = [124.72, 175.75]; - break; - case 'B10': // ISO 216, 31 mm x 44 mm - $sizes = [87.87, 124.72]; - break; + // ISO B series + case 'B0': // ISO 216, 1000 mm x 1414 mm + $sizes = [2834.65, 4008.19]; + break; + case 'B1': // ISO 216, 707 mm x 1000 mm + $sizes = [2004.09, 2834.65]; + break; + case 'B2': // ISO 216, 500 mm x 707 mm + $sizes = [1417.32, 2004.09]; + break; + case 'B3': // ISO 216, 353 mm x 500 mm + $sizes = [1000.63, 1417.32]; + break; + case 'B4': // ISO 216, 250 mm x 353 mm + $sizes = [708.66, 1000.63]; + break; + case 'B5': // ISO 216, 176 mm x 250 mm + $sizes = [498.90, 708.66]; + break; + case 'B6': // ISO 216, 125 mm x 176 mm + $sizes = [354.33, 498.90]; + break; + case 'B7': // ISO 216, 88 mm x 125 mm + $sizes = [249.45, 354.33]; + break; + case 'B8': // ISO 216, 62 mm x 88 mm + $sizes = [175.75, 249.45]; + break; + case 'B9': // ISO 216, 44 mm x 62 mm + $sizes = [124.72, 175.75]; + break; + case 'B10': // ISO 216, 31 mm x 44 mm + $sizes = [87.87, 124.72]; + break; - // ISO C series, Envelope - case 'C0': // ISO 269, 917 mm x 1297 mm, For flat A0 sheet - $sizes = [2599.37, 3676.54]; - break; - case 'C1': // ISO 269, 648 mm x 917 mm, For flat A1 sheet - $sizes = [1836.85, 2599.37]; - break; - case 'C2': // ISO 269, 458 mm x 648 mm, For flat A2 sheet, A1 folded in half - $sizes = [1298.27, 1836.85]; - break; - case 'C3': // ISO 269, 324 mm x 458 mm, For flat A3 sheet, A2 folded in half - $sizes = [918.43, 1298.27]; - break; - case 'C4': // ISO 269, 229 mm x 324 mm, For flat A4 sheet, A3 folded in half - $sizes = [649.13, 918.43]; - break; - case 'C5': // ISO 269, 162 mm x 229 mm, For flat A5 sheet, A4 folded in half - $sizes = [459.21, 649.13]; - break; - case 'C6/5': // ISO 269, 114 mm x 229 mm. A5 folded twice = 1/3 A4. Alternative for the DL envelope - $sizes = [323.15, 649.13]; - break; - case 'C6': // ISO 269, 114 mm x 162 mm, For A5 folded in half - $sizes = [323.15, 459.21]; - break; - case 'C7/6': // ISO 269, 81 mm x 162 mm, For A5 sheet folded in thirds - $sizes = [229.61, 459.21]; - break; - case 'C7': // ISO 269, 81 mm x 114 mm, For A5 folded in quarters - $sizes = [229.61, 323.15]; - break; - case 'C8': // ISO 269, 57 mm x 81 mm - $sizes = [161.57, 229.61]; - break; - case 'C9': // ISO 269, 40 mm x 57 mm - $sizes = [113.39, 161.57]; - break; - case 'C10': // ISO 269, 28 mm x 40 mm - $sizes = [79.37, 113.39]; - break; - case 'DL': // Original DIN 678 but ISO 269 now has this C6/5 , 110 mm x 220 mm, For A4 sheet folded in thirds, A5 in half - $sizes = [311.81, 623.62]; - break; + // ISO C series, Envelope + case 'C0': // ISO 269, 917 mm x 1297 mm, For flat A0 sheet + $sizes = [2599.37, 3676.54]; + break; + case 'C1': // ISO 269, 648 mm x 917 mm, For flat A1 sheet + $sizes = [1836.85, 2599.37]; + break; + case 'C2': // ISO 269, 458 mm x 648 mm, For flat A2 sheet, A1 folded in half + $sizes = [1298.27, 1836.85]; + break; + case 'C3': // ISO 269, 324 mm x 458 mm, For flat A3 sheet, A2 folded in half + $sizes = [918.43, 1298.27]; + break; + case 'C4': // ISO 269, 229 mm x 324 mm, For flat A4 sheet, A3 folded in half + $sizes = [649.13, 918.43]; + break; + case 'C5': // ISO 269, 162 mm x 229 mm, For flat A5 sheet, A4 folded in half + $sizes = [459.21, 649.13]; + break; + case 'C6/5': // ISO 269, 114 mm x 229 mm. A5 folded twice = 1/3 A4. Alternative for the DL envelope + $sizes = [323.15, 649.13]; + break; + case 'C6': // ISO 269, 114 mm x 162 mm, For A5 folded in half + $sizes = [323.15, 459.21]; + break; + case 'C7/6': // ISO 269, 81 mm x 162 mm, For A5 sheet folded in thirds + $sizes = [229.61, 459.21]; + break; + case 'C7': // ISO 269, 81 mm x 114 mm, For A5 folded in quarters + $sizes = [229.61, 323.15]; + break; + case 'C8': // ISO 269, 57 mm x 81 mm + $sizes = [161.57, 229.61]; + break; + case 'C9': // ISO 269, 40 mm x 57 mm + $sizes = [113.39, 161.57]; + break; + case 'C10': // ISO 269, 28 mm x 40 mm + $sizes = [79.37, 113.39]; + break; + case 'DL': // Original DIN 678 but ISO 269 now has this C6/5 , 110 mm x 220 mm, For A4 sheet folded in thirds, A5 in half + $sizes = [311.81, 623.62]; + break; - // Untrimmed stock sizes for the ISO-A Series - ISO primary range - case 'RA0': // ISO 478, 860 mm x 1220 mm - $sizes = [2437.80, 3458.27]; - break; - case 'RA1': // ISO 478, 610 mm x 860 mm - $sizes = [1729.13, 2437.80]; - break; - case 'RA2': // ISO 478, 430 mm x 610 mm - $sizes = [1218.90, 1729.13]; - break; - case 'RA3': // ISO 478, 305 mm x 430 mm - $sizes = [864.57, 1218.90]; - break; - case 'RA4': // ISO 478, 215 mm x 305 mm - $sizes = [609.45, 864.57]; - break; + // Untrimmed stock sizes for the ISO-A Series - ISO primary range + case 'RA0': // ISO 478, 860 mm x 1220 mm + $sizes = [2437.80, 3458.27]; + break; + case 'RA1': // ISO 478, 610 mm x 860 mm + $sizes = [1729.13, 2437.80]; + break; + case 'RA2': // ISO 478, 430 mm x 610 mm + $sizes = [1218.90, 1729.13]; + break; + case 'RA3': // ISO 478, 305 mm x 430 mm + $sizes = [864.57, 1218.90]; + break; + case 'RA4': // ISO 478, 215 mm x 305 mm + $sizes = [609.45, 864.57]; + break; - // Untrimmed stock sizes for the ISO-A Series - ISO supplementary range - case 'SRA0': // ISO 593, 900 mm x 1280 mm - $sizes = [2551.18, 3628.35]; - break; - case 'SRA1': // ISO 593, 640 mm x 900 mm - $sizes = [1814.17, 2551.18]; - break; - case 'SRA2': // ISO 593, 450 mm x 640 mm - $sizes = [1275.59, 1814.17]; - break; - case 'SRA3': // ISO 593, 320 mm x 450 mm - $sizes = [907.09, 1275.59]; - break; - case 'SRA4': // ISO 593, 225 mm x 320 mm - $sizes = [637.80, 907.09]; - break; + // Untrimmed stock sizes for the ISO-A Series - ISO supplementary range + case 'SRA0': // ISO 593, 900 mm x 1280 mm + $sizes = [2551.18, 3628.35]; + break; + case 'SRA1': // ISO 593, 640 mm x 900 mm + $sizes = [1814.17, 2551.18]; + break; + case 'SRA2': // ISO 593, 450 mm x 640 mm + $sizes = [1275.59, 1814.17]; + break; + case 'SRA3': // ISO 593, 320 mm x 450 mm + $sizes = [907.09, 1275.59]; + break; + case 'SRA4': // ISO 593, 225 mm x 320 mm + $sizes = [637.80, 907.09]; + break; - // ISO size variations - case 'A2EXTRA': // ISO 216, 445 mm x 619 mm - $sizes = [1261.42, 1754.65]; - break; - case 'A2SUPER': // ISO 216, 305 mm x 508 mm - $sizes = [864.57, 1440.00]; - break; - case 'A3EXTRA': // ISO 216, 322 mm x 445 mm - $sizes = [912.76, 1261.42]; - break; - case 'SUPERA3': // ISO 216, 305 mm x 487 mm - $sizes = [864.57, 1380.47]; - break; - case 'A4EXTRA': // ISO 216, 235 mm x 322 mm - $sizes = [666.14, 912.76]; - break; - case 'A4LONG': // ISO 216, 210 mm x 348 mm - $sizes = [595.28, 986.46]; - break; - case 'A4SUPER': // ISO 216, 229 mm x 322 mm - $sizes = [649.13, 912.76]; - break; - case 'SUPERA4': // ISO 216, 227 mm x 356 mm - $sizes = [643.46, 1009.13]; - break; - case 'A5EXTRA': // ISO 216, 173 mm x 235 mm - $sizes = [490.39, 666.14]; - break; - case 'SOB5EXTRA': // ISO 216, 202 mm x 276 mm - $sizes = [572.60, 782.36]; - break; + // ISO size variations + case 'A2EXTRA': // ISO 216, 445 mm x 619 mm + $sizes = [1261.42, 1754.65]; + break; + case 'A2SUPER': // ISO 216, 305 mm x 508 mm + $sizes = [864.57, 1440.00]; + break; + case 'A3EXTRA': // ISO 216, 322 mm x 445 mm + $sizes = [912.76, 1261.42]; + break; + case 'SUPERA3': // ISO 216, 305 mm x 487 mm + $sizes = [864.57, 1380.47]; + break; + case 'A4EXTRA': // ISO 216, 235 mm x 322 mm + $sizes = [666.14, 912.76]; + break; + case 'A4LONG': // ISO 216, 210 mm x 348 mm + $sizes = [595.28, 986.46]; + break; + case 'A4SUPER': // ISO 216, 229 mm x 322 mm + $sizes = [649.13, 912.76]; + break; + case 'SUPERA4': // ISO 216, 227 mm x 356 mm + $sizes = [643.46, 1009.13]; + break; + case 'A5EXTRA': // ISO 216, 173 mm x 235 mm + $sizes = [490.39, 666.14]; + break; + case 'SOB5EXTRA': // ISO 216, 202 mm x 276 mm + $sizes = [572.60, 782.36]; + break; - // Japanese version of the ISO 216 B series - case 'JB0': // JIS P 0138-61, 1030 mm x 1456 mm - $sizes = [2919.69, 4127.24]; - break; - case 'JB1': // JIS P 0138-61, 728 mm x 1030 mm - $sizes = [2063.62, 2919.69]; - break; - case 'JB2': // JIS P 0138-61, 515 mm x 728 mm - $sizes = [1459.84, 2063.62]; - break; - case 'JB3': // JIS P 0138-61, 364 mm x 515 mm - $sizes = [1031.81, 1459.84]; - break; - case 'JB4': // JIS P 0138-61, 257 mm x 364 mm - $sizes = [728.50, 1031.81]; - break; - case 'JB5': // JIS P 0138-61, 182 mm x 257 mm - $sizes = [515.91, 728.50]; - break; - case 'JB6': // JIS P 0138-61, 128 mm x 182 mm - $sizes = [362.83, 515.91]; - break; - case 'JB7': // JIS P 0138-61, 91 mm x 128 mm - $sizes = [257.95, 362.83]; - break; - case 'JB8': // JIS P 0138-61, 64 mm x 91 mm - $sizes = [181.42, 257.95]; - break; - case 'JB9': // JIS P 0138-61, 45 mm x 64 mm - $sizes = [127.56, 181.42]; - break; - case 'JB10': // JIS P 0138-61, 32 mm x 45 mm - $sizes = [90.71, 127.56]; - break; + // Japanese version of the ISO 216 B series + case 'JB0': // JIS P 0138-61, 1030 mm x 1456 mm + $sizes = [2919.69, 4127.24]; + break; + case 'JB1': // JIS P 0138-61, 728 mm x 1030 mm + $sizes = [2063.62, 2919.69]; + break; + case 'JB2': // JIS P 0138-61, 515 mm x 728 mm + $sizes = [1459.84, 2063.62]; + break; + case 'JB3': // JIS P 0138-61, 364 mm x 515 mm + $sizes = [1031.81, 1459.84]; + break; + case 'JB4': // JIS P 0138-61, 257 mm x 364 mm + $sizes = [728.50, 1031.81]; + break; + case 'JB5': // JIS P 0138-61, 182 mm x 257 mm + $sizes = [515.91, 728.50]; + break; + case 'JB6': // JIS P 0138-61, 128 mm x 182 mm + $sizes = [362.83, 515.91]; + break; + case 'JB7': // JIS P 0138-61, 91 mm x 128 mm + $sizes = [257.95, 362.83]; + break; + case 'JB8': // JIS P 0138-61, 64 mm x 91 mm + $sizes = [181.42, 257.95]; + break; + case 'JB9': // JIS P 0138-61, 45 mm x 64 mm + $sizes = [127.56, 181.42]; + break; + case 'JB10': // JIS P 0138-61, 32 mm x 45 mm + $sizes = [90.71, 127.56]; + break; - // US pages - case 'EXECUTIVE': // 7.25 in x 10.5 in - $sizes = [522.00, 756.00]; - break; - case 'FOLIO': // 8.5 in x 13 in - $sizes = [612.00, 936.00]; - break; - case 'FOOLSCAP': // 13.5 in x 17 in - $sizes = [972.00, 1224.00]; - break; - case 'LEDGER': // 11 in x 17 in - $sizes = [792.00, 1224.00]; - break; - case 'LEGAL': // 8.5 in x 14 in - $sizes = [612.00, 1008.00]; - break; - case 'LETTER': // 8.5 in x 11 in - $sizes = [612.00, 792.00]; - break; - case 'QUARTO': // 8.46 in x 10.8 in - $sizes = [609.12, 777.50]; - break; - case 'STATEMENT': // 5.5 in x 8.5 in - $sizes = [396.00, 612.00]; - break; - case 'USGOVT': // 8 in x 11 in - $sizes = [576.00, 792.00]; - break; - default: - $this->pageFormat = 'A4'; - $sizes = [595.28, 841.89]; - break; + // US pages + case 'EXECUTIVE': // 7.25 in x 10.5 in + $sizes = [522.00, 756.00]; + break; + case 'FOLIO': // 8.5 in x 13 in + $sizes = [612.00, 936.00]; + break; + case 'FOOLSCAP': // 13.5 in x 17 in + $sizes = [972.00, 1224.00]; + break; + case 'LEDGER': // 11 in x 17 in + $sizes = [792.00, 1224.00]; + break; + case 'LEGAL': // 8.5 in x 14 in + $sizes = [612.00, 1008.00]; + break; + case 'LETTER': // 8.5 in x 11 in + $sizes = [612.00, 792.00]; + break; + case 'QUARTO': // 8.46 in x 10.8 in + $sizes = [609.12, 777.50]; + break; + case 'STATEMENT': // 5.5 in x 8.5 in + $sizes = [396.00, 612.00]; + break; + case 'USGOVT': // 8 in x 11 in + $sizes = [576.00, 792.00]; + break; + default: + $this->pageFormat = 'A4'; + $sizes = [595.28, 841.89]; + break; } $this->pagew = $sizes[0]; $this->pageh = $sizes[1]; diff --git a/app/Report/ReportHtmlCell.php b/app/Report/ReportHtmlCell.php index 843e07985f..1cc537f90c 100644 --- a/app/Report/ReportHtmlCell.php +++ b/app/Report/ReportHtmlCell.php @@ -147,15 +147,15 @@ class ReportHtmlCell extends ReportBaseCell { // Text alignment switch ($this->align) { - case 'C': - echo ' text-align:center;'; - break; - case 'L': - echo ' text-align:left;'; - break; - case 'R': - echo ' text-align:right;'; - break; + case 'C': + echo ' text-align:center;'; + break; + case 'L': + echo ' text-align:left;'; + break; + case 'R': + echo ' text-align:right;'; + break; } // Print the collected HTML code diff --git a/app/Report/ReportHtmlImage.php b/app/Report/ReportHtmlImage.php index d6c09c655c..eaca7384c7 100644 --- a/app/Report/ReportHtmlImage.php +++ b/app/Report/ReportHtmlImage.php @@ -43,20 +43,20 @@ class ReportHtmlImage extends ReportBaseImage { // Image alignment switch ($this->align) { - case 'L': - echo '<div style="position:absolute;top:', $this->y, 'pt;left:0pt;width:', $renderer->getRemainingWidth(), "pt;text-align:left;\">\n"; - echo '<img src="', $this->file, '" style="width:', $this->width, 'pt;height:', $this->height, "pt;\" alt=\"\">\n</div>\n"; - break; - case 'C': - echo '<div style="position:absolute;top:', $this->y, 'pt;left:0pt;width:', $renderer->getRemainingWidth(), "pt;text-align:center;\">\n"; - echo '<img src="', $this->file, '" style="width:', $this->width, 'pt;height:', $this->height, "pt;\" alt=\"\">\n</div>\n"; - break; - case 'R': - echo '<div style="position:absolute;top:', $this->y, 'pt;left:0pt;width:', $renderer->getRemainingWidth(), "pt;text-align:right;\">\n"; - echo '<img src="', $this->file, '" style="width:', $this->width, 'pt;height:', $this->height, "pt;\" alt=\"\">\n</div>\n"; - break; - default: - echo '<img src="', $this->file, '" style="position:absolute;', $renderer->alignRTL, ':', $this->x, 'pt;top:', $this->y, 'pt;width:', $this->width, 'pt;height:', $this->height, "pt;\" alt=\"\">\n"; + case 'L': + echo '<div style="position:absolute;top:', $this->y, 'pt;left:0pt;width:', $renderer->getRemainingWidth(), "pt;text-align:left;\">\n"; + echo '<img src="', $this->file, '" style="width:', $this->width, 'pt;height:', $this->height, "pt;\" alt=\"\">\n</div>\n"; + break; + case 'C': + echo '<div style="position:absolute;top:', $this->y, 'pt;left:0pt;width:', $renderer->getRemainingWidth(), "pt;text-align:center;\">\n"; + echo '<img src="', $this->file, '" style="width:', $this->width, 'pt;height:', $this->height, "pt;\" alt=\"\">\n</div>\n"; + break; + case 'R': + echo '<div style="position:absolute;top:', $this->y, 'pt;left:0pt;width:', $renderer->getRemainingWidth(), "pt;text-align:right;\">\n"; + echo '<img src="', $this->file, '" style="width:', $this->width, 'pt;height:', $this->height, "pt;\" alt=\"\">\n</div>\n"; + break; + default: + echo '<img src="', $this->file, '" style="position:absolute;', $renderer->alignRTL, ':', $this->x, 'pt;top:', $this->y, 'pt;width:', $this->width, 'pt;height:', $this->height, "pt;\" alt=\"\">\n"; } $lastpicpage = $renderer->pageNo(); diff --git a/app/Report/ReportParserGenerate.php b/app/Report/ReportParserGenerate.php index 3c7adba05b..5b2954f570 100644 --- a/app/Report/ReportParserGenerate.php +++ b/app/Report/ReportParserGenerate.php @@ -933,14 +933,14 @@ class ReportParserGenerate extends ReportParserBase { $tags = preg_split('/[: ]/', $tag); $value = $this->getGedcomValue($tag, $level, $this->gedrec); switch (end($tags)) { - case 'DATE': - $tmp = new Date($value); - $value = $tmp->display(); - break; - case 'PLAC': - $tmp = new Place($value, $WT_TREE); - $value = $tmp->getShortName(); - break; + case 'DATE': + $tmp = new Date($value); + $value = $tmp->display(); + break; + case 'PLAC': + $tmp = new Place($value, $WT_TREE); + $value = $tmp->getShortName(); + break; } if ($useBreak == '1') { // Insert <br> when multiple dates exist. @@ -1333,22 +1333,22 @@ class ReportParserGenerate extends ReportParserBase { // Arithmetic functions if (preg_match("/(\d+)\s*([\-\+\*\/])\s*(\d+)/", $value, $match)) { switch ($match[2]) { - case '+': - $t = $match[1] + $match[3]; - $value = preg_replace('/' . $match[1] . "\s*([\-\+\*\/])\s*" . $match[3] . '/', $t, $value); - break; - case '-': - $t = $match[1] - $match[3]; - $value = preg_replace('/' . $match[1] . "\s*([\-\+\*\/])\s*" . $match[3] . '/', $t, $value); - break; - case '*': - $t = $match[1] * $match[3]; - $value = preg_replace('/' . $match[1] . "\s*([\-\+\*\/])\s*" . $match[3] . '/', $t, $value); - break; - case '/': - $t = $match[1] / $match[3]; - $value = preg_replace('/' . $match[1] . "\s*([\-\+\*\/])\s*" . $match[3] . '/', $t, $value); - break; + case '+': + $t = $match[1] + $match[3]; + $value = preg_replace('/' . $match[1] . "\s*([\-\+\*\/])\s*" . $match[3] . '/', $t, $value); + break; + case '-': + $t = $match[1] - $match[3]; + $value = preg_replace('/' . $match[1] . "\s*([\-\+\*\/])\s*" . $match[3] . '/', $t, $value); + break; + case '*': + $t = $match[1] * $match[3]; + $value = preg_replace('/' . $match[1] . "\s*([\-\+\*\/])\s*" . $match[3] . '/', $t, $value); + break; + case '/': + $t = $match[1] / $match[3]; + $value = preg_replace('/' . $match[1] . "\s*([\-\+\*\/])\s*" . $match[3] . '/', $t, $value); + break; } } if (strpos($value, '@') !== false) { @@ -1816,179 +1816,179 @@ class ReportParserGenerate extends ReportParserBase { } // Some filters/sorts can be applied using SQL, while others require PHP switch ($listname) { - case 'pending': - $rows = Database::prepare( - "SELECT xref, CASE new_gedcom WHEN '' THEN old_gedcom ELSE new_gedcom END AS gedcom" . - " FROM `##change`" . " WHERE (xref, change_id) IN (" . - " SELECT xref, MAX(change_id)" . - " FROM `##change`" . - " WHERE status = 'pending' AND gedcom_id = :tree_id" . - " GROUP BY xref" . - " )" - )->execute([ - 'tree_id' => $WT_TREE->getTreeId(), - ])->fetchAll(); - $this->list = []; - foreach ($rows as $row) { - $this->list[] = GedcomRecord::getInstance($row->xref, $WT_TREE, $row->gedcom); - } - break; - case 'individual': - $sql_select = "SELECT i_id AS xref, i_gedcom AS gedcom FROM `##individuals` "; - $sql_join = ""; - $sql_where = " WHERE i_file = :tree_id"; - $sql_order_by = ""; - $sql_params = ['tree_id' => $WT_TREE->getTreeId()]; - foreach ($attrs as $attr => $value) { - if (strpos($attr, 'filter') === 0 && $value) { - $value = $this->substituteVars($value, false); - // Convert the various filters into SQL - if (preg_match('/^(\w+):DATE (LTE|GTE) (.+)$/', $value, $match)) { - $sql_join .= " JOIN `##dates` AS {$attr} ON ({$attr}.d_file=i_file AND {$attr}.d_gid=i_id)"; - $sql_where .= " AND {$attr}.d_fact = :{$attr}fact"; - $sql_params[$attr . 'fact'] = $match[1]; - $date = new Date($match[3]); - if ($match[2] == 'LTE') { - $sql_where .= " AND {$attr}.d_julianday2 <= :{$attr}date"; - $sql_params[$attr . 'date'] = $date->maximumJulianDay(); - } else { - $sql_where .= " AND {$attr}.d_julianday1 >= :{$attr}date"; - $sql_params[$attr . 'date'] = $date->minimumJulianDay(); - } - if ($sortby == $match[1]) { - $sortby = ""; - $sql_order_by .= ($sql_order_by ? ", " : " ORDER BY ") . "{$attr}.d_julianday1"; - } - unset($attrs[$attr]); // This filter has been fully processed - } elseif (preg_match('/^NAME CONTAINS (.*)$/', $value, $match)) { - // Do nothing, unless you have to - if ($match[1] != '' || $sortby == 'NAME') { - $sql_join .= " JOIN `##name` AS {$attr} ON (n_file=i_file AND n_id=i_id)"; - // Search the DB only if there is any name supplied - if ($match[1] != '') { - $names = explode(' ', $match[1]); - foreach ($names as $n => $name) { - $sql_where .= " AND {$attr}.n_full LIKE CONCAT('%', :{$attr}name{$n}, '%')"; - $sql_params[$attr . 'name' . $n] = $name; - } + case 'pending': + $rows = Database::prepare( + "SELECT xref, CASE new_gedcom WHEN '' THEN old_gedcom ELSE new_gedcom END AS gedcom" . + " FROM `##change`" . " WHERE (xref, change_id) IN (" . + " SELECT xref, MAX(change_id)" . + " FROM `##change`" . + " WHERE status = 'pending' AND gedcom_id = :tree_id" . + " GROUP BY xref" . + " )" + )->execute([ + 'tree_id' => $WT_TREE->getTreeId(), + ])->fetchAll(); + $this->list = []; + foreach ($rows as $row) { + $this->list[] = GedcomRecord::getInstance($row->xref, $WT_TREE, $row->gedcom); + } + break; + case 'individual': + $sql_select = "SELECT i_id AS xref, i_gedcom AS gedcom FROM `##individuals` "; + $sql_join = ""; + $sql_where = " WHERE i_file = :tree_id"; + $sql_order_by = ""; + $sql_params = ['tree_id' => $WT_TREE->getTreeId()]; + foreach ($attrs as $attr => $value) { + if (strpos($attr, 'filter') === 0 && $value) { + $value = $this->substituteVars($value, false); + // Convert the various filters into SQL + if (preg_match('/^(\w+):DATE (LTE|GTE) (.+)$/', $value, $match)) { + $sql_join .= " JOIN `##dates` AS {$attr} ON ({$attr}.d_file=i_file AND {$attr}.d_gid=i_id)"; + $sql_where .= " AND {$attr}.d_fact = :{$attr}fact"; + $sql_params[$attr . 'fact'] = $match[1]; + $date = new Date($match[3]); + if ($match[2] == 'LTE') { + $sql_where .= " AND {$attr}.d_julianday2 <= :{$attr}date"; + $sql_params[$attr . 'date'] = $date->maximumJulianDay(); + } else { + $sql_where .= " AND {$attr}.d_julianday1 >= :{$attr}date"; + $sql_params[$attr . 'date'] = $date->minimumJulianDay(); } - // Let the DB do the name sorting even when no name was entered - if ($sortby == 'NAME') { - $sortby = ''; - $sql_order_by .= ($sql_order_by ? ', ' : ' ORDER BY ') . "{$attr}.n_sort"; + if ($sortby == $match[1]) { + $sortby = ""; + $sql_order_by .= ($sql_order_by ? ", " : " ORDER BY ") . "{$attr}.d_julianday1"; + } + unset($attrs[$attr]); // This filter has been fully processed + } elseif (preg_match('/^NAME CONTAINS (.*)$/', $value, $match)) { + // Do nothing, unless you have to + if ($match[1] != '' || $sortby == 'NAME') { + $sql_join .= " JOIN `##name` AS {$attr} ON (n_file=i_file AND n_id=i_id)"; + // Search the DB only if there is any name supplied + if ($match[1] != '') { + $names = explode(' ', $match[1]); + foreach ($names as $n => $name) { + $sql_where .= " AND {$attr}.n_full LIKE CONCAT('%', :{$attr}name{$n}, '%')"; + $sql_params[$attr . 'name' . $n] = $name; + } + } + // Let the DB do the name sorting even when no name was entered + if ($sortby == 'NAME') { + $sortby = ''; + $sql_order_by .= ($sql_order_by ? ', ' : ' ORDER BY ') . "{$attr}.n_sort"; + } } + unset($attrs[$attr]); // This filter has been fully processed + } elseif (preg_match('/^REGEXP \/(.+)\//', $value, $match)) { + $sql_where .= " AND i_gedcom REGEXP :{$attr}gedcom"; + // PDO helpfully escapes backslashes for us, preventing us from matching "\n1 FACT" + $sql_params[$attr . 'gedcom'] = str_replace('\n', "\n", $match[1]); + unset($attrs[$attr]); // This filter has been fully processed + } elseif (preg_match('/^(?:\w+):PLAC CONTAINS (.+)$/', $value, $match)) { + $sql_join .= " JOIN `##places` AS {$attr}a ON ({$attr}a.p_file = i_file)"; + $sql_join .= " JOIN `##placelinks` AS {$attr}b ON ({$attr}a.p_file = {$attr}b.pl_file AND {$attr}b.pl_p_id = {$attr}a.p_id AND {$attr}b.pl_gid = i_id)"; + $sql_where .= " AND {$attr}a.p_place LIKE CONCAT('%', :{$attr}place, '%')"; + $sql_params[$attr . 'place'] = $match[1]; + // Don't unset this filter. This is just initial filtering + } elseif (preg_match('/^(\w*):*(\w*) CONTAINS (.+)$/', $value, $match)) { + $sql_where .= " AND i_gedcom LIKE CONCAT('%', :{$attr}contains1, '%', :{$attr}contains2, '%', :{$attr}contains3, '%')"; + $sql_params[$attr . 'contains1'] = $match[1]; + $sql_params[$attr . 'contains2'] = $match[2]; + $sql_params[$attr . 'contains3'] = $match[3]; + // Don't unset this filter. This is just initial filtering } - unset($attrs[$attr]); // This filter has been fully processed - } elseif (preg_match('/^REGEXP \/(.+)\//', $value, $match)) { - $sql_where .= " AND i_gedcom REGEXP :{$attr}gedcom"; - // PDO helpfully escapes backslashes for us, preventing us from matching "\n1 FACT" - $sql_params[$attr . 'gedcom'] = str_replace('\n', "\n", $match[1]); - unset($attrs[$attr]); // This filter has been fully processed - } elseif (preg_match('/^(?:\w+):PLAC CONTAINS (.+)$/', $value, $match)) { - $sql_join .= " JOIN `##places` AS {$attr}a ON ({$attr}a.p_file = i_file)"; - $sql_join .= " JOIN `##placelinks` AS {$attr}b ON ({$attr}a.p_file = {$attr}b.pl_file AND {$attr}b.pl_p_id = {$attr}a.p_id AND {$attr}b.pl_gid = i_id)"; - $sql_where .= " AND {$attr}a.p_place LIKE CONCAT('%', :{$attr}place, '%')"; - $sql_params[$attr . 'place'] = $match[1]; - // Don't unset this filter. This is just initial filtering - } elseif (preg_match('/^(\w*):*(\w*) CONTAINS (.+)$/', $value, $match)) { - $sql_where .= " AND i_gedcom LIKE CONCAT('%', :{$attr}contains1, '%', :{$attr}contains2, '%', :{$attr}contains3, '%')"; - $sql_params[$attr . 'contains1'] = $match[1]; - $sql_params[$attr . 'contains2'] = $match[2]; - $sql_params[$attr . 'contains3'] = $match[3]; - // Don't unset this filter. This is just initial filtering } } - } - $this->list = []; - $rows = Database::prepare( - $sql_select . $sql_join . $sql_where . $sql_order_by - )->execute($sql_params)->fetchAll(); + $this->list = []; + $rows = Database::prepare( + $sql_select . $sql_join . $sql_where . $sql_order_by + )->execute($sql_params)->fetchAll(); - foreach ($rows as $row) { - $this->list[$row->xref] = Individual::getInstance($row->xref, $WT_TREE, $row->gedcom); - } - break; + foreach ($rows as $row) { + $this->list[$row->xref] = Individual::getInstance($row->xref, $WT_TREE, $row->gedcom); + } + break; - case 'family': - $sql_select = "SELECT f_id AS xref, f_gedcom AS gedcom FROM `##families`"; - $sql_join = ""; - $sql_where = " WHERE f_file = :tree_id"; - $sql_order_by = ""; - $sql_params = ['tree_id' => $WT_TREE->getTreeId()]; - foreach ($attrs as $attr => $value) { - if (strpos($attr, 'filter') === 0 && $value) { - $value = $this->substituteVars($value, false); - // Convert the various filters into SQL - if (preg_match('/^(\w+):DATE (LTE|GTE) (.+)$/', $value, $match)) { - $sql_join .= " JOIN `##dates` AS {$attr} ON ({$attr}.d_file=f_file AND {$attr}.d_gid=f_id)"; - $sql_where .= " AND {$attr}.d_fact = :{$attr}fact"; - $sql_params[$attr . 'fact'] = $match[1]; - $date = new Date($match[3]); - if ($match[2] == 'LTE') { - $sql_where .= " AND {$attr}.d_julianday2 <= :{$attr}date"; - $sql_params[$attr . 'date'] = $date->maximumJulianDay(); - } else { - $sql_where .= " AND {$attr}.d_julianday1 >= :{$attr}date"; - $sql_params[$attr . 'date'] = $date->minimumJulianDay(); - } - if ($sortby == $match[1]) { - $sortby = ''; - $sql_order_by .= ($sql_order_by ? ', ' : ' ORDER BY ') . "{$attr}.d_julianday1"; - } - unset($attrs[$attr]); // This filter has been fully processed - } elseif (preg_match('/^REGEXP \/(.+)\//', $value, $match)) { - $sql_where .= " AND f_gedcom REGEXP :{$attr}gedcom"; - // PDO helpfully escapes backslashes for us, preventing us from matching "\n1 FACT" - $sql_params[$attr . 'gedcom'] = str_replace('\n', "\n", $match[1]); - unset($attrs[$attr]); // This filter has been fully processed - } elseif (preg_match('/^NAME CONTAINS (.+)$/', $value, $match)) { - // Do nothing, unless you have to - if ($match[1] != '' || $sortby == 'NAME') { - $sql_join .= " JOIN `##name` AS {$attr} ON n_file = f_file AND n_id IN (f_husb, f_wife)"; - // Search the DB only if there is any name supplied - if ($match[1] != '') { - $names = explode(' ', $match[1]); - foreach ($names as $n => $name) { - $sql_where .= " AND {$attr}.n_full LIKE CONCAT('%', :{$attr}name{$n}, '%')"; - $sql_params[$attr . 'name' . $n] = $name; - } + case 'family': + $sql_select = "SELECT f_id AS xref, f_gedcom AS gedcom FROM `##families`"; + $sql_join = ""; + $sql_where = " WHERE f_file = :tree_id"; + $sql_order_by = ""; + $sql_params = ['tree_id' => $WT_TREE->getTreeId()]; + foreach ($attrs as $attr => $value) { + if (strpos($attr, 'filter') === 0 && $value) { + $value = $this->substituteVars($value, false); + // Convert the various filters into SQL + if (preg_match('/^(\w+):DATE (LTE|GTE) (.+)$/', $value, $match)) { + $sql_join .= " JOIN `##dates` AS {$attr} ON ({$attr}.d_file=f_file AND {$attr}.d_gid=f_id)"; + $sql_where .= " AND {$attr}.d_fact = :{$attr}fact"; + $sql_params[$attr . 'fact'] = $match[1]; + $date = new Date($match[3]); + if ($match[2] == 'LTE') { + $sql_where .= " AND {$attr}.d_julianday2 <= :{$attr}date"; + $sql_params[$attr . 'date'] = $date->maximumJulianDay(); + } else { + $sql_where .= " AND {$attr}.d_julianday1 >= :{$attr}date"; + $sql_params[$attr . 'date'] = $date->minimumJulianDay(); } - // Let the DB do the name sorting even when no name was entered - if ($sortby == 'NAME') { + if ($sortby == $match[1]) { $sortby = ''; - $sql_order_by .= ($sql_order_by ? ', ' : ' ORDER BY ') . "{$attr}.n_sort"; + $sql_order_by .= ($sql_order_by ? ', ' : ' ORDER BY ') . "{$attr}.d_julianday1"; + } + unset($attrs[$attr]); // This filter has been fully processed + } elseif (preg_match('/^REGEXP \/(.+)\//', $value, $match)) { + $sql_where .= " AND f_gedcom REGEXP :{$attr}gedcom"; + // PDO helpfully escapes backslashes for us, preventing us from matching "\n1 FACT" + $sql_params[$attr . 'gedcom'] = str_replace('\n', "\n", $match[1]); + unset($attrs[$attr]); // This filter has been fully processed + } elseif (preg_match('/^NAME CONTAINS (.+)$/', $value, $match)) { + // Do nothing, unless you have to + if ($match[1] != '' || $sortby == 'NAME') { + $sql_join .= " JOIN `##name` AS {$attr} ON n_file = f_file AND n_id IN (f_husb, f_wife)"; + // Search the DB only if there is any name supplied + if ($match[1] != '') { + $names = explode(' ', $match[1]); + foreach ($names as $n => $name) { + $sql_where .= " AND {$attr}.n_full LIKE CONCAT('%', :{$attr}name{$n}, '%')"; + $sql_params[$attr . 'name' . $n] = $name; + } + } + // Let the DB do the name sorting even when no name was entered + if ($sortby == 'NAME') { + $sortby = ''; + $sql_order_by .= ($sql_order_by ? ', ' : ' ORDER BY ') . "{$attr}.n_sort"; + } } + unset($attrs[$attr]); // This filter has been fully processed + } elseif (preg_match('/^(?:\w+):PLAC CONTAINS (.+)$/', $value, $match)) { + $sql_join .= " JOIN `##places` AS {$attr}a ON ({$attr}a.p_file=f_file)"; + $sql_join .= " JOIN `##placelinks` AS {$attr}b ON ({$attr}a.p_file={$attr}b.pl_file AND {$attr}b.pl_p_id={$attr}a.p_id AND {$attr}b.pl_gid=f_id)"; + $sql_where .= " AND {$attr}a.p_place LIKE CONCAT('%', :{$attr}place, '%')"; + $sql_params[$attr . 'place'] = $match[1]; + // Don't unset this filter. This is just initial filtering + } elseif (preg_match('/^(\w*):*(\w*) CONTAINS (.+)$/', $value, $match)) { + $sql_where .= " AND f_gedcom LIKE CONCAT('%', :{$attr}contains1, '%', :{$attr}contains2, '%', :{$attr}contains3, '%')"; + $sql_params[$attr . 'contains1'] = $match[1]; + $sql_params[$attr . 'contains2'] = $match[2]; + $sql_params[$attr . 'contains3'] = $match[3]; + // Don't unset this filter. This is just initial filtering } - unset($attrs[$attr]); // This filter has been fully processed - } elseif (preg_match('/^(?:\w+):PLAC CONTAINS (.+)$/', $value, $match)) { - $sql_join .= " JOIN `##places` AS {$attr}a ON ({$attr}a.p_file=f_file)"; - $sql_join .= " JOIN `##placelinks` AS {$attr}b ON ({$attr}a.p_file={$attr}b.pl_file AND {$attr}b.pl_p_id={$attr}a.p_id AND {$attr}b.pl_gid=f_id)"; - $sql_where .= " AND {$attr}a.p_place LIKE CONCAT('%', :{$attr}place, '%')"; - $sql_params[$attr . 'place'] = $match[1]; - // Don't unset this filter. This is just initial filtering - } elseif (preg_match('/^(\w*):*(\w*) CONTAINS (.+)$/', $value, $match)) { - $sql_where .= " AND f_gedcom LIKE CONCAT('%', :{$attr}contains1, '%', :{$attr}contains2, '%', :{$attr}contains3, '%')"; - $sql_params[$attr . 'contains1'] = $match[1]; - $sql_params[$attr . 'contains2'] = $match[2]; - $sql_params[$attr . 'contains3'] = $match[3]; - // Don't unset this filter. This is just initial filtering } } - } - $this->list = []; - $rows = Database::prepare( - $sql_select . $sql_join . $sql_where . $sql_order_by - )->execute($sql_params)->fetchAll(); + $this->list = []; + $rows = Database::prepare( + $sql_select . $sql_join . $sql_where . $sql_order_by + )->execute($sql_params)->fetchAll(); - foreach ($rows as $row) { - $this->list[$row->xref] = Family::getInstance($row->xref, $WT_TREE, $row->gedcom); - } - break; + foreach ($rows as $row) { + $this->list[$row->xref] = Family::getInstance($row->xref, $WT_TREE, $row->gedcom); + } + break; - default: - throw new \DomainException('Invalid list name: ' . $listname); + default: + throw new \DomainException('Invalid list name: ' . $listname); } $filters = []; @@ -2049,17 +2049,17 @@ class ReportParserGenerate extends ReportParserBase { $searchstr = '1 ' . $tag; } switch ($expr) { - case 'CONTAINS': - if ($t == 'PLAC') { - $searchstr .= "[^\n]*[, ]*" . $val; - } else { - $searchstr .= "[^\n]*" . $val; - } - $filters[] = $searchstr; - break; - default: - $filters2[] = ['tag' => $tag, 'expr' => $expr, 'val' => $val]; - break; + case 'CONTAINS': + if ($t == 'PLAC') { + $searchstr .= "[^\n]*[, ]*" . $val; + } else { + $searchstr .= "[^\n]*" . $val; + } + $filters[] = $searchstr; + break; + default: + $filters2[] = ['tag' => $tag, 'expr' => $expr, 'val' => $val]; + break; } } } @@ -2103,31 +2103,31 @@ class ReportParserGenerate extends ReportParserBase { } switch ($expr) { - case 'GTE': - if ($t == 'DATE') { - $date1 = new Date($v); - $date2 = new Date($val); - $keep = (Date::compare($date1, $date2) >= 0); - } elseif ($val >= $v) { - $keep = true; - } - break; - case 'LTE': - if ($t == 'DATE') { - $date1 = new Date($v); - $date2 = new Date($val); - $keep = (Date::compare($date1, $date2) <= 0); - } elseif ($val >= $v) { - $keep = true; - } - break; - default: - if ($v == $val) { - $keep = true; - } else { - $keep = false; - } - break; + case 'GTE': + if ($t == 'DATE') { + $date1 = new Date($v); + $date2 = new Date($val); + $keep = (Date::compare($date1, $date2) >= 0); + } elseif ($val >= $v) { + $keep = true; + } + break; + case 'LTE': + if ($t == 'DATE') { + $date1 = new Date($v); + $date2 = new Date($val); + $keep = (Date::compare($date1, $date2) <= 0); + } elseif ($val >= $v) { + $keep = true; + } + break; + default: + if ($v == $val) { + $keep = true; + } else { + $keep = false; + } + break; } } } @@ -2139,26 +2139,26 @@ class ReportParserGenerate extends ReportParserBase { } switch ($sortby) { - case 'NAME': - uasort($this->list, '\Fisharebest\Webtrees\GedcomRecord::compare'); - break; - case 'CHAN': - uasort($this->list, function (GedcomRecord $x, GedcomRecord $y) { - return $y->lastChangeTimestamp(true) - $x->lastChangeTimestamp(true); - }); - break; - case 'BIRT:DATE': - uasort($this->list, '\Fisharebest\Webtrees\Individual::compareBirthDate'); - break; - case 'DEAT:DATE': - uasort($this->list, '\Fisharebest\Webtrees\Individual::compareDeathDate'); - break; - case 'MARR:DATE': - uasort($this->list, '\Fisharebest\Webtrees\Family::compareMarrDate'); - break; - default: - // unsorted or already sorted by SQL - break; + case 'NAME': + uasort($this->list, '\Fisharebest\Webtrees\GedcomRecord::compare'); + break; + case 'CHAN': + uasort($this->list, function (GedcomRecord $x, GedcomRecord $y) { + return $y->lastChangeTimestamp(true) - $x->lastChangeTimestamp(true); + }); + break; + case 'BIRT:DATE': + uasort($this->list, '\Fisharebest\Webtrees\Individual::compareBirthDate'); + break; + case 'DEAT:DATE': + uasort($this->list, '\Fisharebest\Webtrees\Individual::compareDeathDate'); + break; + case 'MARR:DATE': + uasort($this->list, '\Fisharebest\Webtrees\Family::compareMarrDate'); + break; + default: + // unsorted or already sorted by SQL + break; } array_push($this->repeats_stack, [$this->repeats, $this->repeat_bytes]); @@ -2309,88 +2309,88 @@ class ReportParserGenerate extends ReportParserBase { if (!empty($person)) { $this->list[$id] = $person; switch ($group) { - case 'child-family': - foreach ($person->getChildFamilies() as $family) { - $husband = $family->getHusband(); - $wife = $family->getWife(); - if (!empty($husband)) { - $this->list[$husband->getXref()] = $husband; - } - if (!empty($wife)) { - $this->list[$wife->getXref()] = $wife; - } - $children = $family->getChildren(); - foreach ($children as $child) { - if (!empty($child)) { - $this->list[$child->getXref()] = $child; + case 'child-family': + foreach ($person->getChildFamilies() as $family) { + $husband = $family->getHusband(); + $wife = $family->getWife(); + if (!empty($husband)) { + $this->list[$husband->getXref()] = $husband; + } + if (!empty($wife)) { + $this->list[$wife->getXref()] = $wife; + } + $children = $family->getChildren(); + foreach ($children as $child) { + if (!empty($child)) { + $this->list[$child->getXref()] = $child; + } } } - } - break; - case 'spouse-family': - foreach ($person->getSpouseFamilies() as $family) { - $husband = $family->getHusband(); - $wife = $family->getWife(); - if (!empty($husband)) { - $this->list[$husband->getXref()] = $husband; - } - if (!empty($wife)) { - $this->list[$wife->getXref()] = $wife; - } - $children = $family->getChildren(); - foreach ($children as $child) { - if (!empty($child)) { - $this->list[$child->getXref()] = $child; + break; + case 'spouse-family': + foreach ($person->getSpouseFamilies() as $family) { + $husband = $family->getHusband(); + $wife = $family->getWife(); + if (!empty($husband)) { + $this->list[$husband->getXref()] = $husband; + } + if (!empty($wife)) { + $this->list[$wife->getXref()] = $wife; + } + $children = $family->getChildren(); + foreach ($children as $child) { + if (!empty($child)) { + $this->list[$child->getXref()] = $child; + } } } - } - break; - case 'direct-ancestors': - $this->addAncestors($this->list, $id, false, $maxgen); - break; - case 'ancestors': - $this->addAncestors($this->list, $id, true, $maxgen); - break; - case 'descendants': - $this->list[$id]->generation = 1; - $this->addDescendancy($this->list, $id, false, $maxgen); - break; - case 'all': - $this->addAncestors($this->list, $id, true, $maxgen); - $this->addDescendancy($this->list, $id, true, $maxgen); - break; + break; + case 'direct-ancestors': + $this->addAncestors($this->list, $id, false, $maxgen); + break; + case 'ancestors': + $this->addAncestors($this->list, $id, true, $maxgen); + break; + case 'descendants': + $this->list[$id]->generation = 1; + $this->addDescendancy($this->list, $id, false, $maxgen); + break; + case 'all': + $this->addAncestors($this->list, $id, true, $maxgen); + $this->addDescendancy($this->list, $id, true, $maxgen); + break; } } switch ($sortby) { - case 'NAME': - uasort($this->list, '\Fisharebest\Webtrees\GedcomRecord::compare'); - break; - case 'BIRT:DATE': - uasort($this->list, '\Fisharebest\Webtrees\Individual::compareBirthDate'); - break; - case 'DEAT:DATE': - uasort($this->list, '\Fisharebest\Webtrees\Individual::compareDeathDate'); - break; - case 'generation': - $newarray = []; - reset($this->list); - $genCounter = 1; - while (count($newarray) < count($this->list)) { - foreach ($this->list as $key => $value) { - $this->generation = $value->generation; - if ($this->generation == $genCounter) { - $newarray[$key] = new \stdClass; - $newarray[$key]->generation = $this->generation; + case 'NAME': + uasort($this->list, '\Fisharebest\Webtrees\GedcomRecord::compare'); + break; + case 'BIRT:DATE': + uasort($this->list, '\Fisharebest\Webtrees\Individual::compareBirthDate'); + break; + case 'DEAT:DATE': + uasort($this->list, '\Fisharebest\Webtrees\Individual::compareDeathDate'); + break; + case 'generation': + $newarray = []; + reset($this->list); + $genCounter = 1; + while (count($newarray) < count($this->list)) { + foreach ($this->list as $key => $value) { + $this->generation = $value->generation; + if ($this->generation == $genCounter) { + $newarray[$key] = new \stdClass; + $newarray[$key]->generation = $this->generation; + } } + $genCounter++; } - $genCounter++; - } - $this->list = $newarray; - break; - default: - // unsorted - break; + $this->list = $newarray; + break; + default: + // unsorted + break; } array_push($this->repeats_stack, [$this->repeats, $this->repeat_bytes]); $this->repeat_bytes = xml_get_current_line_number($this->parser) + 1; diff --git a/app/Statement.php b/app/Statement.php index 74ee4cd89a..e2aedd22b9 100644 --- a/app/Statement.php +++ b/app/Statement.php @@ -64,18 +64,18 @@ class Statement { $key = ':' . $key; } switch (gettype($bind_variable)) { - case 'NULL': - $this->pdo_statement->bindValue($key, $bind_variable, PDO::PARAM_NULL); - break; - case 'boolean': - $this->pdo_statement->bindValue($key, (int) $bind_variable, PDO::PARAM_INT); - break; - case 'integer': - $this->pdo_statement->bindValue($key, $bind_variable, PDO::PARAM_INT); - break; - default: - $this->pdo_statement->bindValue($key, $bind_variable, PDO::PARAM_STR); - break; + case 'NULL': + $this->pdo_statement->bindValue($key, $bind_variable, PDO::PARAM_NULL); + break; + case 'boolean': + $this->pdo_statement->bindValue($key, (int) $bind_variable, PDO::PARAM_INT); + break; + case 'integer': + $this->pdo_statement->bindValue($key, $bind_variable, PDO::PARAM_INT); + break; + default: + $this->pdo_statement->bindValue($key, $bind_variable, PDO::PARAM_STR); + break; } } diff --git a/app/Stats.php b/app/Stats.php index d13bda33f2..49eb09eee3 100644 --- a/app/Stats.php +++ b/app/Stats.php @@ -301,22 +301,22 @@ class Stats { */ private function getPercentage($total, $type) { switch ($type) { - case 'individual': - $type = $this->totalIndividualsQuery(); - break; - case 'family': - $type = $this->totalFamiliesQuery(); - break; - case 'source': - $type = $this->totalSourcesQuery(); - break; - case 'note': - $type = $this->totalNotesQuery(); - break; - case 'all': - default: - $type = $this->totalIndividualsQuery() + $this->totalFamiliesQuery() + $this->totalSourcesQuery(); - break; + case 'individual': + $type = $this->totalIndividualsQuery(); + break; + case 'family': + $type = $this->totalFamiliesQuery(); + break; + case 'source': + $type = $this->totalSourcesQuery(); + break; + case 'note': + $type = $this->totalNotesQuery(); + break; + case 'all': + default: + $type = $this->totalIndividualsQuery() + $this->totalFamiliesQuery() + $this->totalSourcesQuery(); + break; } if ($type == 0) { return I18N::percentage(0, 1); @@ -1442,32 +1442,32 @@ class Stats { $row = $rows[0]; $record = GedcomRecord::getInstance($row['d_gid'], $this->tree); switch ($type) { - default: - case 'full': - if ($record->canShow()) { - $result = $record->formatList('span', false, $record->getFullName()); - } else { - $result = I18N::translate('This information is private and cannot be shown.'); - } - break; - case 'year': - if ($row['d_year'] < 0) { - $row['d_year'] = abs($row['d_year']) . ' B.C.'; - } - $date = new Date($row['d_type'] . ' ' . $row['d_year']); - $result = $date->display(); - break; - case 'name': - $result = '<a href="' . $record->getHtmlUrl() . '">' . $record->getFullName() . '</a>'; - break; - case 'place': - $fact = GedcomRecord::getInstance($row['d_gid'], $this->tree)->getFirstFact($row['d_fact']); - if ($fact) { - $result = FunctionsPrint::formatFactPlace($fact, true, true, true); - } else { - $result = I18N::translate('Private'); - } - break; + default: + case 'full': + if ($record->canShow()) { + $result = $record->formatList('span', false, $record->getFullName()); + } else { + $result = I18N::translate('This information is private and cannot be shown.'); + } + break; + case 'year': + if ($row['d_year'] < 0) { + $row['d_year'] = abs($row['d_year']) . ' B.C.'; + } + $date = new Date($row['d_type'] . ' ' . $row['d_year']); + $result = $date->display(); + break; + case 'name': + $result = '<a href="' . $record->getHtmlUrl() . '">' . $record->getFullName() . '</a>'; + break; + case 'place': + $fact = GedcomRecord::getInstance($row['d_gid'], $this->tree)->getFirstFact($row['d_fact']); + if ($fact) { + $result = FunctionsPrint::formatFactPlace($fact, true, true, true); + } else { + $result = I18N::translate('Private'); + } + break; } return $result; @@ -1632,96 +1632,96 @@ class Stats { } I18N::init(WT_LOCALE); switch ($chart_type) { - case 'surname_distribution_chart': - if ($surname == '') { - $surname = $this->getCommonSurname(); - } - $chart_title = I18N::translate('Surname distribution chart') . ': ' . $surname; - // Count how many people are events in each country - $surn_countries = []; - $indis = QueryName::individuals($this->tree, I18N::strtoupper($surname), '', '', false, false); - foreach ($indis as $person) { - if (preg_match_all('/^2 PLAC (?:.*, *)*(.*)/m', $person->getGedcom(), $matches)) { - // webtrees uses 3 letter country codes and localised country names, but google uses 2 letter codes. - foreach ($matches[1] as $country) { - if (array_key_exists($country, $country_to_iso3166)) { - if (array_key_exists($country_to_iso3166[$country], $surn_countries)) { - $surn_countries[$country_to_iso3166[$country]]++; - } else { - $surn_countries[$country_to_iso3166[$country]] = 1; + case 'surname_distribution_chart': + if ($surname == '') { + $surname = $this->getCommonSurname(); + } + $chart_title = I18N::translate('Surname distribution chart') . ': ' . $surname; + // Count how many people are events in each country + $surn_countries = []; + $indis = QueryName::individuals($this->tree, I18N::strtoupper($surname), '', '', false, false); + foreach ($indis as $person) { + if (preg_match_all('/^2 PLAC (?:.*, *)*(.*)/m', $person->getGedcom(), $matches)) { + // webtrees uses 3 letter country codes and localised country names, but google uses 2 letter codes. + foreach ($matches[1] as $country) { + if (array_key_exists($country, $country_to_iso3166)) { + if (array_key_exists($country_to_iso3166[$country], $surn_countries)) { + $surn_countries[$country_to_iso3166[$country]]++; + } else { + $surn_countries[$country_to_iso3166[$country]] = 1; + } } } } } - } - break; - case 'birth_distribution_chart': - $chart_title = I18N::translate('Birth by country'); - // Count how many people were born in each country - $surn_countries = []; - $b_countries = $this->statsPlaces('INDI', 'BIRT', 0, true); - foreach ($b_countries as $place => $count) { - $country = $place; - if (array_key_exists($country, $country_to_iso3166)) { - if (!isset($surn_countries[$country_to_iso3166[$country]])) { - $surn_countries[$country_to_iso3166[$country]] = $count; - } else { - $surn_countries[$country_to_iso3166[$country]] += $count; + break; + case 'birth_distribution_chart': + $chart_title = I18N::translate('Birth by country'); + // Count how many people were born in each country + $surn_countries = []; + $b_countries = $this->statsPlaces('INDI', 'BIRT', 0, true); + foreach ($b_countries as $place => $count) { + $country = $place; + if (array_key_exists($country, $country_to_iso3166)) { + if (!isset($surn_countries[$country_to_iso3166[$country]])) { + $surn_countries[$country_to_iso3166[$country]] = $count; + } else { + $surn_countries[$country_to_iso3166[$country]] += $count; + } } } - } - break; - case 'death_distribution_chart': - $chart_title = I18N::translate('Death by country'); - // Count how many people were death in each country - $surn_countries = []; - $d_countries = $this->statsPlaces('INDI', 'DEAT', 0, true); - foreach ($d_countries as $place => $count) { - $country = $place; - if (array_key_exists($country, $country_to_iso3166)) { - if (!isset($surn_countries[$country_to_iso3166[$country]])) { - $surn_countries[$country_to_iso3166[$country]] = $count; - } else { - $surn_countries[$country_to_iso3166[$country]] += $count; + break; + case 'death_distribution_chart': + $chart_title = I18N::translate('Death by country'); + // Count how many people were death in each country + $surn_countries = []; + $d_countries = $this->statsPlaces('INDI', 'DEAT', 0, true); + foreach ($d_countries as $place => $count) { + $country = $place; + if (array_key_exists($country, $country_to_iso3166)) { + if (!isset($surn_countries[$country_to_iso3166[$country]])) { + $surn_countries[$country_to_iso3166[$country]] = $count; + } else { + $surn_countries[$country_to_iso3166[$country]] += $count; + } } } - } - break; - case 'marriage_distribution_chart': - $chart_title = I18N::translate('Marriage by country'); - // Count how many families got marriage in each country - $surn_countries = []; - $m_countries = $this->statsPlaces('FAM'); - // webtrees uses 3 letter country codes and localised country names, but google uses 2 letter codes. - foreach ($m_countries as $place) { - $country = $place['country']; - if (array_key_exists($country, $country_to_iso3166)) { - if (!isset($surn_countries[$country_to_iso3166[$country]])) { - $surn_countries[$country_to_iso3166[$country]] = $place['tot']; - } else { - $surn_countries[$country_to_iso3166[$country]] += $place['tot']; + break; + case 'marriage_distribution_chart': + $chart_title = I18N::translate('Marriage by country'); + // Count how many families got marriage in each country + $surn_countries = []; + $m_countries = $this->statsPlaces('FAM'); + // webtrees uses 3 letter country codes and localised country names, but google uses 2 letter codes. + foreach ($m_countries as $place) { + $country = $place['country']; + if (array_key_exists($country, $country_to_iso3166)) { + if (!isset($surn_countries[$country_to_iso3166[$country]])) { + $surn_countries[$country_to_iso3166[$country]] = $place['tot']; + } else { + $surn_countries[$country_to_iso3166[$country]] += $place['tot']; + } } } - } - break; - case 'indi_distribution_chart': - default: - $chart_title = I18N::translate('Individual distribution chart'); - // Count how many people have events in each country - $surn_countries = []; - $a_countries = $this->statsPlaces('INDI'); - // webtrees uses 3 letter country codes and localised country names, but google uses 2 letter codes. - foreach ($a_countries as $place) { - $country = $place['country']; - if (array_key_exists($country, $country_to_iso3166)) { - if (!isset($surn_countries[$country_to_iso3166[$country]])) { - $surn_countries[$country_to_iso3166[$country]] = $place['tot']; - } else { - $surn_countries[$country_to_iso3166[$country]] += $place['tot']; + break; + case 'indi_distribution_chart': + default: + $chart_title = I18N::translate('Individual distribution chart'); + // Count how many people have events in each country + $surn_countries = []; + $a_countries = $this->statsPlaces('INDI'); + // webtrees uses 3 letter country codes and localised country names, but google uses 2 letter codes. + foreach ($a_countries as $place) { + $country = $place['country']; + if (array_key_exists($country, $country_to_iso3166)) { + if (!isset($surn_countries[$country_to_iso3166[$country]])) { + $surn_countries[$country_to_iso3166[$country]] = $place['tot']; + } else { + $surn_countries[$country_to_iso3166[$country]] += $place['tot']; + } } } - } - break; + break; } $chart_url = 'https://chart.googleapis.com/chart?cht=t&chtm=' . $chart_shows; $chart_url .= '&chco=' . $WT_STATS_CHART_COLOR1 . ',' . $WT_STATS_CHART_COLOR3 . ',' . $WT_STATS_CHART_COLOR2; // country colours @@ -2260,20 +2260,20 @@ class Stats { $row = $rows[0]; $person = Individual::getInstance($row['id'], $this->tree); switch ($type) { - default: - case 'full': - if ($person->canShowName()) { - $result = $person->formatList('span', false, $person->getFullName()); - } else { - $result = I18N::translate('This information is private and cannot be shown.'); - } - break; - case 'age': - $result = I18N::number((int) ($row['age'] / 365.25)); - break; - case 'name': - $result = '<a href="' . $person->getHtmlUrl() . '">' . $person->getFullName() . '</a>'; - break; + default: + case 'full': + if ($person->canShowName()) { + $result = $person->formatList('span', false, $person->getFullName()); + } else { + $result = I18N::translate('This information is private and cannot be shown.'); + } + break; + case 'age': + $result = I18N::number((int) ($row['age'] / 365.25)); + break; + case 'name': + $result = '<a href="' . $person->getHtmlUrl() . '">' . $person->getFullName() . '</a>'; + break; } return $result; @@ -2943,36 +2943,36 @@ class Stats { $row = $rows[0]; $record = GedcomRecord::getInstance($row['id'], $this->tree); switch ($type) { - default: - case 'full': - if ($record->canShow()) { - $result = $record->formatList('span', false, $record->getFullName()); - } else { - $result = I18N::translate('This information is private and cannot be shown.'); - } - break; - case 'year': - $date = new Date($row['type'] . ' ' . $row['year']); - $result = $date->display(); - break; - case 'type': - if (isset($eventTypes[$row['fact']])) { - $result = $eventTypes[$row['fact']]; - } else { - $result = GedcomTag::getLabel($row['fact']); - } - break; - case 'name': - $result = '<a href="' . $record->getHtmlUrl() . '">' . $record->getFullName() . '</a>'; - break; - case 'place': - $fact = $record->getFirstFact($row['fact']); - if ($fact) { - $result = FunctionsPrint::formatFactPlace($fact, true, true, true); - } else { - $result = I18N::translate('Private'); - } - break; + default: + case 'full': + if ($record->canShow()) { + $result = $record->formatList('span', false, $record->getFullName()); + } else { + $result = I18N::translate('This information is private and cannot be shown.'); + } + break; + case 'year': + $date = new Date($row['type'] . ' ' . $row['year']); + $result = $date->display(); + break; + case 'type': + if (isset($eventTypes[$row['fact']])) { + $result = $eventTypes[$row['fact']]; + } else { + $result = GedcomTag::getLabel($row['fact']); + } + break; + case 'name': + $result = '<a href="' . $record->getHtmlUrl() . '">' . $record->getFullName() . '</a>'; + break; + case 'place': + $fact = $record->getFirstFact($row['fact']); + if ($fact) { + $result = FunctionsPrint::formatFactPlace($fact, true, true, true); + } else { + $result = I18N::translate('Private'); + } + break; } return $result; @@ -3117,32 +3117,32 @@ class Stats { $person = Individual::getInstance($row['i_id'], $this->tree); } switch ($type) { - default: - case 'full': - if ($family->canShow()) { - $result = $family->formatList('span', false, $person->getFullName()); - } else { - $result = I18N::translate('This information is private and cannot be shown.'); - } - break; - case 'name': - $result = '<a href="' . $family->getHtmlUrl() . '">' . $person->getFullName() . '</a>'; - break; - case 'age': - $age = $row['age']; - if ($show_years) { - if ((int) ($age / 365.25) > 0) { - $age = (int) ($age / 365.25) . 'y'; - } elseif ((int) ($age / 30.4375) > 0) { - $age = (int) ($age / 30.4375) . 'm'; + default: + case 'full': + if ($family->canShow()) { + $result = $family->formatList('span', false, $person->getFullName()); } else { - $age = $age . 'd'; + $result = I18N::translate('This information is private and cannot be shown.'); } - $result = FunctionsDate::getAgeAtEvent($age); - } else { - $result = I18N::number((int) ($age / 365.25)); - } - break; + break; + case 'name': + $result = '<a href="' . $family->getHtmlUrl() . '">' . $person->getFullName() . '</a>'; + break; + case 'age': + $age = $row['age']; + if ($show_years) { + if ((int) ($age / 365.25) > 0) { + $age = (int) ($age / 365.25) . 'y'; + } elseif ((int) ($age / 30.4375) > 0) { + $age = (int) ($age / 30.4375) . 'm'; + } else { + $age = $age . 'd'; + } + $result = FunctionsDate::getAgeAtEvent($age); + } else { + $result = I18N::number((int) ($age / 365.25)); + } + break; } return $result; @@ -3415,32 +3415,32 @@ class Stats { $person = Individual::getInstance($row['id'], $this->tree); } switch ($type) { - default: - case 'full': - if ($person->canShow()) { - $result = $person->formatList('span', false, $person->getFullName()); - } else { - $result = I18N::translate('This information is private and cannot be shown.'); - } - break; - case 'name': - $result = '<a href="' . $person->getHtmlUrl() . '">' . $person->getFullName() . '</a>'; - break; - case 'age': - $age = $row['age']; - if ($show_years) { - if ((int) ($age / 365.25) > 0) { - $age = (int) ($age / 365.25) . 'y'; - } elseif ((int) ($age / 30.4375) > 0) { - $age = (int) ($age / 30.4375) . 'm'; + default: + case 'full': + if ($person->canShow()) { + $result = $person->formatList('span', false, $person->getFullName()); } else { - $age = $age . 'd'; + $result = I18N::translate('This information is private and cannot be shown.'); } - $result = FunctionsDate::getAgeAtEvent($age); - } else { - $result = (int) ($age / 365.25); - } - break; + break; + case 'name': + $result = '<a href="' . $person->getHtmlUrl() . '">' . $person->getFullName() . '</a>'; + break; + case 'age': + $age = $row['age']; + if ($show_years) { + if ((int) ($age / 365.25) > 0) { + $age = (int) ($age / 365.25) . 'y'; + } elseif ((int) ($age / 30.4375) > 0) { + $age = (int) ($age / 30.4375) . 'm'; + } else { + $age = $age . 'd'; + } + $result = FunctionsDate::getAgeAtEvent($age); + } else { + $result = (int) ($age / 365.25); + } + break; } return $result; @@ -4398,20 +4398,20 @@ class Stats { $row = $rows[0]; $family = Family::getInstance($row['id'], $this->tree); switch ($type) { - default: - case 'full': - if ($family->canShow()) { - $result = $family->formatList('span', false, $family->getFullName()); - } else { - $result = I18N::translate('This information is private and cannot be shown.'); - } - break; - case 'size': - $result = I18N::number($row['tot']); - break; - case 'name': - $result = '<a href="' . $family->getHtmlUrl() . '">' . $family->getFullName() . '</a>'; - break; + default: + case 'full': + if ($family->canShow()) { + $result = $family->formatList('span', false, $family->getFullName()); + } else { + $result = I18N::translate('This information is private and cannot be shown.'); + } + break; + case 'size': + $result = I18N::number($row['tot']); + break; + case 'name': + $result = '<a href="' . $family->getHtmlUrl() . '">' . $family->getFullName() . '</a>'; + break; } return $result; @@ -4686,43 +4686,43 @@ class Stats { foreach ($rows as $values) { $counts[] = round(100 * $values['total'] / $tot, 0); switch ($values['d_month']) { - default: - case 'JAN': - $values['d_month'] = 1; - break; - case 'FEB': - $values['d_month'] = 2; - break; - case 'MAR': - $values['d_month'] = 3; - break; - case 'APR': - $values['d_month'] = 4; - break; - case 'MAY': - $values['d_month'] = 5; - break; - case 'JUN': - $values['d_month'] = 6; - break; - case 'JUL': - $values['d_month'] = 7; - break; - case 'AUG': - $values['d_month'] = 8; - break; - case 'SEP': - $values['d_month'] = 9; - break; - case 'OCT': - $values['d_month'] = 10; - break; - case 'NOV': - $values['d_month'] = 11; - break; - case 'DEC': - $values['d_month'] = 12; - break; + default: + case 'JAN': + $values['d_month'] = 1; + break; + case 'FEB': + $values['d_month'] = 2; + break; + case 'MAR': + $values['d_month'] = 3; + break; + case 'APR': + $values['d_month'] = 4; + break; + case 'MAY': + $values['d_month'] = 5; + break; + case 'JUN': + $values['d_month'] = 6; + break; + case 'JUL': + $values['d_month'] = 7; + break; + case 'AUG': + $values['d_month'] = 8; + break; + case 'SEP': + $values['d_month'] = 9; + break; + case 'OCT': + $values['d_month'] = 10; + break; + case 'NOV': + $values['d_month'] = 11; + break; + case 'DEC': + $values['d_month'] = 12; + break; } $text .= I18N::translate(ucfirst(strtolower(($values['d_month'])))) . ' - ' . $values['total'] . '|'; } @@ -5309,16 +5309,16 @@ class Stats { } switch ($sorting) { - default: - case 'alpha': - uksort($surname_list, '\Fisharebest\Webtrees\I18N::strcasecmp'); - break; - case 'count': - asort($surname_list); - break; - case 'rcount': - arsort($surname_list); - break; + default: + case 'alpha': + uksort($surname_list, '\Fisharebest\Webtrees\I18N::strcasecmp'); + break; + case 'count': + asort($surname_list); + break; + case 'rcount': + arsort($surname_list); + break; } // Note that we count/display SPFX SURN, but sort/group under just SURN @@ -5432,9 +5432,9 @@ class Stats { } } switch ($SURNAME_TRADITION) { - case 'polish': - // most common surname should be in male variant (Kowalski, not Kowalska) - $top_name = preg_replace(['/ska$/', '/cka$/', '/dzka$/', '/żka$/'], ['ski', 'cki', 'dzki', 'żki'], $top_name); + case 'polish': + // most common surname should be in male variant (Kowalski, not Kowalska) + $top_name = preg_replace(['/ska$/', '/cka$/', '/dzka$/', '/żka$/'], ['ski', 'cki', 'dzki', 'żki'], $top_name); } $per = round(100 * $count_per / $tot_indi, 0); $chd .= $this->arrayToExtendedEncoding([$per]); @@ -5473,19 +5473,19 @@ class Stats { } switch ($sex) { - case 'M': - $sex_sql = "i_sex='M'"; - break; - case 'F': - $sex_sql = "i_sex='F'"; - break; - case 'U': - $sex_sql = "i_sex='U'"; - break; - case 'B': - default: - $sex_sql = "i_sex<>'U'"; - break; + case 'M': + $sex_sql = "i_sex='M'"; + break; + case 'F': + $sex_sql = "i_sex='F'"; + break; + case 'U': + $sex_sql = "i_sex='U'"; + break; + case 'B': + default: + $sex_sql = "i_sex<>'U'"; + break; } $ged_id = $this->tree->getTreeId(); @@ -5530,29 +5530,29 @@ class Stats { $tot = ''; } switch ($type) { - case 'table': - $common[] = '<tr><td>' . $given . '</td><td data-sort="' . $total . '">' . I18N::number($total) . '</td></tr>'; - break; - case 'list': - $common[] = '<li><span dir="auto">' . $given . '</span>' . $tot . '</li>'; - break; - case 'nolist': - $common[] = '<span dir="auto">' . $given . '</span>' . $tot; - break; + case 'table': + $common[] = '<tr><td>' . $given . '</td><td data-sort="' . $total . '">' . I18N::number($total) . '</td></tr>'; + break; + case 'list': + $common[] = '<li><span dir="auto">' . $given . '</span>' . $tot . '</li>'; + break; + case 'nolist': + $common[] = '<span dir="auto">' . $given . '</span>' . $tot; + break; } } if ($common) { switch ($type) { - case 'table': - $lookup = ['M' => I18N::translate('Male'), 'F' => I18N::translate('Female'), 'U' => I18N::translateContext('unknown gender', 'Unknown'), 'B' => I18N::translate('All')]; + case 'table': + $lookup = ['M' => I18N::translate('Male'), 'F' => I18N::translate('Female'), 'U' => I18N::translateContext('unknown gender', 'Unknown'), 'B' => I18N::translate('All')]; - return '<table ' . Datatables::givenNameTableAttributes() . '><thead><tr><th colspan="3">' . $lookup[$sex] . '</th></tr><tr><th>' . I18N::translate('Name') . '</th><th>' . I18N::translate('Individuals') . '</th></tr></thead><tbody>' . implode('', $common) . '</tbody></table>'; - case 'list': - return '<ul>' . implode('', $common) . '</ul>'; - case 'nolist': - return implode(I18N::$list_separator, $common); - default: - return ''; + return '<table ' . Datatables::givenNameTableAttributes() . '><thead><tr><th colspan="3">' . $lookup[$sex] . '</th></tr><tr><th>' . I18N::translate('Name') . '</th><th>' . I18N::translate('Individuals') . '</th></tr></thead><tbody>' . implode('', $common) . '</tbody></table>'; + case 'list': + return '<ul>' . implode('', $common) . '</ul>'; + case 'nolist': + return implode(I18N::$list_separator, $common); + default: + return ''; } } else { return ''; @@ -6038,42 +6038,42 @@ class Stats { } switch ($type) { - default: - case 'userid': - return $user->getUserId(); - case 'username': - return Html::escape($user->getUserName()); - case 'fullname': - return $user->getRealNameHtml(); - case 'regdate': - if (is_array($params) && isset($params[0]) && $params[0] != '') { - $datestamp = $params[0]; - } else { - $datestamp = I18N::dateFormat(); - } + default: + case 'userid': + return $user->getUserId(); + case 'username': + return Html::escape($user->getUserName()); + case 'fullname': + return $user->getRealNameHtml(); + case 'regdate': + if (is_array($params) && isset($params[0]) && $params[0] != '') { + $datestamp = $params[0]; + } else { + $datestamp = I18N::dateFormat(); + } - return FunctionsDate::timestampToGedcomDate((int) $user->getPreference('reg_timestamp'))->display(false, $datestamp); - case 'regtime': - if (is_array($params) && isset($params[0]) && $params[0] != '') { - $datestamp = $params[0]; - } else { - $datestamp = str_replace('%', '', I18N::timeFormat()); - } + return FunctionsDate::timestampToGedcomDate((int) $user->getPreference('reg_timestamp'))->display(false, $datestamp); + case 'regtime': + if (is_array($params) && isset($params[0]) && $params[0] != '') { + $datestamp = $params[0]; + } else { + $datestamp = str_replace('%', '', I18N::timeFormat()); + } - return date($datestamp, (int) $user->getPreference('reg_timestamp')); - case 'loggedin': - if (is_array($params) && isset($params[0]) && $params[0] != '') { - $yes = $params[0]; - } else { - $yes = I18N::translate('yes'); - } - if (is_array($params) && isset($params[1]) && $params[1] != '') { - $no = $params[1]; - } else { - $no = I18N::translate('no'); - } + return date($datestamp, (int) $user->getPreference('reg_timestamp')); + case 'loggedin': + if (is_array($params) && isset($params[0]) && $params[0] != '') { + $yes = $params[0]; + } else { + $yes = I18N::translate('yes'); + } + if (is_array($params) && isset($params[1]) && $params[1] != '') { + $no = $params[1]; + } else { + $no = I18N::translate('no'); + } - return Database::prepare("SELECT SQL_NO_CACHE 1 FROM `##session` WHERE user_id=? LIMIT 1")->execute([$user->getUserId()])->fetchOne() ? $yes : $no; + return Database::prepare("SELECT SQL_NO_CACHE 1 FROM `##session` WHERE user_id=? LIMIT 1")->execute([$user->getUserId()])->fetchOne() ? $yes : $no; } } @@ -6890,50 +6890,50 @@ class Stats { } // The current chart engine (Google charts) can't handle <sup></sup> markup switch ($century) { - case 21: - return strip_tags(I18N::translateContext('CENTURY', '21st')); - case 20: - return strip_tags(I18N::translateContext('CENTURY', '20th')); - case 19: - return strip_tags(I18N::translateContext('CENTURY', '19th')); - case 18: - return strip_tags(I18N::translateContext('CENTURY', '18th')); - case 17: - return strip_tags(I18N::translateContext('CENTURY', '17th')); - case 16: - return strip_tags(I18N::translateContext('CENTURY', '16th')); - case 15: - return strip_tags(I18N::translateContext('CENTURY', '15th')); - case 14: - return strip_tags(I18N::translateContext('CENTURY', '14th')); - case 13: - return strip_tags(I18N::translateContext('CENTURY', '13th')); - case 12: - return strip_tags(I18N::translateContext('CENTURY', '12th')); - case 11: - return strip_tags(I18N::translateContext('CENTURY', '11th')); - case 10: - return strip_tags(I18N::translateContext('CENTURY', '10th')); - case 9: - return strip_tags(I18N::translateContext('CENTURY', '9th')); - case 8: - return strip_tags(I18N::translateContext('CENTURY', '8th')); - case 7: - return strip_tags(I18N::translateContext('CENTURY', '7th')); - case 6: - return strip_tags(I18N::translateContext('CENTURY', '6th')); - case 5: - return strip_tags(I18N::translateContext('CENTURY', '5th')); - case 4: - return strip_tags(I18N::translateContext('CENTURY', '4th')); - case 3: - return strip_tags(I18N::translateContext('CENTURY', '3rd')); - case 2: - return strip_tags(I18N::translateContext('CENTURY', '2nd')); - case 1: - return strip_tags(I18N::translateContext('CENTURY', '1st')); - default: - return ($century - 1) . '01-' . $century . '00'; + case 21: + return strip_tags(I18N::translateContext('CENTURY', '21st')); + case 20: + return strip_tags(I18N::translateContext('CENTURY', '20th')); + case 19: + return strip_tags(I18N::translateContext('CENTURY', '19th')); + case 18: + return strip_tags(I18N::translateContext('CENTURY', '18th')); + case 17: + return strip_tags(I18N::translateContext('CENTURY', '17th')); + case 16: + return strip_tags(I18N::translateContext('CENTURY', '16th')); + case 15: + return strip_tags(I18N::translateContext('CENTURY', '15th')); + case 14: + return strip_tags(I18N::translateContext('CENTURY', '14th')); + case 13: + return strip_tags(I18N::translateContext('CENTURY', '13th')); + case 12: + return strip_tags(I18N::translateContext('CENTURY', '12th')); + case 11: + return strip_tags(I18N::translateContext('CENTURY', '11th')); + case 10: + return strip_tags(I18N::translateContext('CENTURY', '10th')); + case 9: + return strip_tags(I18N::translateContext('CENTURY', '9th')); + case 8: + return strip_tags(I18N::translateContext('CENTURY', '8th')); + case 7: + return strip_tags(I18N::translateContext('CENTURY', '7th')); + case 6: + return strip_tags(I18N::translateContext('CENTURY', '6th')); + case 5: + return strip_tags(I18N::translateContext('CENTURY', '5th')); + case 4: + return strip_tags(I18N::translateContext('CENTURY', '4th')); + case 3: + return strip_tags(I18N::translateContext('CENTURY', '3rd')); + case 2: + return strip_tags(I18N::translateContext('CENTURY', '2nd')); + case 1: + return strip_tags(I18N::translateContext('CENTURY', '1st')); + default: + return ($century - 1) . '01-' . $century . '00'; } } } diff --git a/app/SurnameTradition.php b/app/SurnameTradition.php index 519c5683a3..53cfe63f69 100644 --- a/app/SurnameTradition.php +++ b/app/SurnameTradition.php @@ -39,24 +39,24 @@ class SurnameTradition { */ public static function create($name) { switch ($name) { - case 'paternal': - return new PaternalSurnameTradition; - case 'patrilineal': - return new PatrilinealSurnameTradition; - case 'matrilineal': - return new MatrilinealSurnameTradition; - case 'portuguese': - return new PortugueseSurnameTradition; - case 'spanish': - return new SpanishSurnameTradition; - case 'polish': - return new PolishSurnameTradition; - case 'lithuanian': - return new LithuanianSurnameTradition; - case 'icelandic': - return new IcelandicSurnameTradition; - default: - return new DefaultSurnameTradition; + case 'paternal': + return new PaternalSurnameTradition; + case 'patrilineal': + return new PatrilinealSurnameTradition; + case 'matrilineal': + return new MatrilinealSurnameTradition; + case 'portuguese': + return new PortugueseSurnameTradition; + case 'spanish': + return new SpanishSurnameTradition; + case 'polish': + return new PolishSurnameTradition; + case 'lithuanian': + return new LithuanianSurnameTradition; + case 'icelandic': + return new IcelandicSurnameTradition; + default: + return new DefaultSurnameTradition; } } diff --git a/app/SurnameTradition/IcelandicSurnameTradition.php b/app/SurnameTradition/IcelandicSurnameTradition.php index 4da21653f6..38dc85fee4 100644 --- a/app/SurnameTradition/IcelandicSurnameTradition.php +++ b/app/SurnameTradition/IcelandicSurnameTradition.php @@ -43,14 +43,14 @@ class IcelandicSurnameTradition extends DefaultSurnameTradition implements Surna public function newChildNames($father_name, $mother_name, $child_sex) { if (preg_match(self::REGEX_GIVN, $father_name, $father_match)) { switch ($child_sex) { - case 'M': - return [ - 'NAME' => $father_match['GIVN'] . 'sson', - ]; - case 'F': - return [ - 'NAME' => $father_match['GIVN'] . 'sdottir', - ]; + case 'M': + return [ + 'NAME' => $father_match['GIVN'] . 'sson', + ]; + case 'F': + return [ + 'NAME' => $father_match['GIVN'] . 'sdottir', + ]; } } diff --git a/app/SurnameTradition/PaternalSurnameTradition.php b/app/SurnameTradition/PaternalSurnameTradition.php index b90874ab8f..5aaa3e5b81 100644 --- a/app/SurnameTradition/PaternalSurnameTradition.php +++ b/app/SurnameTradition/PaternalSurnameTradition.php @@ -39,17 +39,17 @@ class PaternalSurnameTradition extends PatrilinealSurnameTradition implements Su public function newParentNames($child_name, $parent_sex) { if (preg_match(self::REGEX_SPFX_SURN, $child_name, $match)) { switch ($parent_sex) { - case 'M': - return array_filter([ - 'NAME' => $match['NAME'], - 'SPFX' => $match['SPFX'], - 'SURN' => $match['SURN'], - ]); - case 'F': - return [ - 'NAME' => '//', - '_MARNM' => '/' . trim($match['SPFX'] . ' ' . $match['SURN']) . '/', - ]; + case 'M': + return array_filter([ + 'NAME' => $match['NAME'], + 'SPFX' => $match['SPFX'], + 'SURN' => $match['SURN'], + ]); + case 'F': + return [ + 'NAME' => '//', + '_MARNM' => '/' . trim($match['SPFX'] . ' ' . $match['SURN']) . '/', + ]; } } diff --git a/app/SurnameTradition/SpanishSurnameTradition.php b/app/SurnameTradition/SpanishSurnameTradition.php index 9c7ee7556f..6e27a394bd 100644 --- a/app/SurnameTradition/SpanishSurnameTradition.php +++ b/app/SurnameTradition/SpanishSurnameTradition.php @@ -62,16 +62,16 @@ class SpanishSurnameTradition extends DefaultSurnameTradition implements Surname public function newParentNames($child_name, $parent_sex) { if (preg_match(self::REGEX_SURNS, $child_name, $match)) { switch ($parent_sex) { - case 'M': - return [ - 'NAME' => '/' . $match['SURN1'] . '/ //', - 'SURN' => $match['SURN1'], - ]; - case 'F': - return [ - 'NAME' => '/' . $match['SURN2'] . '/ //', - 'SURN' => $match['SURN2'], - ]; + case 'M': + return [ + 'NAME' => '/' . $match['SURN1'] . '/ //', + 'SURN' => $match['SURN1'], + ]; + case 'F': + return [ + 'NAME' => '/' . $match['SURN2'] . '/ //', + 'SURN' => $match['SURN2'], + ]; } } diff --git a/app/Theme/AbstractTheme.php b/app/Theme/AbstractTheme.php index b27367ef07..6e065be1a4 100644 --- a/app/Theme/AbstractTheme.php +++ b/app/Theme/AbstractTheme.php @@ -329,12 +329,12 @@ abstract class AbstractTheme { $method = $user->getPreference('contactmethod'); switch ($method) { - case 'none': - return ''; - case 'mailto': - return '<a href="mailto:' . Html::escape($user->getEmail()) . '">' . $user->getRealNameHtml() . '</a>'; - default: - return '<a href="message.php?to=' . rawurlencode($user->getUserName()) . '&ged=' . $this->tree->getNameUrl() . '&url=' . Html::escape(Functions::getQueryUrl()) . '">' . $user->getRealNameHtml() . '</a>'; + case 'none': + return ''; + case 'mailto': + return '<a href="mailto:' . Html::escape($user->getEmail()) . '">' . $user->getRealNameHtml() . '</a>'; + default: + return '<a href="message.php?to=' . rawurlencode($user->getUserName()) . '&ged=' . $this->tree->getNameUrl() . '&url=' . Html::escape(Functions::getQueryUrl()) . '">' . $user->getRealNameHtml() . '</a>'; } } @@ -1413,20 +1413,20 @@ abstract class AbstractTheme { $records = []; foreach ($favorites as $favorite) { switch ($favorite['type']) { - case 'URL': - $submenus[] = new Menu($favorite['title'], $favorite['url']); - break; - case 'INDI': - case 'FAM': - case 'SOUR': - case 'OBJE': - case 'NOTE': - $record = GedcomRecord::getInstance($favorite['gid'], $this->tree); - if ($record && $record->canShowName()) { - $submenus[] = new Menu($record->getFullName(), $record->getHtmlUrl()); - $records[] = $record; - } - break; + case 'URL': + $submenus[] = new Menu($favorite['title'], $favorite['url']); + break; + case 'INDI': + case 'FAM': + case 'SOUR': + case 'OBJE': + case 'NOTE': + $record = GedcomRecord::getInstance($favorite['gid'], $this->tree); + if ($record && $record->canShowName()) { + $submenus[] = new Menu($record->getFullName(), $record->getHtmlUrl()); + $records[] = $record; + } + break; } } diff --git a/autocomplete.php b/autocomplete.php index 15820086e8..ae8dcfc47f 100644 --- a/autocomplete.php +++ b/autocomplete.php @@ -29,505 +29,505 @@ $type = Filter::get('field'); switch ($type) { -case 'ASSO': // Associates of an individuals, whose name contains the search terms - header('Content-Type: text/plain; charset=UTF-8'); + case 'ASSO': // Associates of an individuals, whose name contains the search terms + header('Content-Type: text/plain; charset=UTF-8'); - $data = []; - // Fetch all data, regardless of privacy - $rows = Database::prepare( - "SELECT 'INDI' AS type, i_id AS xref, i_gedcom AS gedcom, n_full" . - " FROM `##individuals`" . - " JOIN `##name` ON i_id = n_id AND i_file = n_file" . - " WHERE (n_full LIKE CONCAT('%', REPLACE(:term_1, ' ', '%'), '%') OR n_surn LIKE CONCAT('%', REPLACE(:term_2, ' ', '%'), '%')) AND i_file = :tree_id" . - " ORDER BY n_full COLLATE :collate" - )->execute([ - 'term_1' => $term, - 'term_2' => $term, - 'tree_id' => $WT_TREE->getTreeId(), - 'collate' => I18N::collation(), - ])->fetchAll(); + $data = []; + // Fetch all data, regardless of privacy + $rows = Database::prepare( + "SELECT 'INDI' AS type, i_id AS xref, i_gedcom AS gedcom, n_full" . + " FROM `##individuals`" . + " JOIN `##name` ON i_id = n_id AND i_file = n_file" . + " WHERE (n_full LIKE CONCAT('%', REPLACE(:term_1, ' ', '%'), '%') OR n_surn LIKE CONCAT('%', REPLACE(:term_2, ' ', '%'), '%')) AND i_file = :tree_id" . + " ORDER BY n_full COLLATE :collate" + )->execute([ + 'term_1' => $term, + 'term_2' => $term, + 'tree_id' => $WT_TREE->getTreeId(), + 'collate' => I18N::collation(), + ])->fetchAll(); - // Filter for privacy and whether they could be alive at the right time - $event_date = Filter::get('extra'); - $date = new Date($event_date); - $event_jd = $date->julianDay(); - foreach ($rows as $row) { - $person = Individual::getInstance($row->xref, $WT_TREE, $row->gedcom); - if ($person->canShow()) { - if ($event_jd) { - // Exclude individuals who were born after the event. - $person_birth_jd = $person->getEstimatedBirthDate()->minimumJulianDay(); - if ($person_birth_jd && $person_birth_jd > $event_jd) { - continue; + // Filter for privacy and whether they could be alive at the right time + $event_date = Filter::get('extra'); + $date = new Date($event_date); + $event_jd = $date->julianDay(); + foreach ($rows as $row) { + $person = Individual::getInstance($row->xref, $WT_TREE, $row->gedcom); + if ($person->canShow()) { + if ($event_jd) { + // Exclude individuals who were born after the event. + $person_birth_jd = $person->getEstimatedBirthDate()->minimumJulianDay(); + if ($person_birth_jd && $person_birth_jd > $event_jd) { + continue; + } + // Exclude individuals who died before the event. + $person_death_jd = $person->getEstimatedDeathDate()->maximumJulianDay(); + if ($person_death_jd && $person_death_jd < $event_jd) { + continue; + } } - // Exclude individuals who died before the event. - $person_death_jd = $person->getEstimatedDeathDate()->maximumJulianDay(); - if ($person_death_jd && $person_death_jd < $event_jd) { - continue; + // Add the age (if we have it) or the lifespan (if we do not). + $label = $person->getFullName(); + if ($event_jd && $person->getBirthDate()->isOK()) { + $label .= ', <span class="age">(' . I18N::translate('Age') . ' ' . Date::getAge($person->getBirthDate(), $date, 0) . ')</span>'; + } else { + $label .= ', <i>' . $person->getLifeSpan() . '</i>'; } + $data[$row->xref] = ['value' => $row->xref, 'label' => $label]; } - // Add the age (if we have it) or the lifespan (if we do not). - $label = $person->getFullName(); - if ($event_jd && $person->getBirthDate()->isOK()) { - $label .= ', <span class="age">(' . I18N::translate('Age') . ' ' . Date::getAge($person->getBirthDate(), $date, 0) . ')</span>'; - } else { - $label .= ', <i>' . $person->getLifeSpan() . '</i>'; - } - $data[$row->xref] = ['value' => $row->xref, 'label' => $label]; } - } - echo json_encode($data); + echo json_encode($data); - return; + return; -case 'CEME': // Cemetery fields, that contain the search term - header('Content-Type: text/plain; charset=UTF-8'); + case 'CEME': // Cemetery fields, that contain the search term + header('Content-Type: text/plain; charset=UTF-8'); - $data = []; - // Fetch all data, regardless of privacy - $rows = Database::prepare( - "SELECT SQL_CACHE i_id AS xref, i_gedcom AS gedcom" . - " FROM `##individuals`" . - " WHERE i_gedcom LIKE '%\n2 CEME %' AND i_file = :tree_id" . - " ORDER BY SUBSTRING_INDEX(i_gedcom, '\n2 CEME ', -1) COLLATE :collation" - )->execute([ - 'tree_id' => $WT_TREE->getTreeId(), - 'collation' => I18N::collation(), - ])->fetchAll(); - // Filter for privacy - foreach ($rows as $row) { - $person = Individual::getInstance($row->xref, $WT_TREE, $row->gedcom); - if (preg_match('/\n2 CEME (.*' . preg_quote($term, '/') . '.*)/i', $person->getGedcom(), $match)) { - if (!in_array($match[1], $data)) { - $data[] = $match[1]; + $data = []; + // Fetch all data, regardless of privacy + $rows = Database::prepare( + "SELECT SQL_CACHE i_id AS xref, i_gedcom AS gedcom" . + " FROM `##individuals`" . + " WHERE i_gedcom LIKE '%\n2 CEME %' AND i_file = :tree_id" . + " ORDER BY SUBSTRING_INDEX(i_gedcom, '\n2 CEME ', -1) COLLATE :collation" + )->execute([ + 'tree_id' => $WT_TREE->getTreeId(), + 'collation' => I18N::collation(), + ])->fetchAll(); + // Filter for privacy + foreach ($rows as $row) { + $person = Individual::getInstance($row->xref, $WT_TREE, $row->gedcom); + if (preg_match('/\n2 CEME (.*' . preg_quote($term, '/') . '.*)/i', $person->getGedcom(), $match)) { + if (!in_array($match[1], $data)) { + $data[] = $match[1]; + } } } - } - echo json_encode($data); + echo json_encode($data); - return; + return; -case 'FAM': // Families, whose name contains the search terms - header('Content-Type: text/plain; charset=UTF-8'); + case 'FAM': // Families, whose name contains the search terms + header('Content-Type: text/plain; charset=UTF-8'); - $data = []; - // Fetch all data, regardless of privacy - $rows = get_FAM_rows($WT_TREE, $term); - // Filter for privacy - foreach ($rows as $row) { - $family = Family::getInstance($row->xref, $WT_TREE, $row->gedcom); - if ($family->canShowName()) { - $marriage_year = $family->getMarriageYear(); - if ($marriage_year) { - $data[] = ['value' => $family->getXref(), 'label' => $family->getFullName() . ', <i>' . $marriage_year . '</i>']; - } else { - $data[] = ['value' => $family->getXref(), 'label' => $family->getFullName()]; + $data = []; + // Fetch all data, regardless of privacy + $rows = get_FAM_rows($WT_TREE, $term); + // Filter for privacy + foreach ($rows as $row) { + $family = Family::getInstance($row->xref, $WT_TREE, $row->gedcom); + if ($family->canShowName()) { + $marriage_year = $family->getMarriageYear(); + if ($marriage_year) { + $data[] = ['value' => $family->getXref(), 'label' => $family->getFullName() . ', <i>' . $marriage_year . '</i>']; + } else { + $data[] = ['value' => $family->getXref(), 'label' => $family->getFullName()]; + } } } - } - echo json_encode($data); + echo json_encode($data); - return; + return; -case 'GIVN': // Given names, that start with the search term - header('Content-Type: text/plain; charset=UTF-8'); + case 'GIVN': // Given names, that start with the search term + header('Content-Type: text/plain; charset=UTF-8'); - // Do not filter by privacy. Given names on their own do not identify individuals. - echo json_encode( - Database::prepare( - "SELECT SQL_CACHE DISTINCT n_givn" . - " FROM `##name`" . - " WHERE n_givn LIKE CONCAT(:term, '%') AND n_file = :tree_id" . - " ORDER BY n_givn COLLATE :collation" - )->execute([ - 'term' => $term, - 'tree_id' => $WT_TREE->getTreeId(), - 'collation' => I18N::collation(), - ])->fetchOneColumn() - ); + // Do not filter by privacy. Given names on their own do not identify individuals. + echo json_encode( + Database::prepare( + "SELECT SQL_CACHE DISTINCT n_givn" . + " FROM `##name`" . + " WHERE n_givn LIKE CONCAT(:term, '%') AND n_file = :tree_id" . + " ORDER BY n_givn COLLATE :collation" + )->execute([ + 'term' => $term, + 'tree_id' => $WT_TREE->getTreeId(), + 'collation' => I18N::collation(), + ])->fetchOneColumn() + ); - return; + return; -case 'INDI': // Individuals, whose name contains the search terms - header('Content-Type: text/plain; charset=UTF-8'); + case 'INDI': // Individuals, whose name contains the search terms + header('Content-Type: text/plain; charset=UTF-8'); - $data = []; - // Fetch all data, regardless of privacy - $rows = Database::prepare( - "SELECT i_id AS xref, i_gedcom AS gedcom, n_full" . - " FROM `##individuals`" . - " JOIN `##name` ON i_id = n_id AND i_file = n_file" . - " WHERE (n_full LIKE CONCAT('%', REPLACE(:term_1, ' ', '%'), '%') OR n_surn LIKE CONCAT('%', REPLACE(:term_2, ' ', '%'), '%')) AND i_file = :tree_id" . - " ORDER BY n_full COLLATE :collation" - )->execute([ - 'term_1' => $term, - 'term_2' => $term, - 'tree_id' => $WT_TREE->getTreeId(), - 'collation' => I18N::collation(), - ])->fetchAll(); - // Filter for privacy - foreach ($rows as $row) { - $person = Individual::getInstance($row->xref, $WT_TREE, $row->gedcom); - if ($person->canShowName()) { - $data[] = ['value' => $row->xref, 'label' => str_replace(['@N.N.', '@P.N.'], [I18N::translateContext('Unknown surname', '…'), I18N::translateContext('Unknown given name', '…')], $row->n_full) . ', <i>' . $person->getLifeSpan() . '</i>']; + $data = []; + // Fetch all data, regardless of privacy + $rows = Database::prepare( + "SELECT i_id AS xref, i_gedcom AS gedcom, n_full" . + " FROM `##individuals`" . + " JOIN `##name` ON i_id = n_id AND i_file = n_file" . + " WHERE (n_full LIKE CONCAT('%', REPLACE(:term_1, ' ', '%'), '%') OR n_surn LIKE CONCAT('%', REPLACE(:term_2, ' ', '%'), '%')) AND i_file = :tree_id" . + " ORDER BY n_full COLLATE :collation" + )->execute([ + 'term_1' => $term, + 'term_2' => $term, + 'tree_id' => $WT_TREE->getTreeId(), + 'collation' => I18N::collation(), + ])->fetchAll(); + // Filter for privacy + foreach ($rows as $row) { + $person = Individual::getInstance($row->xref, $WT_TREE, $row->gedcom); + if ($person->canShowName()) { + $data[] = ['value' => $row->xref, 'label' => str_replace(['@N.N.', '@P.N.'], [I18N::translateContext('Unknown surname', '…'), I18N::translateContext('Unknown given name', '…')], $row->n_full) . ', <i>' . $person->getLifeSpan() . '</i>']; + } } - } - echo json_encode($data); + echo json_encode($data); - return; + return; -case 'NOTE': // Notes which contain the search terms - header('Content-Type: text/plain; charset=UTF-8'); + case 'NOTE': // Notes which contain the search terms + header('Content-Type: text/plain; charset=UTF-8'); - $data = []; - // Fetch all data, regardless of privacy - $rows = get_NOTE_rows($WT_TREE, $term); - // Filter for privacy - foreach ($rows as $row) { - $note = Note::getInstance($row->xref, $WT_TREE, $row->gedcom); - if ($note->canShowName()) { - $data[] = ['value' => $note->getXref(), 'label' => $note->getFullName()]; + $data = []; + // Fetch all data, regardless of privacy + $rows = get_NOTE_rows($WT_TREE, $term); + // Filter for privacy + foreach ($rows as $row) { + $note = Note::getInstance($row->xref, $WT_TREE, $row->gedcom); + if ($note->canShowName()) { + $data[] = ['value' => $note->getXref(), 'label' => $note->getFullName()]; + } } - } - echo json_encode($data); + echo json_encode($data); - return; + return; -case 'OBJE': - header('Content-Type: text/plain; charset=UTF-8'); + case 'OBJE': + header('Content-Type: text/plain; charset=UTF-8'); - $data = []; - // Fetch all data, regardless of privacy - $rows = get_OBJE_rows($WT_TREE, $term); - // Filter for privacy - foreach ($rows as $row) { - $media = Media::getInstance($row->xref, $WT_TREE, $row->gedcom); - if ($media->canShowName()) { - $data[] = ['value' => $row->xref, 'label' => '<img src="' . $media->imageUrl(25, 25, 'crop') . '" width="25" height="25"> ' . $media->getFullName()]; + $data = []; + // Fetch all data, regardless of privacy + $rows = get_OBJE_rows($WT_TREE, $term); + // Filter for privacy + foreach ($rows as $row) { + $media = Media::getInstance($row->xref, $WT_TREE, $row->gedcom); + if ($media->canShowName()) { + $data[] = ['value' => $row->xref, 'label' => '<img src="' . $media->imageUrl(25, 25, 'crop') . '" width="25" height="25"> ' . $media->getFullName()]; + } } - } - echo json_encode($data); + echo json_encode($data); - return; + return; -case 'PLAC': // Place names (with hierarchy), that include the search term - header('Content-Type: text/plain; charset=UTF-8'); + case 'PLAC': // Place names (with hierarchy), that include the search term + header('Content-Type: text/plain; charset=UTF-8'); - // Do not filter by privacy. Place names on their own do not identify individuals. - $data = []; - foreach (Place::findPlaces($term, $WT_TREE) as $place) { - $data[] = $place->getGedcomName(); - } - if (!$data && $WT_TREE->getPreference('GEONAMES_ACCOUNT')) { - // No place found? Use an external gazetteer - $url = - "http://api.geonames.org/searchJSON" . - "?name_startsWith=" . urlencode($term) . - "&lang=" . WT_LOCALE . - "&fcode=CMTY&fcode=ADM4&fcode=PPL&fcode=PPLA&fcode=PPLC" . - "&style=full" . - "&username=" . $WT_TREE->getPreference('GEONAMES_ACCOUNT'); - // try to use curl when file_get_contents not allowed - if (ini_get('allow_url_fopen')) { - $json = file_get_contents($url); - } elseif (function_exists('curl_init')) { - $ch = curl_init(); - curl_setopt($ch, CURLOPT_URL, $url); - curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); - $json = curl_exec($ch); - curl_close($ch); - } else { - return $data; + // Do not filter by privacy. Place names on their own do not identify individuals. + $data = []; + foreach (Place::findPlaces($term, $WT_TREE) as $place) { + $data[] = $place->getGedcomName(); } - $places = json_decode($json, true); - if (isset($places['geonames']) && is_array($places['geonames'])) { - foreach ($places['geonames'] as $k => $place) { - $data[] = $place['name'] . ', ' . $place['adminName2'] . ', ' . $place['adminName1'] . ', ' . $place['countryName']; + if (!$data && $WT_TREE->getPreference('GEONAMES_ACCOUNT')) { + // No place found? Use an external gazetteer + $url = + "http://api.geonames.org/searchJSON" . + "?name_startsWith=" . urlencode($term) . + "&lang=" . WT_LOCALE . + "&fcode=CMTY&fcode=ADM4&fcode=PPL&fcode=PPLA&fcode=PPLC" . + "&style=full" . + "&username=" . $WT_TREE->getPreference('GEONAMES_ACCOUNT'); + // try to use curl when file_get_contents not allowed + if (ini_get('allow_url_fopen')) { + $json = file_get_contents($url); + } elseif (function_exists('curl_init')) { + $ch = curl_init(); + curl_setopt($ch, CURLOPT_URL, $url); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); + $json = curl_exec($ch); + curl_close($ch); + } else { + return $data; + } + $places = json_decode($json, true); + if (isset($places['geonames']) && is_array($places['geonames'])) { + foreach ($places['geonames'] as $k => $place) { + $data[] = $place['name'] . ', ' . $place['adminName2'] . ', ' . $place['adminName1'] . ', ' . $place['countryName']; + } } } - } - echo json_encode($data); + echo json_encode($data); - return; + return; -case 'PLAC2': // Place names (without hierarchy), that include the search term - header('Content-Type: text/plain; charset=UTF-8'); + case 'PLAC2': // Place names (without hierarchy), that include the search term + header('Content-Type: text/plain; charset=UTF-8'); - // Do not filter by privacy. Place names on their own do not identify individuals. - echo json_encode( - Database::prepare( - "SELECT SQL_CACHE p_place" . - " FROM `##places`" . - " WHERE p_place LIKE CONCAT('%', :term, '%') AND p_file = :tree_id" . - " ORDER BY p_place COLLATE :collation" - )->execute([ - 'term' => $term, - 'tree_id' => $WT_TREE->getTreeId(), - 'collation' => I18N::collation(), - ])->fetchOneColumn() - ); + // Do not filter by privacy. Place names on their own do not identify individuals. + echo json_encode( + Database::prepare( + "SELECT SQL_CACHE p_place" . + " FROM `##places`" . + " WHERE p_place LIKE CONCAT('%', :term, '%') AND p_file = :tree_id" . + " ORDER BY p_place COLLATE :collation" + )->execute([ + 'term' => $term, + 'tree_id' => $WT_TREE->getTreeId(), + 'collation' => I18N::collation(), + ])->fetchOneColumn() + ); - return; + return; -case 'REPO': // Repositories, that include the search terms - header('Content-Type: text/plain; charset=UTF-8'); + case 'REPO': // Repositories, that include the search terms + header('Content-Type: text/plain; charset=UTF-8'); - $data = []; - // Fetch all data, regardless of privacy - $rows = get_REPO_rows($WT_TREE, $term); - // Filter for privacy - foreach ($rows as $row) { - $record = Repository::getInstance($row->xref, $WT_TREE, $row->gedcom); - if ($record->canShowName()) { - foreach ($record->getFacts('NAME') as $fact) { - $data[] = ['value' => $record->getXref(), 'label' => $fact->getValue()]; + $data = []; + // Fetch all data, regardless of privacy + $rows = get_REPO_rows($WT_TREE, $term); + // Filter for privacy + foreach ($rows as $row) { + $record = Repository::getInstance($row->xref, $WT_TREE, $row->gedcom); + if ($record->canShowName()) { + foreach ($record->getFacts('NAME') as $fact) { + $data[] = ['value' => $record->getXref(), 'label' => $fact->getValue()]; + } } } - } - echo json_encode($data); + echo json_encode($data); - return; + return; -case 'REPO_NAME': // Repository names, that include the search terms - header('Content-Type: text/plain; charset=UTF-8'); + case 'REPO_NAME': // Repository names, that include the search terms + header('Content-Type: text/plain; charset=UTF-8'); - $data = []; - // Fetch all data, regardless of privacy - $rows = get_REPO_rows($WT_TREE, $term); - // Filter for privacy - foreach ($rows as $row) { - $record = Repository::getInstance($row->xref, $WT_TREE, $row->gedcom); - if ($record->canShowName()) { - $data[] = strip_tags($record->getFullName()); + $data = []; + // Fetch all data, regardless of privacy + $rows = get_REPO_rows($WT_TREE, $term); + // Filter for privacy + foreach ($rows as $row) { + $record = Repository::getInstance($row->xref, $WT_TREE, $row->gedcom); + if ($record->canShowName()) { + $data[] = strip_tags($record->getFullName()); + } } - } - echo json_encode($data); + echo json_encode($data); - return; + return; -case 'SOUR': // Sources, that include the search terms - header('Content-Type: text/plain; charset=UTF-8'); + case 'SOUR': // Sources, that include the search terms + header('Content-Type: text/plain; charset=UTF-8'); - $data = []; - // Fetch all data, regardless of privacy - $rows = get_SOUR_rows($WT_TREE, $term); - // Filter for privacy - foreach ($rows as $row) { - $record = Source::getInstance($row->xref, $WT_TREE, $row->gedcom); - if ($record->canShowName()) { - foreach ($record->getFacts('TITL') as $fact) { - $data[] = ['value' => $record->getXref(), 'label' => $fact->getValue()]; + $data = []; + // Fetch all data, regardless of privacy + $rows = get_SOUR_rows($WT_TREE, $term); + // Filter for privacy + foreach ($rows as $row) { + $record = Source::getInstance($row->xref, $WT_TREE, $row->gedcom); + if ($record->canShowName()) { + foreach ($record->getFacts('TITL') as $fact) { + $data[] = ['value' => $record->getXref(), 'label' => $fact->getValue()]; + } } } - } - echo json_encode($data); + echo json_encode($data); - return; + return; -case 'PAGE': // Citation details, for a given source, that contain the search term - header('Content-Type: text/plain; charset=UTF-8'); + case 'PAGE': // Citation details, for a given source, that contain the search term + header('Content-Type: text/plain; charset=UTF-8'); - $data = []; - $sid = Filter::get('extra', WT_REGEX_XREF); - // Fetch all data, regardless of privacy - $rows = Database::prepare( - "SELECT SQL_CACHE i_id AS xref, i_gedcom AS gedcom" . - " FROM `##individuals`" . - " WHERE i_gedcom LIKE CONCAT('%\n_ SOUR @', :xref, '@%', REPLACE(:term, ' ', '%'), '%') AND i_file = :tree_id" - )->execute([ - 'xref' => $sid, - 'term' => $term, - 'tree_id' => $WT_TREE->getTreeId(), - ])->fetchAll(); - // Filter for privacy - foreach ($rows as $row) { - $person = Individual::getInstance($row->xref, $WT_TREE, $row->gedcom); - if (preg_match('/\n1 SOUR @' . $sid . '@(?:\n[2-9].*)*\n2 PAGE (.*' . str_replace(' ', '.+', preg_quote($term, '/')) . '.*)/i', $person->getGedcom(), $match)) { - $data[] = $match[1]; - } - if (preg_match('/\n2 SOUR @' . $sid . '@(?:\n[3-9].*)*\n3 PAGE (.*' . str_replace(' ', '.+', preg_quote($term, '/')) . '.*)/i', $person->getGedcom(), $match)) { - $data[] = $match[1]; - } - } - // Fetch all data, regardless of privacy - $rows = Database::prepare( - "SELECT SQL_CACHE f_id AS xref, f_gedcom AS gedcom" . - " FROM `##families`" . - " WHERE f_gedcom LIKE CONCAT('%\n_ SOUR @', :xref, '@%', REPLACE(:term, ' ', '%'), '%') AND f_file = :tree_id" - )->execute([ - 'xref' => $sid, - 'term' => $term, - 'tree_id' => $WT_TREE->getTreeId(), - ])->fetchAll(); - // Filter for privacy - foreach ($rows as $row) { - $family = Family::getInstance($row->xref, $WT_TREE, $row->gedcom); - if (preg_match('/\n1 SOUR @' . $sid . '@(?:\n[2-9].*)*\n2 PAGE (.*' . str_replace(' ', '.+', preg_quote($term, '/')) . '.*)/i', $family->getGedcom(), $match)) { - $data[] = $match[1]; - } - if (preg_match('/\n2 SOUR @' . $sid . '@(?:\n[3-9].*)*\n3 PAGE (.*' . str_replace(' ', '.+', preg_quote($term, '/')) . '.*)/i', $family->getGedcom(), $match)) { - $data[] = $match[1]; + $data = []; + $sid = Filter::get('extra', WT_REGEX_XREF); + // Fetch all data, regardless of privacy + $rows = Database::prepare( + "SELECT SQL_CACHE i_id AS xref, i_gedcom AS gedcom" . + " FROM `##individuals`" . + " WHERE i_gedcom LIKE CONCAT('%\n_ SOUR @', :xref, '@%', REPLACE(:term, ' ', '%'), '%') AND i_file = :tree_id" + )->execute([ + 'xref' => $sid, + 'term' => $term, + 'tree_id' => $WT_TREE->getTreeId(), + ])->fetchAll(); + // Filter for privacy + foreach ($rows as $row) { + $person = Individual::getInstance($row->xref, $WT_TREE, $row->gedcom); + if (preg_match('/\n1 SOUR @' . $sid . '@(?:\n[2-9].*)*\n2 PAGE (.*' . str_replace(' ', '.+', preg_quote($term, '/')) . '.*)/i', $person->getGedcom(), $match)) { + $data[] = $match[1]; + } + if (preg_match('/\n2 SOUR @' . $sid . '@(?:\n[3-9].*)*\n3 PAGE (.*' . str_replace(' ', '.+', preg_quote($term, '/')) . '.*)/i', $person->getGedcom(), $match)) { + $data[] = $match[1]; + } } - } - // array_unique() converts the keys from integer to string, which breaks - // the JSON encoding - so need to call array_values() to convert them - // back into integers. - $data = array_values(array_unique($data)); - echo json_encode($data); - - return; - -case 'SOUR_TITL': // Source titles, that include the search terms - header('Content-Type: text/plain; charset=UTF-8'); - - $data = []; - // Fetch all data, regardless of privacy - $rows = Database::prepare( - "SELECT s_id AS xref, s_gedcom AS gedcom, s_name" . - " FROM `##sources`" . - " WHERE s_name LIKE CONCAT('%', REPLACE(:term, ' ', '%'), '%') AND s_file = :tree_id" . - " ORDER BY s_name COLLATE :collation" - )->execute([ - 'term' => $term, - 'tree_id' => $WT_TREE->getTreeId(), - 'collation' => I18N::collation(), - ])->fetchAll(); - // Filter for privacy - foreach ($rows as $row) { - $source = Source::getInstance($row->xref, $WT_TREE, $row->gedcom); - if ($source->canShowName()) { - $data[] = $row->s_name; + // Fetch all data, regardless of privacy + $rows = Database::prepare( + "SELECT SQL_CACHE f_id AS xref, f_gedcom AS gedcom" . + " FROM `##families`" . + " WHERE f_gedcom LIKE CONCAT('%\n_ SOUR @', :xref, '@%', REPLACE(:term, ' ', '%'), '%') AND f_file = :tree_id" + )->execute([ + 'xref' => $sid, + 'term' => $term, + 'tree_id' => $WT_TREE->getTreeId(), + ])->fetchAll(); + // Filter for privacy + foreach ($rows as $row) { + $family = Family::getInstance($row->xref, $WT_TREE, $row->gedcom); + if (preg_match('/\n1 SOUR @' . $sid . '@(?:\n[2-9].*)*\n2 PAGE (.*' . str_replace(' ', '.+', preg_quote($term, '/')) . '.*)/i', $family->getGedcom(), $match)) { + $data[] = $match[1]; + } + if (preg_match('/\n2 SOUR @' . $sid . '@(?:\n[3-9].*)*\n3 PAGE (.*' . str_replace(' ', '.+', preg_quote($term, '/')) . '.*)/i', $family->getGedcom(), $match)) { + $data[] = $match[1]; + } } - } - echo json_encode($data); + // array_unique() converts the keys from integer to string, which breaks + // the JSON encoding - so need to call array_values() to convert them + // back into integers. + $data = array_values(array_unique($data)); + echo json_encode($data); - return; + return; -case 'SURN': // Surnames, that start with the search term - header('Content-Type: text/plain; charset=UTF-8'); + case 'SOUR_TITL': // Source titles, that include the search terms + header('Content-Type: text/plain; charset=UTF-8'); - // Do not filter by privacy. Surnames on their own do not identify individuals. - echo json_encode( - Database::prepare( - "SELECT SQL_CACHE DISTINCT n_surname" . - " FROM `##name`" . - " WHERE n_surname LIKE CONCAT(:term, '%') AND n_file = :tree_id" . - " ORDER BY n_surname COLLATE :collation" + $data = []; + // Fetch all data, regardless of privacy + $rows = Database::prepare( + "SELECT s_id AS xref, s_gedcom AS gedcom, s_name" . + " FROM `##sources`" . + " WHERE s_name LIKE CONCAT('%', REPLACE(:term, ' ', '%'), '%') AND s_file = :tree_id" . + " ORDER BY s_name COLLATE :collation" )->execute([ 'term' => $term, 'tree_id' => $WT_TREE->getTreeId(), 'collation' => I18N::collation(), - ])->fetchOneColumn() - ); + ])->fetchAll(); + // Filter for privacy + foreach ($rows as $row) { + $source = Source::getInstance($row->xref, $WT_TREE, $row->gedcom); + if ($source->canShowName()) { + $data[] = $row->s_name; + } + } + echo json_encode($data); + + return; + + case 'SURN': // Surnames, that start with the search term + header('Content-Type: text/plain; charset=UTF-8'); + + // Do not filter by privacy. Surnames on their own do not identify individuals. + echo json_encode( + Database::prepare( + "SELECT SQL_CACHE DISTINCT n_surname" . + " FROM `##name`" . + " WHERE n_surname LIKE CONCAT(:term, '%') AND n_file = :tree_id" . + " ORDER BY n_surname COLLATE :collation" + )->execute([ + 'term' => $term, + 'tree_id' => $WT_TREE->getTreeId(), + 'collation' => I18N::collation(), + ])->fetchOneColumn() + ); - return; + return; -case 'IFSRO': - header('Content-Type: text/plain; charset=UTF-8'); + case 'IFSRO': + header('Content-Type: text/plain; charset=UTF-8'); - $data = []; - // Fetch all data, regardless of privacy - $rows = get_INDI_rows($WT_TREE, $term); - // Filter for privacy - foreach ($rows as $row) { - $person = Individual::getInstance($row->xref, $WT_TREE, $row->gedcom); - if ($person->canShowName()) { - $data[] = ['value' => $person->getXref(), 'label' => str_replace(['@N.N.', '@P.N.'], [I18N::translateContext('Unknown surname', '…'), I18N::translateContext('Unknown given name', '…')], $row->n_full) . ', <i>' . $person->getLifeSpan() . '</i>']; + $data = []; + // Fetch all data, regardless of privacy + $rows = get_INDI_rows($WT_TREE, $term); + // Filter for privacy + foreach ($rows as $row) { + $person = Individual::getInstance($row->xref, $WT_TREE, $row->gedcom); + if ($person->canShowName()) { + $data[] = ['value' => $person->getXref(), 'label' => str_replace(['@N.N.', '@P.N.'], [I18N::translateContext('Unknown surname', '…'), I18N::translateContext('Unknown given name', '…')], $row->n_full) . ', <i>' . $person->getLifeSpan() . '</i>']; + } } - } - // Fetch all data, regardless of privacy - $rows = get_SOUR_rows($WT_TREE, $term); - // Filter for privacy - foreach ($rows as $row) { - $source = Source::getInstance($row->xref, $WT_TREE, $row->gedcom); - if ($source->canShowName()) { - $data[] = ['value' => $source->getXref(), 'label' => $source->getFullName()]; + // Fetch all data, regardless of privacy + $rows = get_SOUR_rows($WT_TREE, $term); + // Filter for privacy + foreach ($rows as $row) { + $source = Source::getInstance($row->xref, $WT_TREE, $row->gedcom); + if ($source->canShowName()) { + $data[] = ['value' => $source->getXref(), 'label' => $source->getFullName()]; + } } - } - // Fetch all data, regardless of privacy - $rows = get_REPO_rows($WT_TREE, $term); - // Filter for privacy - foreach ($rows as $row) { - $repository = Repository::getInstance($row->xref, $WT_TREE, $row->gedcom); - if ($repository->canShowName()) { - $data[] = ['value' => $repository->getXref(), 'label' => $repository->getFullName()]; + // Fetch all data, regardless of privacy + $rows = get_REPO_rows($WT_TREE, $term); + // Filter for privacy + foreach ($rows as $row) { + $repository = Repository::getInstance($row->xref, $WT_TREE, $row->gedcom); + if ($repository->canShowName()) { + $data[] = ['value' => $repository->getXref(), 'label' => $repository->getFullName()]; + } } - } - // Fetch all data, regardless of privacy - $rows = get_OBJE_rows($WT_TREE, $term); - // Filter for privacy - foreach ($rows as $row) { - $media = Media::getInstance($row->xref, $WT_TREE, $row->gedcom); - if ($media->canShowName()) { - $data[] = ['value' => $media->getXref(), 'label' => '<img src="' . $media->imageUrl(25, 25, 'crop') . '" width="25" height="25"> ' . $media->getFullName()]; + // Fetch all data, regardless of privacy + $rows = get_OBJE_rows($WT_TREE, $term); + // Filter for privacy + foreach ($rows as $row) { + $media = Media::getInstance($row->xref, $WT_TREE, $row->gedcom); + if ($media->canShowName()) { + $data[] = ['value' => $media->getXref(), 'label' => '<img src="' . $media->imageUrl(25, 25, 'crop') . '" width="25" height="25"> ' . $media->getFullName()]; + } } - } - // Fetch all data, regardless of privacy - $rows = get_FAM_rows($WT_TREE, $term); - // Filter for privacy - foreach ($rows as $row) { - $family = Family::getInstance($row->xref, $WT_TREE, $row->gedcom); - if ($family->canShowName()) { - $marriage_year = $family->getMarriageYear(); - if ($marriage_year) { - $data[] = ['value' => $family->getXref(), 'label' => $family->getFullName() . ', <i>' . $marriage_year . '</i>']; - } else { - $data[] = ['value' => $family->getXref(), 'label' => $family->getFullName()]; + // Fetch all data, regardless of privacy + $rows = get_FAM_rows($WT_TREE, $term); + // Filter for privacy + foreach ($rows as $row) { + $family = Family::getInstance($row->xref, $WT_TREE, $row->gedcom); + if ($family->canShowName()) { + $marriage_year = $family->getMarriageYear(); + if ($marriage_year) { + $data[] = ['value' => $family->getXref(), 'label' => $family->getFullName() . ', <i>' . $marriage_year . '</i>']; + } else { + $data[] = ['value' => $family->getXref(), 'label' => $family->getFullName()]; + } } } - } - // Fetch all data, regardless of privacy - $rows = get_NOTE_rows($WT_TREE, $term); - // Filter for privacy - foreach ($rows as $row) { - $note = Note::getInstance($row->xref, $WT_TREE, $row->gedcom); - if ($note->canShowName()) { - $data[] = ['value' => $note->getXref(), 'label' => $note->getFullName()]; + // Fetch all data, regardless of privacy + $rows = get_NOTE_rows($WT_TREE, $term); + // Filter for privacy + foreach ($rows as $row) { + $note = Note::getInstance($row->xref, $WT_TREE, $row->gedcom); + if ($note->canShowName()) { + $data[] = ['value' => $note->getXref(), 'label' => $note->getFullName()]; + } } - } - echo json_encode($data); + echo json_encode($data); - return; + return; -case 'IFS': - header('Content-Type: text/plain; charset=UTF-8'); + case 'IFS': + header('Content-Type: text/plain; charset=UTF-8'); - $data = []; - // Fetch all data, regardless of privacy - $rows = get_INDI_rows($WT_TREE, $term); - // Filter for privacy - foreach ($rows as $row) { - $person = Individual::getInstance($row->xref, $WT_TREE, $row->gedcom); - if ($person->canShowName()) { - $data[] = ['value' => $person->getXref(), 'label' => str_replace(['@N.N.', '@P.N.'], [I18N::translateContext('Unknown surname', '…'), I18N::translateContext('Unknown given name', '…')], $row->n_full) . ', <i>' . $person->getLifeSpan() . '</i>']; + $data = []; + // Fetch all data, regardless of privacy + $rows = get_INDI_rows($WT_TREE, $term); + // Filter for privacy + foreach ($rows as $row) { + $person = Individual::getInstance($row->xref, $WT_TREE, $row->gedcom); + if ($person->canShowName()) { + $data[] = ['value' => $person->getXref(), 'label' => str_replace(['@N.N.', '@P.N.'], [I18N::translateContext('Unknown surname', '…'), I18N::translateContext('Unknown given name', '…')], $row->n_full) . ', <i>' . $person->getLifeSpan() . '</i>']; + } } - } - // Fetch all data, regardless of privacy - $rows = get_SOUR_rows($WT_TREE, $term); - // Filter for privacy - foreach ($rows as $row) { - $source = Source::getInstance($row->xref, $WT_TREE, $row->gedcom); - if ($source->canShowName()) { - $data[] = ['value' => $source->getXref(), 'label' => $source->getFullName()]; + // Fetch all data, regardless of privacy + $rows = get_SOUR_rows($WT_TREE, $term); + // Filter for privacy + foreach ($rows as $row) { + $source = Source::getInstance($row->xref, $WT_TREE, $row->gedcom); + if ($source->canShowName()) { + $data[] = ['value' => $source->getXref(), 'label' => $source->getFullName()]; + } } - } - // Fetch all data, regardless of privacy - $rows = get_FAM_rows($WT_TREE, $term); - // Filter for privacy - foreach ($rows as $row) { - $family = Family::getInstance($row->xref, $WT_TREE, $row->gedcom); - if ($family->canShowName()) { - $marriage_year = $family->getMarriageYear(); - if ($marriage_year) { - $data[] = ['value' => $family->getXref(), 'label' => $family->getFullName() . ', <i>' . $marriage_year . '</i>']; - } else { - $data[] = ['value' => $family->getXref(), 'label' => $family->getFullName()]; + // Fetch all data, regardless of privacy + $rows = get_FAM_rows($WT_TREE, $term); + // Filter for privacy + foreach ($rows as $row) { + $family = Family::getInstance($row->xref, $WT_TREE, $row->gedcom); + if ($family->canShowName()) { + $marriage_year = $family->getMarriageYear(); + if ($marriage_year) { + $data[] = ['value' => $family->getXref(), 'label' => $family->getFullName() . ', <i>' . $marriage_year . '</i>']; + } else { + $data[] = ['value' => $family->getXref(), 'label' => $family->getFullName()]; + } } } - } - echo json_encode($data); + echo json_encode($data); - return; + return; } /** diff --git a/calendar.php b/calendar.php index a33d427c2b..9de5aefa31 100644 --- a/calendar.php +++ b/calendar.php @@ -113,15 +113,15 @@ $controller = new PageController; $controller->setPageTitle(I18N::translate('Anniversary calendar')); switch ($view) { -case 'day': - $controller->setPageTitle(I18N::translate('On this day…') . ' ' . $ged_date->display(false)); - break; -case 'month': - $controller->setPageTitle(I18N::translate('In this month…') . ' ' . $ged_date->display(false, '%F %Y')); - break; -case 'year': - $controller->setPageTitle(I18N::translate('In this year…') . ' ' . $ged_date->display(false, '%Y')); - break; + case 'day': + $controller->setPageTitle(I18N::translate('On this day…') . ' ' . $ged_date->display(false)); + break; + case 'month': + $controller->setPageTitle(I18N::translate('In this month…') . ' ' . $ged_date->display(false, '%F %Y')); + break; + case 'year': + $controller->setPageTitle(I18N::translate('In this year…') . ' ' . $ged_date->display(false, '%Y')); + break; } // Only generate the content for interactive users (not search robots). @@ -323,38 +323,38 @@ if (Filter::getBool('ajax') && Session::has('initiated')) { $found_facts = []; switch ($view) { - case 'day': - $found_facts = apply_filter(FunctionsDb::getAnniversaryEvents($cal_date->minJD, $filterev, $WT_TREE), $filterof, $filtersx); - break; - case 'month': - $cal_date->d = 0; - $cal_date->setJdFromYmd(); - // Make a separate list for each day. Unspecified/invalid days go in day 0. - for ($d = 0; $d <= $days_in_month; ++$d) { - $found_facts[$d] = []; - } - // Fetch events for each day - for ($jd = $cal_date->minJD; $jd <= $cal_date->maxJD; ++$jd) { - foreach (apply_filter(FunctionsDb::getAnniversaryEvents($jd, $filterev, $WT_TREE), $filterof, $filtersx) as $fact) { - $tmp = $fact->getDate()->minimumDate(); - if ($tmp->d >= 1 && $tmp->d <= $tmp->daysInMonth()) { - // If the day is valid (for its own calendar), display it in the - // anniversary day (for the display calendar). - $found_facts[$jd - $cal_date->minJD + 1][] = $fact; - } else { - // Otherwise, display it in the "Day not set" box. - $found_facts[0][] = $fact; + case 'day': + $found_facts = apply_filter(FunctionsDb::getAnniversaryEvents($cal_date->minJD, $filterev, $WT_TREE), $filterof, $filtersx); + break; + case 'month': + $cal_date->d = 0; + $cal_date->setJdFromYmd(); + // Make a separate list for each day. Unspecified/invalid days go in day 0. + for ($d = 0; $d <= $days_in_month; ++$d) { + $found_facts[$d] = []; + } + // Fetch events for each day + for ($jd = $cal_date->minJD; $jd <= $cal_date->maxJD; ++$jd) { + foreach (apply_filter(FunctionsDb::getAnniversaryEvents($jd, $filterev, $WT_TREE), $filterof, $filtersx) as $fact) { + $tmp = $fact->getDate()->minimumDate(); + if ($tmp->d >= 1 && $tmp->d <= $tmp->daysInMonth()) { + // If the day is valid (for its own calendar), display it in the + // anniversary day (for the display calendar). + $found_facts[$jd - $cal_date->minJD + 1][] = $fact; + } else { + // Otherwise, display it in the "Day not set" box. + $found_facts[0][] = $fact; + } } } - } - break; - case 'year': - $cal_date->m = 0; - $cal_date->setJdFromYmd(); - $found_facts = apply_filter(FunctionsDb::getCalendarEvents($ged_date->minimumJulianDay(), $ged_date->maximumJulianDay(), $filterev, $WT_TREE), $filterof, $filtersx); - // Eliminate duplicates (e.g. BET JUL 1900 AND SEP 1900 will appear twice in 1900) - $found_facts = array_unique($found_facts); - break; + break; + case 'year': + $cal_date->m = 0; + $cal_date->setJdFromYmd(); + $found_facts = apply_filter(FunctionsDb::getCalendarEvents($ged_date->minimumJulianDay(), $ged_date->maximumJulianDay(), $filterev, $WT_TREE), $filterof, $filtersx); + // Eliminate duplicates (e.g. BET JUL 1900 AND SEP 1900 will appear twice in 1900) + $found_facts = array_unique($found_facts); + break; } // Group the facts by family/individual @@ -363,156 +363,156 @@ if (Filter::getBool('ajax') && Session::has('initiated')) { $cal_facts = []; switch ($view) { - case 'year': - case 'day': - foreach ($found_facts as $fact) { - $record = $fact->getParent(); - $xref = $record->getXref(); - if ($record instanceof Individual) { - if (empty($indis[$xref])) { - $indis[$xref] = calendar_fact_text($fact, true); - } else { - $indis[$xref] .= '<br>' . calendar_fact_text($fact, true); - } - } elseif ($record instanceof Family) { - if (empty($indis[$xref])) { - $fams[$xref] = calendar_fact_text($fact, true); - } else { - $fams[$xref] .= '<br>' . calendar_fact_text($fact, true); + case 'year': + case 'day': + foreach ($found_facts as $fact) { + $record = $fact->getParent(); + $xref = $record->getXref(); + if ($record instanceof Individual) { + if (empty($indis[$xref])) { + $indis[$xref] = calendar_fact_text($fact, true); + } else { + $indis[$xref] .= '<br>' . calendar_fact_text($fact, true); + } + } elseif ($record instanceof Family) { + if (empty($indis[$xref])) { + $fams[$xref] = calendar_fact_text($fact, true); + } else { + $fams[$xref] .= '<br>' . calendar_fact_text($fact, true); + } } } - } - break; - case 'month': - foreach ($found_facts as $d => $facts) { - $cal_facts[$d] = []; - foreach ($facts as $fact) { - $xref = $fact->getParent()->getXref(); - if (empty($cal_facts[$d][$xref])) { - $cal_facts[$d][$xref] = calendar_fact_text($fact, false); - } else { - $cal_facts[$d][$xref] .= '<br>' . calendar_fact_text($fact, false); + break; + case 'month': + foreach ($found_facts as $d => $facts) { + $cal_facts[$d] = []; + foreach ($facts as $fact) { + $xref = $fact->getParent()->getXref(); + if (empty($cal_facts[$d][$xref])) { + $cal_facts[$d][$xref] = calendar_fact_text($fact, false); + } else { + $cal_facts[$d][$xref] .= '<br>' . calendar_fact_text($fact, false); + } } } - } - break; + break; } switch ($view) { - case 'year': - case 'day': - $males = 0; - $females = 0; - echo '<table class="width100"><tr>'; - echo '<td class="descriptionbox center width50"><i class="icon-indis"></i>', I18N::translate('Individuals'), '</td>'; - echo '<td class="descriptionbox center width50"><i class="icon-cfamily"></i>', I18N::translate('Families'), '</td>'; - echo '</tr><tr>'; - echo '<td class="optionbox wrap">'; + case 'year': + case 'day': + $males = 0; + $females = 0; + echo '<table class="width100"><tr>'; + echo '<td class="descriptionbox center width50"><i class="icon-indis"></i>', I18N::translate('Individuals'), '</td>'; + echo '<td class="descriptionbox center width50"><i class="icon-cfamily"></i>', I18N::translate('Families'), '</td>'; + echo '</tr><tr>'; + echo '<td class="optionbox wrap">'; - $content = calendar_list_text($indis, '<li>', '</li>', true); - if ($content) { - echo '<ul>', $content, '</ul>'; - } + $content = calendar_list_text($indis, '<li>', '</li>', true); + if ($content) { + echo '<ul>', $content, '</ul>'; + } - echo '</td>'; - echo '<td class="optionbox wrap">'; + echo '</td>'; + echo '<td class="optionbox wrap">'; - $content = calendar_list_text($fams, '<li>', '</li>', true); - if ($content) { - echo '<ul>', $content, '</ul>'; - } + $content = calendar_list_text($fams, '<li>', '</li>', true); + if ($content) { + echo '<ul>', $content, '</ul>'; + } - echo '</td>'; - echo '</tr><tr>'; - echo '<td class="descriptionbox">', I18N::translate('Total individuals: %s', count($indis)); - echo '<br>'; - echo '<i class="icon-sex_m_15x15" title="', I18N::translate('Males'), '"></i> ', $males, ' '; - echo '<i class="icon-sex_f_15x15" title="', I18N::translate('Females'), '"></i> ', $females, ' '; - if (count($indis) !== $males + $females) { - echo '<i class="icon-sex_u_15x15" title="', I18N::translate('All individuals'), '"></i> ', count($indis) - $males - $females; - } - echo '</td>'; - echo '<td class="descriptionbox">', I18N::translate('Total families: %s', count($fams)), '</td>'; - echo '</tr></table>'; + echo '</td>'; + echo '</tr><tr>'; + echo '<td class="descriptionbox">', I18N::translate('Total individuals: %s', count($indis)); + echo '<br>'; + echo '<i class="icon-sex_m_15x15" title="', I18N::translate('Males'), '"></i> ', $males, ' '; + echo '<i class="icon-sex_f_15x15" title="', I18N::translate('Females'), '"></i> ', $females, ' '; + if (count($indis) !== $males + $females) { + echo '<i class="icon-sex_u_15x15" title="', I18N::translate('All individuals'), '"></i> ', count($indis) - $males - $females; + } + echo '</td>'; + echo '<td class="descriptionbox">', I18N::translate('Total families: %s', count($fams)), '</td>'; + echo '</tr></table>'; - break; - case 'month': -// We use JD%7 = 0/Mon…6/Sun. Standard definitions use 0/Sun…6/Sat. - $week_start = (I18N::firstDay() + 6) % 7; - $weekend_start = (I18N::weekendStart() + 6) % 7; - $weekend_end = (I18N::weekendEnd() + 6) % 7; - // The french calendar has a 10-day week, which starts on primidi - if ($days_in_week === 10) { - $week_start = 0; - $weekend_start = -1; - $weekend_end = -1; - } - echo '<table class="width100"><thead><tr>'; - for ($week_day = 0; $week_day < $days_in_week; ++$week_day) { - $day_name = $cal_date->dayNames(($week_day + $week_start) % $days_in_week); - if ($week_day == $weekend_start || $week_day == $weekend_end) { - echo '<th class="descriptionbox weekend" width="' . (100 / $days_in_week) . '%">', $day_name, '</th>'; - } else { - echo '<th class="descriptionbox" width="' . (100 / $days_in_week) . '%">', $day_name, '</th>'; + break; + case 'month': + // We use JD%7 = 0/Mon…6/Sun. Standard definitions use 0/Sun…6/Sat. + $week_start = (I18N::firstDay() + 6) % 7; + $weekend_start = (I18N::weekendStart() + 6) % 7; + $weekend_end = (I18N::weekendEnd() + 6) % 7; + // The french calendar has a 10-day week, which starts on primidi + if ($days_in_week === 10) { + $week_start = 0; + $weekend_start = -1; + $weekend_end = -1; } - } - echo '</tr>'; - echo '</thead>'; - echo '<tbody>'; - // Print days 1 to n of the month, but extend to cover "empty" days before/after the month to make whole weeks. - // e.g. instead of 1 -> 30 (=30 days), we might have -1 -> 33 (=35 days) - $start_d = 1 - ($cal_date->minJD - $week_start) % $days_in_week; - $end_d = $days_in_month + ($days_in_week - ($cal_date->maxJD - $week_start + 1) % $days_in_week) % $days_in_week; - // Make sure that there is an empty box for any leap/missing days - if ($start_d === 1 && $end_d === $days_in_month && count($found_facts[0]) > 0) { - $end_d += $days_in_week; - } - for ($d = $start_d; $d <= $end_d; ++$d) { - if (($d + $cal_date->minJD - $week_start) % $days_in_week === 1) { - echo '<tr>'; + echo '<table class="width100"><thead><tr>'; + for ($week_day = 0; $week_day < $days_in_week; ++$week_day) { + $day_name = $cal_date->dayNames(($week_day + $week_start) % $days_in_week); + if ($week_day == $weekend_start || $week_day == $weekend_end) { + echo '<th class="descriptionbox weekend" width="' . (100 / $days_in_week) . '%">', $day_name, '</th>'; + } else { + echo '<th class="descriptionbox" width="' . (100 / $days_in_week) . '%">', $day_name, '</th>'; + } } - echo '<td class="optionbox wrap">'; - if ($d < 1 || $d > $days_in_month) { - if (count($cal_facts[0]) > 0) { - echo '<span class="cal_day">', I18N::translate('Day not set'), '</span><br style="clear: both;">'; - echo '<div class="details1" style="height: 180px; overflow: auto;">'; - echo calendar_list_text($cal_facts[0], '', '', false); - echo '</div>'; - $cal_facts[0] = []; + echo '</tr>'; + echo '</thead>'; + echo '<tbody>'; + // Print days 1 to n of the month, but extend to cover "empty" days before/after the month to make whole weeks. + // e.g. instead of 1 -> 30 (=30 days), we might have -1 -> 33 (=35 days) + $start_d = 1 - ($cal_date->minJD - $week_start) % $days_in_week; + $end_d = $days_in_month + ($days_in_week - ($cal_date->maxJD - $week_start + 1) % $days_in_week) % $days_in_week; + // Make sure that there is an empty box for any leap/missing days + if ($start_d === 1 && $end_d === $days_in_month && count($found_facts[0]) > 0) { + $end_d += $days_in_week; + } + for ($d = $start_d; $d <= $end_d; ++$d) { + if (($d + $cal_date->minJD - $week_start) % $days_in_week === 1) { + echo '<tr>'; } - } else { - // Format the day number using the calendar - $tmp = new Date($cal_date->format("%@ {$d} %O %E")); - $d_fmt = $tmp->minimumDate()->format('%j'); - if ($d === $today->d && $cal_date->m === $today->m) { - echo '<span class="cal_day current_day">', $d_fmt, '</span>'; + echo '<td class="optionbox wrap">'; + if ($d < 1 || $d > $days_in_month) { + if (count($cal_facts[0]) > 0) { + echo '<span class="cal_day">', I18N::translate('Day not set'), '</span><br style="clear: both;">'; + echo '<div class="details1" style="height: 180px; overflow: auto;">'; + echo calendar_list_text($cal_facts[0], '', '', false); + echo '</div>'; + $cal_facts[0] = []; + } } else { - echo '<span class="cal_day">', $d_fmt, '</span>'; - } - // Show a converted date - foreach (explode('_and_', $CALENDAR_FORMAT) as $convcal) { - switch ($convcal) { - case 'french': - $alt_date = new FrenchDate($cal_date->minJD + $d - 1); - break; - case 'gregorian': - $alt_date = new GregorianDate($cal_date->minJD + $d - 1); - break; - case 'jewish': - $alt_date = new JewishDate($cal_date->minJD + $d - 1); - break; - case 'julian': - $alt_date = new JulianDate($cal_date->minJD + $d - 1); - break; - case 'hijri': - $alt_date = new HijriDate($cal_date->minJD + $d - 1); - break; - case 'jalali': - $alt_date = new JalaliDate($cal_date->minJD + $d - 1); - break; - default: - break 2; + // Format the day number using the calendar + $tmp = new Date($cal_date->format("%@ {$d} %O %E")); + $d_fmt = $tmp->minimumDate()->format('%j'); + if ($d === $today->d && $cal_date->m === $today->m) { + echo '<span class="cal_day current_day">', $d_fmt, '</span>'; + } else { + echo '<span class="cal_day">', $d_fmt, '</span>'; } + // Show a converted date + foreach (explode('_and_', $CALENDAR_FORMAT) as $convcal) { + switch ($convcal) { + case 'french': + $alt_date = new FrenchDate($cal_date->minJD + $d - 1); + break; + case 'gregorian': + $alt_date = new GregorianDate($cal_date->minJD + $d - 1); + break; + case 'jewish': + $alt_date = new JewishDate($cal_date->minJD + $d - 1); + break; + case 'julian': + $alt_date = new JulianDate($cal_date->minJD + $d - 1); + break; + case 'hijri': + $alt_date = new HijriDate($cal_date->minJD + $d - 1); + break; + case 'jalali': + $alt_date = new JalaliDate($cal_date->minJD + $d - 1); + break; + default: + break 2; + } if (get_class($alt_date) !== get_class($cal_date) && $alt_date->inValidRange()) { echo '<span class="rtl_cal_day">' . $alt_date->format('%j %M') . '</span>'; // Just show the first conversion @@ -643,17 +643,17 @@ function calendar_list_text($list, $tag1, $tag2, $show_sex_symbols) { $html .= $tag1 . '<a href="' . $tmp->getHtmlUrl() . '">' . $tmp->getFullName() . '</a> '; if ($show_sex_symbols && $tmp instanceof Individual) { switch ($tmp->getSex()) { - case 'M': - $html .= '<i class="icon-sex_m_9x9" title="' . I18N::translate('Male') . '"></i>'; - ++$males; - break; - case 'F': - $html .= '<i class="icon-sex_f_9x9" title="' . I18N::translate('Female') . '"></i>'; - ++$females; - break; - default: - $html .= '<i class="icon-sex_u_9x9" title="' . I18N::translateContext('unknown gender', 'Unknown') . '"></i>'; - break; + case 'M': + $html .= '<i class="icon-sex_m_9x9" title="' . I18N::translate('Male') . '"></i>'; + ++$males; + break; + case 'F': + $html .= '<i class="icon-sex_f_9x9" title="' . I18N::translate('Female') . '"></i>'; + ++$females; + break; + default: + $html .= '<i class="icon-sex_u_9x9" title="' . I18N::translateContext('unknown gender', 'Unknown') . '"></i>'; + break; } } $html .= '<div class="indent">' . $facts . '</div>' . $tag2; diff --git a/descendancy.php b/descendancy.php index 6e544aa22f..db22ccab7f 100644 --- a/descendancy.php +++ b/descendancy.php @@ -27,25 +27,25 @@ $controller->restrictAccess(Module::isActiveChart($controller->tree(), 'descenda // Only generate the content for interactive users (not search robots). if (Filter::getBool('ajax') && Session::has('initiated')) { switch ($controller->chart_style) { - case 0: // List - echo '<ul id="descendancy_chart" class="chart_common">'; - $controller->printChildDescendancy($controller->root, $controller->generations); - echo '</ul>'; - break; - case 1: // Booklet - $show_cousins = true; - echo '<div id="descendancy_booklet">'; - $controller->printChildFamily($controller->root, $controller->generations); - echo '</div>'; - break; - case 2: // Individual list - $descendants = $controller->individualDescendancy($controller->root, $controller->generations, []); - echo '<div id="descendancy-list">', FunctionsPrintLists::individualTable($descendants), '</div>'; - break; - case 3: // Family list - $descendants = $controller->familyDescendancy($controller->root, $controller->generations, []); - echo '<div id="descendancy-list">', FunctionsPrintLists::familyTable($descendants), '</div>'; - break; + case 0: // List + echo '<ul id="descendancy_chart" class="chart_common">'; + $controller->printChildDescendancy($controller->root, $controller->generations); + echo '</ul>'; + break; + case 1: // Booklet + $show_cousins = true; + echo '<div id="descendancy_booklet">'; + $controller->printChildFamily($controller->root, $controller->generations); + echo '</div>'; + break; + case 2: // Individual list + $descendants = $controller->individualDescendancy($controller->root, $controller->generations, []); + echo '<div id="descendancy-list">', FunctionsPrintLists::individualTable($descendants), '</div>'; + break; + case 3: // Family list + $descendants = $controller->familyDescendancy($controller->root, $controller->generations, []); + echo '<div id="descendancy-list">', FunctionsPrintLists::familyTable($descendants), '</div>'; + break; } echo $controller->getJavascript(); diff --git a/edit_changes.php b/edit_changes.php index 52f8c5be52..c4b9cdd41b 100644 --- a/edit_changes.php +++ b/edit_changes.php @@ -35,72 +35,72 @@ $change_id = Filter::getInteger('change_id'); $url = Filter::get('url', null, 'index.php'); switch ($action) { -case 'reject': - $gedcom_id = Database::prepare("SELECT gedcom_id FROM `##change` WHERE change_id=?")->execute([$change_id])->fetchOne(); - $xref = Database::prepare("SELECT xref FROM `##change` WHERE change_id=?")->execute([$change_id])->fetchOne(); - // Reject a change, and subsequent changes to the same record - Database::prepare( - "UPDATE `##change`" . - " SET status = 'rejected'" . - " WHERE status = 'pending'" . - " AND gedcom_id = ?" . - " AND xref = ?" . - " AND change_id >= ?" - )->execute([$gedcom_id, $xref, $change_id]); - break; -case 'accept': - $gedcom_id = Database::prepare("SELECT gedcom_id FROM `##change` WHERE change_id=?")->execute([$change_id])->fetchOne(); - $xref = Database::prepare("SELECT xref FROM `##change` WHERE change_id=?")->execute([$change_id])->fetchOne(); - // Accept a change, and all previous changes to the same record - $all_changes = Database::prepare( - "SELECT change_id, gedcom_id, gedcom_name, xref, old_gedcom, new_gedcom" . - " FROM `##change` c" . - " JOIN `##gedcom` g USING (gedcom_id)" . - " WHERE c.status = 'pending'" . - " AND gedcom_id = ?" . - " AND xref = ?" . - " AND change_id <= ?" . - " ORDER BY change_id" - )->execute([$gedcom_id, $xref, $change_id])->fetchAll(); - foreach ($all_changes as $change) { - if (empty($change->new_gedcom)) { - // delete - FunctionsImport::updateRecord($change->old_gedcom, $gedcom_id, true); - } else { - // add/update - FunctionsImport::updateRecord($change->new_gedcom, $gedcom_id, false); + case 'reject': + $gedcom_id = Database::prepare("SELECT gedcom_id FROM `##change` WHERE change_id=?")->execute([$change_id])->fetchOne(); + $xref = Database::prepare("SELECT xref FROM `##change` WHERE change_id=?")->execute([$change_id])->fetchOne(); + // Reject a change, and subsequent changes to the same record + Database::prepare( + "UPDATE `##change`" . + " SET status = 'rejected'" . + " WHERE status = 'pending'" . + " AND gedcom_id = ?" . + " AND xref = ?" . + " AND change_id >= ?" + )->execute([$gedcom_id, $xref, $change_id]); + break; + case 'accept': + $gedcom_id = Database::prepare("SELECT gedcom_id FROM `##change` WHERE change_id=?")->execute([$change_id])->fetchOne(); + $xref = Database::prepare("SELECT xref FROM `##change` WHERE change_id=?")->execute([$change_id])->fetchOne(); + // Accept a change, and all previous changes to the same record + $all_changes = Database::prepare( + "SELECT change_id, gedcom_id, gedcom_name, xref, old_gedcom, new_gedcom" . + " FROM `##change` c" . + " JOIN `##gedcom` g USING (gedcom_id)" . + " WHERE c.status = 'pending'" . + " AND gedcom_id = ?" . + " AND xref = ?" . + " AND change_id <= ?" . + " ORDER BY change_id" + )->execute([$gedcom_id, $xref, $change_id])->fetchAll(); + foreach ($all_changes as $change) { + if (empty($change->new_gedcom)) { + // delete + FunctionsImport::updateRecord($change->old_gedcom, $gedcom_id, true); + } else { + // add/update + FunctionsImport::updateRecord($change->new_gedcom, $gedcom_id, false); + } + Database::prepare("UPDATE `##change` SET status='accepted' WHERE change_id=?")->execute([$change->change_id]); + Log::addEditLog("Accepted change {$change->change_id} for {$change->xref} / {$change->gedcom_name} into database"); } - Database::prepare("UPDATE `##change` SET status='accepted' WHERE change_id=?")->execute([$change->change_id]); - Log::addEditLog("Accepted change {$change->change_id} for {$change->xref} / {$change->gedcom_name} into database"); - } - break; -case 'rejectall': - Database::prepare( - "UPDATE `##change`" . - " SET status='rejected'" . - " WHERE status='pending' AND gedcom_id=?" - )->execute([$WT_TREE->getTreeId()]); - break; -case 'acceptall': - $all_changes = Database::prepare( - "SELECT change_id, gedcom_id, gedcom_name, xref, old_gedcom, new_gedcom" . - " FROM `##change` c" . - " JOIN `##gedcom` g USING (gedcom_id)" . - " WHERE c.status='pending' AND gedcom_id=?" . - " ORDER BY change_id" - )->execute([$WT_TREE->getTreeId()])->fetchAll(); - foreach ($all_changes as $change) { - if (empty($change->new_gedcom)) { - // delete - FunctionsImport::updateRecord($change->old_gedcom, $change->gedcom_id, true); - } else { - // add/update - FunctionsImport::updateRecord($change->new_gedcom, $change->gedcom_id, false); + break; + case 'rejectall': + Database::prepare( + "UPDATE `##change`" . + " SET status='rejected'" . + " WHERE status='pending' AND gedcom_id=?" + )->execute([$WT_TREE->getTreeId()]); + break; + case 'acceptall': + $all_changes = Database::prepare( + "SELECT change_id, gedcom_id, gedcom_name, xref, old_gedcom, new_gedcom" . + " FROM `##change` c" . + " JOIN `##gedcom` g USING (gedcom_id)" . + " WHERE c.status='pending' AND gedcom_id=?" . + " ORDER BY change_id" + )->execute([$WT_TREE->getTreeId()])->fetchAll(); + foreach ($all_changes as $change) { + if (empty($change->new_gedcom)) { + // delete + FunctionsImport::updateRecord($change->old_gedcom, $change->gedcom_id, true); + } else { + // add/update + FunctionsImport::updateRecord($change->new_gedcom, $change->gedcom_id, false); + } + Database::prepare("UPDATE `##change` SET status='accepted' WHERE change_id=?")->execute([$change->change_id]); + Log::addEditLog("Accepted change {$change->change_id} for {$change->xref} / {$change->gedcom_name} into database"); } - Database::prepare("UPDATE `##change` SET status='accepted' WHERE change_id=?")->execute([$change->change_id]); - Log::addEditLog("Accepted change {$change->change_id} for {$change->xref} / {$change->gedcom_name} into database"); - } - break; + break; } $rows = Database::prepare( @@ -120,27 +120,27 @@ foreach ($rows as $row) { preg_match('/^0 (?:@' . WT_REGEX_XREF . '@ )?(' . WT_REGEX_TAG . ')/', $row->old_gedcom . $row->new_gedcom, $match); switch ($match[1]) { - case 'INDI': - $row->record = new Individual($row->xref, $row->old_gedcom, $row->new_gedcom, $tree); - break; - case 'FAM': - $row->record = new Family($row->xref, $row->old_gedcom, $row->new_gedcom, $tree); - break; - case 'SOUR': - $row->record = new Source($row->xref, $row->old_gedcom, $row->new_gedcom, $tree); - break; - case 'REPO': - $row->record = new Repository($row->xref, $row->old_gedcom, $row->new_gedcom, $tree); - break; - case 'OBJE': - $row->record = new Media($row->xref, $row->old_gedcom, $row->new_gedcom, $tree); - break; - case 'NOTE': - $row->record = new Note($row->xref, $row->old_gedcom, $row->new_gedcom, $tree); - break; - default: - $row->record = new GedcomRecord($row->xref, $row->old_gedcom, $row->new_gedcom, $tree); - break; + case 'INDI': + $row->record = new Individual($row->xref, $row->old_gedcom, $row->new_gedcom, $tree); + break; + case 'FAM': + $row->record = new Family($row->xref, $row->old_gedcom, $row->new_gedcom, $tree); + break; + case 'SOUR': + $row->record = new Source($row->xref, $row->old_gedcom, $row->new_gedcom, $tree); + break; + case 'REPO': + $row->record = new Repository($row->xref, $row->old_gedcom, $row->new_gedcom, $tree); + break; + case 'OBJE': + $row->record = new Media($row->xref, $row->old_gedcom, $row->new_gedcom, $tree); + break; + case 'NOTE': + $row->record = new Note($row->xref, $row->old_gedcom, $row->new_gedcom, $tree); + break; + default: + $row->record = new GedcomRecord($row->xref, $row->old_gedcom, $row->new_gedcom, $tree); + break; } $row->accept_url = Html::url('edit_changes.php', [ diff --git a/edit_interface.php b/edit_interface.php index 12c21c575c..56ec01c7dc 100644 --- a/edit_interface.php +++ b/edit_interface.php @@ -288,40 +288,40 @@ case 'edit': $level1type = $edit_fact->getTag(); switch ($record::RECORD_TYPE) { - case 'REPO': - // REPO:NAME facts may take a NOTE (but the REPO record may not). - if ($level1type === 'NAME') { - FunctionsEdit::printAddLayer('NOTE'); - FunctionsEdit::printAddLayer('SHARED_NOTE'); - } - break; - case 'FAM': - case 'INDI': - // FAM and INDI records have real facts. They can take NOTE/SOUR/OBJE/etc. - if ($level1type !== 'SEX' && $level1type !== 'NOTE' && $level1type !== 'ALIA') { - if ($level1type !== 'SOUR') { - FunctionsEdit::printAddLayer('SOUR'); - } - if ($level1type !== 'OBJE') { - FunctionsEdit::printAddLayer('OBJE'); - } - FunctionsEdit::printAddLayer('NOTE'); - FunctionsEdit::printAddLayer('SHARED_NOTE', 2, $level1type); - if ($level1type !== 'ASSO' && $level1type !== 'NOTE' && $level1type !== 'SOUR') { - FunctionsEdit::printAddLayer('ASSO'); - } - // allow to add godfather and godmother for CHR fact or best man and bridesmaid for MARR fact in one window - if (in_array($level1type, Config::twoAssociates())) { - FunctionsEdit::printAddLayer('ASSO2'); + case 'REPO': + // REPO:NAME facts may take a NOTE (but the REPO record may not). + if ($level1type === 'NAME') { + FunctionsEdit::printAddLayer('NOTE'); + FunctionsEdit::printAddLayer('SHARED_NOTE'); } - if ($level1type !== 'SOUR') { - FunctionsEdit::printAddLayer('RESN'); + break; + case 'FAM': + case 'INDI': + // FAM and INDI records have real facts. They can take NOTE/SOUR/OBJE/etc. + if ($level1type !== 'SEX' && $level1type !== 'NOTE' && $level1type !== 'ALIA') { + if ($level1type !== 'SOUR') { + FunctionsEdit::printAddLayer('SOUR'); + } + if ($level1type !== 'OBJE') { + FunctionsEdit::printAddLayer('OBJE'); + } + FunctionsEdit::printAddLayer('NOTE'); + FunctionsEdit::printAddLayer('SHARED_NOTE', 2, $level1type); + if ($level1type !== 'ASSO' && $level1type !== 'NOTE' && $level1type !== 'SOUR') { + FunctionsEdit::printAddLayer('ASSO'); + } + // allow to add godfather and godmother for CHR fact or best man and bridesmaid for MARR fact in one window + if (in_array($level1type, Config::twoAssociates())) { + FunctionsEdit::printAddLayer('ASSO2'); + } + if ($level1type !== 'SOUR') { + FunctionsEdit::printAddLayer('RESN'); + } } - } - break; - default: - // Other types of record do not have these lower-level records - break; + break; + default: + // Other types of record do not have these lower-level records + break; } ?> @@ -2120,15 +2120,15 @@ case 'changefamily': <b> <?php switch ($father->getSex()) { - case 'M': - echo I18N::translate('husband'); - break; - case 'F': - echo I18N::translate('wife'); - break; - default: - echo I18N::translate('spouse'); - break; + case 'M': + echo I18N::translate('husband'); + break; + case 'F': + echo I18N::translate('wife'); + break; + default: + echo I18N::translate('spouse'); + break; } ?> </b> @@ -2159,15 +2159,15 @@ case 'changefamily': <b> <?php switch ($mother->getSex()) { - case 'M': - echo I18N::translate('husband'); - break; - case 'F': - echo I18N::translate('wife'); - break; - default: - echo I18N::translate('spouse'); - break; + case 'M': + echo I18N::translate('husband'); + break; + case 'F': + echo I18N::translate('wife'); + break; + default: + echo I18N::translate('spouse'); + break; } ?> </b> @@ -2200,15 +2200,15 @@ case 'changefamily': <b> <?php switch ($child->getSex()) { - case 'M': - echo I18N::translate('son'); - break; - case 'F': - echo I18N::translate('daughter'); - break; - default: - echo I18N::translate('child'); - break; + case 'M': + echo I18N::translate('son'); + break; + case 'F': + echo I18N::translate('daughter'); + break; + default: + echo I18N::translate('child'); + break; } ?> </b> @@ -2886,35 +2886,35 @@ function print_indi_form($nextaction, Individual $person = null, Family $family } switch ($nextaction) { - case 'add_child_to_family_action': - $name_fields = array_merge($name_fields, $surname_tradition->newChildNames($father_name, $mother_name, $gender)); - break; - case 'add_child_to_individual_action': - if ($person->getSex() === 'F') { - $name_fields = array_merge($name_fields, $surname_tradition->newChildNames('', $indi_name, $gender)); - } else { - $name_fields = array_merge($name_fields, $surname_tradition->newChildNames($indi_name, '', $gender)); - } - break; - case 'add_parent_to_individual_action': - $name_fields = array_merge($name_fields, $surname_tradition->newParentNames($indi_name, $gender)); - break; - case 'add_spouse_to_family_action': - if ($father) { - $name_fields = array_merge($name_fields, $surname_tradition->newSpouseNames($father_name, $gender)); - } else { - $name_fields = array_merge($name_fields, $surname_tradition->newSpouseNames($mother_name, $gender)); - } - break; - case 'add_spouse_to_individual_action': - $name_fields = array_merge($name_fields, $surname_tradition->newSpouseNames($indi_name, $gender)); - break; - case 'add_unlinked_indi_action': - case 'update': - if ($surname_tradition->hasSurnames()) { - $name_fields['NAME'] = '//'; - } - break; + case 'add_child_to_family_action': + $name_fields = array_merge($name_fields, $surname_tradition->newChildNames($father_name, $mother_name, $gender)); + break; + case 'add_child_to_individual_action': + if ($person->getSex() === 'F') { + $name_fields = array_merge($name_fields, $surname_tradition->newChildNames('', $indi_name, $gender)); + } else { + $name_fields = array_merge($name_fields, $surname_tradition->newChildNames($indi_name, '', $gender)); + } + break; + case 'add_parent_to_individual_action': + $name_fields = array_merge($name_fields, $surname_tradition->newParentNames($indi_name, $gender)); + break; + case 'add_spouse_to_family_action': + if ($father) { + $name_fields = array_merge($name_fields, $surname_tradition->newSpouseNames($father_name, $gender)); + } else { + $name_fields = array_merge($name_fields, $surname_tradition->newSpouseNames($mother_name, $gender)); + } + break; + case 'add_spouse_to_individual_action': + $name_fields = array_merge($name_fields, $surname_tradition->newSpouseNames($indi_name, $gender)); + break; + case 'add_unlinked_indi_action': + case 'update': + if ($surname_tradition->hasSurnames()) { + $name_fields['NAME'] = '//'; + } + break; } } @@ -2934,11 +2934,11 @@ function print_indi_form($nextaction, Individual $person = null, Family $family echo '<table class="table wt-facts-table">'; switch ($nextaction) { - case 'add_child_to_family_action': - case 'add_child_to_individual_action': - // When adding a new child, specify the pedigree - echo FunctionsEdit::addSimpleTag('0 PEDI'); - break; + case 'add_child_to_family_action': + case 'add_child_to_individual_action': + // When adding a new child, specify the pedigree + echo FunctionsEdit::addSimpleTag('0 PEDI'); + break; } // First - standard name fields foreach ($name_fields as $tag => $value) { diff --git a/edituser.php b/edituser.php index c161e8077c..66c5778df5 100644 --- a/edituser.php +++ b/edituser.php @@ -48,46 +48,46 @@ $visible_online = Filter::postBool('visible-online'); // Respond to form action if ($action !== '' && Filter::checkCsrf()) { switch ($action) { - case 'update': - if ($username !== Auth::user()->getUserName() && User::findByUserName($username)) { - FlashMessages::addMessage(I18N::translate('Duplicate username. A user with that username already exists. Please choose another username.')); - } elseif ($email !== Auth::user()->getEmail() && User::findByEmail($email)) { - FlashMessages::addMessage(I18N::translate('Duplicate email address. A user with that email already exists.')); - } else { - // Change username - if ($username !== Auth::user()->getUserName()) { - Log::addAuthenticationLog('User ' . Auth::user()->getUserName() . ' renamed to ' . $username); - Auth::user()->setUserName($username); - } + case 'update': + if ($username !== Auth::user()->getUserName() && User::findByUserName($username)) { + FlashMessages::addMessage(I18N::translate('Duplicate username. A user with that username already exists. Please choose another username.')); + } elseif ($email !== Auth::user()->getEmail() && User::findByEmail($email)) { + FlashMessages::addMessage(I18N::translate('Duplicate email address. A user with that email already exists.')); + } else { + // Change username + if ($username !== Auth::user()->getUserName()) { + Log::addAuthenticationLog('User ' . Auth::user()->getUserName() . ' renamed to ' . $username); + Auth::user()->setUserName($username); + } - // Change password - if ($password_1 !== '' && $password_1 === $password_2) { - Auth::user()->setPassword($password_1); - } + // Change password + if ($password_1 !== '' && $password_1 === $password_2) { + Auth::user()->setPassword($password_1); + } - // Change other settings - Auth::user() - ->setRealName($real_name) - ->setEmail($email) - ->setPreference('language', $language) - ->setPreference('TIMEZONE', $time_zone) - ->setPreference('contactmethod', $contact_method) - ->setPreference('visibleonline', $visible_online ? '1' : '0'); + // Change other settings + Auth::user() + ->setRealName($real_name) + ->setEmail($email) + ->setPreference('language', $language) + ->setPreference('TIMEZONE', $time_zone) + ->setPreference('contactmethod', $contact_method) + ->setPreference('visibleonline', $visible_online ? '1' : '0'); - Auth::user()->setPreference('theme', $theme); + Auth::user()->setPreference('theme', $theme); - $WT_TREE->setUserPreference(Auth::user(), 'rootid', $root_id); - } - break; + $WT_TREE->setUserPreference(Auth::user(), 'rootid', $root_id); + } + break; - case 'delete': - // An administrator can only be deleted by another administrator - if (!Auth::user()->getPreference('canadmin')) { - $currentUser = Auth::user(); - Auth::logout(); - $currentUser->delete(); - } - break; + case 'delete': + // An administrator can only be deleted by another administrator + if (!Auth::user()->getPreference('canadmin')) { + $currentUser = Auth::user(); + Auth::logout(); + $currentUser->delete(); + } + break; } header('Location: edituser.php'); diff --git a/expand_view.php b/expand_view.php index 1c25b00719..70d93ff32c 100644 --- a/expand_view.php +++ b/expand_view.php @@ -38,38 +38,38 @@ Functions::sortFacts($facts); foreach ($facts as $fact) { switch ($fact->getTag()) { - case 'ADDR': - case 'ALIA': - case 'ASSO': - case 'CHAN': - case 'CHIL': - case 'EMAIL': - case 'FAMC': - case 'FAMS': - case 'HUSB': - case 'NAME': - case 'NOTE': - case 'OBJE': - case 'PHON': - case 'RESI': - case 'RESN': - case 'SEX': - case 'SOUR': - case 'SSN': - case 'SUBM': - case 'TITL': - case 'URL': - case 'WIFE': - case 'WWW': - case '_EMAIL': - case '_TODO': - case '_UID': - case '_WT_OBJE_SORT': - // Do not show these - break; - default: - // Simple version of FunctionsPrintFacts::print_fact() - echo $fact->summary(); - break; + case 'ADDR': + case 'ALIA': + case 'ASSO': + case 'CHAN': + case 'CHIL': + case 'EMAIL': + case 'FAMC': + case 'FAMS': + case 'HUSB': + case 'NAME': + case 'NOTE': + case 'OBJE': + case 'PHON': + case 'RESI': + case 'RESN': + case 'SEX': + case 'SOUR': + case 'SSN': + case 'SUBM': + case 'TITL': + case 'URL': + case 'WIFE': + case 'WWW': + case '_EMAIL': + case '_TODO': + case '_UID': + case '_WT_OBJE_SORT': + // Do not show these + break; + default: + // Simple version of FunctionsPrintFacts::print_fact() + echo $fact->summary(); + break; } } diff --git a/famlist.php b/famlist.php index 2295415be5..12abb2e310 100644 --- a/famlist.php +++ b/famlist.php @@ -37,12 +37,12 @@ if ($show_all_firstnames === 'yes') { $show_marnm = Filter::get('show_marnm', 'no|yes'); switch ($show_marnm) { -case 'no': -case 'yes': - Auth::user()->setPreference('famlist.php_show_marnm', $show_marnm); - break; -default: - $show_marnm = Auth::user()->getPreference('famlist.php_show_marnm'); + case 'no': + case 'yes': + Auth::user()->setPreference('famlist.php_show_marnm', $show_marnm); + break; + default: + $show_marnm = Auth::user()->getPreference('famlist.php_show_marnm'); } // Make sure selections are consistent. @@ -79,16 +79,16 @@ if ($show_all === 'yes') { } $url = '?surname=' . rawurlencode($surname) . '&ged=' . $controller->tree()->getNameUrl(); switch ($falpha) { - case '': - break; - case '@': - $legend .= ', ' . I18N::translateContext('Unknown given name', '…'); - $url .= '&falpha=' . rawurlencode($falpha) . '&ged=' . $controller->tree()->getNameUrl(); - break; - default: - $legend .= ', ' . Html::escape($falpha) . '…'; - $url .= '&falpha=' . rawurlencode($falpha) . '&ged=' . $controller->tree()->getNameUrl(); - break; + case '': + break; + case '@': + $legend .= ', ' . I18N::translateContext('Unknown given name', '…'); + $url .= '&falpha=' . rawurlencode($falpha) . '&ged=' . $controller->tree()->getNameUrl(); + break; + default: + $legend .= ', ' . Html::escape($falpha) . '…'; + $url .= '&falpha=' . rawurlencode($falpha) . '&ged=' . $controller->tree()->getNameUrl(); + break; } $show = 'indi'; // SURN list makes no sense here } elseif ($alpha === '@') { @@ -173,16 +173,16 @@ if ($show === 'indi' || $show === 'surn') { if ($show === 'surn') { // Show the surname list switch ($controller->tree()->getPreference('SURNAME_LIST_STYLE')) { - case 'style1': - echo FunctionsPrintLists::surnameList($surns, 3, true, 'famlist.php', $controller->tree()); - break; - case 'style3': - echo FunctionsPrintLists::surnameTagCloud($surns, 'famlist.php', true, $controller->tree()); - break; - case 'style2': - default: - echo FunctionsPrintLists::surnameTable($surns, 'famlist.php', $controller->tree()); - break; + case 'style1': + echo FunctionsPrintLists::surnameList($surns, 3, true, 'famlist.php', $controller->tree()); + break; + case 'style3': + echo FunctionsPrintLists::surnameTagCloud($surns, 'famlist.php', true, $controller->tree()); + break; + case 'style2': + default: + echo FunctionsPrintLists::surnameTable($surns, 'famlist.php', $controller->tree()); + break; } } else { // Show the list diff --git a/help_text.php b/help_text.php index f8481b127c..87e98394c2 100644 --- a/help_text.php +++ b/help_text.php @@ -28,102 +28,102 @@ switch ($help_topic) { // Generally, these tags need to be lists explicitly in FunctionsEdit::add_simple_tag() ////////////////////////////////////////////////////////////////////////////// -case 'DATE': - $title = I18N::translate('Date'); - $dates = [ - '1900' => new Date('1900'), - 'JAN 1900' => new Date('JAN 1900'), - 'FEB 1900' => new Date('FEB 1900'), - 'MAR 1900' => new Date('MAR 1900'), - 'APR 1900' => new Date('APR 1900'), - 'MAY 1900' => new Date('MAY 1900'), - 'JUN 1900' => new Date('JUN 1900'), - 'JUL 1900' => new Date('JUL 1900'), - 'AUG 1900' => new Date('AUG 1900'), - 'SEP 1900' => new Date('SEP 1900'), - 'OCT 1900' => new Date('OCT 1900'), - 'NOV 1900' => new Date('NOV 1900'), - 'DEC 1900' => new Date('DEC 1900'), - '11 DEC 1913' => new Date('11 DEC 1913'), - '01 FEB 2003' => new Date('01 FEB 2003'), - 'ABT 1900' => new Date('ABT 1900'), - 'EST 1900' => new Date('EST 1900'), - 'CAL 1900' => new Date('CAL 1900'), - 'INT 1900 (...)' => new Date('INT 1900 (...)'), - '@#DJULIAN@ 44 B.C.' => new Date('@#DJULIAN@ 44 B.C.'), - '@#DJULIAN@ 14 JAN 1700' => new Date('@#DJULIAN@ 14 JAN 1700'), - 'BET @#DJULIAN@ 01 SEP 1752 AND @#DGREGORIAN@ 30 SEP 1752' => new Date('BET @#DJULIAN@ 01 SEP 1752 AND @#DGREGORIAN@ 30 SEP 1752'), - '@#DJULIAN@ 20 FEB 1742/43' => new Date('@#DJULIAN@ 20 FEB 1742/43'), - 'FROM 1900 TO 1910' => new Date('FROM 1900 TO 1910'), - 'FROM 1900' => new Date('FROM 1900'), - 'TO 1910' => new Date('TO 1910'), - 'BET 1900 AND 1910' => new Date('BET 1900 AND 1910'), - 'BET JAN 1900 AND MAR 1900' => new Date('BET JAN 1900 AND MAR 1900'), - 'BET APR 1900 AND JUN 1900' => new Date('BET APR 1900 AND JUN 1900'), - 'BET JUL 1900 AND SEP 1900' => new Date('BET JUL 1900 AND SEP 1900'), - 'BET OCT 1900 AND DEC 1900' => new Date('BET OCT 1900 AND DEC 1900'), - 'AFT 1900' => new Date('AFT 1900'), - 'BEF 1910' => new Date('BEF 1910'), - // Hijri dates - '@#DHIJRI@ 1497' => new Date('@#DHIJRI@ 1497'), - '@#DHIJRI@ MUHAR 1497' => new Date('@#DHIJRI@ MUHAR 1497'), - 'ABT @#DHIJRI@ SAFAR 1497' => new Date('ABT @#DHIJRI@ SAFAR 1497'), - 'BET @#DHIJRI@ RABIA 1497 AND @#DHIJRI@ RABIT 1497' => new Date('BET @#DHIJRI@ RABIA 1497 AND @#DHIJRI@ RABIT 1497'), - 'FROM @#DHIJRI@ JUMAA 1497 TO @#DHIJRI@ JUMAT 1497' => new Date('FROM @#DHIJRI@ JUMAA 1497 TO @#DHIJRI@ JUMAT 1497'), - 'AFT @#DHIJRI@ RAJAB 1497' => new Date('AFT @#DHIJRI@ RAJAB 1497'), - 'BEF @#DHIJRI@ SHAAB 1497' => new Date('BEF @#DHIJRI@ SHAAB 1497'), - 'ABT @#DHIJRI@ RAMAD 1497' => new Date('ABT @#DHIJRI@ RAMAD 1497'), - 'FROM @#DHIJRI@ SHAWW 1497' => new Date('FROM @#DHIJRI@ SHAWW 1497'), - 'TO @#DHIJRI@ DHUAQ 1497' => new Date('TO @#DHIJRI@ DHUAQ 1497'), - '@#DHIJRI@ 03 DHUAH 1497' => new Date('@#DHIJRI@ 03 DHUAH 1497'), - // French dates - '@#DFRENCH R@ 12' => new Date('@#DFRENCH R@ 12'), - '@#DFRENCH R@ VEND 12' => new Date('@#DFRENCH R@ VEND 12'), - 'ABT @#DFRENCH R@ BRUM 12' => new Date('ABT @#DFRENCH R@ BRUM 12'), - 'BET @#DFRENCH R@ FRIM 12 AND @#DFRENCH R@ NIVO 12' => new Date('BET @#DFRENCH R@ FRIM 12 AND @#DFRENCH R@ NIVO 12'), - 'FROM @#DFRENCH R@ PLUV 12 TO @#DFRENCH R@ VENT 12' => new Date('FROM @#DFRENCH R@ PLUV 12 TO @#DFRENCH R@ VENT 12'), - 'AFT @#DFRENCH R@ GERM 12' => new Date('AFT @#DFRENCH R@ GERM 12'), - 'BEF @#DFRENCH R@ FLOR 12' => new Date('BEF @#DFRENCH R@ FLOR 12'), - 'ABT @#DFRENCH R@ PRAI 12' => new Date('ABT @#DFRENCH R@ PRAI 12'), - 'FROM @#DFRENCH R@ MESS 12' => new Date('FROM @#DFRENCH R@ MESS 12'), - 'TO @#DFRENCH R@ THER 12' => new Date('TO @#DFRENCH R@ THER 12'), - 'EST @#DFRENCH R@ FRUC 12' => new Date('EST @#DFRENCH R@ FRUC 12'), - '@#DFRENCH R@ 03 COMP 12' => new Date('@#DFRENCH R@ 03 COMP 12'), - // Jewish dates - '@#DHEBREW@ 5481' => new Date('@#DHEBREW@ 5481'), - '@#DHEBREW@ TSH 5481' => new Date('@#DHEBREW@ TSH 5481'), - 'ABT @#DHEBREW@ CSH 5481' => new Date('ABT @#DHEBREW@ CSH 5481'), - 'BET @#DHEBREW@ KSL 5481 AND @#DHEBREW@ TVT 5481' => new Date('BET @#DHEBREW@ KSL 5481 AND @#DHEBREW@ TVT 5481'), - 'FROM @#DHEBREW@ SHV 5481 TO @#DHEBREW@ ADR 5481' => new Date('FROM @#DHEBREW@ SHV 5481 TO @#DHEBREW@ ADR 5481'), - 'AFT @#DHEBREW@ ADR 5481' => new Date('AFT @#DHEBREW@ ADR 5481'), - 'AFT @#DHEBREW@ ADS 5480' => new Date('AFT @#DHEBREW@ ADS 5480'), - 'BEF @#DHEBREW@ NSN 5481' => new Date('BEF @#DHEBREW@ NSN 5481'), - 'ABT @#DHEBREW@ IYR 5481' => new Date('ABT @#DHEBREW@ IYR 5481'), - 'FROM @#DHEBREW@ SVN 5481' => new Date('FROM @#DHEBREW@ SVN 5481'), - 'TO @#DHEBREW@ TMZ 5481' => new Date('TO @#DHEBREW@ TMZ 5481'), - 'EST @#DHEBREW@ AAV 5481' => new Date('EST @#DHEBREW@ AAV 5481'), - '@#DHEBREW@ 03 ELL 5481' => new Date('@#DHEBREW@ 03 ELL 5481'), - ]; + case 'DATE': + $title = I18N::translate('Date'); + $dates = [ + '1900' => new Date('1900'), + 'JAN 1900' => new Date('JAN 1900'), + 'FEB 1900' => new Date('FEB 1900'), + 'MAR 1900' => new Date('MAR 1900'), + 'APR 1900' => new Date('APR 1900'), + 'MAY 1900' => new Date('MAY 1900'), + 'JUN 1900' => new Date('JUN 1900'), + 'JUL 1900' => new Date('JUL 1900'), + 'AUG 1900' => new Date('AUG 1900'), + 'SEP 1900' => new Date('SEP 1900'), + 'OCT 1900' => new Date('OCT 1900'), + 'NOV 1900' => new Date('NOV 1900'), + 'DEC 1900' => new Date('DEC 1900'), + '11 DEC 1913' => new Date('11 DEC 1913'), + '01 FEB 2003' => new Date('01 FEB 2003'), + 'ABT 1900' => new Date('ABT 1900'), + 'EST 1900' => new Date('EST 1900'), + 'CAL 1900' => new Date('CAL 1900'), + 'INT 1900 (...)' => new Date('INT 1900 (...)'), + '@#DJULIAN@ 44 B.C.' => new Date('@#DJULIAN@ 44 B.C.'), + '@#DJULIAN@ 14 JAN 1700' => new Date('@#DJULIAN@ 14 JAN 1700'), + 'BET @#DJULIAN@ 01 SEP 1752 AND @#DGREGORIAN@ 30 SEP 1752' => new Date('BET @#DJULIAN@ 01 SEP 1752 AND @#DGREGORIAN@ 30 SEP 1752'), + '@#DJULIAN@ 20 FEB 1742/43' => new Date('@#DJULIAN@ 20 FEB 1742/43'), + 'FROM 1900 TO 1910' => new Date('FROM 1900 TO 1910'), + 'FROM 1900' => new Date('FROM 1900'), + 'TO 1910' => new Date('TO 1910'), + 'BET 1900 AND 1910' => new Date('BET 1900 AND 1910'), + 'BET JAN 1900 AND MAR 1900' => new Date('BET JAN 1900 AND MAR 1900'), + 'BET APR 1900 AND JUN 1900' => new Date('BET APR 1900 AND JUN 1900'), + 'BET JUL 1900 AND SEP 1900' => new Date('BET JUL 1900 AND SEP 1900'), + 'BET OCT 1900 AND DEC 1900' => new Date('BET OCT 1900 AND DEC 1900'), + 'AFT 1900' => new Date('AFT 1900'), + 'BEF 1910' => new Date('BEF 1910'), + // Hijri dates + '@#DHIJRI@ 1497' => new Date('@#DHIJRI@ 1497'), + '@#DHIJRI@ MUHAR 1497' => new Date('@#DHIJRI@ MUHAR 1497'), + 'ABT @#DHIJRI@ SAFAR 1497' => new Date('ABT @#DHIJRI@ SAFAR 1497'), + 'BET @#DHIJRI@ RABIA 1497 AND @#DHIJRI@ RABIT 1497' => new Date('BET @#DHIJRI@ RABIA 1497 AND @#DHIJRI@ RABIT 1497'), + 'FROM @#DHIJRI@ JUMAA 1497 TO @#DHIJRI@ JUMAT 1497' => new Date('FROM @#DHIJRI@ JUMAA 1497 TO @#DHIJRI@ JUMAT 1497'), + 'AFT @#DHIJRI@ RAJAB 1497' => new Date('AFT @#DHIJRI@ RAJAB 1497'), + 'BEF @#DHIJRI@ SHAAB 1497' => new Date('BEF @#DHIJRI@ SHAAB 1497'), + 'ABT @#DHIJRI@ RAMAD 1497' => new Date('ABT @#DHIJRI@ RAMAD 1497'), + 'FROM @#DHIJRI@ SHAWW 1497' => new Date('FROM @#DHIJRI@ SHAWW 1497'), + 'TO @#DHIJRI@ DHUAQ 1497' => new Date('TO @#DHIJRI@ DHUAQ 1497'), + '@#DHIJRI@ 03 DHUAH 1497' => new Date('@#DHIJRI@ 03 DHUAH 1497'), + // French dates + '@#DFRENCH R@ 12' => new Date('@#DFRENCH R@ 12'), + '@#DFRENCH R@ VEND 12' => new Date('@#DFRENCH R@ VEND 12'), + 'ABT @#DFRENCH R@ BRUM 12' => new Date('ABT @#DFRENCH R@ BRUM 12'), + 'BET @#DFRENCH R@ FRIM 12 AND @#DFRENCH R@ NIVO 12' => new Date('BET @#DFRENCH R@ FRIM 12 AND @#DFRENCH R@ NIVO 12'), + 'FROM @#DFRENCH R@ PLUV 12 TO @#DFRENCH R@ VENT 12' => new Date('FROM @#DFRENCH R@ PLUV 12 TO @#DFRENCH R@ VENT 12'), + 'AFT @#DFRENCH R@ GERM 12' => new Date('AFT @#DFRENCH R@ GERM 12'), + 'BEF @#DFRENCH R@ FLOR 12' => new Date('BEF @#DFRENCH R@ FLOR 12'), + 'ABT @#DFRENCH R@ PRAI 12' => new Date('ABT @#DFRENCH R@ PRAI 12'), + 'FROM @#DFRENCH R@ MESS 12' => new Date('FROM @#DFRENCH R@ MESS 12'), + 'TO @#DFRENCH R@ THER 12' => new Date('TO @#DFRENCH R@ THER 12'), + 'EST @#DFRENCH R@ FRUC 12' => new Date('EST @#DFRENCH R@ FRUC 12'), + '@#DFRENCH R@ 03 COMP 12' => new Date('@#DFRENCH R@ 03 COMP 12'), + // Jewish dates + '@#DHEBREW@ 5481' => new Date('@#DHEBREW@ 5481'), + '@#DHEBREW@ TSH 5481' => new Date('@#DHEBREW@ TSH 5481'), + 'ABT @#DHEBREW@ CSH 5481' => new Date('ABT @#DHEBREW@ CSH 5481'), + 'BET @#DHEBREW@ KSL 5481 AND @#DHEBREW@ TVT 5481' => new Date('BET @#DHEBREW@ KSL 5481 AND @#DHEBREW@ TVT 5481'), + 'FROM @#DHEBREW@ SHV 5481 TO @#DHEBREW@ ADR 5481' => new Date('FROM @#DHEBREW@ SHV 5481 TO @#DHEBREW@ ADR 5481'), + 'AFT @#DHEBREW@ ADR 5481' => new Date('AFT @#DHEBREW@ ADR 5481'), + 'AFT @#DHEBREW@ ADS 5480' => new Date('AFT @#DHEBREW@ ADS 5480'), + 'BEF @#DHEBREW@ NSN 5481' => new Date('BEF @#DHEBREW@ NSN 5481'), + 'ABT @#DHEBREW@ IYR 5481' => new Date('ABT @#DHEBREW@ IYR 5481'), + 'FROM @#DHEBREW@ SVN 5481' => new Date('FROM @#DHEBREW@ SVN 5481'), + 'TO @#DHEBREW@ TMZ 5481' => new Date('TO @#DHEBREW@ TMZ 5481'), + 'EST @#DHEBREW@ AAV 5481' => new Date('EST @#DHEBREW@ AAV 5481'), + '@#DHEBREW@ 03 ELL 5481' => new Date('@#DHEBREW@ 03 ELL 5481'), + ]; - foreach ($dates as &$date) { - $date = strip_tags($date->display(false, null, false)); - } - // These shortcuts work differently for different languages - switch (preg_replace('/[^DMY]/', '', str_replace(['J', 'F'], ['D', 'M'], I18N::dateFormat()))) { - case 'YMD': - $example1 = '11/12/1913'; // Note: we ignore the DMY order if it doesn't make sense. - $example2 = '03/02/01'; - break; - case 'MDY': - $example1 = '12/11/1913'; - $example2 = '02/01/03'; - break; - case 'DMY': - default: - $example1 = '11/12/1913'; - $example2 = '01/02/03'; - break; - } + foreach ($dates as &$date) { + $date = strip_tags($date->display(false, null, false)); + } + // These shortcuts work differently for different languages + switch (preg_replace('/[^DMY]/', '', str_replace(['J', 'F'], ['D', 'M'], I18N::dateFormat()))) { + case 'YMD': + $example1 = '11/12/1913'; // Note: we ignore the DMY order if it doesn't make sense. + $example2 = '03/02/01'; + break; + case 'MDY': + $example1 = '12/11/1913'; + $example2 = '02/01/03'; + break; + case 'DMY': + default: + $example1 = '11/12/1913'; + $example2 = '01/02/03'; + break; + } $example1 .= '<br>' . str_replace('/', '-', $example1) . '<br>' . str_replace('/', '.', $example1); $example2 .= '<br>' . str_replace('/', '-', $example2) . '<br>' . str_replace('/', '.', $example2); $text = @@ -208,99 +208,99 @@ case 'DATE': break; // This help text is used for all NAME components -case 'NAME': - $title = GedcomTag::getLabel('NAME'); - $text = - '<p>' . - I18N::translate('The <b>name</b> field contains the individual’s full name, as they would have spelled it or as it was recorded. This is how it will be displayed on screen. It uses standard genealogy annotations to identify different parts of the name.') . - '</p>' . - '<ul><li>' . - I18N::translate('The surname is enclosed by slashes: <%s>John Paul /Smith/<%s>', 'span style="color:#0000ff;"', '/span') . - '</li><li>' . - I18N::translate('If the surname is unknown, use empty slashes: <%s>Mary //<%s>', 'span style="color:#0000ff;"', '/span') . - '</li><li>' . - I18N::translate('If an individual has two separate surnames, both should be enclosed by slashes: <%s>José Antonio /Gómez/ /Iglesias/<%s>', 'span style="color:#0000ff;"', '/span') . - '</li><li>' . - I18N::translate('If an individual does not have a surname, no slashes are needed: <%s>Jón Einarsson<%s>', 'span style="color:#0000ff;"', '/span') . - '</li><li>' . - I18N::translate('If an individual was not known by their first given name, the preferred name should be indicated with an asterisk: <%s>John Paul* /Smith/<%s>', 'span style="color:#0000ff;"', '/span') . - '</li><li>' . - I18N::translate('If an individual was known by a nickname which is not part of their formal name, it should be enclosed by quotation marks. For example, <%s>John "Nobby" /Clark/<%s>.', 'span style="color:#0000ff;"', '/span') . - '</li></ul>'; - break; + case 'NAME': + $title = GedcomTag::getLabel('NAME'); + $text = + '<p>' . + I18N::translate('The <b>name</b> field contains the individual’s full name, as they would have spelled it or as it was recorded. This is how it will be displayed on screen. It uses standard genealogy annotations to identify different parts of the name.') . + '</p>' . + '<ul><li>' . + I18N::translate('The surname is enclosed by slashes: <%s>John Paul /Smith/<%s>', 'span style="color:#0000ff;"', '/span') . + '</li><li>' . + I18N::translate('If the surname is unknown, use empty slashes: <%s>Mary //<%s>', 'span style="color:#0000ff;"', '/span') . + '</li><li>' . + I18N::translate('If an individual has two separate surnames, both should be enclosed by slashes: <%s>José Antonio /Gómez/ /Iglesias/<%s>', 'span style="color:#0000ff;"', '/span') . + '</li><li>' . + I18N::translate('If an individual does not have a surname, no slashes are needed: <%s>Jón Einarsson<%s>', 'span style="color:#0000ff;"', '/span') . + '</li><li>' . + I18N::translate('If an individual was not known by their first given name, the preferred name should be indicated with an asterisk: <%s>John Paul* /Smith/<%s>', 'span style="color:#0000ff;"', '/span') . + '</li><li>' . + I18N::translate('If an individual was known by a nickname which is not part of their formal name, it should be enclosed by quotation marks. For example, <%s>John "Nobby" /Clark/<%s>.', 'span style="color:#0000ff;"', '/span') . + '</li></ul>'; + break; -case 'SURN': - $title = I18N::translate('Surname'); - $text = '<p>' . - I18N::translate('The <b>surname</b> field contains a name that is used for sorting and grouping. It can be different to the individual’s actual surname which is always taken from the <b>name</b> field. This field can be used to sort surnames with or without a prefix (Gogh / van Gogh) and to group spelling variations or inflections (Kowalski / Kowalska). If an individual needs to be listed under more than one surname, each name should be separated by a comma.') . - '</p>'; - break; + case 'SURN': + $title = I18N::translate('Surname'); + $text = '<p>' . + I18N::translate('The <b>surname</b> field contains a name that is used for sorting and grouping. It can be different to the individual’s actual surname which is always taken from the <b>name</b> field. This field can be used to sort surnames with or without a prefix (Gogh / van Gogh) and to group spelling variations or inflections (Kowalski / Kowalska). If an individual needs to be listed under more than one surname, each name should be separated by a comma.') . + '</p>'; + break; -case 'OBJE': - $title = I18N::translate('Media object'); - $text = - '<p>' . - I18N::translate('A media object is a record in the family tree which contains information about a media file. This information may include a title, a copyright notice, a transcript, privacy restrictions, etc. The media file, such as the photo or video, can be stored locally (on this webserver) or remotely (on a different webserver).') . - '</p>'; - break; + case 'OBJE': + $title = I18N::translate('Media object'); + $text = + '<p>' . + I18N::translate('A media object is a record in the family tree which contains information about a media file. This information may include a title, a copyright notice, a transcript, privacy restrictions, etc. The media file, such as the photo or video, can be stored locally (on this webserver) or remotely (on a different webserver).') . + '</p>'; + break; -case 'PLAC': - $title = I18N::translate('Place'); - $text = I18N::translate('Places should be entered according to the standards for genealogy. In genealogy, places are recorded with the most specific information about the place first and then working up to the least specific place last, using commas to separate the different place levels. The level at which you record the place information should represent the levels of government or church where vital records for that place are kept.<br><br>For example, a place like Salt Lake City would be entered as “Salt Lake City, Salt Lake, Utah, USA”.<br><br>Let’s examine each part of this place. The first part, “Salt Lake City,” is the city or township where the event occurred. In some countries, there may be municipalities or districts inside a city which are important to note. In that case, they should come before the city. The next part, “Salt Lake,” is the county. “Utah” is the state, and “USA” is the country. It is important to note each place because genealogy records are kept by the governments of each level.<br><br>If a level of the place is unknown, you should leave a space between the commas. Suppose, in the example above, you didn’t know the county for Salt Lake City. You should then record it like this: “Salt Lake City, , Utah, USA”. Suppose you only know that an individual was born in Utah. You would enter the information like this: “, , Utah, USA”. <br><br>You can use the <b>Find Place</b> link to help you find places that already exist in the database.'); - break; + case 'PLAC': + $title = I18N::translate('Place'); + $text = I18N::translate('Places should be entered according to the standards for genealogy. In genealogy, places are recorded with the most specific information about the place first and then working up to the least specific place last, using commas to separate the different place levels. The level at which you record the place information should represent the levels of government or church where vital records for that place are kept.<br><br>For example, a place like Salt Lake City would be entered as “Salt Lake City, Salt Lake, Utah, USA”.<br><br>Let’s examine each part of this place. The first part, “Salt Lake City,” is the city or township where the event occurred. In some countries, there may be municipalities or districts inside a city which are important to note. In that case, they should come before the city. The next part, “Salt Lake,” is the county. “Utah” is the state, and “USA” is the country. It is important to note each place because genealogy records are kept by the governments of each level.<br><br>If a level of the place is unknown, you should leave a space between the commas. Suppose, in the example above, you didn’t know the county for Salt Lake City. You should then record it like this: “Salt Lake City, , Utah, USA”. Suppose you only know that an individual was born in Utah. You would enter the information like this: “, , Utah, USA”. <br><br>You can use the <b>Find Place</b> link to help you find places that already exist in the database.'); + break; -case 'RESN': - $title = GedcomTag::getLabel('RESN'); - $text = I18N::translate('Restrictions can be added to records and/or facts. They restrict who can view the data and who can edit it.') . '<br><br>' . I18N::translate('Note that if a user account is linked to a record, then that user will always be able to view that record.'); - break; + case 'RESN': + $title = GedcomTag::getLabel('RESN'); + $text = I18N::translate('Restrictions can be added to records and/or facts. They restrict who can view the data and who can edit it.') . '<br><br>' . I18N::translate('Note that if a user account is linked to a record, then that user will always be able to view that record.'); + break; -case 'ROMN': - $title = GedcomTag::getLabel('ROMN'); - $text = I18N::translate('In many cultures it is customary to have a traditional name spelled in the traditional characters and also a romanized version of the name as it would be spelled or pronounced in languages based on the Latin alphabet, such as English.<br><br>If you prefer to use a non-Latin alphabet such as Hebrew, Greek, Russian, Chinese, or Arabic to enter the name in the standard name fields, then you can use this field to enter the same name using the Latin alphabet. Both versions of the name will appear in lists and charts.<br><br>Although this field is labeled “Romanized”, it is not restricted to containing only characters based on the Latin alphabet. This might be of use with Japanese names, where three different alphabets may occur.'); - break; + case 'ROMN': + $title = GedcomTag::getLabel('ROMN'); + $text = I18N::translate('In many cultures it is customary to have a traditional name spelled in the traditional characters and also a romanized version of the name as it would be spelled or pronounced in languages based on the Latin alphabet, such as English.<br><br>If you prefer to use a non-Latin alphabet such as Hebrew, Greek, Russian, Chinese, or Arabic to enter the name in the standard name fields, then you can use this field to enter the same name using the Latin alphabet. Both versions of the name will appear in lists and charts.<br><br>Although this field is labeled “Romanized”, it is not restricted to containing only characters based on the Latin alphabet. This might be of use with Japanese names, where three different alphabets may occur.'); + break; -case '_HEB': - $title = GedcomTag::getLabel('_HEB'); - $text = I18N::translate('In many cultures it is customary to have a traditional name spelled in the traditional characters and also a romanized version of the name as it would be spelled or pronounced in languages based on the Latin alphabet, such as English.<br><br>If you prefer to use the Latin alphabet to enter the name in the standard name fields, then you can use this field to enter the same name in the non-Latin alphabet such as Greek, Hebrew, Russian, Arabic, or Chinese. Both versions of the name will appear in lists and charts.<br><br>Although this field is labeled “Hebrew”, it is not restricted to containing only Hebrew characters.'); - break; + case '_HEB': + $title = GedcomTag::getLabel('_HEB'); + $text = I18N::translate('In many cultures it is customary to have a traditional name spelled in the traditional characters and also a romanized version of the name as it would be spelled or pronounced in languages based on the Latin alphabet, such as English.<br><br>If you prefer to use the Latin alphabet to enter the name in the standard name fields, then you can use this field to enter the same name in the non-Latin alphabet such as Greek, Hebrew, Russian, Arabic, or Chinese. Both versions of the name will appear in lists and charts.<br><br>Although this field is labeled “Hebrew”, it is not restricted to containing only Hebrew characters.'); + break; - ////////////////////////////////////////////////////////////////////////////// - // This section contains all the other help items. - ////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////////// + // This section contains all the other help items. + ////////////////////////////////////////////////////////////////////////////// -case 'annivers_year_select': - $title = I18N::translate('Year input box'); - $text = I18N::translate('This input box lets you change that year of the calendar. Type a year into the box and press <b>Enter</b> to change the calendar to that year.<br><br><b>Advanced features</b> for <b>View the year</b><dl><dt><b>More than one year</b></dt><dd>You can search for dates in a range of years.<br><br>Year ranges are <u>inclusive</u>. This means that the date range extends from 1 January of the first year of the range to 31 December of the last year mentioned. Here are a few examples of year ranges:<br><br><b>1992-5</b> for all events from 1992 to 1995.<br><b>1972-89</b> for all events from 1972 to 1989.<br><b>1610-759</b> for all events from 1610 to 1759.<br><b>1880-1905</b> for all events from 1880 to 1905.<br><b>880-1105</b> for all events from 880 to 1105.<br><br>To see all the events in a given decade or century, you can use <b>?</b> in place of the final digits. For example, <b>197?</b> for all events from 1970 to 1979 or <b>16??</b> for all events from 1600 to 1699.<br><br>Selecting a range of years will change the calendar to the year view.</dd></dl>'); - break; + case 'annivers_year_select': + $title = I18N::translate('Year input box'); + $text = I18N::translate('This input box lets you change that year of the calendar. Type a year into the box and press <b>Enter</b> to change the calendar to that year.<br><br><b>Advanced features</b> for <b>View the year</b><dl><dt><b>More than one year</b></dt><dd>You can search for dates in a range of years.<br><br>Year ranges are <u>inclusive</u>. This means that the date range extends from 1 January of the first year of the range to 31 December of the last year mentioned. Here are a few examples of year ranges:<br><br><b>1992-5</b> for all events from 1992 to 1995.<br><b>1972-89</b> for all events from 1972 to 1989.<br><b>1610-759</b> for all events from 1610 to 1759.<br><b>1880-1905</b> for all events from 1880 to 1905.<br><b>880-1105</b> for all events from 880 to 1105.<br><br>To see all the events in a given decade or century, you can use <b>?</b> in place of the final digits. For example, <b>197?</b> for all events from 1970 to 1979 or <b>16??</b> for all events from 1600 to 1699.<br><br>Selecting a range of years will change the calendar to the year view.</dd></dl>'); + break; -case 'edit_SOUR_EVEN': - $title = I18N::translate('Associate events with this source'); - $text = I18N::translate('Each source records specific events, generally for a given date range and for a place jurisdiction. For example a Census records census events and church records record birth, marriage, and death events.<br><br>Select the events that are recorded by this source from the list of events provided. The date should be specified in a range format such as <i>FROM 1900 TO 1910</i>. The place jurisdiction is the name of the lowest jurisdiction that encompasses all lower-level places named in this source. For example, “Oneida, Idaho, USA” would be used as a source jurisdiction place for events occurring in the various towns within Oneida County. “Idaho, USA” would be the source jurisdiction place if the events recorded took place not only in Oneida County but also in other counties in Idaho.'); - break; + case 'edit_SOUR_EVEN': + $title = I18N::translate('Associate events with this source'); + $text = I18N::translate('Each source records specific events, generally for a given date range and for a place jurisdiction. For example a Census records census events and church records record birth, marriage, and death events.<br><br>Select the events that are recorded by this source from the list of events provided. The date should be specified in a range format such as <i>FROM 1900 TO 1910</i>. The place jurisdiction is the name of the lowest jurisdiction that encompasses all lower-level places named in this source. For example, “Oneida, Idaho, USA” would be used as a source jurisdiction place for events occurring in the various towns within Oneida County. “Idaho, USA” would be the source jurisdiction place if the events recorded took place not only in Oneida County but also in other counties in Idaho.'); + break; -case 'google_chart_surname': - $title = I18N::translate('Surname'); - $text = I18N::translate('The number of occurrences of the specified name will be shown on the map. If you leave this field empty, the most common surname will be used.'); - break; + case 'google_chart_surname': + $title = I18N::translate('Surname'); + $text = I18N::translate('The number of occurrences of the specified name will be shown on the map. If you leave this field empty, the most common surname will be used.'); + break; -case 'pending_changes': - $title = I18N::translate('Pending changes'); - $text = '<p>' . I18N::translate('When you add, edit, or delete information, the changes are not saved immediately. Instead, they are kept in a “pending” area. These pending changes need to be reviewed by a moderator before they are accepted.') . '</p><p>' . - I18N::translate('This process allows the site’s owner to ensure that the new information follows the site’s standards and conventions, has proper source attributions, etc.') . - '</p><p>' . - I18N::translate('Pending changes are only shown when your account has permission to edit. When you sign out, you will no longer be able to see them. Also, pending changes are only shown on certain pages. For example, they are not shown in lists, reports, or search results.') . - '</p>'; - if (Auth::isAdmin()) { - $text .= - '<p>' . - I18N::translate('Each user account has an option to “automatically accept changes”. When this is enabled, any changes made by that user are saved immediately. Many administrators enable this for their own user account.') . + case 'pending_changes': + $title = I18N::translate('Pending changes'); + $text = '<p>' . I18N::translate('When you add, edit, or delete information, the changes are not saved immediately. Instead, they are kept in a “pending” area. These pending changes need to be reviewed by a moderator before they are accepted.') . '</p><p>' . + I18N::translate('This process allows the site’s owner to ensure that the new information follows the site’s standards and conventions, has proper source attributions, etc.') . + '</p><p>' . + I18N::translate('Pending changes are only shown when your account has permission to edit. When you sign out, you will no longer be able to see them. Also, pending changes are only shown on certain pages. For example, they are not shown in lists, reports, or search results.') . '</p>'; - } - break; + if (Auth::isAdmin()) { + $text .= + '<p>' . + I18N::translate('Each user account has an option to “automatically accept changes”. When this is enabled, any changes made by that user are saved immediately. Many administrators enable this for their own user account.') . + '</p>'; + } + break; -default: - $title = I18N::translate('Help'); - $text = I18N::translate('The help text has not been written for this item.'); - break; + default: + $title = I18N::translate('Help'); + $text = I18N::translate('The help text has not been written for this item.'); + break; } diff --git a/import.php b/import.php index 2bd0d419b7..5765bd4352 100644 --- a/import.php +++ b/import.php @@ -124,75 +124,75 @@ for ($end_time = microtime(true) + 1.0; microtime(true) < $end_time;) { // MySQL supports a wide range of collation conversions. These are ones that // have been encountered "in the wild". switch ($charset) { - case 'ASCII': - Database::prepare( - "UPDATE `##gedcom_chunk`" . - " SET chunk_data=CONVERT(CONVERT(chunk_data USING ascii) USING utf8)" . - " WHERE gedcom_id=?" - )->execute([$gedcom_id]); - break; - case 'IBMPC': // IBMPC, IBM WINDOWS and MS-DOS could be anything. Mostly it means CP850. - case 'IBM WINDOWS': - case 'MS-DOS': - case 'CP437': - case 'CP850': - // CP850 has extra letters with diacritics to replace box-drawing chars in CP437. - Database::prepare( - "UPDATE `##gedcom_chunk`" . - " SET chunk_data=CONVERT(CONVERT(chunk_data USING cp850) USING utf8)" . - " WHERE gedcom_id=?" - )->execute([$gedcom_id]); - break; - case 'ANSI': // ANSI could be anything. Most applications seem to treat it as latin1. - $controller->addInlineJavascript( - '$("#import' . $gedcom_id . '").parent().prepend("<div class=\"bg-info\">' . /* I18N: %1$s and %2$s are the names of character encodings, such as ISO-8859-1 or ASCII */ - I18N::translate('This GEDCOM file is encoded using %1$s. Assume this to mean %2$s.', $charset, 'ISO-8859-1') . '</div>");' - ); - // no break; - case 'WINDOWS': - case 'CP1252': - case 'ISO8859-1': - case 'ISO-8859-1': - case 'LATIN1': - case 'LATIN-1': - // Convert from ISO-8859-1 (western european) to UTF8. - Database::prepare( - "UPDATE `##gedcom_chunk`" . - " SET chunk_data=CONVERT(CONVERT(chunk_data USING latin1) USING utf8)" . - " WHERE gedcom_id=?" - )->execute([$gedcom_id]); - break; - case 'CP1250': - case 'ISO8859-2': - case 'ISO-8859-2': - case 'LATIN2': - case 'LATIN-2': - // Convert from ISO-8859-2 (eastern european) to UTF8. - Database::prepare( - "UPDATE `##gedcom_chunk`" . - " SET chunk_data=CONVERT(CONVERT(chunk_data USING latin2) USING utf8)" . - " WHERE gedcom_id=?" - )->execute([$gedcom_id]); - break; - case 'MACINTOSH': - // Convert from MAC Roman to UTF8. - Database::prepare( - "UPDATE `##gedcom_chunk`" . - " SET chunk_data=CONVERT(CONVERT(chunk_data USING macroman) USING utf8)" . - " WHERE gedcom_id=?" - )->execute([$gedcom_id]); - break; - case 'UTF8': - case 'UTF-8': - // Already UTF-8 so nothing to do! - break; - case 'ANSEL': - default: - Database::rollBack(); - echo '<span class="error">', I18N::translate('Error: converting GEDCOM files from %s encoding to UTF-8 encoding not currently supported.', $charset), '</span>'; - $controller->addInlineJavascript('$("#actions' . $gedcom_id . '").removeClass("hidden");'); + case 'ASCII': + Database::prepare( + "UPDATE `##gedcom_chunk`" . + " SET chunk_data=CONVERT(CONVERT(chunk_data USING ascii) USING utf8)" . + " WHERE gedcom_id=?" + )->execute([$gedcom_id]); + break; + case 'IBMPC': // IBMPC, IBM WINDOWS and MS-DOS could be anything. Mostly it means CP850. + case 'IBM WINDOWS': + case 'MS-DOS': + case 'CP437': + case 'CP850': + // CP850 has extra letters with diacritics to replace box-drawing chars in CP437. + Database::prepare( + "UPDATE `##gedcom_chunk`" . + " SET chunk_data=CONVERT(CONVERT(chunk_data USING cp850) USING utf8)" . + " WHERE gedcom_id=?" + )->execute([$gedcom_id]); + break; + case 'ANSI': // ANSI could be anything. Most applications seem to treat it as latin1. + $controller->addInlineJavascript( + '$("#import' . $gedcom_id . '").parent().prepend("<div class=\"bg-info\">' . /* I18N: %1$s and %2$s are the names of character encodings, such as ISO-8859-1 or ASCII */ + I18N::translate('This GEDCOM file is encoded using %1$s. Assume this to mean %2$s.', $charset, 'ISO-8859-1') . '</div>");' + ); + // no break; + case 'WINDOWS': + case 'CP1252': + case 'ISO8859-1': + case 'ISO-8859-1': + case 'LATIN1': + case 'LATIN-1': + // Convert from ISO-8859-1 (western european) to UTF8. + Database::prepare( + "UPDATE `##gedcom_chunk`" . + " SET chunk_data=CONVERT(CONVERT(chunk_data USING latin1) USING utf8)" . + " WHERE gedcom_id=?" + )->execute([$gedcom_id]); + break; + case 'CP1250': + case 'ISO8859-2': + case 'ISO-8859-2': + case 'LATIN2': + case 'LATIN-2': + // Convert from ISO-8859-2 (eastern european) to UTF8. + Database::prepare( + "UPDATE `##gedcom_chunk`" . + " SET chunk_data=CONVERT(CONVERT(chunk_data USING latin2) USING utf8)" . + " WHERE gedcom_id=?" + )->execute([$gedcom_id]); + break; + case 'MACINTOSH': + // Convert from MAC Roman to UTF8. + Database::prepare( + "UPDATE `##gedcom_chunk`" . + " SET chunk_data=CONVERT(CONVERT(chunk_data USING macroman) USING utf8)" . + " WHERE gedcom_id=?" + )->execute([$gedcom_id]); + break; + case 'UTF8': + case 'UTF-8': + // Already UTF-8 so nothing to do! + break; + case 'ANSEL': + default: + Database::rollBack(); + echo '<span class="error">', I18N::translate('Error: converting GEDCOM files from %s encoding to UTF-8 encoding not currently supported.', $charset), '</span>'; + $controller->addInlineJavascript('$("#actions' . $gedcom_id . '").removeClass("hidden");'); - return; + return; } $first_time = false; diff --git a/includes/session.php b/includes/session.php index 090bbb6d94..7be4b4705f 100644 --- a/includes/session.php +++ b/includes/session.php @@ -156,29 +156,29 @@ set_exception_handler(function (Throwable $ex) { $frame += ['args' => [], 'file' => 'unknown', 'line' => 'unknown']; array_walk($frame['args'], function (&$arg) { switch (gettype($arg)) { - case 'boolean': - case 'integer': - case 'double': - case 'null': - $arg = var_export($arg, true); - break; - case 'string': - if (mb_strlen($arg) > 30) { - $arg = mb_substr($arg, 0, 30) . '…'; - } - $arg = var_export($arg, true); - break; - case 'object': - $reflection = new \ReflectionClass($arg); - if (is_object($arg) && method_exists($arg, '__toString')) { - $arg = '[' . $reflection->getShortName() . ' ' . (string) $arg . ']'; - } else { - $arg = '[' . $reflection->getShortName() . ']'; - } - break; - default: - $arg = '[' . gettype($arg) . ']'; - break; + case 'boolean': + case 'integer': + case 'double': + case 'null': + $arg = var_export($arg, true); + break; + case 'string': + if (mb_strlen($arg) > 30) { + $arg = mb_substr($arg, 0, 30) . '…'; + } + $arg = var_export($arg, true); + break; + case 'object': + $reflection = new \ReflectionClass($arg); + if (is_object($arg) && method_exists($arg, '__toString')) { + $arg = '[' . $reflection->getShortName() . ' ' . (string) $arg . ']'; + } else { + $arg = '[' . $reflection->getShortName() . ']'; + } + break; + default: + $arg = '[' . gettype($arg) . ']'; + break; } }); $frame['file'] = str_replace(dirname(__DIR__), '', $frame['file']); diff --git a/indilist.php b/indilist.php index 13c4289df9..e8e56bd032 100644 --- a/indilist.php +++ b/indilist.php @@ -37,12 +37,12 @@ if ($show_all_firstnames === 'yes') { $show_marnm = Filter::get('show_marnm', 'no|yes'); switch ($show_marnm) { -case 'no': -case 'yes': - Auth::user()->setPreference('indilist.php_show_marnm', $show_marnm); - break; -default: - $show_marnm = Auth::user()->getPreference('indilist.php_show_marnm'); + case 'no': + case 'yes': + Auth::user()->setPreference('indilist.php_show_marnm', $show_marnm); + break; + default: + $show_marnm = Auth::user()->getPreference('indilist.php_show_marnm'); } // Make sure selections are consistent. @@ -79,16 +79,16 @@ if ($show_all === 'yes') { } $url = '?surname=' . rawurlencode($surname) . '&ged=' . $controller->tree()->getNameUrl(); switch ($falpha) { - case '': - break; - case '@': - $legend .= ', ' . I18N::translateContext('Unknown given name', '…'); - $url .= '&falpha=' . rawurlencode($falpha) . '&ged=' . $controller->tree()->getNameUrl(); - break; - default: - $legend .= ', ' . Html::escape($falpha) . '…'; - $url .= '&falpha=' . rawurlencode($falpha) . '&ged=' . $controller->tree()->getNameUrl(); - break; + case '': + break; + case '@': + $legend .= ', ' . I18N::translateContext('Unknown given name', '…'); + $url .= '&falpha=' . rawurlencode($falpha) . '&ged=' . $controller->tree()->getNameUrl(); + break; + default: + $legend .= ', ' . Html::escape($falpha) . '…'; + $url .= '&falpha=' . rawurlencode($falpha) . '&ged=' . $controller->tree()->getNameUrl(); + break; } $show = 'indi'; // SURN list makes no sense here } elseif ($alpha === '@') { @@ -173,16 +173,16 @@ if ($show === 'indi' || $show === 'surn') { if ($show === 'surn') { // Show the surname list switch ($controller->tree()->getPreference('SURNAME_LIST_STYLE')) { - case 'style1': - echo FunctionsPrintLists::surnameList($surns, 3, true, 'indilist.php', $controller->tree()); - break; - case 'style3': - echo FunctionsPrintLists::surnameTagCloud($surns, 'indilist.php', true, $controller->tree()); - break; - case 'style2': - default: - echo FunctionsPrintLists::surnameTable($surns, 'indilist.php', $controller->tree()); - break; + case 'style1': + echo FunctionsPrintLists::surnameList($surns, 3, true, 'indilist.php', $controller->tree()); + break; + case 'style3': + echo FunctionsPrintLists::surnameTagCloud($surns, 'indilist.php', true, $controller->tree()); + break; + case 'style2': + default: + echo FunctionsPrintLists::surnameTable($surns, 'indilist.php', $controller->tree()); + break; } } else { // Show the list @@ -65,91 +65,91 @@ if (!$url) { $message = ''; switch ($action) { -case 'login': - try { - if (!$_COOKIE) { - Log::addAuthenticationLog('Login failed (no session cookies): ' . $username); - throw new \Exception(I18N::translate('You cannot sign in because your browser does not accept cookies.')); - } + case 'login': + try { + if (!$_COOKIE) { + Log::addAuthenticationLog('Login failed (no session cookies): ' . $username); + throw new \Exception(I18N::translate('You cannot sign in because your browser does not accept cookies.')); + } - $user = User::findByIdentifier($username); + $user = User::findByIdentifier($username); - if (!$user) { - Log::addAuthenticationLog('Login failed (no such user/email): ' . $username); - throw new \Exception(I18N::translate('The username or password is incorrect.')); - } + if (!$user) { + Log::addAuthenticationLog('Login failed (no such user/email): ' . $username); + throw new \Exception(I18N::translate('The username or password is incorrect.')); + } - if (!$user->checkPassword($password)) { - Log::addAuthenticationLog('Login failed (incorrect password): ' . $username); - throw new \Exception(I18N::translate('The username or password is incorrect.')); - } + if (!$user->checkPassword($password)) { + Log::addAuthenticationLog('Login failed (incorrect password): ' . $username); + throw new \Exception(I18N::translate('The username or password is incorrect.')); + } - if (!$user->getPreference('verified')) { - Log::addAuthenticationLog('Login failed (not verified by user): ' . $username); - throw new \Exception(I18N::translate('This account has not been verified. Please check your email for a verification message.')); - } + if (!$user->getPreference('verified')) { + Log::addAuthenticationLog('Login failed (not verified by user): ' . $username); + throw new \Exception(I18N::translate('This account has not been verified. Please check your email for a verification message.')); + } - if (!$user->getPreference('verified_by_admin')) { - Log::addAuthenticationLog('Login failed (not approved by admin): ' . $username); - throw new \Exception(I18N::translate('This account has not been approved. Please wait for an administrator to approve it.')); - } + if (!$user->getPreference('verified_by_admin')) { + Log::addAuthenticationLog('Login failed (not approved by admin): ' . $username); + throw new \Exception(I18N::translate('This account has not been approved. Please wait for an administrator to approve it.')); + } - Auth::login($user); - Log::addAuthenticationLog('Login: ' . Auth::user()->getUserName() . '/' . Auth::user()->getRealName()); - Auth::user()->setPreference('sessiontime', WT_TIMESTAMP); + Auth::login($user); + Log::addAuthenticationLog('Login: ' . Auth::user()->getUserName() . '/' . Auth::user()->getRealName()); + Auth::user()->setPreference('sessiontime', WT_TIMESTAMP); - Session::put('locale', Auth::user()->getPreference('language')); - Session::put('theme_id', Auth::user()->getPreference('theme')); - I18N::init(Auth::user()->getPreference('language')); + Session::put('locale', Auth::user()->getPreference('language')); + Session::put('theme_id', Auth::user()->getPreference('theme')); + I18N::init(Auth::user()->getPreference('language')); - // We're logging in as an administrator - if (Auth::isAdmin()) { - // Check for updates - $latest_version_txt = Functions::fetchLatestVersion(); - if (preg_match('/^[0-9.]+\|[0-9.]+\|/', $latest_version_txt)) { - list($latest_version, $earliest_version, $download_url) = explode('|', $latest_version_txt); - if (version_compare(WT_VERSION, $latest_version) < 0) { - FlashMessages::addMessage( - I18N::translate('A new version of webtrees is available.') . - ' <a href="admin_site_upgrade.php"><b>' . - I18N::translate('Upgrade to webtrees %s.', '<span dir="ltr">' . $latest_version . '</span>') . - '</b></a>' - ); + // We're logging in as an administrator + if (Auth::isAdmin()) { + // Check for updates + $latest_version_txt = Functions::fetchLatestVersion(); + if (preg_match('/^[0-9.]+\|[0-9.]+\|/', $latest_version_txt)) { + list($latest_version, $earliest_version, $download_url) = explode('|', $latest_version_txt); + if (version_compare(WT_VERSION, $latest_version) < 0) { + FlashMessages::addMessage( + I18N::translate('A new version of webtrees is available.') . + ' <a href="admin_site_upgrade.php"><b>' . + I18N::translate('Upgrade to webtrees %s.', '<span dir="ltr">' . $latest_version . '</span>') . + '</b></a>' + ); + } } } - } - // If we were on a "home page", redirect to "my page" - if ($url === '' || strpos($url, 'index.php?ctype=gedcom') === 0) { - $url = 'index.php?ctype=user'; - // Switch to a tree where we have a genealogy record (or keep to the current/default). - $tree = Database::prepare( - "SELECT gedcom_name FROM `##gedcom` JOIN `##user_gedcom_setting` USING (gedcom_id)" . - " WHERE setting_name = 'gedcomid' AND user_id = :user_id" . - " ORDER BY gedcom_id = :tree_id DESC" - )->execute([ - 'user_id' => Auth::user()->getUserId(), - 'tree_id' => $WT_TREE->getTreeId(), - ])->fetchOne(); - $url .= '&ged=' . rawurlencode($tree); - } + // If we were on a "home page", redirect to "my page" + if ($url === '' || strpos($url, 'index.php?ctype=gedcom') === 0) { + $url = 'index.php?ctype=user'; + // Switch to a tree where we have a genealogy record (or keep to the current/default). + $tree = Database::prepare( + "SELECT gedcom_name FROM `##gedcom` JOIN `##user_gedcom_setting` USING (gedcom_id)" . + " WHERE setting_name = 'gedcomid' AND user_id = :user_id" . + " ORDER BY gedcom_id = :tree_id DESC" + )->execute([ + 'user_id' => Auth::user()->getUserId(), + 'tree_id' => $WT_TREE->getTreeId(), + ])->fetchOne(); + $url .= '&ged=' . rawurlencode($tree); + } - // Redirect to the target URL - header('Location: ' . $url); + // Redirect to the target URL + header('Location: ' . $url); - return; - } catch (\Exception $ex) { - DebugBar::addThrowable($ex); + return; + } catch (\Exception $ex) { + DebugBar::addThrowable($ex); - $message = $ex->getMessage(); - } - // No break; + $message = $ex->getMessage(); + } + // No break; -default: - $controller - ->setPageTitle(I18N::translate('Sign in')) - ->pageHeader() - ->addInlineJavascript(' + default: + $controller + ->setPageTitle(I18N::translate('Sign in')) + ->pageHeader() + ->addInlineJavascript(' $("#new_passwd_form").hide(); $("#passwd_click").click(function() { $("#new_passwd_form").slideToggle(100, function() { @@ -159,25 +159,25 @@ default: }); '); - echo '<div id="login-page">'; - echo '<div id="login-text">'; + echo '<div id="login-page">'; + echo '<div id="login-text">'; - echo '<p class="center"><strong>' . I18N::translate('Welcome to this genealogy website') . '</strong></p>'; + echo '<p class="center"><strong>' . I18N::translate('Welcome to this genealogy website') . '</strong></p>'; - switch (Site::getPreference('WELCOME_TEXT_AUTH_MODE')) { - case 1: - echo '<p>' . I18N::translate('Anyone with a user account can access this website.') . ' ' . I18N::translate('You can apply for an account using the link below.') . '</p>'; - break; - case 2: - echo '<p>' . I18N::translate('You need to be an authorized user to access this website.') . ' ' . I18N::translate('You can apply for an account using the link below.') . '</p>'; - break; - case 3: - echo '<p>' . I18N::translate('You need to be a family member to access this website.') . ' ' . I18N::translate('You can apply for an account using the link below.') . '</p>'; - break; - case 4: - echo '<p style="white-space: pre-wrap;">', Site::getPreference('WELCOME_TEXT_AUTH_MODE_' . WT_LOCALE), '</p>'; - break; - } + switch (Site::getPreference('WELCOME_TEXT_AUTH_MODE')) { + case 1: + echo '<p>' . I18N::translate('Anyone with a user account can access this website.') . ' ' . I18N::translate('You can apply for an account using the link below.') . '</p>'; + break; + case 2: + echo '<p>' . I18N::translate('You need to be an authorized user to access this website.') . ' ' . I18N::translate('You can apply for an account using the link below.') . '</p>'; + break; + case 3: + echo '<p>' . I18N::translate('You need to be a family member to access this website.') . ' ' . I18N::translate('You can apply for an account using the link below.') . '</p>'; + break; + case 4: + echo '<p style="white-space: pre-wrap;">', Site::getPreference('WELCOME_TEXT_AUTH_MODE_' . WT_LOCALE), '</p>'; + break; + } echo '</div>'; echo '<div id="login-box">'; @@ -232,92 +232,22 @@ default: echo '</div>'; break; -case 'requestpw': - $username = Filter::post('new_passwd_username'); - $user = User::findByIdentifier($username); - - if ($user) { - $passchars = 'abcdefghijklmnopqrstuvqxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'; - $user_new_pw = ''; - $max = strlen($passchars) - 1; - for ($i = 0; $i < 8; $i++) { - $index = rand(0, $max); - $user_new_pw .= $passchars{$index}; - } - - $user->setPassword($user_new_pw); - Log::addAuthenticationLog('Password request was sent to user: ' . $user->getUserName()); - - $sender = new User( - (object) [ - 'user_id' => null, - 'user_name' => '', - 'real_name' => $WT_TREE->getTitle(), - 'email' => $WT_TREE->getPreference('WEBTREES_EMAIL'), - ] - ); - - Mail::send( - $sender, - $user, - $sender, - I18N::translate('Lost password request'), - View::make('emails/password-reset-text', ['user' => $user, 'new_password' => $user_new_pw]), - View::make('emails/password-reset-html', ['user' => $user, 'new_password' => $user_new_pw]) - ); - - FlashMessages::addMessage(I18N::translate('A new password has been created and emailed to %s. You can change this password after you sign in.', Html::escape($username)), 'success'); - } else { - FlashMessages::addMessage(I18N::translate('There is no account with the username or email “%s”.', Html::escape($username)), 'danger'); - } - header('Location: login.php'); - - return; - break; - -case 'register': - if (Site::getPreference('USE_REGISTRATION_MODULE') !== '1') { - header('Location: index.php'); - - return; - } - - $controller->setPageTitle(I18N::translate('Request a new user account')); + case 'requestpw': + $username = Filter::post('new_passwd_username'); + $user = User::findByIdentifier($username); - // The form parameters are mandatory, and the validation errors are shown in the client. - if (Session::get('good_to_send') && $username && $user_password01 && $user_password01 == $user_password02 && $user_realname && $user_email && $user_comments) { - - // These validation errors cannot be shown in the client. - if (User::findByUserName($username)) { - FlashMessages::addMessage(I18N::translate('Duplicate username. A user with that username already exists. Please choose another username.')); - } elseif (User::findByEmail($user_email)) { - FlashMessages::addMessage(I18N::translate('Duplicate email address. A user with that email already exists.')); - } elseif (preg_match('/(?!' . preg_quote(WT_BASE_URL, '/') . ')(((?:ftp|http|https):\/\/)[a-zA-Z0-9.-]+)/', $user_comments, $match)) { - FlashMessages::addMessage( - I18N::translate('You are not allowed to send messages that contain external links.') . ' ' . - I18N::translate('You should delete the “%1$s” from “%2$s” and try again.', $match[2], $match[1]) - ); - Log::addAuthenticationLog('Possible spam registration from "' . $username . '"/"' . $user_email . '" comments="' . $user_comments . '"'); - } else { - // Everything looks good - create the user - $controller->pageHeader(); - Log::addAuthenticationLog('User registration requested for: ' . $username); + if ($user) { + $passchars = 'abcdefghijklmnopqrstuvqxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'; + $user_new_pw = ''; + $max = strlen($passchars) - 1; + for ($i = 0; $i < 8; $i++) { + $index = rand(0, $max); + $user_new_pw .= $passchars{$index}; + } - $user = User::create($username, $user_realname, $user_email, $user_password01); - $user - ->setPreference('language', WT_LOCALE) - ->setPreference('verified', '0') - ->setPreference('verified_by_admin', 0) - ->setPreference('reg_timestamp', date('U')) - ->setPreference('reg_hashcode', md5(Uuid::uuid4())) - ->setPreference('contactmethod', 'messaging2') - ->setPreference('comment', $user_comments) - ->setPreference('visibleonline', '1') - ->setPreference('auto_accept', '0') - ->setPreference('canadmin', '0') - ->setPreference('sessiontime', '0'); + $user->setPassword($user_new_pw); + Log::addAuthenticationLog('Password request was sent to user: ' . $user->getUserName()); - // Create a dummy user, so we can send messages from the tree. $sender = new User( (object) [ 'user_id' => null, @@ -327,66 +257,136 @@ case 'register': ] ); - // Send a verification message to the user. Mail::send( $sender, $user, $sender, - /* I18N: %s is a server name/URL */ I18N::translate('Your registration at %s', WT_BASE_URL), - View::make('emails/register-user-text', ['tree' => $WT_TREE, 'user' => $user]), - View::make('emails/register-user-html', ['tree' => $WT_TREE, 'user' => $user]) + I18N::translate('Lost password request'), + View::make('emails/password-reset-text', ['user' => $user, 'new_password' => $user_new_pw]), + View::make('emails/password-reset-html', ['user' => $user, 'new_password' => $user_new_pw]) ); - // Tell the genealogy contact about the registration. - $webmaster = User::find($WT_TREE->getPreference('WEBMASTER_USER_ID')); - I18N::init($webmaster->getPreference('language')); + FlashMessages::addMessage(I18N::translate('A new password has been created and emailed to %s. You can change this password after you sign in.', Html::escape($username)), 'success'); + } else { + FlashMessages::addMessage(I18N::translate('There is no account with the username or email “%s”.', Html::escape($username)), 'danger'); + } + header('Location: login.php'); - Mail::send( - $sender, - $webmaster, - $user, - /* I18N: %s is a server name/URL */ I18N::translate('New registration at %s', WT_BASE_URL . ' ' . $WT_TREE->getTitle()), - View::make('emails/register-notify-text', ['tree' => $WT_TREE, 'user' => $user, 'comments' => $user_comments]), - View::make('emails/register-notify-html', ['tree' => $WT_TREE, 'user' => $user, 'comments' => $user_comments]) - ); + return; + break; - $mail1_method = $webmaster->getPreference('contact_method'); - if ($mail1_method !== 'messaging3' && $mail1_method !== 'mailto' && $mail1_method !== 'none') { - Database::prepare( - "INSERT INTO `##message` (sender, ip_address, user_id, subject, body) VALUES (? ,? ,? ,? ,?)" - )->execute([ - $user->getEmail(), - $request->getClientIp(), - $webmaster->getUserId(), - /* I18N: %s is a server name/URL */ I18N::translate('New registration at %s', $WT_TREE->getTitle()), + case 'register': + if (Site::getPreference('USE_REGISTRATION_MODULE') !== '1') { + header('Location: index.php'); + + return; + } + + $controller->setPageTitle(I18N::translate('Request a new user account')); + + // The form parameters are mandatory, and the validation errors are shown in the client. + if (Session::get('good_to_send') && $username && $user_password01 && $user_password01 == $user_password02 && $user_realname && $user_email && $user_comments) { + + // These validation errors cannot be shown in the client. + if (User::findByUserName($username)) { + FlashMessages::addMessage(I18N::translate('Duplicate username. A user with that username already exists. Please choose another username.')); + } elseif (User::findByEmail($user_email)) { + FlashMessages::addMessage(I18N::translate('Duplicate email address. A user with that email already exists.')); + } elseif (preg_match('/(?!' . preg_quote(WT_BASE_URL, '/') . ')(((?:ftp|http|https):\/\/)[a-zA-Z0-9.-]+)/', $user_comments, $match)) { + FlashMessages::addMessage( + I18N::translate('You are not allowed to send messages that contain external links.') . ' ' . + I18N::translate('You should delete the “%1$s” from “%2$s” and try again.', $match[2], $match[1]) + ); + Log::addAuthenticationLog('Possible spam registration from "' . $username . '"/"' . $user_email . '" comments="' . $user_comments . '"'); + } else { + // Everything looks good - create the user + $controller->pageHeader(); + Log::addAuthenticationLog('User registration requested for: ' . $username); + + $user = User::create($username, $user_realname, $user_email, $user_password01); + $user + ->setPreference('language', WT_LOCALE) + ->setPreference('verified', '0') + ->setPreference('verified_by_admin', 0) + ->setPreference('reg_timestamp', date('U')) + ->setPreference('reg_hashcode', md5(Uuid::uuid4())) + ->setPreference('contactmethod', 'messaging2') + ->setPreference('comment', $user_comments) + ->setPreference('visibleonline', '1') + ->setPreference('auto_accept', '0') + ->setPreference('canadmin', '0') + ->setPreference('sessiontime', '0'); + + // Create a dummy user, so we can send messages from the tree. + $sender = new User( + (object) [ + 'user_id' => null, + 'user_name' => '', + 'real_name' => $WT_TREE->getTitle(), + 'email' => $WT_TREE->getPreference('WEBTREES_EMAIL'), + ] + ); + + // Send a verification message to the user. + Mail::send( + $sender, + $user, + $sender, + /* I18N: %s is a server name/URL */ I18N::translate('Your registration at %s', WT_BASE_URL), + View::make('emails/register-user-text', ['tree' => $WT_TREE, 'user' => $user]), + View::make('emails/register-user-html', ['tree' => $WT_TREE, 'user' => $user]) + ); + + // Tell the genealogy contact about the registration. + $webmaster = User::find($WT_TREE->getPreference('WEBMASTER_USER_ID')); + I18N::init($webmaster->getPreference('language')); + + Mail::send( + $sender, + $webmaster, + $user, + /* I18N: %s is a server name/URL */ I18N::translate('New registration at %s', WT_BASE_URL . ' ' . $WT_TREE->getTitle()), View::make('emails/register-notify-text', ['tree' => $WT_TREE, 'user' => $user, 'comments' => $user_comments]), - ]); - } - I18N::init(WT_LOCALE); + View::make('emails/register-notify-html', ['tree' => $WT_TREE, 'user' => $user, 'comments' => $user_comments]) + ); - echo '<div id="login-register-page">'; - echo '<div class="confirm"><p>', I18N::translate('Hello %s…<br>Thank you for your registration.', $user->getRealNameHtml()), '</p>'; - echo '<p>', I18N::translate('We will now send a confirmation email to the address <b>%s</b>. You must verify your account request by following instructions in the confirmation email. If you do not confirm your account request within seven days, your application will be rejected automatically. You will have to apply again.<br><br>After you have followed the instructions in the confirmation email, the administrator still has to approve your request before your account can be used.<br><br>To sign in to this website, you will need to know your username and password.', $user->getEmail()), '</p>'; - echo '</div>'; - echo '</div>'; + $mail1_method = $webmaster->getPreference('contact_method'); + if ($mail1_method !== 'messaging3' && $mail1_method !== 'mailto' && $mail1_method !== 'none') { + Database::prepare( + "INSERT INTO `##message` (sender, ip_address, user_id, subject, body) VALUES (? ,? ,? ,? ,?)" + )->execute([ + $user->getEmail(), + $request->getClientIp(), + $webmaster->getUserId(), + /* I18N: %s is a server name/URL */ I18N::translate('New registration at %s', $WT_TREE->getTitle()), + View::make('emails/register-notify-text', ['tree' => $WT_TREE, 'user' => $user, 'comments' => $user_comments]), + ]); + } + I18N::init(WT_LOCALE); - return; + echo '<div id="login-register-page">'; + echo '<div class="confirm"><p>', I18N::translate('Hello %s…<br>Thank you for your registration.', $user->getRealNameHtml()), '</p>'; + echo '<p>', I18N::translate('We will now send a confirmation email to the address <b>%s</b>. You must verify your account request by following instructions in the confirmation email. If you do not confirm your account request within seven days, your application will be rejected automatically. You will have to apply again.<br><br>After you have followed the instructions in the confirmation email, the administrator still has to approve your request before your account can be used.<br><br>To sign in to this website, you will need to know your username and password.', $user->getEmail()), '</p>'; + echo '</div>'; + echo '</div>'; + + return; + } } - } - Session::put('good_to_send', true); - $controller - ->pageHeader() - ->addInlineJavascript('function regex_quote(str) {return str.replace(/[\\\\.?+*()[\](){}|]/g, "\\\\$&");}'); + Session::put('good_to_send', true); + $controller + ->pageHeader() + ->addInlineJavascript('function regex_quote(str) {return str.replace(/[\\\\.?+*()[\](){}|]/g, "\\\\$&");}'); - ?> + ?> <div id="login-register-page"> <h2><?= $controller->getPageTitle() ?></h2> <?php if (Site::getPreference('SHOW_REGISTER_CAUTION') === '1'): ?> - <div id="register-text"> + <div id="register-text"> <?= I18N::translate('<div class="largeError">Notice:</div><div class="error">By completing and submitting this form, you agree:<ul><li>to protect the privacy of living individuals listed on our site;</li><li>and in the text box below, to explain to whom you are related, or to provide us with information on someone who should be listed on our website.</li></ul></div>') ?> - </div> + </div> <?php endif ?> <div id="register-box"> <form id="register-form" name="register-form" method="post" onsubmit="return checkform(this);" autocomplete="off"> @@ -397,7 +397,7 @@ case 'register': <div> <label for="user_realname"> <?= I18N::translate('Real name') ?> - <input type="text" id="user_realname" name="user_realname" required maxlength="64" value="<?= Html::escape($user_realname) ?>" autofocus> + <input type="text" id="user_realname" name="user_realname" required maxlength="64" value="<?= Html::escape($user_realname) ?>" autofocus> </label> <p class="small text-muted"> <?= I18N::translate('This is your real name, as you would like it displayed on screen.') ?> @@ -407,7 +407,7 @@ case 'register': <div> <label for="user_email"> <?= I18N::translate('Email address') ?> - <input type="email" id="user_email" name="user_email" required maxlength="64" value="<?= Html::escape($user_email) ?>"> + <input type="email" id="user_email" name="user_email" required maxlength="64" value="<?= Html::escape($user_email) ?>"> </label> <p class="small text-muted"> <?= I18N::translate('This email address will be used to send password reminders, website notifications, and messages from other family members who are registered on the website.') ?> @@ -417,7 +417,7 @@ case 'register': <div> <label for="username"> <?= I18N::translate('Username') ?> - <input type="text" id="username" name="username" required maxlength="32" value="<?php Html::escape($username) ?>"> + <input type="text" id="username" name="username" required maxlength="32" value="<?php Html::escape($username) ?>"> </label> <p class="small text-muted"> <?= I18N::translate('Usernames are case-insensitive and ignore accented letters, so that “chloe”, “chloë”, and “Chloe” are considered to be the same.') ?> @@ -480,82 +480,82 @@ case 'register': </div> </div> <?php - break; - -case 'userverify': - if (Site::getPreference('USE_REGISTRATION_MODULE') !== '1') { - header('Location: index.php'); + break; - return; - } + case 'userverify': + if (Site::getPreference('USE_REGISTRATION_MODULE') !== '1') { + header('Location: index.php'); - $controller->setPageTitle(I18N::translate('User verification')); - $controller->pageHeader(); + return; + } - if (Site::getPreference('USE_REGISTRATION_MODULE') !== '1') { - header('Location: index.php'); + $controller->setPageTitle(I18N::translate('User verification')); + $controller->pageHeader(); - return; - } + if (Site::getPreference('USE_REGISTRATION_MODULE') !== '1') { + header('Location: index.php'); - $user = User::findByUserName($username); + return; + } - if ($user && $user->getPreference('reg_hashcode') === $user_hashcode) { - // switch language to webmaster settings - $webmaster = User::find($WT_TREE->getPreference('WEBMASTER_USER_ID')); - I18N::init($webmaster->getPreference('language')); + $user = User::findByUserName($username); - // Create a dummy user, so we can send messages from the tree. - $sender = new User( - (object) [ - 'user_id' => null, - 'user_name' => '', - 'real_name' => $WT_TREE->getTitle(), - 'email' => $WT_TREE->getPreference('WEBTREES_EMAIL'), - ] - ); + if ($user && $user->getPreference('reg_hashcode') === $user_hashcode) { + // switch language to webmaster settings + $webmaster = User::find($WT_TREE->getPreference('WEBMASTER_USER_ID')); + I18N::init($webmaster->getPreference('language')); - Mail::send( - $sender, - $webmaster, - $sender, - /* I18N: %s is a server name/URL */ I18N::translate('New user at %s', WT_BASE_URL . ' ' . $WT_TREE->getTitle()), - View::make('emails/verify-notify-text', ['user' => $user]), - View::make('emails/verify-notify-html', ['user' => $user]) - ); + // Create a dummy user, so we can send messages from the tree. + $sender = new User( + (object) [ + 'user_id' => null, + 'user_name' => '', + 'real_name' => $WT_TREE->getTitle(), + 'email' => $WT_TREE->getPreference('WEBTREES_EMAIL'), + ] + ); - $mail1_method = $webmaster->getPreference('CONTACT_METHOD'); - if ($mail1_method !== 'messaging3' && $mail1_method !== 'mailto' && $mail1_method !== 'none') { - Database::prepare( - "INSERT INTO `##message` (sender, ip_address, user_id, subject, body) VALUES (? ,? ,? ,? ,?)" - )->execute([ - $username, - $request->getClientIp(), - $webmaster->getUserId(), + Mail::send( + $sender, + $webmaster, + $sender, /* I18N: %s is a server name/URL */ I18N::translate('New user at %s', WT_BASE_URL . ' ' . $WT_TREE->getTitle()), - View::make('emails/verify-notify-text', ['user' => $user]) - ]); - } - I18N::init(WT_LOCALE); + View::make('emails/verify-notify-text', ['user' => $user]), + View::make('emails/verify-notify-html', ['user' => $user]) + ); - $user - ->setPreference('verified', '1') - ->setPreference('reg_timestamp', date('U')) - ->setPreference('reg_hashcode', ''); + $mail1_method = $webmaster->getPreference('CONTACT_METHOD'); + if ($mail1_method !== 'messaging3' && $mail1_method !== 'mailto' && $mail1_method !== 'none') { + Database::prepare( + "INSERT INTO `##message` (sender, ip_address, user_id, subject, body) VALUES (? ,? ,? ,? ,?)" + )->execute([ + $username, + $request->getClientIp(), + $webmaster->getUserId(), + /* I18N: %s is a server name/URL */ I18N::translate('New user at %s', WT_BASE_URL . ' ' . $WT_TREE->getTitle()), + View::make('emails/verify-notify-text', ['user' => $user]) + ]); + } + I18N::init(WT_LOCALE); - Log::addAuthenticationLog('User ' . $username . ' verified their email address'); + $user + ->setPreference('verified', '1') + ->setPreference('reg_timestamp', date('U')) + ->setPreference('reg_hashcode', ''); - echo '<div id="login-register-page">'; - echo '<h2>' . I18N::translate('User verification') . '</h2>'; - echo '<div id="user-verify">'; - echo '<p>', I18N::translate('You have confirmed your request to become a registered user.'), '</p>'; - echo '<p>', I18N::translate('The administrator has been informed. As soon as they give you permission to sign in, you can sign in with your username and password.'), '</p>'; - } else { - echo '<p class="warning">'; - echo I18N::translate('Could not verify the information you entered. Please try again or contact the site administrator for more information.'); - echo '</p>'; - } - echo '</div>'; - echo '</div>'; - break; + Log::addAuthenticationLog('User ' . $username . ' verified their email address'); + + echo '<div id="login-register-page">'; + echo '<h2>' . I18N::translate('User verification') . '</h2>'; + echo '<div id="user-verify">'; + echo '<p>', I18N::translate('You have confirmed your request to become a registered user.'), '</p>'; + echo '<p>', I18N::translate('The administrator has been informed. As soon as they give you permission to sign in, you can sign in with your username and password.'), '</p>'; + } else { + echo '<p class="warning">'; + echo I18N::translate('Could not verify the information you entered. Please try again or contact the site administrator for more information.'); + echo '</p>'; + } + echo '</div>'; + echo '</div>'; + break; } diff --git a/relationship.php b/relationship.php index 44493f5967..3b064d938a 100644 --- a/relationship.php +++ b/relationship.php @@ -146,39 +146,39 @@ if ($person1 && $person2) { foreach ($path as $n => $xref) { if ($n % 2 === 1) { switch ($relationships[$n]) { - case 'hus': - case 'wif': - case 'spo': - case 'bro': - case 'sis': - case 'sib': - $table[$x + 1][$y] = '<div style="background:url(' . Theme::theme()->parameter('image-hline') . ') repeat-x center; width: 94px; text-align: center"><div class="hline-text" style="height: 32px;">' . Functions::getRelationshipNameFromPath($relationships[$n], Individual::getInstance($path[$n - 1], $controller->tree()), Individual::getInstance($path[$n + 1], $controller->tree())) . '</div><div style="height: 32px;">' . FontAwesome::decorativeIcon('arrow-end') . '</div></div>'; - $x += 2; - break; - case 'son': - case 'dau': - case 'chi': - if ($n > 2 && preg_match('/fat|mot|par/', $relationships[$n - 2])) { - $table[$x + 1][$y - 1] = '<div style="background:url(' . $diagonal2 . '); width: 64px; height: 64px; text-align: center;"><div style="height: 32px; text-align: end;">' . Functions::getRelationshipNameFromPath($relationships[$n], Individual::getInstance($path[$n - 1], $controller->tree()), Individual::getInstance($path[$n + 1], $controller->tree())) . '</div><div style="height: 32px; text-align: start;">' . FontAwesome::decorativeIcon('arrow-down') . '</div></div>'; + case 'hus': + case 'wif': + case 'spo': + case 'bro': + case 'sis': + case 'sib': + $table[$x + 1][$y] = '<div style="background:url(' . Theme::theme()->parameter('image-hline') . ') repeat-x center; width: 94px; text-align: center"><div class="hline-text" style="height: 32px;">' . Functions::getRelationshipNameFromPath($relationships[$n], Individual::getInstance($path[$n - 1], $controller->tree()), Individual::getInstance($path[$n + 1], $controller->tree())) . '</div><div style="height: 32px;">' . FontAwesome::decorativeIcon('arrow-end') . '</div></div>'; $x += 2; - } else { - $table[$x][$y - 1] = '<div style="background:url(' . Theme::theme() - ->parameter('image-vline') . ') repeat-y center; height: 64px; text-align: center;"><div class="vline-text" style="display: inline-block; width:50%; line-height: 64px;">' . Functions::getRelationshipNameFromPath($relationships[$n], Individual::getInstance($path[$n - 1], $controller->tree()), Individual::getInstance($path[$n + 1], $controller->tree())) . '</div><div style="display: inline-block; width:50%; line-height: 64px;">' . FontAwesome::decorativeIcon('arrow-down') . '</div></div>'; - } - $y -= 2; - break; - case 'fat': - case 'mot': - case 'par': - if ($n > 2 && preg_match('/son|dau|chi/', $relationships[$n - 2])) { - $table[$x + 1][$y + 1] = '<div style="background:url(' . $diagonal1 . '); background-position: top right; width: 64px; height: 64px; text-align: center;"><div style="height: 32px; text-align: start;">' . Functions::getRelationshipNameFromPath($relationships[$n], Individual::getInstance($path[$n - 1], $controller->tree()), Individual::getInstance($path[$n + 1], $controller->tree())) . '</div><div style="height: 32px; text-align: end;">' . FontAwesome::decorativeIcon('arrow-down') . '</div></div>'; - $x += 2; - } else { - $table[$x][$y + 1] = '<div style="background:url(' . Theme::theme() - ->parameter('image-vline') . ') repeat-y center; height: 64px; text-align:center; "><div class="vline-text" style="display: inline-block; width: 50%; line-height: 32px;">' . Functions::getRelationshipNameFromPath($relationships[$n], Individual::getInstance($path[$n - 1], $controller->tree()), Individual::getInstance($path[$n + 1], $controller->tree())) . '</div><div style="display: inline-block; width: 50%; line-height: 32px">' . FontAwesome::decorativeIcon('arrow-up') . '</div></div>'; - } - $y += 2; - break; + break; + case 'son': + case 'dau': + case 'chi': + if ($n > 2 && preg_match('/fat|mot|par/', $relationships[$n - 2])) { + $table[$x + 1][$y - 1] = '<div style="background:url(' . $diagonal2 . '); width: 64px; height: 64px; text-align: center;"><div style="height: 32px; text-align: end;">' . Functions::getRelationshipNameFromPath($relationships[$n], Individual::getInstance($path[$n - 1], $controller->tree()), Individual::getInstance($path[$n + 1], $controller->tree())) . '</div><div style="height: 32px; text-align: start;">' . FontAwesome::decorativeIcon('arrow-down') . '</div></div>'; + $x += 2; + } else { + $table[$x][$y - 1] = '<div style="background:url(' . Theme::theme() + ->parameter('image-vline') . ') repeat-y center; height: 64px; text-align: center;"><div class="vline-text" style="display: inline-block; width:50%; line-height: 64px;">' . Functions::getRelationshipNameFromPath($relationships[$n], Individual::getInstance($path[$n - 1], $controller->tree()), Individual::getInstance($path[$n + 1], $controller->tree())) . '</div><div style="display: inline-block; width:50%; line-height: 64px;">' . FontAwesome::decorativeIcon('arrow-down') . '</div></div>'; + } + $y -= 2; + break; + case 'fat': + case 'mot': + case 'par': + if ($n > 2 && preg_match('/son|dau|chi/', $relationships[$n - 2])) { + $table[$x + 1][$y + 1] = '<div style="background:url(' . $diagonal1 . '); background-position: top right; width: 64px; height: 64px; text-align: center;"><div style="height: 32px; text-align: start;">' . Functions::getRelationshipNameFromPath($relationships[$n], Individual::getInstance($path[$n - 1], $controller->tree()), Individual::getInstance($path[$n + 1], $controller->tree())) . '</div><div style="height: 32px; text-align: end;">' . FontAwesome::decorativeIcon('arrow-down') . '</div></div>'; + $x += 2; + } else { + $table[$x][$y + 1] = '<div style="background:url(' . Theme::theme() + ->parameter('image-vline') . ') repeat-y center; height: 64px; text-align:center; "><div class="vline-text" style="display: inline-block; width: 50%; line-height: 32px;">' . Functions::getRelationshipNameFromPath($relationships[$n], Individual::getInstance($path[$n - 1], $controller->tree()), Individual::getInstance($path[$n + 1], $controller->tree())) . '</div><div style="display: inline-block; width: 50%; line-height: 32px">' . FontAwesome::decorativeIcon('arrow-up') . '</div></div>'; + } + $y += 2; + break; } $max_x = max($max_x, $x); $min_y = min($min_y, $y); diff --git a/reportengine.php b/reportengine.php index 334edb9ce8..7d6e2a4500 100644 --- a/reportengine.php +++ b/reportengine.php @@ -54,32 +54,32 @@ foreach ($vars as $name => $var) { $newvars[$name]['id'] = $var; if (!empty($type[$name])) { switch ($type[$name]) { - case 'INDI': - $record = Individual::getInstance($var, $WT_TREE); - if ($record && $record->canShowName()) { - $newvars[$name]['gedcom'] = $record->privatizeGedcom(Auth::accessLevel($WT_TREE)); - } else { - $action = 'setup'; - } - break; - case 'FAM': - $record = Family::getInstance($var, $WT_TREE); - if ($record && $record->canShowName()) { - $newvars[$name]['gedcom'] = $record->privatizeGedcom(Auth::accessLevel($WT_TREE)); - } else { - $action = 'setup'; - } - break; - case 'SOUR': - $record = Source::getInstance($var, $WT_TREE); - if ($record && $record->canShowName()) { - $newvars[$name]['gedcom'] = $record->privatizeGedcom(Auth::accessLevel($WT_TREE)); - } else { - $action = 'setup'; - } - break; - default: - break; + case 'INDI': + $record = Individual::getInstance($var, $WT_TREE); + if ($record && $record->canShowName()) { + $newvars[$name]['gedcom'] = $record->privatizeGedcom(Auth::accessLevel($WT_TREE)); + } else { + $action = 'setup'; + } + break; + case 'FAM': + $record = Family::getInstance($var, $WT_TREE); + if ($record && $record->canShowName()) { + $newvars[$name]['gedcom'] = $record->privatizeGedcom(Auth::accessLevel($WT_TREE)); + } else { + $action = 'setup'; + } + break; + case 'SOUR': + $record = Source::getInstance($var, $WT_TREE); + if ($record && $record->canShowName()) { + $newvars[$name]['gedcom'] = $record->privatizeGedcom(Auth::accessLevel($WT_TREE)); + } else { + $action = 'setup'; + } + break; + default: + break; } } } @@ -142,61 +142,61 @@ case 'setup': ]; switch ($input['lookup']) { - case 'INDI': - $individual = Individual::getInstance($pid, $WT_TREE) ?: $controller->getSignificantIndividual(); - $input['control'] = FunctionsEdit::formControlIndividual($individual, $attributes); - break; - case 'FAM': - $family = Family::getInstance($pid, $WT_TREE) ?: $controller->getSignificantFamily(); - $input['control'] = FunctionsEdit::formControlFamily($family, $attributes); - break; - case 'SOUR': - $source = Source::getInstance($pid, $WT_TREE); - $input['control'] = FunctionsEdit::formControlSource($source, $attributes); - break; - case 'DATE': - $attributes += [ - 'type' => 'text', - 'value' => $input['default'], - ]; - $input['control'] = '<input ' . Html::attributes($attributes) . '>'; - $input['extra'] = FontAwesome::linkIcon('calendar', I18N::translate('Select a date'), [ - 'class' => 'btn btn-link', - 'href' => '#', - 'onclick' => 'return calendarWidget("calendar-widget-' . $n . '", "input-' . $n . '");', - ]) . '<div id="calendar-widget-' . $n . '" style="position:absolute;visibility:hidden;background-color:white;z-index:1000;"></div>'; - break; - default: - switch ($input['type']) { - case 'text': + case 'INDI': + $individual = Individual::getInstance($pid, $WT_TREE) ?: $controller->getSignificantIndividual(); + $input['control'] = FunctionsEdit::formControlIndividual($individual, $attributes); + break; + case 'FAM': + $family = Family::getInstance($pid, $WT_TREE) ?: $controller->getSignificantFamily(); + $input['control'] = FunctionsEdit::formControlFamily($family, $attributes); + break; + case 'SOUR': + $source = Source::getInstance($pid, $WT_TREE); + $input['control'] = FunctionsEdit::formControlSource($source, $attributes); + break; + case 'DATE': $attributes += [ 'type' => 'text', 'value' => $input['default'], ]; $input['control'] = '<input ' . Html::attributes($attributes) . '>'; + $input['extra'] = FontAwesome::linkIcon('calendar', I18N::translate('Select a date'), [ + 'class' => 'btn btn-link', + 'href' => '#', + 'onclick' => 'return calendarWidget("calendar-widget-' . $n . '", "input-' . $n . '");', + ]) . '<div id="calendar-widget-' . $n . '" style="position:absolute;visibility:hidden;background-color:white;z-index:1000;"></div>'; break; - case 'checkbox': - $attributes += [ - 'type' => 'checkbox', - 'checked' => (bool) $input['default'], - ]; - $input['control'] = '<input ' . Html::attributes($attributes) . '>'; - break; - case 'select': - $options = []; - foreach (preg_split('/[|]+/', $input['options']) as $option) { - list($key, $value) = explode('=>', $option); - if (preg_match('/^I18N::number\((.+?)(,([\d+]))?\)$/', $value, $match)) { - $options[$key] = I18N::number($match[1], isset($match[3]) ? $match[3] : 0); - } elseif (preg_match('/^I18N::translate\(\'(.+)\'\)$/', $value, $match)) { - $options[$key] = I18N::translate($match[1]); - } elseif (preg_match('/^I18N::translateContext\(\'(.+)\', *\'(.+)\'\)$/', $value, $match)) { - $options[$key] = I18N::translateContext($match[1], $match[2]); - } + default: + switch ($input['type']) { + case 'text': + $attributes += [ + 'type' => 'text', + 'value' => $input['default'], + ]; + $input['control'] = '<input ' . Html::attributes($attributes) . '>'; + break; + case 'checkbox': + $attributes += [ + 'type' => 'checkbox', + 'checked' => (bool) $input['default'], + ]; + $input['control'] = '<input ' . Html::attributes($attributes) . '>'; + break; + case 'select': + $options = []; + foreach (preg_split('/[|]+/', $input['options']) as $option) { + list($key, $value) = explode('=>', $option); + if (preg_match('/^I18N::number\((.+?)(,([\d+]))?\)$/', $value, $match)) { + $options[$key] = I18N::number($match[1], isset($match[3]) ? $match[3] : 0); + } elseif (preg_match('/^I18N::translate\(\'(.+)\'\)$/', $value, $match)) { + $options[$key] = I18N::translate($match[1]); + } elseif (preg_match('/^I18N::translateContext\(\'(.+)\', *\'(.+)\'\)$/', $value, $match)) { + $options[$key] = I18N::translateContext($match[1], $match[2]); + } + } + $input['control'] = Bootstrap4::select($options, $input['default'], $attributes); + break; } - $input['control'] = Bootstrap4::select($options, $input['default'], $attributes); - break; - } } $inputs[] = $input; @@ -221,13 +221,13 @@ case 'run': } switch ($output) { - case 'HTML': - header('Content-type: text/html; charset=UTF-8'); - new ReportParserGenerate($report, new ReportHtml, $vars); - break; - case 'PDF': - new ReportParserGenerate($report, new ReportPdf, $vars); - break; + case 'HTML': + header('Content-type: text/html; charset=UTF-8'); + new ReportParserGenerate($report, new ReportHtml, $vars); + break; + case 'PDF': + new ReportParserGenerate($report, new ReportPdf, $vars); + break; } } } @@ -53,15 +53,15 @@ $method = $request->getMethod(); $route = $request->get('route'); switch ($method . ':' . $route) { -default: - $url = Html::url('setup.php', ['route' => 'setup']); - $response = new RedirectResponse($url); - break; + default: + $url = Html::url('setup.php', ['route' => 'setup']); + $response = new RedirectResponse($url); + break; -case 'GET:setup': -case 'POST:setup': - $response = (new SetupController)->setup($request); - break; + case 'GET:setup': + case 'POST:setup': + $response = (new SetupController)->setup($request); + break; } $response->prepare($request)->send(); |
