fisharebest /
webtrees
| 1 | <?php |
||
| 2 | |||
| 3 | /** |
||
| 4 | * webtrees: online genealogy |
||
| 5 | * Copyright (C) 2025 webtrees development team |
||
| 6 | * This program is free software: you can redistribute it and/or modify |
||
| 7 | * it under the terms of the GNU General Public License as published by |
||
| 8 | * the Free Software Foundation, either version 3 of the License, or |
||
| 9 | * (at your option) any later version. |
||
| 10 | * This program is distributed in the hope that it will be useful, |
||
| 11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
||
| 12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||
| 13 | * GNU General Public License for more details. |
||
| 14 | * You should have received a copy of the GNU General Public License |
||
| 15 | * along with this program. If not, see <https://www.gnu.org/licenses/>. |
||
| 16 | */ |
||
| 17 | |||
| 18 | declare(strict_types=1); |
||
| 19 | |||
| 20 | namespace Fisharebest\Webtrees\Module; |
||
| 21 | |||
| 22 | use Fisharebest\Localization\Locale\LocaleFr; |
||
| 23 | use Fisharebest\Localization\Locale\LocaleInterface; |
||
| 24 | use Fisharebest\Webtrees\Relationship; |
||
| 25 | |||
| 26 | class LanguageFrench extends AbstractModule implements ModuleLanguageInterface |
||
| 27 | { |
||
| 28 | use ModuleLanguageTrait; |
||
| 29 | |||
| 30 | protected const array SYMMETRIC_COUSINS = [ |
||
|
0 ignored issues
–
show
Bug
introduced
by
Loading history...
|
|||
| 31 | 1 => [ |
||
| 32 | 'F' => ['cousine germaine', '%s de la cousine germaine'], |
||
| 33 | 'M' => ['cousin germain', '%s du cousin germain'], |
||
| 34 | 'U' => ['cousin germain', '%s du cousin germain'] |
||
| 35 | ], |
||
| 36 | 2 => [ |
||
| 37 | 'F' => ['cousine issue de germain', '%s de la cousine issue de germain'], |
||
| 38 | 'M' => ['cousin issu de germain', '%s du cousin issu de germain'], |
||
| 39 | 'U' => ['cousin issu de germain', '%s du cousin issu de germain'] |
||
| 40 | ] |
||
| 41 | ]; |
||
| 42 | |||
| 43 | protected const array ASYMMETRIC_COUSINS = [ |
||
| 44 | 1 => [ |
||
| 45 | 'F' => ['down', 'petite-cousine', 'de la '], |
||
| 46 | 'M' => ['down', 'petit-cousin', 'du '], |
||
| 47 | 'U' => ['down', 'petit-cousin', 'du '] |
||
| 48 | ], |
||
| 49 | -1 => [ |
||
| 50 | 'F' => ['up', 'grand-cousine', 'de la '], |
||
| 51 | 'M' => ['up', 'grand-cousin', 'du '], |
||
| 52 | 'U' => ['up', 'grand-cousin', 'du '] |
||
| 53 | ], |
||
| 54 | ]; |
||
| 55 | |||
| 56 | public function locale(): LocaleInterface |
||
| 57 | { |
||
| 58 | return new LocaleFr(); |
||
| 59 | } |
||
| 60 | |||
| 61 | /** |
||
| 62 | * Pour les traducteurs français, certaines configurations peuvent avoir plusieurs traduction françaises possibles, |
||
| 63 | * ou aucune. Voici les choix qui ont été faits (mais complètement ouverts à discussion): |
||
| 64 | * |
||
| 65 | * - je n'ai aucune intention de rentrer dans le débat de l'écriture inclusive, mais malheureusement un choix doit |
||
| 66 | * être fait: lorsque nécessaire dans les choix des articles ou accords, je m'en suis tenu à la recommandation de |
||
| 67 | * l'Académie Française d'utiliser la forme non marquée (et donc le masculin) pour le genre neutre. |
||
| 68 | * - dans le cas de frères/sœurs jumeaux, j'évite le problème en utiliseant le substantif `jumeau` lorsque le sexe |
||
| 69 | * n'est pas connu, alors que j'utilise la structure `frère jumeau`/`sœur jumelle` lorsque le sexe est connu. |
||
| 70 | * - `conjoint` a été choisi pour un couple non marié (`époux`/`épouse` lorsque les conjoints sont mariés). |
||
| 71 | * Une alternative est `partenaire`, mais `conjoint` est le terme déjà utilisé dans les traductions françaises. |
||
| 72 | * - la notion de `foster` (qui peut traduire plusieurs réalités différentes en français) a été traduite dans le |
||
| 73 | * cadre de la `famille d'accueil`. Les suggestions sont les bienvenues. |
||
| 74 | * - La situation des enfants dans les familles recomposées a été traduite: |
||
| 75 | * - `frère`/`sœur` pour les enfants dont les deux parents sont les mêmes |
||
| 76 | * - `demi-frère`/`demi-sœur` pour les enfants qui ont un parent en commun |
||
| 77 | * - `quasi-frère`/`quasi-sœur` pour les enfants qui ne partagent aucun parent en commun, mais dont les parents |
||
| 78 | * sont en couple |
||
| 79 | * - 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 |
||
| 80 | * `frère aîné`/`frère cadet` ou `frère plus âgé`/`frère plus jeune` |
||
| 81 | * - Lorsqu'il est nécessaire d'aller au-delà d'un `arrière-`{substantif} (par exemple, pour décrire le case de |
||
| 82 | * l'enfant d'un arrière-petit-enfant), la forme `{substantif} au Ne degré` est choisie, avec pour convention |
||
| 83 | * N = 1 pour le niveau du substantif racine, on utilisera donc par exemple: |
||
| 84 | * - `petit-enfant` (= petit-enfant au 1er degré) |
||
| 85 | * - `arrière-petit-enfant` (= petit-enfant au 2e degré) |
||
| 86 | * - `petit-enfant au 3e degré` et ainsi de suite pour les degrés supérieurs |
||
| 87 | * - Un exception à la règle précédente sont les grand-parents au 3e degré, qui ont la description de `trisaïeux`. |
||
| 88 | * - Pour les cousins, c'est la description selon le droit canon qui a été choisie (principalement car elle donne |
||
| 89 | * une meilleure visibilité de la distance à l'ancêtre commun que la description en droit civil), donc: |
||
| 90 | * - l'enfant d'un oncle/tante est un `cousin germain`/`cousine germaine` (= cousins au 1er degré) |
||
| 91 | * - les enfants de cousins germains sont des `cousins issus de germain` (= cousins au 2e degré) |
||
| 92 | * - pour les enfants des cousins issus de germains, et ainsi de suite, la relation est décrite suivant le |
||
| 93 | * nombre de degré séparant les cousins de l'ancêtre commun: |
||
| 94 | * - en cas de symétrie des chemins, ils sont dits `cousins au N-ème degré` |
||
| 95 | * - en cas d'asymétrie des chemins, ils sont dit `cousins du N-ème au M-ème degré` |
||
| 96 | * - de plus, les notions de `grand-cousin` et `petit-cousin` ont été implémentées comme suit: |
||
| 97 | * - un `(arrière-)grand-cousin` est l'enfant d'un `(arrière-)grand-oncle`/`grand-tante` |
||
| 98 | * (= cousin du 1er au N-ème degré) |
||
| 99 | * - un `(arrière-)petit-cousin` est un `(arrière-)petit-neveu`/`petite-nièce` d'un parent |
||
| 100 | * (= cousin du Ner au 1er degré) |
||
| 101 | * |
||
| 102 | * @return array<Relationship> |
||
| 103 | */ |
||
| 104 | public function relationships(): array |
||
| 105 | { |
||
| 106 | // Construct the genitive form in French |
||
| 107 | $genitive = static fn (string $s, string $genitive_link): array => [$s, '%s ' . $genitive_link . $s]; |
||
| 108 | |||
| 109 | // Functions to coumpound the name that can be indefinitely repeated |
||
| 110 | $degree = static fn (int $n, string $suffix, string $genitive_link): array => |
||
| 111 | $genitive($suffix . ' au ' . $n . '<sup>e</sup> degré', $genitive_link); |
||
| 112 | |||
| 113 | $great = static fn (int $n, string $suffix, string $genitive_link): array => |
||
| 114 | $n <= 1 ? $genitive('arrière-' . $suffix, 'de l’') : $degree($n + 1, $suffix, $genitive_link); |
||
| 115 | |||
| 116 | $firstCompound = static fn (int $n, string $suffix, string $genitive_link): array => |
||
| 117 | $n <= 1 ? $genitive($suffix, $genitive_link) : $great($n - 1, $suffix, $genitive_link); |
||
| 118 | |||
| 119 | $compound = |
||
| 120 | static fn (int $n, string $first_level, string $suffix, string $genitive_none, string $genitive_first): array => |
||
| 121 | $n <= 1 ? $genitive($suffix, $genitive_none) : $firstCompound($n - 1, $first_level . $suffix, $genitive_first); |
||
| 122 | |||
| 123 | // Functions to translate cousins' degree of relationship |
||
| 124 | $symmetricCousin = static fn (int $n, string $sex): array => self::SYMMETRIC_COUSINS[$n][$sex] ?? $genitive( |
||
| 125 | $sex === 'F' ? 'cousine au ' . $n . '<sup>e</sup> degré' : 'cousin au ' . $n . '<sup>e</sup> degré', |
||
| 126 | $sex === 'F' ? 'de la ' : 'du ' |
||
| 127 | ); |
||
| 128 | |||
| 129 | $cousin = |
||
| 130 | static function (int $up, int $down, string $sex) use ($symmetricCousin, $firstCompound, $genitive): array { |
||
| 131 | if ($up === $down) { |
||
| 132 | return $symmetricCousin($up, $sex); |
||
| 133 | } |
||
| 134 | $fixed = self::ASYMMETRIC_COUSINS[$up][$sex] ?? self::ASYMMETRIC_COUSINS[-$down][$sex] ?? null; |
||
| 135 | if ($fixed !== null) { |
||
| 136 | $fixed[0] = $fixed[0] === 'up' ? $up - 1 : $down - 1; |
||
| 137 | return $firstCompound(...$fixed); |
||
| 138 | } |
||
| 139 | return $genitive( |
||
| 140 | $sex === 'F' ? |
||
| 141 | 'cousine du ' . $down . '<sup>e</sup> au ' . $up . '<sup>e</sup> degré' : |
||
| 142 | 'cousin du ' . $down . '<sup>e</sup> au ' . $up . '<sup>e</sup> degré', |
||
| 143 | $sex === 'F' ? 'de la ' : 'du ' |
||
| 144 | ); |
||
| 145 | }; |
||
| 146 | |||
| 147 | return [ |
||
| 148 | // Adopted |
||
| 149 | Relationship::fixed('mère adoptive', '%s de la mère adoptive')->adoptive()->mother(), |
||
| 150 | Relationship::fixed('père adoptif', '%s du père adoptif')->adoptive()->father(), |
||
| 151 | Relationship::fixed('parent adoptif', '%s du parent adoptif')->adoptive()->parent(), |
||
| 152 | Relationship::fixed('sœur adoptive', '%s de la sœur adoptive')->adoptive()->sister(), |
||
| 153 | Relationship::fixed('frère adoptif', '%s du frère adoptif')->adoptive()->brother(), |
||
| 154 | Relationship::fixed('frère/sœur adoptif', '%s du frère/sœur adoptif')->adoptive()->sibling(), |
||
| 155 | Relationship::fixed('fille adoptive', '%s de la fille adoptive')->adopted()->daughter(), |
||
| 156 | Relationship::fixed('fils adoptif', '%s du fils adoptif')->adopted()->son(), |
||
| 157 | Relationship::fixed('enfant adoptif', '%s de l’enfant adoptif')->adopted()->child(), |
||
| 158 | Relationship::fixed('sœur adoptive', '%s de la sœur adoptive')->adopted()->sister(), |
||
| 159 | Relationship::fixed('frère adoptif', '%s du frère adoptif')->adopted()->brother(), |
||
| 160 | Relationship::fixed('frère/sœur adoptif', '%s du frère/sœur adoptif')->adopted()->sibling(), |
||
| 161 | // Fostered |
||
| 162 | Relationship::fixed('mère d’accueil', '%s de la mère d’accueil')->fostering()->mother(), |
||
| 163 | Relationship::fixed('père d’accueil', '%s du père d’accueil')->fostering()->father(), |
||
| 164 | Relationship::fixed('parent d’accueil', '%s du parent d’accueil')->fostering()->parent(), |
||
| 165 | Relationship::fixed('sœur d’accueil', '%s de la sœur d’accueil')->fostering()->sister(), |
||
| 166 | Relationship::fixed('frère d’accueil', '%s du frère d’accueil')->fostering()->brother(), |
||
| 167 | Relationship::fixed('frère/sœur d’accueil', '%s du frère/sœur d’accueil')->fostering()->sibling(), |
||
| 168 | Relationship::fixed('fille accueillie', '%s de la fille accueillie')->fostered()->daughter(), |
||
| 169 | Relationship::fixed('fils accueilli', '%s du fils accueilli')->fostered()->son(), |
||
| 170 | Relationship::fixed('enfant accueilli', '%s de l’enfant accueilli')->fostered()->child(), |
||
| 171 | Relationship::fixed('sœur accueillie', '%s de la sœur accueillie')->fostered()->sister(), |
||
| 172 | Relationship::fixed('frère accueilli', '%s du frère accueilli')->fostered()->brother(), |
||
| 173 | Relationship::fixed('frère/sœur accueilli', '%s du frère/sœur accueilli')->fostered()->sibling(), |
||
| 174 | // Parents |
||
| 175 | Relationship::fixed('mère', '%s de la mère')->mother(), |
||
| 176 | Relationship::fixed('père', '%s du père')->father(), |
||
| 177 | Relationship::fixed('parent', '%s du parent')->parent(), |
||
| 178 | // Children |
||
| 179 | Relationship::fixed('fille', '%s de la fille')->daughter(), |
||
| 180 | Relationship::fixed('fils', '%s du fils')->son(), |
||
| 181 | Relationship::fixed('enfant', '%s de l’enfant')->child(), |
||
| 182 | // Siblings |
||
| 183 | Relationship::fixed('sœur jumelle', '%s de la sœur jumelle')->twin()->sister(), |
||
| 184 | Relationship::fixed('frère jumeau', '%s du frère jumeau')->twin()->brother(), |
||
| 185 | Relationship::fixed('jumeau', '%s du jumeau')->twin()->sibling(), |
||
| 186 | Relationship::fixed('grande sœur', '%s de la grande sœur')->older()->sister(), |
||
| 187 | Relationship::fixed('grand frère', '%s du grand frère')->older()->brother(), |
||
| 188 | Relationship::fixed('grand frère/sœur', '%s du grand frère/sœur')->older()->sibling(), |
||
| 189 | Relationship::fixed('petite sœur', '%s de la petite sœur')->younger()->sister(), |
||
| 190 | Relationship::fixed('petit frère', '%s du petit-frère')->younger()->brother(), |
||
| 191 | Relationship::fixed('petit frère/sœur', '%s du petit frère/sœur')->younger()->sibling(), |
||
| 192 | Relationship::fixed('sœur', '%s de la sœur')->sister(), |
||
| 193 | Relationship::fixed('frère', '%s du frère')->brother(), |
||
| 194 | Relationship::fixed('frère/sœur', '%s du frère/sœur')->sibling(), |
||
| 195 | // Half-family |
||
| 196 | Relationship::fixed('demi-sœur', '%s de la demi-sœur')->parent()->daughter(), |
||
| 197 | Relationship::fixed('demi-frère', '%s du demi-frère')->parent()->son(), |
||
| 198 | Relationship::fixed('demi-frère/sœur', '%s du demi-frère/sœur')->parent()->child(), |
||
| 199 | // Stepfamily |
||
| 200 | Relationship::fixed('belle-mère', '%s de la belle-mère')->parent()->wife(), |
||
| 201 | Relationship::fixed('beau-père', '%s du beau-père')->parent()->husband(), |
||
| 202 | Relationship::fixed('beau-parent', '%s du beau-parent')->parent()->married()->spouse(), |
||
| 203 | Relationship::fixed('belle-fille', '%s de la belle-fille')->married()->spouse()->daughter(), |
||
| 204 | Relationship::fixed('beau-fils', '%s du beau-fils')->married()->spouse()->son(), |
||
| 205 | Relationship::fixed('beau-fils/fille', '%s du beau-fils/fille')->married()->spouse()->child(), |
||
| 206 | Relationship::fixed('quasi-sœur', '%s de la quasi-sœur')->parent()->spouse()->daughter(), |
||
| 207 | Relationship::fixed('quasi-frère', '%s du quasi-frère')->parent()->spouse()->son(), |
||
| 208 | Relationship::fixed('quasi-frère/sœur', '%s du quasi-frère/sœur')->parent()->spouse()->child(), |
||
| 209 | // Partners |
||
| 210 | Relationship::fixed('ex-épouse', '%s de l’ex-épouse')->divorced()->partner()->female(), |
||
| 211 | Relationship::fixed('ex-époux', '%s de l’ex-époux')->divorced()->partner()->male(), |
||
| 212 | Relationship::fixed('ex-époux', '%s de l’ex-époux')->divorced()->partner(), |
||
| 213 | Relationship::fixed('ex-conjointe', '%s de l’ex-conjoint')->divorced()->partner()->female(), |
||
| 214 | Relationship::fixed('ex-conjoint', '%s de l’ex-conjoint')->divorced()->partner()->male(), |
||
| 215 | Relationship::fixed('ex-conjoint', '%s de l’ex-conjoint')->divorced()->partner(), |
||
| 216 | Relationship::fixed('fiancée', '%s de la fiancée')->engaged()->partner()->female(), |
||
| 217 | Relationship::fixed('fiancé', '%s du fiancé')->engaged()->partner()->male(), |
||
| 218 | Relationship::fixed('épouse', '%s de l’épouse')->wife(), |
||
| 219 | Relationship::fixed('époux', '%s de l’époux')->husband(), |
||
| 220 | Relationship::fixed('époux', '%s de l’époux')->spouse(), |
||
| 221 | Relationship::fixed('conjointe', '%s du conjoint')->partner()->female(), |
||
| 222 | Relationship::fixed('conjoint', '%s du conjoint')->partner()->male(), |
||
| 223 | Relationship::fixed('conjoint', '%s du conjoint')->partner(), |
||
| 224 | // In-laws |
||
| 225 | Relationship::fixed('belle-mère', '%s de la belle-mère')->married()->spouse()->mother(), |
||
| 226 | Relationship::fixed('beau-père', '%s du beau-père')->married()->spouse()->father(), |
||
| 227 | Relationship::fixed('beau-parent', '%s du beau-parent')->married()->spouse()->parent(), |
||
| 228 | Relationship::fixed('bru', '%s de la bru')->child()->wife(), |
||
| 229 | Relationship::fixed('gendre', '%s du gendre')->child()->husband(), |
||
| 230 | Relationship::fixed('belle-sœur', '%s de la belle-sœur')->spouse()->sister(), |
||
| 231 | Relationship::fixed('beau-frère', '%s du beau-frère')->spouse()->brother(), |
||
| 232 | Relationship::fixed('beau-frère/belle-sœur', '%s du beau-frère/belle-sœur')->spouse()->sibling(), |
||
| 233 | Relationship::fixed('belle-sœur', '%s de la belle-sœur')->sibling()->wife(), |
||
| 234 | Relationship::fixed('beau-frère', '%s du beau-frère')->sibling()->husband(), |
||
| 235 | Relationship::fixed('beau-frère/belle-sœur', '%s du beau-frère/belle-sœur')->sibling()->spouse(), |
||
| 236 | // Grandparents and above |
||
| 237 | //"Trisaïeux" are an exception to the dynamic rule |
||
| 238 | Relationship::fixed('trisaïeule maternelle', '%s de la trisaïeule maternelle')->mother()->parent()->parent()->mother(), |
||
| 239 | Relationship::fixed('trisaïeul maternel', '%s du trisaïeul maternel')->mother()->parent()->parent()->father(), |
||
| 240 | Relationship::fixed('trisaïeule paternelle', '%s de la trisaïeule paternelle')->father()->parent()->parent()->mother(), |
||
| 241 | Relationship::fixed('trisaïeul paternel', '%s du trisaïeul paternel')->father()->parent()->parent()->father(), |
||
| 242 | Relationship::fixed('trisaïeule', '%s de la trisaïeule')->parent()->parent()->parent()->mother(), |
||
| 243 | Relationship::fixed('trisaïeul', '%s du trisaïeul')->parent()->parent()->parent()->father(), |
||
| 244 | Relationship::dynamic(static fn (int $n) => $firstCompound($n, 'grand-mère maternelle', 'de la '))->mother()->ancestor()->female(), |
||
| 245 | Relationship::dynamic(static fn (int $n) => $firstCompound($n, 'grand-père maternel', 'du '))->mother()->ancestor()->male(), |
||
| 246 | Relationship::dynamic(static fn (int $n) => $firstCompound($n, 'grand-parent maternel', 'du '))->mother()->ancestor(), |
||
| 247 | Relationship::dynamic(static fn (int $n) => $firstCompound($n, 'grand-mère paternelle', 'de la '))->father()->ancestor()->female(), |
||
| 248 | Relationship::dynamic(static fn (int $n) => $firstCompound($n, 'grand-père paternel', 'du '))->father()->ancestor()->male(), |
||
| 249 | Relationship::dynamic(static fn (int $n) => $firstCompound($n, 'grand-parent paternel', 'du '))->father()->ancestor(), |
||
| 250 | Relationship::dynamic(static fn (int $n) => $firstCompound($n, 'grand-mère', 'de la '))->parent()->ancestor()->female(), |
||
| 251 | Relationship::dynamic(static fn (int $n) => $firstCompound($n, 'grand-père', 'du '))->parent()->ancestor()->male(), |
||
| 252 | Relationship::dynamic(static fn (int $n) => $firstCompound($n, 'grand-parent', 'du '))->parent()->ancestor(), |
||
| 253 | // Grandchildren and below |
||
| 254 | Relationship::dynamic(static fn (int $n) => $firstCompound($n, 'petite-fille', 'de la '))->child()->descendant()->female(), |
||
| 255 | Relationship::dynamic(static fn (int $n) => $firstCompound($n, 'petit-fils', 'du '))->child()->descendant()->male(), |
||
| 256 | Relationship::dynamic(static fn (int $n) => $firstCompound($n, 'petit-enfant', 'du '))->child()->descendant(), |
||
| 257 | // Collateral relatives |
||
| 258 | Relationship::dynamic(static fn (int $n) => $compound($n, 'grand-', 'tante', 'de la ', 'de la '))->ancestor()->sister(), |
||
| 259 | Relationship::dynamic(static fn (int $n) => $compound($n, 'grand-', 'tante par alliance', 'de la ', 'de la '))->ancestor()->sibling()->wife(), |
||
| 260 | Relationship::dynamic(static fn (int $n) => $compound($n, 'grand-', 'oncle', 'de l’', 'du '))->ancestor()->brother(), |
||
| 261 | Relationship::dynamic(static fn (int $n) => $compound($n, 'grand-', 'oncle par alliance', 'de l’', 'du '))->ancestor()->sibling()->husband(), |
||
| 262 | Relationship::dynamic(static fn (int $n) => $compound($n, 'petite-', 'nièce', 'de la ', 'de la '))->sibling()->descendant()->female(), |
||
| 263 | Relationship::dynamic(static fn (int $n) => $compound($n, 'petite-', 'nièce par alliance', 'de la ', 'de la '))->married()->spouse()->sibling()->descendant()->female(), |
||
| 264 | Relationship::dynamic(static fn (int $n) => $compound($n, 'petit-', 'neveu', 'du ', 'du '))->sibling()->descendant()->male(), |
||
| 265 | Relationship::dynamic(static fn (int $n) => $compound($n, 'petit-', 'neveu par alliance', 'du ', 'du '))->married()->spouse()->sibling()->descendant()->male(), |
||
| 266 | // Cousins (based on canon law) |
||
| 267 | Relationship::dynamic(static fn (int $up, int $down) => $cousin($up, $down, 'F'))->cousin()->female(), |
||
| 268 | Relationship::dynamic(static fn (int $up, int $down) => $cousin($up, $down, 'M'))->cousin()->male(), |
||
| 269 | |||
| 270 | ]; |
||
| 271 | } |
||
| 272 | } |
||
| 273 |