102086832SGreg Roach<?php 23976b470SGreg Roach 302086832SGreg Roach/** 402086832SGreg Roach * webtrees: online genealogy 5*d11be702SGreg Roach * Copyright (C) 2023 webtrees development team 602086832SGreg Roach * This program is free software: you can redistribute it and/or modify 702086832SGreg Roach * it under the terms of the GNU General Public License as published by 802086832SGreg Roach * the Free Software Foundation, either version 3 of the License, or 902086832SGreg Roach * (at your option) any later version. 1002086832SGreg Roach * This program is distributed in the hope that it will be useful, 1102086832SGreg Roach * but WITHOUT ANY WARRANTY; without even the implied warranty of 1202086832SGreg Roach * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 1302086832SGreg Roach * GNU General Public License for more details. 1402086832SGreg Roach * You should have received a copy of the GNU General Public License 1589f7189bSGreg Roach * along with this program. If not, see <https://www.gnu.org/licenses/>. 1602086832SGreg Roach */ 17fcfa147eSGreg Roach 1802086832SGreg Roachdeclare(strict_types=1); 1902086832SGreg Roach 2002086832SGreg Roachnamespace Fisharebest\Webtrees\Module; 2102086832SGreg Roach 2202086832SGreg Roachuse Fisharebest\Localization\Locale\LocaleFr; 2302086832SGreg Roachuse Fisharebest\Localization\Locale\LocaleInterface; 24d8a5ab6eSJonathan Jaubartuse Fisharebest\Webtrees\Relationship; 2502086832SGreg Roach 2602086832SGreg Roach/** 2702086832SGreg Roach * Class LanguageFrench. 2802086832SGreg Roach */ 2902086832SGreg Roachclass LanguageFrench extends AbstractModule implements ModuleLanguageInterface 3002086832SGreg Roach{ 3102086832SGreg Roach use ModuleLanguageTrait; 3202086832SGreg Roach 33d8a5ab6eSJonathan Jaubart protected const SYMMETRIC_COUSINS = [ 34d8a5ab6eSJonathan Jaubart 1 => [ 3596c67f5bSJonathan Jaubart 'F' => ['cousine germaine', '%s de la cousine germaine'], 3696c67f5bSJonathan Jaubart 'M' => ['cousin germain', '%s du cousin germain'], 37d8a5ab6eSJonathan Jaubart 'U' => ['cousin germain', '%s du cousin germain'] 38d8a5ab6eSJonathan Jaubart ], 39d8a5ab6eSJonathan Jaubart 2 => [ 4096c67f5bSJonathan Jaubart 'F' => ['cousine issue de germain', '%s de la cousine issue de germain'], 4196c67f5bSJonathan Jaubart 'M' => ['cousin issu de germain', '%s du cousin issu de germain'], 42d8a5ab6eSJonathan Jaubart 'U' => ['cousin issu de germain', '%s du cousin issu de germain'] 43d8a5ab6eSJonathan Jaubart ] 44d8a5ab6eSJonathan Jaubart ]; 45d8a5ab6eSJonathan Jaubart 46d8a5ab6eSJonathan Jaubart protected const ASYMMETRIC_COUSINS = [ 47d8a5ab6eSJonathan Jaubart 1 => [ 483d9e70a5SJonathan Jaubart 'F' => ['down', 'petite-cousine', 'de la '], 493d9e70a5SJonathan Jaubart 'M' => ['down', 'petit-cousin', 'du '], 503d9e70a5SJonathan Jaubart 'U' => ['down', 'petit-cousin', 'du '] 51d8a5ab6eSJonathan Jaubart ], 52d8a5ab6eSJonathan Jaubart -1 => [ 533d9e70a5SJonathan Jaubart 'F' => ['up', 'grand-cousine', 'de la '], 543d9e70a5SJonathan Jaubart 'M' => ['up', 'grand-cousin', 'du '], 553d9e70a5SJonathan Jaubart 'U' => ['up', 'grand-cousin', 'du '] 56d8a5ab6eSJonathan Jaubart ], 57d8a5ab6eSJonathan Jaubart ]; 58d8a5ab6eSJonathan Jaubart 5902086832SGreg Roach /** 6002086832SGreg Roach * @return LocaleInterface 6102086832SGreg Roach */ 6202086832SGreg Roach public function locale(): LocaleInterface 6302086832SGreg Roach { 6402086832SGreg Roach return new LocaleFr(); 6502086832SGreg Roach } 66d8a5ab6eSJonathan Jaubart 671abf1c4fSGreg Roach /** 681abf1c4fSGreg Roach * Pour les traducteurs français, certaines configurations peuvent avoir plusieurs traduction françaises possibles, 693d9e70a5SJonathan Jaubart * ou aucune. Voici les choix qui ont été faits (mais complètement ouverts à discussion): 701abf1c4fSGreg Roach * 711abf1c4fSGreg Roach * - je n'ai aucune intention de rentrer dans le débat de l'écriture inclusive, mais malheureusement un choix doit 721abf1c4fSGreg Roach * être fait: lorsque nécessaire dans les choix des articles ou accords, je m'en suis tenu à la recommandation de 731abf1c4fSGreg Roach * l'Académie Française d'utiliser la forme non marquée (et donc le masculin) pour le genre neutre. 743d9e70a5SJonathan Jaubart * - dans le cas de frères/sœurs jumeaux, j'évite le problème en utiliseant le substantif `jumeau` lorsque le sexe 751abf1c4fSGreg Roach * n'est pas connu, alors que j'utilise la structure `frère jumeau`/`sœur jumelle` lorsque le sexe est connu. 761abf1c4fSGreg Roach * - `conjoint` a été choisi pour un couple non marié (`époux`/`épouse` lorsque les conjoints sont mariés). 771abf1c4fSGreg Roach * Une alternative est `partenaire`, mais `conjoint` est le terme déjà utilisé dans les traductions françaises. 781abf1c4fSGreg Roach * - la notion de `foster` (qui peut traduire plusieurs réalités différentes en français) a été traduite dans le 791abf1c4fSGreg Roach * cadre de la `famille d'accueil`. Les suggestions sont les bienvenues. 803d9e70a5SJonathan Jaubart * - La situation des enfants dans les familles recomposées a été traduite: 811abf1c4fSGreg Roach * - `frère`/`sœur` pour les enfants dont les deux parents sont les mêmes 821abf1c4fSGreg Roach * - `demi-frère`/`demi-sœur` pour les enfants qui ont un parent en commun 831abf1c4fSGreg Roach * - `quasi-frère`/`quasi-sœur` pour les enfants qui ne partagent aucun parent en commun, mais dont les parents 841abf1c4fSGreg Roach * sont en couple 853d9e70a5SJonathan Jaubart * - la notion d'âge entre frères/sœurs a été traduite par `grand frère`/`petit frère`, plutôt que des variantes sur 861abf1c4fSGreg Roach * `frère aîné`/`frère cadet` ou `frère plus âgé`/`frère plus jeune` 873d9e70a5SJonathan Jaubart * - Lorsqu'il est nécessaire d'aller au-delà d'un `arrière-`{substantif} (par exemple, pour décrire le case de 883d9e70a5SJonathan Jaubart * l'enfant d'un arrière-petit-enfant), la forme `{substantif} au Ne degré` est choisie, avec pour convention 893d9e70a5SJonathan Jaubart * N = 1 pour le niveau du substantif racine, on utilisera donc par exemple: 903d9e70a5SJonathan Jaubart * - `petit-enfant` (= petit-enfant au 1er degré) 913d9e70a5SJonathan Jaubart * - `arrière-petit-enfant` (= petit-enfant au 2e degré) 923d9e70a5SJonathan Jaubart * - `petit-enfant au 3e degré` et ainsi de suite pour les degrés supérieurs 933d9e70a5SJonathan Jaubart * - Un exception à la règle précédente sont les grand-parents au 3e degré, qui ont la description de `trisaïeux`. 941abf1c4fSGreg Roach * - Pour les cousins, c'est la description selon le droit canon qui a été choisie (principalement car elle donne 951abf1c4fSGreg Roach * une meilleure visibilité de la distance à l'ancêtre commun que la description en droit civil), donc: 961abf1c4fSGreg Roach * - l'enfant d'un oncle/tante est un `cousin germain`/`cousine germaine` (= cousins au 1er degré) 971abf1c4fSGreg Roach * - les enfants de cousins germains sont des `cousins issus de germain` (= cousins au 2e degré) 983d9e70a5SJonathan Jaubart * - pour les enfants des cousins issus de germains, et ainsi de suite, la relation est décrite suivant le 993d9e70a5SJonathan Jaubart * nombre de degré séparant les cousins de l'ancêtre commun: 1001abf1c4fSGreg Roach * - en cas de symétrie des chemins, ils sont dits `cousins au N-ème degré` 1011abf1c4fSGreg Roach * - en cas d'asymétrie des chemins, ils sont dit `cousins du N-ème au M-ème degré` 1021abf1c4fSGreg Roach * - de plus, les notions de `grand-cousin` et `petit-cousin` ont été implémentées comme suit: 1033d9e70a5SJonathan Jaubart * - un `(arrière-)grand-cousin` est l'enfant d'un `(arrière-)grand-oncle`/`grand-tante` 1043d9e70a5SJonathan Jaubart * (= cousin du 1er au N-ème degré) 1053d9e70a5SJonathan Jaubart * - un `(arrière-)petit-cousin` est un `(arrière-)petit-neveu`/`petite-nièce` d'un parent 1063d9e70a5SJonathan Jaubart * (= cousin du Ner au 1er degré) 1071abf1c4fSGreg Roach * 108696d9d5cSGreg Roach * @return array<Relationship> 1092c927a63SGreg Roach */ 1102c927a63SGreg Roach public function relationships(): array 111d8a5ab6eSJonathan Jaubart { 1123d9e70a5SJonathan Jaubart // Construct the genitive form in French 11305babb96SGreg Roach $genitive = static fn (string $s, string $genitive_link): array => [$s, '%s ' . $genitive_link . $s]; 114d8a5ab6eSJonathan Jaubart 1153d9e70a5SJonathan Jaubart // Functions to coumpound the name that can be indefinitely repeated 11605babb96SGreg Roach $degree = static fn (int $n, string $suffix, string $genitive_link): array => 117b6ac34efSGreg Roach $genitive($suffix . ' au ' . $n . '<sup>e</sup> degré', $genitive_link); 118d8a5ab6eSJonathan Jaubart 11905babb96SGreg Roach $great = static fn (int $n, string $suffix, string $genitive_link): array => 1203d9e70a5SJonathan Jaubart $n <= 1 ? $genitive('arrière-' . $suffix, 'de l’') : $degree($n + 1, $suffix, $genitive_link); 1213d9e70a5SJonathan Jaubart 12205babb96SGreg Roach $firstCompound = static fn (int $n, string $suffix, string $genitive_link): array => 1233d9e70a5SJonathan Jaubart $n <= 1 ? $genitive($suffix, $genitive_link) : $great($n - 1, $suffix, $genitive_link); 1243d9e70a5SJonathan Jaubart 1253d9e70a5SJonathan Jaubart $compound = 12605babb96SGreg Roach static fn (int $n, string $first_level, string $suffix, string $genitive_none, string $genitive_first): array => 1273d9e70a5SJonathan Jaubart $n <= 1 ? $genitive($suffix, $genitive_none) : $firstCompound($n - 1, $first_level . $suffix, $genitive_first); 128d8a5ab6eSJonathan Jaubart 1293d9e70a5SJonathan Jaubart // Functions to translate cousins' degree of relationship 13005babb96SGreg Roach $symmetricCousin = static fn (int $n, string $sex): array => self::SYMMETRIC_COUSINS[$n][$sex] ?? $genitive( 131d8a5ab6eSJonathan Jaubart $sex === 'F' ? 'cousine au ' . $n . '<sup>e</sup> degré' : 'cousin au ' . $n . '<sup>e</sup> degré', 132d8a5ab6eSJonathan Jaubart $sex === 'F' ? 'de la ' : 'du ' 133d8a5ab6eSJonathan Jaubart ); 134d8a5ab6eSJonathan Jaubart 1353d9e70a5SJonathan Jaubart $cousin = 1363d9e70a5SJonathan Jaubart static function (int $up, int $down, string $sex) use ($symmetricCousin, $firstCompound, $genitive): array { 137d8a5ab6eSJonathan Jaubart if ($up === $down) { 138d8a5ab6eSJonathan Jaubart return $symmetricCousin($up, $sex); 139d8a5ab6eSJonathan Jaubart } 140d8a5ab6eSJonathan Jaubart $fixed = self::ASYMMETRIC_COUSINS[$up][$sex] ?? self::ASYMMETRIC_COUSINS[-$down][$sex] ?? null; 141d8a5ab6eSJonathan Jaubart if ($fixed !== null) { 142d8a5ab6eSJonathan Jaubart $fixed[0] = $fixed[0] === 'up' ? $up - 1 : $down - 1; 1433d9e70a5SJonathan Jaubart return $firstCompound(...$fixed); 144d8a5ab6eSJonathan Jaubart } 145d8a5ab6eSJonathan Jaubart return $genitive( 146d8a5ab6eSJonathan Jaubart $sex === 'F' ? 147d8a5ab6eSJonathan Jaubart 'cousine du ' . $down . '<sup>e</sup> au ' . $up . '<sup>e</sup> degré' : 148d8a5ab6eSJonathan Jaubart 'cousin du ' . $down . '<sup>e</sup> au ' . $up . '<sup>e</sup> degré', 149d8a5ab6eSJonathan Jaubart $sex === 'F' ? 'de la ' : 'du ' 150d8a5ab6eSJonathan Jaubart ); 151d8a5ab6eSJonathan Jaubart }; 152d8a5ab6eSJonathan Jaubart 153d8a5ab6eSJonathan Jaubart return [ 154d8a5ab6eSJonathan Jaubart // Adopted 155d8a5ab6eSJonathan Jaubart Relationship::fixed('mère adoptive', '%s de la mère adoptive')->adoptive()->mother(), 156d8a5ab6eSJonathan Jaubart Relationship::fixed('père adoptif', '%s du père adoptif')->adoptive()->father(), 157d8a5ab6eSJonathan Jaubart Relationship::fixed('parent adoptif', '%s du parent adoptif')->adoptive()->parent(), 1583d9e70a5SJonathan Jaubart Relationship::fixed('sœur adoptive', '%s de la sœur adoptive')->adoptive()->sister(), 1593d9e70a5SJonathan Jaubart Relationship::fixed('frère adoptif', '%s du frère adoptif')->adoptive()->brother(), 1603d9e70a5SJonathan Jaubart Relationship::fixed('frère/sœur adoptif', '%s du frère/sœur adoptif')->adoptive()->sibling(), 161d8a5ab6eSJonathan Jaubart Relationship::fixed('fille adoptive', '%s de la fille adoptive')->adopted()->daughter(), 162d8a5ab6eSJonathan Jaubart Relationship::fixed('fils adoptif', '%s du fils adoptif')->adopted()->son(), 163d8a5ab6eSJonathan Jaubart Relationship::fixed('enfant adoptif', '%s de l’enfant adoptif')->adopted()->child(), 1643d9e70a5SJonathan Jaubart Relationship::fixed('sœur adoptive', '%s de la sœur adoptive')->adopted()->sister(), 1653d9e70a5SJonathan Jaubart Relationship::fixed('frère adoptif', '%s du frère adoptif')->adopted()->brother(), 1663d9e70a5SJonathan Jaubart Relationship::fixed('frère/sœur adoptif', '%s du frère/sœur adoptif')->adopted()->sibling(), 167d8a5ab6eSJonathan Jaubart // Fostered 168d8a5ab6eSJonathan Jaubart Relationship::fixed('mère d’accueil', '%s de la mère d’acceuil')->fostering()->mother(), 169d8a5ab6eSJonathan Jaubart Relationship::fixed('père d’accueil', '%s du père d’acceuil')->fostering()->father(), 170d8a5ab6eSJonathan Jaubart Relationship::fixed('parent d’accueil', '%s du parent d’acceuil')->fostering()->parent(), 1713d9e70a5SJonathan Jaubart Relationship::fixed('sœur d’accueil', '%s de la sœur d’accueil')->fostering()->sister(), 1723d9e70a5SJonathan Jaubart Relationship::fixed('frère d’accueil', '%s du frère d’accueil')->fostering()->brother(), 1733d9e70a5SJonathan Jaubart Relationship::fixed('frère/sœur d’accueil', '%s du frère/sœur d’accueil')->fostering()->sibling(), 174d8a5ab6eSJonathan Jaubart Relationship::fixed('fille accueillie', '%s de la fille accueillie')->fostered()->daughter(), 175d8a5ab6eSJonathan Jaubart Relationship::fixed('fils accueilli', '%s du fils accueilli')->fostered()->son(), 176d8a5ab6eSJonathan Jaubart Relationship::fixed('enfant accueilli', '%s de l’enfant accueilli')->fostered()->child(), 1773d9e70a5SJonathan Jaubart Relationship::fixed('sœur accueillie', '%s de la sœur accueillie')->fostered()->sister(), 1783d9e70a5SJonathan Jaubart Relationship::fixed('frère accueilli', '%s du frère accueilli')->fostered()->brother(), 1793d9e70a5SJonathan Jaubart Relationship::fixed('frère/sœur accueilli', '%s du frère/sœur accueilli')->fostered()->sibling(), 180d8a5ab6eSJonathan Jaubart // Parents 181d8a5ab6eSJonathan Jaubart Relationship::fixed('mère', '%s de la mère')->mother(), 182d8a5ab6eSJonathan Jaubart Relationship::fixed('père', '%s du père')->father(), 183d8a5ab6eSJonathan Jaubart Relationship::fixed('parent', '%s du parent')->parent(), 184d8a5ab6eSJonathan Jaubart // Children 185d8a5ab6eSJonathan Jaubart Relationship::fixed('fille', '%s de la fille')->daughter(), 186d8a5ab6eSJonathan Jaubart Relationship::fixed('fils', '%s du fils')->son(), 187d8a5ab6eSJonathan Jaubart Relationship::fixed('enfant', '%s de l’enfant')->child(), 188d8a5ab6eSJonathan Jaubart // Siblings 189d8a5ab6eSJonathan Jaubart Relationship::fixed('sœur jumelle', '%s de la sœur jumelle')->twin()->sister(), 190d8a5ab6eSJonathan Jaubart Relationship::fixed('frère jumeau', '%s du frère jumeau')->twin()->brother(), 191d8a5ab6eSJonathan Jaubart Relationship::fixed('jumeau', '%s du jumeau')->twin()->sibling(), 192d8a5ab6eSJonathan Jaubart Relationship::fixed('grande sœur', '%s de la grande sœur')->older()->sister(), 193d8a5ab6eSJonathan Jaubart Relationship::fixed('grand frère', '%s du grand frère')->older()->brother(), 194d8a5ab6eSJonathan Jaubart Relationship::fixed('grand frère/sœur', '%s du grand frère/sœur')->older()->sibling(), 195d8a5ab6eSJonathan Jaubart Relationship::fixed('petite sœur', '%s de la petite sœur')->younger()->sister(), 196d8a5ab6eSJonathan Jaubart Relationship::fixed('petit frère', '%s du petit-frère')->younger()->brother(), 197d8a5ab6eSJonathan Jaubart Relationship::fixed('petit frère/sœur', '%s du petit frère/sœur')->younger()->sibling(), 198d8a5ab6eSJonathan Jaubart Relationship::fixed('sœur', '%s de la sœur')->sister(), 199d8a5ab6eSJonathan Jaubart Relationship::fixed('frère', '%s du frère')->brother(), 200d8a5ab6eSJonathan Jaubart Relationship::fixed('frère/sœur', '%s du frère/sœur')->sibling(), 201d8a5ab6eSJonathan Jaubart // Half-family 202d8a5ab6eSJonathan Jaubart Relationship::fixed('demi-sœur', '%s de la demi-sœur')->parent()->daughter(), 203d8a5ab6eSJonathan Jaubart Relationship::fixed('demi-frère', '%s du demi-frère')->parent()->son(), 204d8a5ab6eSJonathan Jaubart Relationship::fixed('demi-frère/sœur', '%s du demi-frère/sœur')->parent()->child(), 205d8a5ab6eSJonathan Jaubart // Stepfamily 206d8a5ab6eSJonathan Jaubart Relationship::fixed('belle-mère', '%s de la belle-mère')->parent()->wife(), 207d8a5ab6eSJonathan Jaubart Relationship::fixed('beau-père', '%s du beau-père')->parent()->husband(), 208d8a5ab6eSJonathan Jaubart Relationship::fixed('beau-parent', '%s du beau-parent')->parent()->married()->spouse(), 209d8a5ab6eSJonathan Jaubart Relationship::fixed('belle-fille', '%s de la belle-fille')->married()->spouse()->daughter(), 210d8a5ab6eSJonathan Jaubart Relationship::fixed('beau-fils', '%s du beau-fils')->married()->spouse()->son(), 211d8a5ab6eSJonathan Jaubart Relationship::fixed('beau-fils/fille', '%s du beau-fils/fille')->married()->spouse()->child(), 212d8a5ab6eSJonathan Jaubart Relationship::fixed('quasi-sœur', '%s de la quasi-sœur')->parent()->spouse()->daughter(), 213d8a5ab6eSJonathan Jaubart Relationship::fixed('quasi-frère', '%s du quasi-frère')->parent()->spouse()->son(), 214d8a5ab6eSJonathan Jaubart Relationship::fixed('quasi-frère/sœur', '%s du quasi-frère/sœur')->parent()->spouse()->child(), 215d8a5ab6eSJonathan Jaubart // Partners 216d8a5ab6eSJonathan Jaubart Relationship::fixed('ex-épouse', '%s de l’ex-épouse')->divorced()->partner()->female(), 217d8a5ab6eSJonathan Jaubart Relationship::fixed('ex-époux', '%s de l’ex-époux')->divorced()->partner()->male(), 2183d9e70a5SJonathan Jaubart Relationship::fixed('ex-époux', '%s de l’ex-époux')->divorced()->partner(), 2193d9e70a5SJonathan Jaubart Relationship::fixed('ex-conjointe', '%s de l’ex-conjoint')->divorced()->partner()->female(), 2203d9e70a5SJonathan Jaubart Relationship::fixed('ex-conjoint', '%s de l’ex-conjoint')->divorced()->partner()->male(), 221d8a5ab6eSJonathan Jaubart Relationship::fixed('ex-conjoint', '%s de l’ex-conjoint')->divorced()->partner(), 222d8a5ab6eSJonathan Jaubart Relationship::fixed('fiancée', '%s de la fiancée')->engaged()->partner()->female(), 223d8a5ab6eSJonathan Jaubart Relationship::fixed('fiancé', '%s du fiancé')->engaged()->partner()->male(), 224d8a5ab6eSJonathan Jaubart Relationship::fixed('épouse', '%s de l’épouse')->wife(), 225d8a5ab6eSJonathan Jaubart Relationship::fixed('époux', '%s de l’époux')->husband(), 226d8a5ab6eSJonathan Jaubart Relationship::fixed('époux', '%s de l’époux')->spouse(), 2273d9e70a5SJonathan Jaubart Relationship::fixed('conjointe', '%s du conjoint')->partner()->female(), 2283d9e70a5SJonathan Jaubart Relationship::fixed('conjoint', '%s du conjoint')->partner()->male(), 229d8a5ab6eSJonathan Jaubart Relationship::fixed('conjoint', '%s du conjoint')->partner(), 230d8a5ab6eSJonathan Jaubart // In-laws 231d8a5ab6eSJonathan Jaubart Relationship::fixed('belle-mère', '%s de la belle-mère')->married()->spouse()->mother(), 232d8a5ab6eSJonathan Jaubart Relationship::fixed('beau-père', '%s du beau-père')->married()->spouse()->father(), 233d8a5ab6eSJonathan Jaubart Relationship::fixed('beau-parent', '%s du beau-parent')->married()->spouse()->parent(), 2343d9e70a5SJonathan Jaubart Relationship::fixed('bru', '%s de la bru')->child()->wife(), 2353d9e70a5SJonathan Jaubart Relationship::fixed('gendre', '%s du gendre')->child()->husband(), 236d8a5ab6eSJonathan Jaubart Relationship::fixed('belle-sœur', '%s de la belle-sœur')->spouse()->sister(), 237d8a5ab6eSJonathan Jaubart Relationship::fixed('beau-frère', '%s du beau-frère')->spouse()->brother(), 238d8a5ab6eSJonathan Jaubart Relationship::fixed('beau-frère/belle-sœur', '%s du beau-frère/belle-sœur')->spouse()->sibling(), 239d8a5ab6eSJonathan Jaubart Relationship::fixed('belle-sœur', '%s de la belle-sœur')->sibling()->wife(), 240d8a5ab6eSJonathan Jaubart Relationship::fixed('beau-frère', '%s du beau-frère')->sibling()->husband(), 241d8a5ab6eSJonathan Jaubart Relationship::fixed('beau-frère/belle-sœur', '%s du beau-frère/belle-sœur')->sibling()->spouse(), 242d8a5ab6eSJonathan Jaubart // Grandparents and above 2433d9e70a5SJonathan Jaubart //"Trisaïeux" are an exception to the dynamic rule 24496c67f5bSJonathan Jaubart Relationship::fixed('trisaïeule maternelle', '%s de la trisaïeule maternelle')->mother()->parent()->parent()->mother(), 24596c67f5bSJonathan Jaubart Relationship::fixed('trisaïeul maternel', '%s du trisaïeul maternel')->mother()->parent()->parent()->father(), 24696c67f5bSJonathan Jaubart Relationship::fixed('trisaïeule paternelle', '%s de la trisaïeule paternelle')->father()->parent()->parent()->mother(), 24796c67f5bSJonathan Jaubart Relationship::fixed('trisaïeul paternel', '%s du trisaïeul paternel')->father()->parent()->parent()->father(), 24896c67f5bSJonathan Jaubart Relationship::fixed('trisaïeule', '%s de la trisaïeule')->parent()->parent()->parent()->mother(), 24996c67f5bSJonathan Jaubart Relationship::fixed('trisaïeul', '%s du trisaïeul')->parent()->parent()->parent()->father(), 2506b2cb23eSGreg Roach Relationship::dynamic(static fn (int $n) => $firstCompound($n, 'grand-mère maternelle', 'de la '))->mother()->ancestor()->female(), 2516b2cb23eSGreg Roach Relationship::dynamic(static fn (int $n) => $firstCompound($n, 'grand-père maternel', 'du '))->mother()->ancestor()->male(), 2526b2cb23eSGreg Roach Relationship::dynamic(static fn (int $n) => $firstCompound($n, 'grand-parent maternel', 'du '))->mother()->ancestor(), 2536b2cb23eSGreg Roach Relationship::dynamic(static fn (int $n) => $firstCompound($n, 'grand-mère paternelle', 'de la '))->father()->ancestor()->female(), 2546b2cb23eSGreg Roach Relationship::dynamic(static fn (int $n) => $firstCompound($n, 'grand-père paternel', 'du '))->father()->ancestor()->male(), 2556b2cb23eSGreg Roach Relationship::dynamic(static fn (int $n) => $firstCompound($n, 'grand-parent paternel', 'du '))->father()->ancestor(), 2566b2cb23eSGreg Roach Relationship::dynamic(static fn (int $n) => $firstCompound($n, 'grand-mère', 'de la '))->parent()->ancestor()->female(), 2576b2cb23eSGreg Roach Relationship::dynamic(static fn (int $n) => $firstCompound($n, 'grand-père', 'du '))->parent()->ancestor()->male(), 2586b2cb23eSGreg Roach Relationship::dynamic(static fn (int $n) => $firstCompound($n, 'grand-parent', 'du '))->parent()->ancestor(), 259d8a5ab6eSJonathan Jaubart // Grandchildren and below 2606b2cb23eSGreg Roach Relationship::dynamic(static fn (int $n) => $firstCompound($n, 'petite-fille', 'de la '))->child()->descendant()->female(), 2616b2cb23eSGreg Roach Relationship::dynamic(static fn (int $n) => $firstCompound($n, 'petit-fils', 'du '))->child()->descendant()->male(), 2626b2cb23eSGreg Roach Relationship::dynamic(static fn (int $n) => $firstCompound($n, 'petit-enfant', 'du '))->child()->descendant(), 263d8a5ab6eSJonathan Jaubart // Collateral relatives 2646b2cb23eSGreg Roach Relationship::dynamic(static fn (int $n) => $compound($n, 'grand-', 'tante', 'de la ', 'de la '))->ancestor()->sister(), 2656b2cb23eSGreg Roach Relationship::dynamic(static fn (int $n) => $compound($n, 'grand-', 'tante par alliance', 'de la ', 'de la '))->ancestor()->sibling()->wife(), 2666b2cb23eSGreg Roach Relationship::dynamic(static fn (int $n) => $compound($n, 'grand-', 'oncle', 'de l’', 'du '))->ancestor()->brother(), 2676b2cb23eSGreg Roach Relationship::dynamic(static fn (int $n) => $compound($n, 'grand-', 'oncle par alliance', 'de l’', 'du '))->ancestor()->sibling()->husband(), 2686b2cb23eSGreg Roach Relationship::dynamic(static fn (int $n) => $compound($n, 'petite-', 'nièce', 'de la ', 'de la '))->sibling()->descendant()->female(), 2696b2cb23eSGreg Roach Relationship::dynamic(static fn (int $n) => $compound($n, 'petite-', 'nièce par alliance', 'de la ', 'de la '))->married()->spouse()->sibling()->descendant()->female(), 2706b2cb23eSGreg Roach Relationship::dynamic(static fn (int $n) => $compound($n, 'petit-', 'neveu', 'du ', 'du '))->sibling()->descendant()->male(), 2716b2cb23eSGreg Roach Relationship::dynamic(static fn (int $n) => $compound($n, 'petit-', 'neveu par alliance', 'du ', 'du '))->married()->spouse()->sibling()->descendant()->male(), 272d8a5ab6eSJonathan Jaubart // Cousins (based on canon law) 2736b2cb23eSGreg Roach Relationship::dynamic(static fn (int $up, int $down) => $cousin($up, $down, 'F'))->cousin()->female(), 2746b2cb23eSGreg Roach Relationship::dynamic(static fn (int $up, int $down) => $cousin($up, $down, 'M'))->cousin()->male(), 275d8a5ab6eSJonathan Jaubart 276d8a5ab6eSJonathan Jaubart ]; 277d8a5ab6eSJonathan Jaubart } 27802086832SGreg Roach} 279