/** * builds and returns sosa relationship name in the active language * * @param string $sosa sosa number * * @return string */ function get_sosa_name($sosa) { $path = ''; while ($sosa > 1) { if ($sosa % 2 == 1) { $sosa -= 1; $path = 'mot' . $path; } else { $path = 'fat' . $path; } $sosa /= 2; } return get_relationship_name_from_path($path, null, null); }
function get_relationship_name_from_path($path, WT_Individual $person1 = null, WT_Individual $person2 = null) { if (!preg_match('/^(mot|fat|par|hus|wif|spo|son|dau|chi|bro|sis|sib)*$/', $path)) { // TODO: Update all the “3 RELA ” values in class_person return '<span class="error">' . $path . '</span>'; } // The path does not include the starting person. In some languages, the // translation for a man’s (relative) is different to a woman’s (relative), // due to inflection. $sex1 = $person1 ? $person1->getSex() : 'U'; // The sex of the last person in the relationship determines the name in // many cases. e.g. great-aunt / great-uncle if (preg_match('/(fat|hus|son|bro)$/', $path)) { $sex2 = 'M'; } elseif (preg_match('/(mot|wif|dau|sis)$/', $path)) { $sex2 = 'F'; } else { $sex2 = 'U'; } switch ($path) { case '': return WT_I18N::translate('self'); // Level One relationships // Level One relationships case 'mot': return WT_I18N::translate('mother'); case 'fat': return WT_I18N::translate('father'); case 'par': return WT_I18N::translate('parent'); case 'hus': if ($person1 && $person2) { foreach ($person1->getSpouseFamilies() as $family) { if ($person2 === $family->getSpouse($person1)) { if ($family->getFacts('_NMR')) { return WT_I18N::translate_c('MALE', 'partner'); } elseif ($family->getFacts(WT_EVENTS_DIV)) { return WT_I18N::translate('ex-husband'); } } } } return WT_I18N::translate('husband'); case 'wif': if ($person1 && $person1) { foreach ($person1->getSpouseFamilies() as $family) { if ($person2 === $family->getSpouse($person1)) { if ($family->getFacts('_NMR')) { return WT_I18N::translate_c('FEMALE', 'partner'); } elseif ($family->getFacts(WT_EVENTS_DIV)) { return WT_I18N::translate('ex-wife'); } } } } return WT_I18N::translate('wife'); case 'spo': if ($person1 && $person2) { foreach ($person1->getSpouseFamilies() as $family) { if ($person2 === $family->getSpouse($person1)) { if ($family->getFacts('_NMR')) { return WT_I18N::translate_c('MALE/FEMALE', 'partner'); } elseif ($family->getFacts(WT_EVENTS_DIV)) { return WT_I18N::translate('ex-spouse'); } } } } return WT_I18N::translate('spouse'); case 'son': return WT_I18N::translate('son'); case 'dau': return WT_I18N::translate('daughter'); case 'chi': return WT_I18N::translate('child'); case 'bro': if ($person1 && $person2) { $dob1 = $person1->getBirthDate(); $dob2 = $person2->getBirthDate(); if ($dob1->isOK() && $dob2->isOK()) { if (abs($dob1->JD() - $dob2->JD()) < 2 && !$dob1->qual1 && !$dob2->qual1) { // Exclude BEF, AFT, etc. return WT_I18N::translate('twin brother'); } elseif ($dob1->MaxJD() < $dob2->MinJD()) { return WT_I18N::translate('younger brother'); } elseif ($dob1->MinJD() > $dob2->MaxJD()) { return WT_I18N::translate('elder brother'); } } } return WT_I18N::translate('brother'); case 'sis': if ($person1 && $person2) { $dob1 = $person1->getBirthDate(); $dob2 = $person2->getBirthDate(); if ($dob1->isOK() && $dob2->isOK()) { if (abs($dob1->JD() - $dob2->JD()) < 2 && !$dob1->qual1 && !$dob2->qual1) { // Exclude BEF, AFT, etc. return WT_I18N::translate('twin sister'); } elseif ($dob1->MaxJD() < $dob2->MinJD()) { return WT_I18N::translate('younger sister'); } elseif ($dob1->MinJD() > $dob2->MaxJD()) { return WT_I18N::translate('elder sister'); } } } return WT_I18N::translate('sister'); case 'sib': if ($person1 && $person2) { $dob1 = $person1->getBirthDate(); $dob2 = $person2->getBirthDate(); if ($dob1->isOK() && $dob2->isOK()) { if (abs($dob1->JD() - $dob2->JD()) < 2 && !$dob1->qual1 && !$dob2->qual1) { // Exclude BEF, AFT, etc. return WT_I18N::translate('twin sibling'); } elseif ($dob1->MaxJD() < $dob2->MinJD()) { return WT_I18N::translate('younger sibling'); } elseif ($dob1->MinJD() > $dob2->MaxJD()) { return WT_I18N::translate('elder sibling'); } } } return WT_I18N::translate('sibling'); // Level Two relationships // Level Two relationships case 'brochi': return WT_I18N::translate_c('brother’s child', 'nephew/niece'); case 'brodau': return WT_I18N::translate_c('brother’s daughter', 'niece'); case 'broson': return WT_I18N::translate_c('brother’s son', 'nephew'); case 'browif': return WT_I18N::translate_c('brother’s wife', 'sister-in-law'); case 'chichi': return WT_I18N::translate_c('child’s child', 'grandchild'); case 'chidau': return WT_I18N::translate_c('child’s daughter', 'granddaughter'); case 'chihus': return WT_I18N::translate_c('child’s husband', 'son-in-law'); case 'chison': return WT_I18N::translate_c('child’s son', 'grandson'); case 'chispo': return WT_I18N::translate_c('child’s spouse', 'son/daughter-in-law'); case 'chiwif': return WT_I18N::translate_c('child’s wife', 'daughter-in-law'); case 'dauchi': return WT_I18N::translate_c('daughter’s child', 'grandchild'); case 'daudau': return WT_I18N::translate_c('daughter’s daughter', 'granddaughter'); case 'dauhus': return WT_I18N::translate_c('daughter’s husband', 'son-in-law'); case 'dauson': return WT_I18N::translate_c('daughter’s son', 'grandson'); case 'fatbro': return WT_I18N::translate_c('father’s brother', 'uncle'); case 'fatchi': return WT_I18N::translate_c('father’s child', 'half-sibling'); case 'fatdau': return WT_I18N::translate_c('father’s daughter', 'half-sister'); case 'fatfat': return WT_I18N::translate_c('father’s father', 'paternal grandfather'); case 'fatmot': return WT_I18N::translate_c('father’s mother', 'paternal grandmother'); case 'fatpar': return WT_I18N::translate_c('father’s parent', 'paternal grandparent'); case 'fatsib': return WT_I18N::translate_c('father’s sibling', 'aunt/uncle'); case 'fatsis': return WT_I18N::translate_c('father’s sister', 'aunt'); case 'fatson': return WT_I18N::translate_c('father’s son', 'half-brother'); case 'fatwif': return WT_I18N::translate_c('father’s wife', 'step-mother'); case 'husbro': return WT_I18N::translate_c('husband’s brother', 'brother-in-law'); case 'huschi': return WT_I18N::translate_c('husband’s child', 'step-child'); case 'husdau': return WT_I18N::translate_c('husband’s daughter', 'step-daughter'); case 'husfat': return WT_I18N::translate_c('husband’s father', 'father-in-law'); case 'husmot': return WT_I18N::translate_c('husband’s mother', 'mother-in-law'); case 'hussib': return WT_I18N::translate_c('husband’s sibling', 'brother/sister-in-law'); case 'hussis': return WT_I18N::translate_c('husband’s sister', 'sister-in-law'); case 'husson': return WT_I18N::translate_c('husband’s son', 'step-son'); case 'motbro': return WT_I18N::translate_c('mother’s brother', 'uncle'); case 'motchi': return WT_I18N::translate_c('mother’s child', 'half-sibling'); case 'motdau': return WT_I18N::translate_c('mother’s daughter', 'half-sister'); case 'motfat': return WT_I18N::translate_c('mother’s father', 'maternal grandfather'); case 'mothus': return WT_I18N::translate_c('mother’s husband', 'step-father'); case 'motmot': return WT_I18N::translate_c('mother’s mother', 'maternal grandmother'); case 'motpar': return WT_I18N::translate_c('mother’s parent', 'maternal grandparent'); case 'motsib': return WT_I18N::translate_c('mother’s sibling', 'aunt/uncle'); case 'motsis': return WT_I18N::translate_c('mother’s sister', 'aunt'); case 'motson': return WT_I18N::translate_c('mother’s son', 'half-brother'); case 'parbro': return WT_I18N::translate_c('parent’s brother', 'uncle'); case 'parchi': return WT_I18N::translate_c('parent’s child', 'half-sibling'); case 'pardau': return WT_I18N::translate_c('parent’s daughter', 'half-sister'); case 'parfat': return WT_I18N::translate_c('parent’s father', 'grandfather'); case 'parmot': return WT_I18N::translate_c('parent’s mother', 'grandmother'); case 'parpar': return WT_I18N::translate_c('parent’s parent', 'grandparent'); case 'parsib': return WT_I18N::translate_c('parent’s sibling', 'aunt/uncle'); case 'parsis': return WT_I18N::translate_c('parent’s sister', 'aunt'); case 'parson': return WT_I18N::translate_c('parent’s son', 'half-brother'); case 'parspo': return WT_I18N::translate_c('parent’s spouse', 'step-parent'); case 'sibchi': return WT_I18N::translate_c('sibling’s child', 'nephew/niece'); case 'sibdau': return WT_I18N::translate_c('sibling’s daughter', 'niece'); case 'sibson': return WT_I18N::translate_c('sibling’s son', 'nephew'); case 'sibspo': return WT_I18N::translate_c('sibling’s spouse', 'brother/sister-in-law'); case 'sischi': return WT_I18N::translate_c('sister’s child', 'nephew/niece'); case 'sisdau': return WT_I18N::translate_c('sister’s daughter', 'niece'); case 'sishus': return WT_I18N::translate_c('sister’s husband', 'brother-in-law'); case 'sisson': return WT_I18N::translate_c('sister’s son', 'nephew'); case 'sonchi': return WT_I18N::translate_c('son’s child', 'grandchild'); case 'sondau': return WT_I18N::translate_c('son’s daughter', 'granddaughter'); case 'sonson': return WT_I18N::translate_c('son’s son', 'grandson'); case 'sonwif': return WT_I18N::translate_c('son’s wife', 'daughter-in-law'); case 'spobro': return WT_I18N::translate_c('spouse’s brother', 'brother-in-law'); case 'spochi': return WT_I18N::translate_c('spouse’s child', 'step-child'); case 'spodau': return WT_I18N::translate_c('spouse’s daughter', 'step-daughter'); case 'spofat': return WT_I18N::translate_c('spouse’s father', 'father-in-law'); case 'spomot': return WT_I18N::translate_c('spouse’s mother', 'mother-in-law'); case 'sposis': return WT_I18N::translate_c('spouse’s sister', 'sister-in-law'); case 'sposon': return WT_I18N::translate_c('spouse’s son', 'step-son'); case 'spopar': return WT_I18N::translate_c('spouse’s parent', 'mother/father-in-law'); case 'sposib': return WT_I18N::translate_c('spouse’s sibling', 'brother/sister-in-law'); case 'wifbro': return WT_I18N::translate_c('wife’s brother', 'brother-in-law'); case 'wifchi': return WT_I18N::translate_c('wife’s child', 'step-child'); case 'wifdau': return WT_I18N::translate_c('wife’s daughter', 'step-daughter'); case 'wiffat': return WT_I18N::translate_c('wife’s father', 'father-in-law'); case 'wifmot': return WT_I18N::translate_c('wife’s mother', 'mother-in-law'); case 'wifsib': return WT_I18N::translate_c('wife’s sibling', 'brother/sister-in-law'); case 'wifsis': return WT_I18N::translate_c('wife’s sister', 'sister-in-law'); case 'wifson': return WT_I18N::translate_c('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 // 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 WT_I18N::translate_c('(a man’s) brother’s child’s child', 'great-nephew/niece'); } else { return WT_I18N::translate_c('(a woman’s) brother’s child’s child', 'great-nephew/niece'); } case 'brochidau': if ($sex1 == 'M') { return WT_I18N::translate_c('(a man’s) brother’s child’s daughter', 'great-niece'); } else { return WT_I18N::translate_c('(a woman’s) brother’s child’s daughter', 'great-niece'); } case 'brochison': if ($sex1 == 'M') { return WT_I18N::translate_c('(a man’s) brother’s child’s son', 'great-nephew'); } else { return WT_I18N::translate_c('(a woman’s) brother’s child’s son', 'great-nephew'); } case 'brodauchi': if ($sex1 == 'M') { return WT_I18N::translate_c('(a man’s) brother’s daughter’s child', 'great-nephew/niece'); } else { return WT_I18N::translate_c('(a woman’s) brother’s daughter’s child', 'great-nephew/niece'); } case 'brodaudau': if ($sex1 == 'M') { return WT_I18N::translate_c('(a man’s) brother’s daughter’s daughter', 'great-niece'); } else { return WT_I18N::translate_c('(a woman’s) brother’s daughter’s daughter', 'great-niece'); } case 'brodauhus': return WT_I18N::translate_c('brother’s daughter’s husband', 'nephew-in-law'); case 'brodauson': if ($sex1 == 'M') { return WT_I18N::translate_c('(a man’s) brother’s daughter’s son', 'great-nephew'); } else { return WT_I18N::translate_c('(a woman’s) brother’s daughter’s son', 'great-nephew'); } case 'brosonchi': if ($sex1 == 'M') { return WT_I18N::translate_c('(a man’s) brother’s son’s child', 'great-nephew/niece'); } else { return WT_I18N::translate_c('(a woman’s) brother’s son’s child', 'great-nephew/niece'); } case 'brosondau': if ($sex1 == 'M') { return WT_I18N::translate_c('(a man’s) brother’s son’s daughter', 'great-niece'); } else { return WT_I18N::translate_c('(a woman’s) brother’s son’s daughter', 'great-niece'); } case 'brosonson': if ($sex1 == 'M') { return WT_I18N::translate_c('(a man’s) brother’s son’s son', 'great-nephew'); } else { return WT_I18N::translate_c('(a woman’s) brother’s son’s son', 'great-nephew'); } case 'brosonwif': return WT_I18N::translate_c('brother’s son’s wife', 'niece-in-law'); case 'browifbro': return WT_I18N::translate_c('brother’s wife’s brother', 'brother-in-law'); case 'browifsib': return WT_I18N::translate_c('brother’s wife’s sibling', 'brother/sister-in-law'); case 'browifsis': return WT_I18N::translate_c('brother’s wife’s sister', 'sister-in-law'); case 'chichichi': return WT_I18N::translate_c('child’s child’s child', 'great-grandchild'); case 'chichidau': return WT_I18N::translate_c('child’s child’s daughter', 'great-granddaughter'); case 'chichison': return WT_I18N::translate_c('child’s child’s son', 'great-grandson'); case 'chidauchi': return WT_I18N::translate_c('child’s daughter’s child', 'great-grandchild'); case 'chidaudau': return WT_I18N::translate_c('child’s daughter’s daughter', 'great-granddaughter'); case 'chidauhus': return WT_I18N::translate_c('child’s daughter’s husband', 'granddaughter’s husband'); case 'chidauson': return WT_I18N::translate_c('child’s daughter’s son', 'great-grandson'); case 'chisonchi': return WT_I18N::translate_c('child’s son’s child', 'great-grandchild'); case 'chisondau': return WT_I18N::translate_c('child’s son’s daughter', 'great-granddaughter'); case 'chisonson': return WT_I18N::translate_c('child’s son’s son', 'great-grandson'); case 'chisonwif': return WT_I18N::translate_c('child’s son’s wife', 'grandson’s wife'); case 'dauchichi': return WT_I18N::translate_c('daughter’s child’s child', 'great-grandchild'); case 'dauchidau': return WT_I18N::translate_c('daughter’s child’s daughter', 'great-granddaughter'); case 'dauchison': return WT_I18N::translate_c('daughter’s child’s son', 'great-grandson'); case 'daudauchi': return WT_I18N::translate_c('daughter’s daughter’s child', 'great-grandchild'); case 'daudaudau': return WT_I18N::translate_c('daughter’s daughter’s daughter', 'great-granddaughter'); case 'daudauhus': return WT_I18N::translate_c('daughter’s daughter’s husband', 'granddaughter’s husband'); case 'daudauson': return WT_I18N::translate_c('daughter’s daughter’s son', 'great-grandson'); case 'dauhusfat': return WT_I18N::translate_c('daughter’s husband’s father', 'son-in-law’s father'); case 'dauhusmot': return WT_I18N::translate_c('daughter’s husband’s mother', 'son-in-law’s mother'); case 'dauhuspar': return WT_I18N::translate_c('daughter’s husband’s parent', 'son-in-law’s parent'); case 'dausonchi': return WT_I18N::translate_c('daughter’s son’s child', 'great-grandchild'); case 'dausondau': return WT_I18N::translate_c('daughter’s son’s daughter', 'great-granddaughter'); case 'dausonson': return WT_I18N::translate_c('daughter’s son’s son', 'great-grandson'); case 'dausonwif': return WT_I18N::translate_c('daughter’s son’s wife', 'grandson’s wife'); case 'fatbrochi': return WT_I18N::translate_c('father’s brother’s child', 'first cousin'); case 'fatbrodau': return WT_I18N::translate_c('father’s brother’s daughter', 'first cousin'); case 'fatbroson': return WT_I18N::translate_c('father’s brother’s son', 'first cousin'); case 'fatbrowif': return WT_I18N::translate_c('father’s brother’s wife', 'aunt'); case 'fatfatbro': return WT_I18N::translate_c('father’s father’s brother', 'great-uncle'); case 'fatfatfat': return WT_I18N::translate_c('father’s father’s father', 'great-grandfather'); case 'fatfatmot': return WT_I18N::translate_c('father’s father’s mother', 'great-grandmother'); case 'fatfatpar': return WT_I18N::translate_c('father’s father’s parent', 'great-grandparent'); case 'fatfatsib': return WT_I18N::translate_c('father’s father’s sibling', 'great-aunt/uncle'); case 'fatfatsis': return WT_I18N::translate_c('father’s father’s sister', 'great-aunt'); case 'fatmotbro': return WT_I18N::translate_c('father’s mother’s brother', 'great-uncle'); case 'fatmotfat': return WT_I18N::translate_c('father’s mother’s father', 'great-grandfather'); case 'fatmotmot': return WT_I18N::translate_c('father’s mother’s mother', 'great-grandmother'); case 'fatmotpar': return WT_I18N::translate_c('father’s mother’s parent', 'great-grandparent'); case 'fatmotsib': return WT_I18N::translate_c('father’s mother’s sibling', 'great-aunt/uncle'); case 'fatmotsis': return WT_I18N::translate_c('father’s mother’s sister', 'great-aunt'); case 'fatparbro': return WT_I18N::translate_c('father’s parent’s brother', 'great-uncle'); case 'fatparfat': return WT_I18N::translate_c('father’s parent’s father', 'great-grandfather'); case 'fatparmot': return WT_I18N::translate_c('father’s parent’s mother', 'great-grandmother'); case 'fatparpar': return WT_I18N::translate_c('father’s parent’s parent', 'great-grandparent'); case 'fatparsib': return WT_I18N::translate_c('father’s parent’s sibling', 'great-aunt/uncle'); case 'fatparsis': return WT_I18N::translate_c('father’s parent’s sister', 'great-aunt'); case 'fatsischi': return WT_I18N::translate_c('father’s sister’s child', 'first cousin'); case 'fatsisdau': return WT_I18N::translate_c('father’s sister’s daughter', 'first cousin'); case 'fatsishus': return WT_I18N::translate_c('father’s sister’s husband', 'uncle'); case 'fatsisson': return WT_I18N::translate_c('father’s sister’s son', 'first cousin'); case 'fatwifchi': return WT_I18N::translate_c('father’s wife’s child', 'step-sibling'); case 'fatwifdau': return WT_I18N::translate_c('father’s wife’s daughter', 'step-sister'); case 'fatwifson': return WT_I18N::translate_c('father’s wife’s son', 'step-brother'); case 'husbrowif': return WT_I18N::translate_c('husband’s brother’s wife', 'sister-in-law'); case 'hussishus': return WT_I18N::translate_c('husband’s sister’s husband', 'brother-in-law'); case 'motbrochi': return WT_I18N::translate_c('mother’s brother’s child', 'first cousin'); case 'motbrodau': return WT_I18N::translate_c('mother’s brother’s daughter', 'first cousin'); case 'motbroson': return WT_I18N::translate_c('mother’s brother’s son', 'first cousin'); case 'motbrowif': return WT_I18N::translate_c('mother’s brother’s wife', 'aunt'); case 'motfatbro': return WT_I18N::translate_c('mother’s father’s brother', 'great-uncle'); case 'motfatfat': return WT_I18N::translate_c('mother’s father’s father', 'great-grandfather'); case 'motfatmot': return WT_I18N::translate_c('mother’s father’s mother', 'great-grandmother'); case 'motfatpar': return WT_I18N::translate_c('mother’s father’s parent', 'great-grandparent'); case 'motfatsib': return WT_I18N::translate_c('mother’s father’s sibling', 'great-aunt/uncle'); case 'motfatsis': return WT_I18N::translate_c('mother’s father’s sister', 'great-aunt'); case 'mothuschi': return WT_I18N::translate_c('mother’s husband’s child', 'step-sibling'); case 'mothusdau': return WT_I18N::translate_c('mother’s husband’s daughter', 'step-sister'); case 'mothusson': return WT_I18N::translate_c('mother’s husband’s son', 'step-brother'); case 'motmotbro': return WT_I18N::translate_c('mother’s mother’s brother', 'great-uncle'); case 'motmotfat': return WT_I18N::translate_c('mother’s mother’s father', 'great-grandfather'); case 'motmotmot': return WT_I18N::translate_c('mother’s mother’s mother', 'great-grandmother'); case 'motmotpar': return WT_I18N::translate_c('mother’s mother’s parent', 'great-grandparent'); case 'motmotsib': return WT_I18N::translate_c('mother’s mother’s sibling', 'great-aunt/uncle'); case 'motmotsis': return WT_I18N::translate_c('mother’s mother’s sister', 'great-aunt'); case 'motparbro': return WT_I18N::translate_c('mother’s parent’s brother', 'great-uncle'); case 'motparfat': return WT_I18N::translate_c('mother’s parent’s father', 'great-grandfather'); case 'motparmot': return WT_I18N::translate_c('mother’s parent’s mother', 'great-grandmother'); case 'motparpar': return WT_I18N::translate_c('mother’s parent’s parent', 'great-grandparent'); case 'motparsib': return WT_I18N::translate_c('mother’s parent’s sibling', 'great-aunt/uncle'); case 'motparsis': return WT_I18N::translate_c('mother’s parent’s sister', 'great-aunt'); case 'motsischi': return WT_I18N::translate_c('mother’s sister’s child', 'first cousin'); case 'motsisdau': return WT_I18N::translate_c('mother’s sister’s daughter', 'first cousin'); case 'motsishus': return WT_I18N::translate_c('mother’s sister’s husband', 'uncle'); case 'motsisson': return WT_I18N::translate_c('mother’s sister’s son', 'first cousin'); case 'parbrowif': return WT_I18N::translate_c('parent’s brother’s wife', 'aunt'); case 'parfatbro': return WT_I18N::translate_c('parent’s father’s brother', 'great-uncle'); case 'parfatfat': return WT_I18N::translate_c('parent’s father’s father', 'great-grandfather'); case 'parfatmot': return WT_I18N::translate_c('parent’s father’s mother', 'great-grandmother'); case 'parfatpar': return WT_I18N::translate_c('parent’s father’s parent', 'great-grandparent'); case 'parfatsib': return WT_I18N::translate_c('parent’s father’s sibling', 'great-aunt/uncle'); case 'parfatsis': return WT_I18N::translate_c('parent’s father’s sister', 'great-aunt'); case 'parmotbro': return WT_I18N::translate_c('parent’s mother’s brother', 'great-uncle'); case 'parmotfat': return WT_I18N::translate_c('parent’s mother’s father', 'great-grandfather'); case 'parmotmot': return WT_I18N::translate_c('parent’s mother’s mother', 'great-grandmother'); case 'parmotpar': return WT_I18N::translate_c('parent’s mother’s parent', 'great-grandparent'); case 'parmotsib': return WT_I18N::translate_c('parent’s mother’s sibling', 'great-aunt/uncle'); case 'parmotsis': return WT_I18N::translate_c('parent’s mother’s sister', 'great-aunt'); case 'parparbro': return WT_I18N::translate_c('parent’s parent’s brother', 'great-uncle'); case 'parparfat': return WT_I18N::translate_c('parent’s parent’s father', 'great-grandfather'); case 'parparmot': return WT_I18N::translate_c('parent’s parent’s mother', 'great-grandmother'); case 'parparpar': return WT_I18N::translate_c('parent’s parent’s parent', 'great-grandparent'); case 'parparsib': return WT_I18N::translate_c('parent’s parent’s sibling', 'great-aunt/uncle'); case 'parparsis': return WT_I18N::translate_c('parent’s parent’s sister', 'great-aunt'); case 'parsishus': return WT_I18N::translate_c('parent’s sister’s husband', 'uncle'); case 'parspochi': return WT_I18N::translate_c('parent’s spouse’s child', 'step-sibling'); case 'parspodau': return WT_I18N::translate_c('parent’s spouse’s daughter', 'step-sister'); case 'parsposon': return WT_I18N::translate_c('parent’s spouse’s son', 'step-brother'); case 'sibchichi': return WT_I18N::translate_c('sibling’s child’s child', 'great-nephew/niece'); case 'sibchidau': return WT_I18N::translate_c('sibling’s child’s daughter', 'great-niece'); case 'sibchison': return WT_I18N::translate_c('sibling’s child’s son', 'great-nephew'); case 'sibdauchi': return WT_I18N::translate_c('sibling’s daughter’s child', 'great-nephew/niece'); case 'sibdaudau': return WT_I18N::translate_c('sibling’s daughter’s daughter', 'great-niece'); case 'sibdauhus': return WT_I18N::translate_c('sibling’s daughter’s husband', 'nephew-in-law'); case 'sibdauson': return WT_I18N::translate_c('sibling’s daughter’s son', 'great-nephew'); case 'sibsonchi': return WT_I18N::translate_c('sibling’s son’s child', 'great-nephew/niece'); case 'sibsondau': return WT_I18N::translate_c('sibling’s son’s daughter', 'great-niece'); case 'sibsonson': return WT_I18N::translate_c('sibling’s son’s son', 'great-nephew'); case 'sibsonwif': return WT_I18N::translate_c('sibling’s son’s wife', 'niece-in-law'); case 'sischichi': if ($sex1 == 'M') { return WT_I18N::translate_c('(a man’s) sister’s child’s child', 'great-nephew/niece'); } else { return WT_I18N::translate_c('(a woman’s) sister’s child’s child', 'great-nephew/niece'); } case 'sischidau': if ($sex1 == 'M') { return WT_I18N::translate_c('(a man’s) sister’s child’s daughter', 'great-niece'); } else { return WT_I18N::translate_c('(a woman’s) sister’s child’s daughter', 'great-niece'); } case 'sischison': if ($sex1 == 'M') { return WT_I18N::translate_c('(a man’s) sister’s child’s son', 'great-nephew'); } else { return WT_I18N::translate_c('(a woman’s) sister’s child’s son', 'great-nephew'); } case 'sisdauchi': if ($sex1 == 'M') { return WT_I18N::translate_c('(a man’s) sister’s daughter’s child', 'great-nephew/niece'); } else { return WT_I18N::translate_c('(a woman’s) sister’s daughter’s child', 'great-nephew/niece'); } case 'sisdaudau': if ($sex1 == 'M') { return WT_I18N::translate_c('(a man’s) sister’s daughter’s daughter', 'great-niece'); } else { return WT_I18N::translate_c('(a woman’s) sister’s daughter’s daughter', 'great-niece'); } case 'sisdauhus': return WT_I18N::translate_c('sisters’s daughter’s husband', 'nephew-in-law'); case 'sisdauson': if ($sex1 == 'M') { return WT_I18N::translate_c('(a man’s) sister’s daughter’s son', 'great-nephew'); } else { return WT_I18N::translate_c('(a woman’s) sister’s daughter’s son', 'great-nephew'); } case 'sishusbro': return WT_I18N::translate_c('sister’s husband’s brother', 'brother-in-law'); case 'sishussib': return WT_I18N::translate_c('sister’s husband’s sibling', 'brother/sister-in-law'); case 'sishussis': return WT_I18N::translate_c('sister’s husband’s sister', 'sister-in-law'); case 'sissonchi': if ($sex1 == 'M') { return WT_I18N::translate_c('(a man’s) sister’s son’s child', 'great-nephew/niece'); } else { return WT_I18N::translate_c('(a woman’s) sister’s son’s child', 'great-nephew/niece'); } case 'sissondau': if ($sex1 == 'M') { return WT_I18N::translate_c('(a man’s) sister’s son’s daughter', 'great-niece'); } else { return WT_I18N::translate_c('(a woman’s) sister’s son’s daughter', 'great-niece'); } case 'sissonson': if ($sex1 == 'M') { return WT_I18N::translate_c('(a man’s) sister’s son’s son', 'great-nephew'); } else { return WT_I18N::translate_c('(a woman’s) sister’s son’s son', 'great-nephew'); } case 'sissonwif': return WT_I18N::translate_c('sisters’s son’s wife', 'niece-in-law'); case 'sonchichi': return WT_I18N::translate_c('son’s child’s child', 'great-grandchild'); case 'sonchidau': return WT_I18N::translate_c('son’s child’s daughter', 'great-granddaughter'); case 'sonchison': return WT_I18N::translate_c('son’s child’s son', 'great-grandson'); case 'sondauchi': return WT_I18N::translate_c('son’s daughter’s child', 'great-grandchild'); case 'sondaudau': return WT_I18N::translate_c('son’s daughter’s daughter', 'great-granddaughter'); case 'sondauhus': return WT_I18N::translate_c('son’s daughter’s husband', 'granddaughter’s husband'); case 'sondauson': return WT_I18N::translate_c('son’s daughter’s son', 'great-grandson'); case 'sonsonchi': return WT_I18N::translate_c('son’s son’s child', 'great-grandchild'); case 'sonsondau': return WT_I18N::translate_c('son’s son’s daughter', 'great-granddaughter'); case 'sonsonson': return WT_I18N::translate_c('son’s son’s son', 'great-grandson'); case 'sonsonwif': return WT_I18N::translate_c('son’s son’s wife', 'grandson’s wife'); case 'sonwiffat': return WT_I18N::translate_c('son’s wife’s father', 'daughter-in-law’s father'); case 'sonwifmot': return WT_I18N::translate_c('son’s wife’s mother', 'daughter-in-law’s mother'); case 'sonwifpar': return WT_I18N::translate_c('son’s wife’s parent', 'daughter-in-law’s parent'); case 'wifbrowif': return WT_I18N::translate_c('wife’s brother’s wife', 'sister-in-law'); case 'wifsishus': return WT_I18N::translate_c('wife’s sister’s husband', 'brother-in-law'); // Some “special case” level four relationships that have specific names in certain languages // Some “special case” level four relationships that have specific names in certain languages case 'fatfatbrowif': return WT_I18N::translate_c('father’s father’s brother’s wife', 'great-aunt'); case 'fatfatsibspo': return WT_I18N::translate_c('father’s father’s sibling’s spouse', 'great-aunt/uncle'); case 'fatfatsishus': return WT_I18N::translate_c('father’s father’s sister’s husband', 'great-uncle'); case 'fatmotbrowif': return WT_I18N::translate_c('father’s mother’s brother’s wife', 'great-aunt'); case 'fatmotsibspo': return WT_I18N::translate_c('father’s mother’s sibling’s spouse', 'great-aunt/uncle'); case 'fatmotsishus': return WT_I18N::translate_c('father’s mother’s sister’s husband', 'great-uncle'); case 'fatparbrowif': return WT_I18N::translate_c('father’s parent’s brother’s wife', 'great-aunt'); case 'fatparsibspo': return WT_I18N::translate_c('father’s parent’s sibling’s spouse', 'great-aunt/uncle'); case 'fatparsishus': return WT_I18N::translate_c('father’s parent’s sister’s husband', 'great-uncle'); case 'motfatbrowif': return WT_I18N::translate_c('mother’s father’s brother’s wife', 'great-aunt'); case 'motfatsibspo': return WT_I18N::translate_c('mother’s father’s sibling’s spouse', 'great-aunt/uncle'); case 'motfatsishus': return WT_I18N::translate_c('mother’s father’s sister’s husband', 'great-uncle'); case 'motmotbrowif': return WT_I18N::translate_c('mother’s mother’s brother’s wife', 'great-aunt'); case 'motmotsibspo': return WT_I18N::translate_c('mother’s mother’s sibling’s spouse', 'great-aunt/uncle'); case 'motmotsishus': return WT_I18N::translate_c('mother’s mother’s sister’s husband', 'great-uncle'); case 'motparbrowif': return WT_I18N::translate_c('mother’s parent’s brother’s wife', 'great-aunt'); case 'motparsibspo': return WT_I18N::translate_c('mother’s parent’s sibling’s spouse', 'great-aunt/uncle'); case 'motparsishus': return WT_I18N::translate_c('mother’s parent’s sister’s husband', 'great-uncle'); case 'parfatbrowif': return WT_I18N::translate_c('parent’s father’s brother’s wife', 'great-aunt'); case 'parfatsibspo': return WT_I18N::translate_c('parent’s father’s sibling’s spouse', 'great-aunt/uncle'); case 'parfatsishus': return WT_I18N::translate_c('parent’s father’s sister’s husband', 'great-uncle'); case 'parmotbrowif': return WT_I18N::translate_c('parent’s mother’s brother’s wife', 'great-aunt'); case 'parmotsibspo': return WT_I18N::translate_c('parent’s mother’s sibling’s spouse', 'great-aunt/uncle'); case 'parmotsishus': return WT_I18N::translate_c('parent’s mother’s sister’s husband', 'great-uncle'); case 'parparbrowif': return WT_I18N::translate_c('parent’s parent’s brother’s wife', 'great-aunt'); case 'parparsibspo': return WT_I18N::translate_c('parent’s parent’s sibling’s spouse', 'great-aunt/uncle'); case 'parparsishus': return WT_I18N::translate_c('parent’s parent’s sister’s husband', 'great-uncle'); case 'fatfatbrodau': return WT_I18N::translate_c('father’s father’s brother’s daughter', 'first cousin once removed ascending'); case 'fatfatbroson': return WT_I18N::translate_c('father’s father’s brother’s son', 'first cousin once removed ascending'); case 'fatfatbrochi': return WT_I18N::translate_c('father’s father’s brother’s child', 'first cousin once removed ascending'); case 'fatfatsisdau': return WT_I18N::translate_c('father’s father’s sister’s daughter', 'first cousin once removed ascending'); case 'fatfatsisson': return WT_I18N::translate_c('father’s father’s sister’s son', 'first cousin once removed ascending'); case 'fatfatsischi': return WT_I18N::translate_c('father’s father’s sister’s child', 'first cousin once removed ascending'); case 'fatmotbrodau': return WT_I18N::translate_c('father’s mother’s brother’s daughter', 'first cousin once removed ascending'); case 'fatmotbroson': return WT_I18N::translate_c('father’s mother’s brother’s son', 'first cousin once removed ascending'); case 'fatmotbrochi': return WT_I18N::translate_c('father’s mother’s brother’s child', 'first cousin once removed ascending'); case 'fatmotsisdau': return WT_I18N::translate_c('father’s mother’s sister’s daughter', 'first cousin once removed ascending'); case 'fatmotsisson': return WT_I18N::translate_c('father’s mother’s sister’s son', 'first cousin once removed ascending'); case 'fatmotsischi': return WT_I18N::translate_c('father’s mother’s sister’s child', 'first cousin once removed ascending'); case 'motfatbrodau': return WT_I18N::translate_c('mother’s father’s brother’s daughter', 'first cousin once removed ascending'); case 'motfatbroson': return WT_I18N::translate_c('mother’s father’s brother’s son', 'first cousin once removed ascending'); case 'motfatbrochi': return WT_I18N::translate_c('mother’s father’s brother’s child', 'first cousin once removed ascending'); case 'motfatsisdau': return WT_I18N::translate_c('mother’s father’s sister’s daughter', 'first cousin once removed ascending'); case 'motfatsisson': return WT_I18N::translate_c('mother’s father’s sister’s son', 'first cousin once removed ascending'); case 'motfatsischi': return WT_I18N::translate_c('mother’s father’s sister’s child', 'first cousin once removed ascending'); case 'motmotbrodau': return WT_I18N::translate_c('mother’s mother’s brother’s daughter', 'first cousin once removed ascending'); case 'motmotbroson': return WT_I18N::translate_c('mother’s mother’s brother’s son', 'first cousin once removed ascending'); case 'motmotbrochi': return WT_I18N::translate_c('mother’s mother’s brother’s child', 'first cousin once removed ascending'); case 'motmotsisdau': return WT_I18N::translate_c('mother’s mother’s sister’s daughter', 'first cousin once removed ascending'); case 'motmotsisson': return WT_I18N::translate_c('mother’s mother’s sister’s son', 'first cousin once removed ascending'); case 'motmotsischi': return WT_I18N::translate_c('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 if (preg_match('/^(mot|fat|par)fatbro(son|dau|chi)dau$/', $path)) { return WT_I18N::translate_c('grandfather’s brother’s granddaughter', 'second cousin'); } else { if (preg_match('/^(mot|fat|par)fatbro(son|dau|chi)son$/', $path)) { return WT_I18N::translate_c('grandfather’s brother’s grandson', 'second cousin'); } else { if (preg_match('/^(mot|fat|par)fatbro(son|dau|chi)chi$/', $path)) { return WT_I18N::translate_c('grandfather’s brother’s grandchild', 'second cousin'); } else { if (preg_match('/^(mot|fat|par)fatsis(son|dau|chi)dau$/', $path)) { return WT_I18N::translate_c('grandfather’s sister’s granddaughter', 'second cousin'); } else { if (preg_match('/^(mot|fat|par)fatsis(son|dau|chi)son$/', $path)) { return WT_I18N::translate_c('grandfather’s sister’s grandson', 'second cousin'); } else { if (preg_match('/^(mot|fat|par)fatsis(son|dau|chi)chi$/', $path)) { return WT_I18N::translate_c('grandfather’s sister’s grandchild', 'second cousin'); } else { if (preg_match('/^(mot|fat|par)fatsib(son|dau|chi)dau$/', $path)) { return WT_I18N::translate_c('grandfather’s sibling’s granddaughter', 'second cousin'); } else { if (preg_match('/^(mot|fat|par)fatsib(son|dau|chi)son$/', $path)) { return WT_I18N::translate_c('grandfather’s sibling’s grandson', 'second cousin'); } else { if (preg_match('/^(mot|fat|par)fatsib(son|dau|chi)chi$/', $path)) { return WT_I18N::translate_c('grandfather’s sibling’s grandchild', 'second cousin'); } else { if (preg_match('/^(mot|fat|par)motbro(son|dau|chi)dau$/', $path)) { return WT_I18N::translate_c('grandmother’s brother’s granddaughter', 'second cousin'); } else { if (preg_match('/^(mot|fat|par)motbro(son|dau|chi)son$/', $path)) { return WT_I18N::translate_c('grandmother’s brother’s grandson', 'second cousin'); } else { if (preg_match('/^(mot|fat|par)motbro(son|dau|chi)chi$/', $path)) { return WT_I18N::translate_c('grandmother’s brother’s grandchild', 'second cousin'); } else { if (preg_match('/^(mot|fat|par)motsis(son|dau|chi)dau$/', $path)) { return WT_I18N::translate_c('grandmother’s sister’s granddaughter', 'second cousin'); } else { if (preg_match('/^(mot|fat|par)motsis(son|dau|chi)son$/', $path)) { return WT_I18N::translate_c('grandmother’s sister’s grandson', 'second cousin'); } else { if (preg_match('/^(mot|fat|par)motsis(son|dau|chi)chi$/', $path)) { return WT_I18N::translate_c('grandmother’s sister’s grandchild', 'second cousin'); } else { if (preg_match('/^(mot|fat|par)motsib(son|dau|chi)dau$/', $path)) { return WT_I18N::translate_c('grandmother’s sibling’s granddaughter', 'second cousin'); } else { if (preg_match('/^(mot|fat|par)motsib(son|dau|chi)son$/', $path)) { return WT_I18N::translate_c('grandmother’s sibling’s grandson', 'second cousin'); } else { if (preg_match('/^(mot|fat|par)motsib(son|dau|chi)chi$/', $path)) { return WT_I18N::translate_c('grandmother’s sibling’s grandchild', 'second cousin'); } else { if (preg_match('/^(mot|fat|par)parbro(son|dau|chi)dau$/', $path)) { return WT_I18N::translate_c('grandparent’s brother’s granddaughter', 'second cousin'); } else { if (preg_match('/^(mot|fat|par)parbro(son|dau|chi)son$/', $path)) { return WT_I18N::translate_c('grandparent’s brother’s grandson', 'second cousin'); } else { if (preg_match('/^(mot|fat|par)parbro(son|dau|chi)chi$/', $path)) { return WT_I18N::translate_c('grandparent’s brother’s grandchild', 'second cousin'); } else { if (preg_match('/^(mot|fat|par)parsis(son|dau|chi)dau$/', $path)) { return WT_I18N::translate_c('grandparent’s sister’s granddaughter', 'second cousin'); } else { if (preg_match('/^(mot|fat|par)parsis(son|dau|chi)son$/', $path)) { return WT_I18N::translate_c('grandparent’s sister’s grandson', 'second cousin'); } else { if (preg_match('/^(mot|fat|par)parsis(son|dau|chi)chi$/', $path)) { return WT_I18N::translate_c('grandparent’s sister’s grandchild', 'second cousin'); } else { if (preg_match('/^(mot|fat|par)parsib(son|dau|chi)dau$/', $path)) { return WT_I18N::translate_c('grandparent’s sibling’s granddaughter', 'second cousin'); } else { if (preg_match('/^(mot|fat|par)parsib(son|dau|chi)son$/', $path)) { return WT_I18N::translate_c('grandparent’s sibling’s grandson', 'second cousin'); } else { if (preg_match('/^(mot|fat|par)parsib(son|dau|chi)chi$/', $path)) { return WT_I18N::translate_c('grandparent’s sibling’s grandchild', 'second cousin'); } } } } } } } } } } } } } } } } } } } } } } } } } } } // Look for generic/pattern relationships. // TODO: these are heavily based on English relationship names. // We need feedback from other languages to improve this. // Dutch has special names for 8 generations of great-great-..., so these need explicit naming // Spanish has special names for four but also has two different numbering patterns if (preg_match('/^((?:mot|fat|par)+)(bro|sis|sib)$/', $path, $match)) { // siblings of direct ancestors $up = strlen($match[1]) / 3; $bef_last = substr($path, -6, 3); switch ($up) { case 3: switch ($sex2) { case 'M': if ($bef_last == 'fat') { return WT_I18N::translate_c('great-grandfather’s brother', 'great-great-uncle'); } else { if ($bef_last == 'mot') { return WT_I18N::translate_c('great-grandmother’s brother', 'great-great-uncle'); } else { return WT_I18N::translate_c('great-grandparent’s brother', 'great-great-uncle'); } } case 'F': return WT_I18N::translate('great-great-aunt'); case 'U': return WT_I18N::translate('great-great-aunt/uncle'); } break; case 4: switch ($sex2) { case 'M': if ($bef_last == 'fat') { return WT_I18N::translate_c('great-great-grandfather’s brother', 'great-great-great-uncle'); } else { if ($bef_last == 'mot') { return WT_I18N::translate_c('great-great-grandmother’s brother', 'great-great-great-uncle'); } else { return WT_I18N::translate_c('great-great-grandparent’s brother', 'great-great-great-uncle'); } } case 'F': return WT_I18N::translate('great-great-great-aunt'); case 'U': return WT_I18N::translate('great-great-great-aunt/uncle'); } break; case 5: switch ($sex2) { case 'M': if ($bef_last == 'fat') { return WT_I18N::translate_c('great-great-great-grandfather’s brother', 'great ×4 uncle'); } else { if ($bef_last == 'mot') { return WT_I18N::translate_c('great-great-great-grandmother’s brother', 'great ×4 uncle'); } else { return WT_I18N::translate_c('great-great-great-grandparent’s brother', 'great ×4 uncle'); } } case 'F': return WT_I18N::translate('great ×4 aunt'); case 'U': return WT_I18N::translate('great ×4 aunt/uncle'); } break; case 6: switch ($sex2) { case 'M': if ($bef_last == 'fat') { return WT_I18N::translate_c('great ×4 grandfather’s brother', 'great ×5 uncle'); } else { if ($bef_last == 'mot') { return WT_I18N::translate_c('great ×4 grandmother’s brother', 'great ×5 uncle'); } else { return WT_I18N::translate_c('great ×4 grandparent’s brother', 'great ×5 uncle'); } } case 'F': return WT_I18N::translate('great ×5 aunt'); case 'U': return WT_I18N::translate('great ×5 aunt/uncle'); } break; case 7: switch ($sex2) { case 'M': if ($bef_last == 'fat') { return WT_I18N::translate_c('great ×5 grandfather’s brother', 'great ×6 uncle'); } else { if ($bef_last == 'mot') { return WT_I18N::translate_c('great ×5 grandmother’s brother', 'great ×6 uncle'); } else { return WT_I18N::translate_c('great ×5 grandparent’s brother', 'great ×6 uncle'); } } case 'F': return WT_I18N::translate('great ×6 aunt'); case 'U': return WT_I18N::translate('great ×6 aunt/uncle'); } break; case 8: switch ($sex2) { case 'M': if ($bef_last == 'fat') { return WT_I18N::translate_c('great ×6 grandfather’s brother', 'great ×7 uncle'); } else { if ($bef_last == 'mot') { return WT_I18N::translate_c('great ×6 grandmother’s brother', 'great ×7 uncle'); } else { return WT_I18N::translate_c('great ×6 grandparent’s brother', 'great ×7 uncle'); } } case 'F': return WT_I18N::translate('great ×7 aunt'); case 'U': return WT_I18N::translate('great ×7 aunt/uncle'); } break; 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 WT_I18N::translate('great ×%d uncle', $up - 4); case 'F': return WT_I18N::translate('great ×%d aunt', $up - 4); case 'U': return WT_I18N::translate('great ×%d aunt/uncle', $up - 4); } case 'pl': switch ($sex2) { case 'M': if ($bef_last == 'fat') { return WT_I18N::translate_c('great ×(%d-1) grandfather’s brother', 'great ×%d uncle', $up - 2); } else { if ($bef_last == 'mot') { return WT_I18N::translate_c('great ×(%d-1) grandmother’s brother', 'great ×%d uncle', $up - 2); } else { return WT_I18N::translate_c('great ×(%d-1) grandparent’s brother', 'great ×%d uncle', $up - 2); } } case 'F': return WT_I18N::translate('great ×%d aunt', $up - 2); case 'U': return WT_I18N::translate('great ×%d aunt/uncle', $up - 2); } case 'it': // Source: Michele Locati // Source: Michele Locati case 'en_AU': case 'en_GB': case 'en_US': default: switch ($sex2) { case 'M': // I18N: if you need a different number for %d, contact the developers, as a code-change is required return WT_I18N::translate('great ×%d uncle', $up - 1); case 'F': return WT_I18N::translate('great ×%d aunt', $up - 1); case 'U': return WT_I18N::translate('great ×%d aunt/uncle', $up - 1); } } } } if (preg_match('/^(?:bro|sis|sib)((?:son|dau|chi)+)$/', $path, $match)) { // direct descendants of siblings $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 WT_I18N::translate_c('(a man’s) brother’s great-grandson', 'great-great-nephew'); } else { if ($first == 'sis' && $sex1 == 'M') { return WT_I18N::translate_c('(a man’s) sister’s great-grandson', 'great-great-nephew'); } else { return WT_I18N::translate_c('(a woman’s) great-great-nephew', 'great-great-nephew'); } } case 'F': if ($first == 'bro' && $sex1 == 'M') { return WT_I18N::translate_c('(a man’s) brother’s great-granddaughter', 'great-great-niece'); } else { if ($first == 'sis' && $sex1 == 'M') { return WT_I18N::translate_c('(a man’s) sister’s great-granddaughter', 'great-great-niece'); } else { return WT_I18N::translate_c('(a woman’s) great-great-niece', 'great-great-niece'); } } case 'U': if ($first == 'bro' && $sex1 == 'M') { return WT_I18N::translate_c('(a man’s) brother’s great-grandchild', 'great-great-nephew/niece'); } else { if ($first == 'sis' && $sex1 == 'M') { return WT_I18N::translate_c('(a man’s) sister’s great-grandchild', 'great-great-nephew/niece'); } else { return WT_I18N::translate_c('(a woman’s) great-great-nephew/niece', 'great-great-nephew/niece'); } } } case 5: switch ($sex2) { case 'M': if ($first == 'bro' && $sex1 == 'M') { return WT_I18N::translate_c('(a man’s) brother’s great-great-grandson', 'great-great-great-nephew'); } else { if ($first == 'sis' && $sex1 == 'M') { return WT_I18N::translate_c('(a man’s) sister’s great-great-grandson', 'great-great-great-nephew'); } else { return WT_I18N::translate_c('(a woman’s) great-great-great-nephew', 'great-great-great-nephew'); } } case 'F': if ($first == 'bro' && $sex1 == 'M') { return WT_I18N::translate_c('(a man’s) brother’s great-great-granddaughter', 'great-great-great-niece'); } else { if ($first == 'sis' && $sex1 == 'M') { return WT_I18N::translate_c('(a man’s) sister’s great-great-granddaughter', 'great-great-great-niece'); } else { return WT_I18N::translate_c('(a woman’s) great-great-great-niece', 'great-great-great-niece'); } } case 'U': if ($first == 'bro' && $sex1 == 'M') { return WT_I18N::translate_c('(a man’s) brother’s great-great-grandchild', 'great-great-great-nephew/niece'); } else { if ($first == 'sis' && $sex1 == 'M') { return WT_I18N::translate_c('(a man’s) sister’s great-great-grandchild', 'great-great-great-nephew/niece'); } else { return WT_I18N::translate_c('(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 WT_I18N::translate_c('(a man’s) brother’s great-great-great-grandson', 'great ×4 nephew'); } else { if ($first == 'sis' && $sex1 == 'M') { return WT_I18N::translate_c('(a man’s) sister’s great-great-great-grandson', 'great ×4 nephew'); } else { return WT_I18N::translate_c('(a woman’s) great ×4 nephew', 'great ×4 nephew'); } } case 'F': if ($first == 'bro' && $sex1 == 'M') { return WT_I18N::translate_c('(a man’s) brother’s great-great-great-granddaughter', 'great ×4 niece'); } else { if ($first == 'sis' && $sex1 == 'M') { return WT_I18N::translate_c('(a man’s) sister’s great-great-great-granddaughter', 'great ×4 niece'); } else { return WT_I18N::translate_c('(a woman’s) great ×4 niece', 'great ×4 niece'); } } case 'U': if ($first == 'bro' && $sex1 == 'M') { return WT_I18N::translate_c('(a man’s) brother’s great-great-great-grandchild', 'great ×4 nephew/niece'); } else { if ($first == 'sis' && $sex1 == 'M') { return WT_I18N::translate_c('(a man’s) sister’s great-great-great-grandchild', 'great ×4 nephew/niece'); } else { return WT_I18N::translate_c('(a woman’s) great ×4 nephew/niece', 'great ×4 nephew/niece'); } } } case 7: switch ($sex2) { case 'M': if ($first == 'bro' && $sex1 == 'M') { return WT_I18N::translate_c('(a man’s) brother’s great ×4 grandson', 'great ×5 nephew'); } else { if ($first == 'sis' && $sex1 == 'M') { return WT_I18N::translate_c('(a man’s) sister’s great ×4 grandson', 'great ×5 nephew'); } else { return WT_I18N::translate_c('(a woman’s) great ×5 nephew', 'great ×5 nephew'); } } case 'F': if ($first == 'bro' && $sex1 == 'M') { return WT_I18N::translate_c('(a man’s) brother’s great ×4 granddaughter', 'great ×5 niece'); } else { if ($first == 'sis' && $sex1 == 'M') { return WT_I18N::translate_c('(a man’s) sister’s great ×4 granddaughter', 'great ×5 niece'); } else { return WT_I18N::translate_c('(a woman’s) great ×5 niece', 'great ×5 niece'); } } case 'U': if ($first == 'bro' && $sex1 == 'M') { return WT_I18N::translate_c('(a man’s) brother’s great ×4 grandchild', 'great ×5 nephew/niece'); } else { if ($first == 'sis' && $sex1 == 'M') { return WT_I18N::translate_c('(a man’s) sister’s great ×4 grandchild', 'great ×5 nephew/niece'); } else { return WT_I18N::translate_c('(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 WT_I18N::translate_c('(a man’s) brother’s great ×(%d-1) grandson', 'great ×%d nephew', $down - 3); } else { if ($first == 'sis' && $sex1 == 'M') { return WT_I18N::translate_c('(a man’s) sister’s great ×(%d-1) grandson', 'great ×%d nephew', $down - 3); } else { return WT_I18N::translate_c('(a woman’s) great ×%d nephew', 'great ×%d nephew', $down - 3); } } case 'F': if ($first == 'bro' && $sex1 == 'M') { return WT_I18N::translate_c('(a man’s) brother’s great ×(%d-1) granddaughter', 'great ×%d niece', $down - 3); } else { if ($first == 'sis' && $sex1 == 'M') { return WT_I18N::translate_c('(a man’s) sister’s great ×(%d-1) granddaughter', 'great ×%d niece', $down - 3); } else { return WT_I18N::translate_c('(a woman’s) great ×%d niece', 'great ×%d niece', $down - 3); } } case 'U': if ($first == 'bro' && $sex1 == 'M') { return WT_I18N::translate_c('(a man’s) brother’s great ×(%d-1) grandchild', 'great ×%d nephew/niece', $down - 3); } else { if ($first == 'sis' && $sex1 == 'M') { return WT_I18N::translate_c('(a man’s) sister’s great ×(%d-1) grandchild', 'great ×%d nephew/niece', $down - 3); } else { return WT_I18N::translate_c('(a woman’s) great ×%d nephew/niece', 'great ×%d nephew/niece', $down - 3); } } } case 'he': // Source: Meliza Amity switch ($sex2) { case 'M': return WT_I18N::translate('great ×%d nephew', $down - 1); case 'F': return WT_I18N::translate('great ×%d niece', $down - 1); case 'U': return WT_I18N::translate('great ×%d nephew/niece', $down - 1); } case 'it': // Source: Michele Locati. // Source: Michele Locati. case 'en_AU': case 'en_GB': case 'en_US': default: switch ($sex2) { case 'M': // I18N: if you need a different number for %d, contact the developers, as a code-change is required return WT_I18N::translate('great ×%d nephew', $down - 2); case 'F': return WT_I18N::translate('great ×%d niece', $down - 2); case 'U': return WT_I18N::translate('great ×%d nephew/niece', $down - 2); } } } } if (preg_match('/^((?:mot|fat|par)*)$/', $path, $match)) { // direct ancestors $up = strlen($match[1]) / 3; switch ($up) { case 4: switch ($sex2) { case 'M': return WT_I18N::translate('great-great-grandfather'); case 'F': return WT_I18N::translate('great-great-grandmother'); case 'U': return WT_I18N::translate('great-great-grandparent'); } break; case 5: switch ($sex2) { case 'M': return WT_I18N::translate('great-great-great-grandfather'); case 'F': return WT_I18N::translate('great-great-great-grandmother'); case 'U': return WT_I18N::translate('great-great-great-grandparent'); } break; case 6: switch ($sex2) { case 'M': return WT_I18N::translate('great ×4 grandfather'); case 'F': return WT_I18N::translate('great ×4 grandmother'); case 'U': return WT_I18N::translate('great ×4 grandparent'); } break; case 7: switch ($sex2) { case 'M': return WT_I18N::translate('great ×5 grandfather'); case 'F': return WT_I18N::translate('great ×5 grandmother'); case 'U': return WT_I18N::translate('great ×5 grandparent'); } break; case 8: switch ($sex2) { case 'M': return WT_I18N::translate('great ×6 grandfather'); case 'F': return WT_I18N::translate('great ×6 grandmother'); case 'U': return WT_I18N::translate('great ×6 grandparent'); } break; case 9: switch ($sex2) { case 'M': return WT_I18N::translate('great ×7 grandfather'); case 'F': return WT_I18N::translate('great ×7 grandmother'); case 'U': return WT_I18N::translate('great ×7 grandparent'); } break; 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 WT_I18N::translate('great ×%d grandfather', $up - 3); case 'F': return WT_I18N::translate('great ×%d grandmother', $up - 3); case 'U': return WT_I18N::translate('great ×%d grandparent', $up - 3); } case 'it': // Source: Michele Locati // Source: Michele Locati case 'es': // Source: Wes Groleau switch ($sex2) { case 'M': return WT_I18N::translate('great ×%d grandfather', $up); case 'F': return WT_I18N::translate('great ×%d grandmother', $up); case 'U': return WT_I18N::translate('great ×%d grandparent', $up); } case 'fr': // Source: Jacqueline Tetreault // Source: Jacqueline Tetreault case 'fr_CA': switch ($sex2) { case 'M': return WT_I18N::translate('great ×%d grandfather', $up - 1); case 'F': return WT_I18N::translate('great ×%d grandmother', $up - 1); case 'U': return WT_I18N::translate('great ×%d grandparent', $up - 1); } case 'nn': // Source: Hogne Røed Nilsen (https://bugs.launchpad.net/webtrees/+bug/1168553) // 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 %d, contact the developers, as a code-change is required return WT_I18N::translate('great ×%d grandfather', $up - 3); case 'F': return WT_I18N::translate('great ×%d grandmother', $up - 3); case 'U': return WT_I18N::translate('great ×%d grandparent', $up - 3); } case 'en_AU': case 'en_GB': case 'en_US': default: switch ($sex2) { case 'M': // I18N: if you need a different number for %d, contact the developers, as a code-change is required return WT_I18N::translate('great ×%d grandfather', $up - 2); case 'F': return WT_I18N::translate('great ×%d grandmother', $up - 2); case 'U': return WT_I18N::translate('great ×%d grandparent', $up - 2); } } } } if (preg_match('/^((?:son|dau|chi)*)$/', $path, $match)) { // direct descendants $up = strlen($match[1]) / 3; switch ($up) { case 4: switch ($sex2) { case 'son': return WT_I18N::translate('great-great-grandson'); case 'dau': return WT_I18N::translate('great-great-granddaughter'); case 'chi': return WT_I18N::translate('great-great-grandchild'); } break; case 5: switch ($sex2) { case 'M': return WT_I18N::translate('great-great-great-grandson'); case 'F': return WT_I18N::translate('great-great-great-granddaughter'); case 'U': return WT_I18N::translate('great-great-great-grandchild'); } break; case 6: switch ($sex2) { case 'M': return WT_I18N::translate('great ×4 grandson'); case 'F': return WT_I18N::translate('great ×4 granddaughter'); case 'U': return WT_I18N::translate('great ×4 grandchild'); } break; case 7: switch ($sex2) { case 'M': return WT_I18N::translate('great ×5 grandson'); case 'F': return WT_I18N::translate('great ×5 granddaughter'); case 'U': return WT_I18N::translate('great ×5 grandchild'); } break; case 8: switch ($sex2) { case 'M': return WT_I18N::translate('great ×6 grandson'); case 'F': return WT_I18N::translate('great ×6 granddaughter'); case 'U': return WT_I18N::translate('great ×6 grandchild'); } break; case 9: switch ($sex2) { case 'M': return WT_I18N::translate('great ×7 grandson'); case 'F': return WT_I18N::translate('great ×7 granddaughter'); case 'U': return WT_I18N::translate('great ×7 grandchild'); } break; 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 // Source: Hogne Røed Nilsen case 'nb': case 'da': // Source: Patrick Sorensen switch ($sex2) { case 'M': return WT_I18N::translate('great ×%d grandson', $up - 3); case 'F': return WT_I18N::translate('great ×%d granddaughter', $up - 3); case 'U': return WT_I18N::translate('great ×%d grandchild', $up - 3); } case 'it': // Source: Michele Locati // Source: Michele Locati case 'es': // Source: Wes Groleau (adding doesn’t change behavior, but needs to be better researched) // Source: Wes Groleau (adding doesn’t change behavior, but needs to be better researched) case 'en_AU': case 'en_GB': case 'en_US': default: switch ($sex2) { case 'M': // I18N: if you need a different number for %d, contact the developers, as a code-change is required return WT_I18N::translate('great ×%d grandson', $up - 2); case 'F': return WT_I18N::translate('great ×%d granddaughter', $up - 2); case 'U': return WT_I18N::translate('great ×%d grandchild', $up - 2); } } } } if (preg_match('/^((?:mot|fat|par)+)(?:bro|sis|sib)((?:son|dau|chi)+)$/', $path, $match)) { // cousins in English $ascent = $match[1]; $descent = $match[2]; $up = strlen($ascent) / 3; $down = strlen($descent) / 3; $cousin = min($up, $down); // Moved out of switch (en/default case) so that $removed = abs($down - $up); // Spanish (and other languages) can use it, too. // Different languages have different rules for naming cousins. For example, // an English “second cousin once removed” is a Polish “cousin of 7th degree”. // // Need to find out which languages use which rules. switch (WT_LOCALE) { case 'pl': // Source: Lukasz Wilenski return cousin_name($up + $down + 2, $sex2); case 'it': // Source: Michele Locati. See italian_cousins_names.zip // http://webtrees.net/forums/8-translation/1200-great-xn-grandparent?limit=6&start=6 return cousin_name($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 cousin_name($cousin, $sex2); } elseif ($down < $up) { return cousin_name2($cousin + 1, $sex2, get_relationship_name_from_path('sib' . $descent, null, null)); } else { switch ($sex2) { case 'M': return cousin_name2($cousin + 1, $sex2, get_relationship_name_from_path('bro' . $descent, null, null)); case 'F': return cousin_name2($cousin + 1, $sex2, get_relationship_name_from_path('sis' . $descent, null, null)); case 'U': return cousin_name2($cousin + 1, $sex2, get_relationship_name_from_path('sib' . $descent, null, null)); } } case 'en_AU': // See: http://en.wikipedia.org/wiki/File:CousinTree.svg // See: http://en.wikipedia.org/wiki/File:CousinTree.svg case 'en_GB': case 'en_US': default: switch ($removed) { case 0: return cousin_name($cousin, $sex2); case 1: if ($up > $down) { /* I18N: %s=“fifth cousin”, etc. http://www.ancestry.com/learn/library/article.aspx?article=2856 */ return WT_I18N::translate('%s once removed ascending', cousin_name($cousin, $sex2)); } else { /* I18N: %s=“fifth cousin”, etc. http://www.ancestry.com/learn/library/article.aspx?article=2856 */ return WT_I18N::translate('%s once removed descending', cousin_name($cousin, $sex2)); } case 2: if ($up > $down) { /* I18N: %s=“fifth cousin”, etc. */ return WT_I18N::translate('%s twice removed ascending', cousin_name($cousin, $sex2)); } else { /* I18N: %s=“fifth cousin”, etc. */ return WT_I18N::translate('%s twice removed descending', cousin_name($cousin, $sex2)); } case 3: if ($up > $down) { /* I18N: %s=“fifth cousin”, etc. */ return WT_I18N::translate('%s three times removed ascending', cousin_name($cousin, $sex2)); } else { /* I18N: %s=“fifth cousin”, etc. */ return WT_I18N::translate('%s three times removed descending', cousin_name($cousin, $sex2)); } default: if ($up > $down) { /* I18N: %1$s=“fifth cousin”, etc., %2$d>=4 */ return WT_I18N::translate('%1$s %2$d times removed ascending', cousin_name($cousin, $sex2), $removed); } else { /* I18N: %1$s=“fifth cousin”, etc., %2$d>=4 */ return WT_I18N::translate('%1$s %2$d times removed descending', cousin_name($cousin, $sex2), $removed); } } } } // Split the relationship into sub-relationships, e.g., third-cousin’s great-uncle. // Try splitting at every point, and choose the path with the shorted translated name. $relationship = null; $path1 = substr($path, 0, 3); $path2 = substr($path, 3); while ($path2) { $tmp = WT_I18N::translate('%1$s’s %2$s', get_relationship_name_from_path($path1, null, null), get_relationship_name_from_path($path2, null, null)); if (!$relationship || strlen($tmp) < strlen($relationship)) { $relationship = $tmp; } $path1 .= substr($path2, 0, 3); $path2 = substr($path2, 3); } return $relationship; }