@treeviz/gedcom-parser 2.1.11 → 2.1.15

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (45) hide show
  1. package/dist/classes/index.js +732 -396
  2. package/dist/classes/indi.d.ts +2 -2
  3. package/dist/classes/indi.d.ts.map +1 -1
  4. package/dist/cli/index.js +733 -397
  5. package/dist/constants/index.js +731 -395
  6. package/dist/factories/index.js +731 -395
  7. package/dist/factories/kinship-factory.d.ts +2 -2
  8. package/dist/factories/kinship-factory.d.ts.map +1 -1
  9. package/dist/index.js +733 -397
  10. package/dist/kinship-translator/index.js +731 -395
  11. package/dist/kinship-translator/kinship-translator.basic.d.ts +3 -1
  12. package/dist/kinship-translator/kinship-translator.basic.d.ts.map +1 -1
  13. package/dist/kinship-translator/kinship-translator.d.ts +3 -2
  14. package/dist/kinship-translator/kinship-translator.d.ts.map +1 -1
  15. package/dist/kinship-translator/kinship-translator.de.d.ts +2 -3
  16. package/dist/kinship-translator/kinship-translator.de.d.ts.map +1 -1
  17. package/dist/kinship-translator/kinship-translator.en.d.ts.map +1 -1
  18. package/dist/kinship-translator/kinship-translator.es.d.ts +2 -3
  19. package/dist/kinship-translator/kinship-translator.es.d.ts.map +1 -1
  20. package/dist/kinship-translator/kinship-translator.fr.d.ts +2 -3
  21. package/dist/kinship-translator/kinship-translator.fr.d.ts.map +1 -1
  22. package/dist/kinship-translator/kinship-translator.hu.d.ts.map +1 -1
  23. package/dist/kinship-translator/kinship-translator.ja.d.ts.map +1 -1
  24. package/dist/kinship-translator/kinship-translator.ru.d.ts +1 -1
  25. package/dist/kinship-translator/kinship-translator.ru.d.ts.map +1 -1
  26. package/dist/kinship-translator/kinship-translator.zh.d.ts.map +1 -1
  27. package/dist/kinship-translator/patterns.de.d.ts +1 -0
  28. package/dist/kinship-translator/patterns.de.d.ts.map +1 -1
  29. package/dist/kinship-translator/patterns.es.d.ts +1 -0
  30. package/dist/kinship-translator/patterns.es.d.ts.map +1 -1
  31. package/dist/kinship-translator/patterns.fr.d.ts +1 -0
  32. package/dist/kinship-translator/patterns.fr.d.ts.map +1 -1
  33. package/dist/kinship-translator/patterns.hu.d.ts.map +1 -1
  34. package/dist/kinship-translator/patterns.ru.d.ts +1 -0
  35. package/dist/kinship-translator/patterns.ru.d.ts.map +1 -1
  36. package/dist/kinship-translator/patterns.zh.d.ts.map +1 -1
  37. package/dist/structures/gedcom.d.ts +1 -0
  38. package/dist/structures/gedcom.d.ts.map +1 -1
  39. package/dist/structures/individual.d.ts +1 -0
  40. package/dist/structures/individual.d.ts.map +1 -1
  41. package/dist/types/types.d.ts +2 -0
  42. package/dist/types/types.d.ts.map +1 -1
  43. package/dist/utils/common-creator.d.ts.map +1 -1
  44. package/dist/utils/index.js +733 -397
  45. package/package.json +1 -1
@@ -1445,11 +1445,12 @@ var hungarianOrdinalize = (n) => {
1445
1445
 
1446
1446
  // src/kinship-translator/kinship-translator.basic.ts
1447
1447
  var KinshipTranslatorBasic = class {
1448
- constructor(path, displayName = "givenname") {
1448
+ constructor(path, displayName = "givenname", nameOrder = "first-last") {
1449
1449
  this.isOfSpouse = false;
1450
1450
  this.isSpouseOf = false;
1451
1451
  this._path = path;
1452
1452
  this.displayName = displayName;
1453
+ this.nameOrder = nameOrder;
1453
1454
  }
1454
1455
  get path() {
1455
1456
  return this._path;
@@ -1728,7 +1729,7 @@ var KinshipTranslatorHU = class extends KinshipTranslatorBasic {
1728
1729
  }
1729
1730
  return `${hungarianOrdinalize(
1730
1731
  degree
1731
- )}unokatestv\xE9r ${level}x elt\xE1vol\xEDtva`;
1732
+ )}unokatestv\xE9r ${Math.abs(level)}x elt\xE1vol\xEDtva`;
1732
1733
  }
1733
1734
  auncle() {
1734
1735
  const level = this.pathN?.level ?? 0;
@@ -1772,14 +1773,25 @@ var KinshipTranslatorHU = class extends KinshipTranslatorBasic {
1772
1773
  return `${ordinalized ? `${ordinalized}unoka` : ""}testv\xE9r ${origPrefix.replace(/nagy$/, "")}unok\xE1ja`;
1773
1774
  }
1774
1775
  parent() {
1776
+ const level = Math.abs(this.pathN?.level ?? 0);
1777
+ if (level <= 1) {
1778
+ if (this.personN?.isMale()) {
1779
+ return "apa";
1780
+ }
1781
+ if (this.personN?.isFemale()) {
1782
+ return "anya";
1783
+ }
1784
+ return "sz\xFCl\u0151";
1785
+ }
1775
1786
  const prefix = this.directPrefix();
1787
+ const gen = prefix === "nagy" ? "" : prefix;
1776
1788
  if (this.personN?.isMale()) {
1777
- return `${prefix}apa`;
1789
+ return `${gen}nagyapa`;
1778
1790
  }
1779
1791
  if (this.personN?.isFemale()) {
1780
- return `${prefix}anya`;
1792
+ return `${gen}nagyanya`;
1781
1793
  }
1782
- return `${prefix}sz\xFCl\u0151`;
1794
+ return `${gen}nagysz\xFCl\u0151`;
1783
1795
  }
1784
1796
  child() {
1785
1797
  const level = Math.abs(this.pathN?.level ?? 0);
@@ -1861,7 +1873,7 @@ var KinshipTranslatorHU = class extends KinshipTranslatorBasic {
1861
1873
  }
1862
1874
  of(relation) {
1863
1875
  const formattedName = nameFormatter(this.path?.[0]?.indi, {
1864
- nameOrder: "last-first"
1876
+ nameOrder: this.nameOrder
1865
1877
  });
1866
1878
  let name = formattedName.inOrder.filter(Boolean).join(" ");
1867
1879
  if (this.displayName === "none") {
@@ -1973,27 +1985,30 @@ var KinshipTranslatorEn = class extends KinshipTranslatorBasic {
1973
1985
  if (!degree) {
1974
1986
  return level < 0 ? this.nibling() : this.auncle();
1975
1987
  }
1976
- return `${ordinalize(degree)} cousin ${level}x removed`;
1988
+ return `${ordinalize(degree)} cousin ${Math.abs(level)}x removed`;
1977
1989
  }
1978
1990
  auncle() {
1979
- const prefix = this.directPrefix();
1991
+ const level = Math.abs(this.pathN?.level ?? 0);
1992
+ const greats = level <= 1 ? "" : "great-".repeat(level - 1);
1980
1993
  if (this.personN?.isMale()) {
1981
- return `${prefix}uncle`;
1994
+ return `${greats}uncle`;
1982
1995
  }
1983
1996
  if (this.personN?.isFemale()) {
1984
- return `${prefix}aunt`;
1997
+ return `${greats}aunt`;
1985
1998
  }
1986
- return `${prefix}auncle`;
1999
+ return greats ? `${greats}uncle/${greats}aunt` : "uncle/aunt";
1987
2000
  }
1988
2001
  nibling() {
1989
- const prefix = this.directPrefix();
2002
+ const level = Math.abs(this.pathN?.level ?? 0);
2003
+ const greats = level <= 2 ? "" : "great-".repeat(level - 2);
2004
+ const grand = level <= 1 ? "" : "grand";
1990
2005
  if (this.personN?.isMale()) {
1991
- return `${prefix}nephew`;
2006
+ return `${greats}${grand}nephew`;
1992
2007
  }
1993
2008
  if (this.personN?.isFemale()) {
1994
- return `${prefix}niece`;
2009
+ return `${greats}${grand}niece`;
1995
2010
  }
1996
- return `${prefix}nibling`;
2011
+ return greats || grand ? `${greats}${grand}nephew/${greats}${grand}niece` : "nephew/niece";
1997
2012
  }
1998
2013
  parent() {
1999
2014
  const prefix = this.directPrefix();
@@ -2072,7 +2087,7 @@ var KinshipTranslatorEn = class extends KinshipTranslatorBasic {
2072
2087
  }
2073
2088
  of(relation) {
2074
2089
  const formattedName = nameFormatter(this.path?.[0]?.indi, {
2075
- nameOrder: "first-last"
2090
+ nameOrder: this.nameOrder
2076
2091
  });
2077
2092
  let name = formattedName.inOrder.filter(Boolean).join(" ");
2078
2093
  if (this.displayName === "none") {
@@ -2121,45 +2136,64 @@ var KinshipTranslatorEn = class extends KinshipTranslatorBasic {
2121
2136
  };
2122
2137
 
2123
2138
  // src/kinship-translator/patterns.de.ts
2139
+ var parentRelationsDe = {
2140
+ step: "Stief",
2141
+ foster: "Pflege",
2142
+ adopted: "Adoptiv"
2143
+ };
2124
2144
  var InLawsDe = {
2125
- "Ehepartner von (kind|tochter|sohn)": "Schwiegerkind",
2126
- "Ehefrau von (kind|tochter|sohn)": "Schwiegertochter",
2127
- "Ehemann von (kind|tochter|sohn)": "Schwiegersohn",
2128
- "mutter des (Ehepartner|Ehefrau|Ehemann)s": "Schwiegermutter",
2129
- "vater des (Ehepartner|Ehefrau|Ehemann)s": "Schwiegervater",
2130
- "elternteil des (Ehepartner|Ehefrau|Ehemann)s": "Schwiegerelternteil",
2131
- "Ehefrau von (Halb)?(geschwister|schwester|bruder)": "Schw\xE4gerin",
2132
- "Ehemann von (Halb)?(geschwister|schwester|bruder)": "Schwager",
2133
- "Ehepartner von (Halb)?(geschwister|schwester|bruder)": "Schwager/Schw\xE4gerin",
2134
- "(Halb)?schwester des (Ehepartner|Ehefrau|Ehemann)s": "Schw\xE4gerin",
2135
- "(Halb)?bruder des (Ehepartner|Ehefrau|Ehemann)s": "Schwager",
2136
- "(Halb)?geschwister des (Ehepartner|Ehefrau|Ehemann)s": "Schwager/Schw\xE4gerin"
2145
+ "Ehepartner von (Kind|Tochter|Sohn)": "Schwiegerkind",
2146
+ "Ehefrau von (Kind|Tochter|Sohn)": "Schwiegertochter",
2147
+ "Ehemann von (Kind|Tochter|Sohn)": "Schwiegersohn",
2148
+ "Mutter (des Ehepartners|des Ehemanns|der Ehefrau)": "Schwiegermutter",
2149
+ "Vater (des Ehepartners|des Ehemanns|der Ehefrau)": "Schwiegervater",
2150
+ "Elternteil (des Ehepartners|des Ehemanns|der Ehefrau)": "Schwiegerelternteil",
2151
+ "Ehefrau von (Halb)?-?(Geschwister|Schwester|Bruder)": "Schw\xE4gerin",
2152
+ "Ehemann von (Halb)?-?(Geschwister|Schwester|Bruder)": "Schwager",
2153
+ "Ehepartner von (Halb)?-?(Geschwister|Schwester|Bruder)": "Schwager/Schw\xE4gerin",
2154
+ "(Halb)?-?(Schwester|schwester) (des Ehepartners|des Ehemanns|der Ehefrau)": "Schw\xE4gerin",
2155
+ "(Halb)?-?(Bruder|bruder) (des Ehepartners|des Ehemanns|der Ehefrau)": "Schwager",
2156
+ "(Halb)?-?(Geschwister|geschwister) (des Ehepartners|des Ehemanns|der Ehefrau)": "Schwager/Schw\xE4gerin"
2137
2157
  };
2138
2158
 
2139
2159
  // src/kinship-translator/kinship-translator.de.ts
2140
- var KinshipTranslatorDe = class extends KinshipTranslatorBasic {
2141
- directPrefix() {
2142
- const level = Math.abs(this.pathN?.level ?? 0);
2143
- if (level <= 1) {
2144
- return "";
2145
- }
2146
- if (level === 2) {
2147
- return "Gro\xDF";
2148
- }
2149
- if (level === 3) {
2150
- return "Urgro\xDF";
2151
- }
2152
- return `Ur${level - 2}-gro\xDF`;
2160
+ var sexOf = (person) => {
2161
+ if (person?.isMale?.()) {
2162
+ return "m";
2163
+ }
2164
+ if (person?.isFemale?.()) {
2165
+ return "f";
2153
2166
  }
2167
+ return "n";
2168
+ };
2169
+ var pick = (sex, male, female, neutral) => {
2170
+ if (sex === "m") {
2171
+ return male;
2172
+ }
2173
+ if (sex === "f") {
2174
+ return female;
2175
+ }
2176
+ return neutral;
2177
+ };
2178
+ var ur = (count) => count > 0 ? "Ur".repeat(count) : "";
2179
+ var genitiveArticle = (spouseType) => {
2180
+ if (spouseType === "Ehefrau") {
2181
+ return `der ${spouseType}`;
2182
+ }
2183
+ return `des ${spouseType}s`;
2184
+ };
2185
+ var KinshipTranslatorDe = class extends KinshipTranslatorBasic {
2154
2186
  indirect() {
2155
2187
  let degree = Math.abs(this.pathN?.degree ?? 0);
2156
2188
  if (degree > 0) {
2157
2189
  degree = degree - 1;
2158
2190
  }
2159
- if (degree === 1) {
2160
- return `Cousin`;
2191
+ const sex = sexOf(this.personN);
2192
+ const cousin = pick(sex, "Cousin", "Cousine", "Cousin/Cousine");
2193
+ if (degree <= 1) {
2194
+ return cousin;
2161
2195
  }
2162
- return `Cousin ${degree}. Grades`;
2196
+ return `${cousin} ${degree}. Grades`;
2163
2197
  }
2164
2198
  removal() {
2165
2199
  const level = this.pathN?.level ?? 0;
@@ -2170,106 +2204,106 @@ var KinshipTranslatorDe = class extends KinshipTranslatorBasic {
2170
2204
  if (!degree) {
2171
2205
  return level < 0 ? this.nibling() : this.auncle();
2172
2206
  }
2173
- return `Cousin ${degree}. Grades ${Math.abs(level)}\xD7 entfernt`;
2207
+ return `${this.indirect()} ${Math.abs(level)}\xD7 entfernt`;
2174
2208
  }
2175
2209
  auncle() {
2176
- const prefix = this.directPrefix();
2177
- if (this.personN?.isMale()) {
2178
- return `${prefix}onkel`;
2179
- }
2180
- if (this.personN?.isFemale()) {
2181
- return `${prefix}tante`;
2210
+ const level = Math.abs(this.pathN?.level ?? 0);
2211
+ const sex = sexOf(this.personN);
2212
+ if (level <= 1) {
2213
+ return pick(sex, "Onkel", "Tante", "Onkel/Tante");
2182
2214
  }
2183
- return `${prefix}onkel/tante`;
2215
+ const prefix = `${ur(level - 2)}Gro\xDF`;
2216
+ return pick(
2217
+ sex,
2218
+ `${prefix}onkel`,
2219
+ `${prefix}tante`,
2220
+ `${prefix}onkel/tante`
2221
+ );
2184
2222
  }
2185
2223
  nibling() {
2186
- const prefix = this.directPrefix();
2187
- if (this.personN?.isMale()) {
2188
- return `${prefix}neffe`;
2189
- }
2190
- if (this.personN?.isFemale()) {
2191
- return `${prefix}nichte`;
2224
+ const level = Math.abs(this.pathN?.level ?? 0);
2225
+ const sex = sexOf(this.personN);
2226
+ if (level <= 1) {
2227
+ return pick(sex, "Neffe", "Nichte", "Neffe/Nichte");
2192
2228
  }
2193
- return `${prefix}neffe/nichte`;
2229
+ const prefix = `${ur(level - 2)}Gro\xDF`;
2230
+ return pick(
2231
+ sex,
2232
+ `${prefix}neffe`,
2233
+ `${prefix}nichte`,
2234
+ `${prefix}neffe/nichte`
2235
+ );
2194
2236
  }
2195
2237
  parent() {
2196
- const prefix = this.directPrefix();
2197
- if (this.personN?.isMale()) {
2198
- return `${prefix}vater`;
2199
- }
2200
- if (this.personN?.isFemale()) {
2201
- return `${prefix}mutter`;
2238
+ const level = Math.abs(this.pathN?.level ?? 0);
2239
+ const sex = sexOf(this.personN);
2240
+ if (level <= 1) {
2241
+ return pick(sex, "Vater", "Mutter", "Elternteil");
2202
2242
  }
2203
- return `${prefix}elternteil`;
2243
+ const prefix = `${ur(level - 2)}Gro\xDF`;
2244
+ return pick(
2245
+ sex,
2246
+ `${prefix}vater`,
2247
+ `${prefix}mutter`,
2248
+ `${prefix}elternteil`
2249
+ );
2204
2250
  }
2205
2251
  child() {
2206
- const prefix = this.directPrefix();
2207
- if (this.personN?.isMale()) {
2208
- return `${prefix}sohn`;
2209
- }
2210
- if (this.personN?.isFemale()) {
2211
- return `${prefix}tochter`;
2252
+ const level = Math.abs(this.pathN?.level ?? 0);
2253
+ const sex = sexOf(this.personN);
2254
+ if (level <= 1) {
2255
+ return pick(sex, "Sohn", "Tochter", "Kind");
2212
2256
  }
2213
- return `${prefix}kind`;
2257
+ const prefix = ur(level - 2);
2258
+ return pick(
2259
+ sex,
2260
+ `${prefix}Enkel`,
2261
+ `${prefix}Enkelin`,
2262
+ `${prefix}Enkelkind`
2263
+ );
2214
2264
  }
2215
2265
  sibling() {
2216
- if (this.personN?.isMale()) {
2217
- return "bruder";
2218
- }
2219
- if (this.personN?.isFemale()) {
2220
- return "schwester";
2221
- }
2222
- return "geschwister";
2266
+ return pick(sexOf(this.personN), "Bruder", "Schwester", "Geschwister");
2223
2267
  }
2224
2268
  halfBlood(relation) {
2225
2269
  if (!relation || !this.isHalfBlood) {
2226
2270
  return relation ?? "";
2227
2271
  }
2228
- if (/^[A-ZÄÖÜ]/.test(relation) || /[-\s]/.test(relation)) {
2272
+ if (/[\s-]/.test(relation) || /^(Groß|Ur)/.test(relation)) {
2229
2273
  return `Halb-${relation}`;
2230
2274
  }
2231
- return `Halb${relation}`;
2275
+ return `Halb${relation.charAt(0).toLowerCase()}${relation.slice(1)}`;
2232
2276
  }
2233
2277
  spouse() {
2234
- if (this.personN?.isMale()) {
2235
- return "Ehemann";
2236
- }
2237
- if (this.personN?.isFemale()) {
2238
- return "Ehefrau";
2239
- }
2240
- return "Ehepartner";
2278
+ return pick(sexOf(this.personN), "Ehemann", "Ehefrau", "Ehepartner");
2241
2279
  }
2242
2280
  ofSpouse(relation) {
2243
2281
  if (!relation) {
2244
2282
  return "";
2245
2283
  }
2246
- const spouse = this.path?.[1].indi;
2247
- let spouseType = "Ehepartner";
2248
- if (spouse?.isMale()) {
2249
- spouseType = "Ehemann";
2250
- }
2251
- if (spouse?.isFemale()) {
2252
- spouseType = "Ehefrau";
2253
- }
2254
- return `${relation} des ${spouseType}s`;
2284
+ const spouseType = pick(
2285
+ sexOf(this.path?.[1].indi),
2286
+ "Ehemann",
2287
+ "Ehefrau",
2288
+ "Ehepartner"
2289
+ );
2290
+ return `${relation} ${genitiveArticle(spouseType)}`;
2255
2291
  }
2256
2292
  spouseOf(relation) {
2257
2293
  if (!relation) {
2258
2294
  return "";
2259
2295
  }
2260
- const spouse = this.path?.[this.path.length - 1].indi;
2261
- let spouseType = "Ehepartner";
2262
- if (spouse?.isMale()) {
2263
- spouseType = "Ehemann";
2264
- }
2265
- if (spouse?.isFemale()) {
2266
- spouseType = "Ehefrau";
2267
- }
2296
+ const spouseType = pick(
2297
+ sexOf(this.path?.[this.path.length - 1].indi),
2298
+ "Ehemann",
2299
+ "Ehefrau",
2300
+ "Ehepartner"
2301
+ );
2268
2302
  return `${spouseType} von ${relation}`;
2269
2303
  }
2270
2304
  of(relation) {
2271
2305
  const formattedName = nameFormatter(this.path?.[0]?.indi, {
2272
- nameOrder: "first-last"
2306
+ nameOrder: this.nameOrder
2273
2307
  });
2274
2308
  let name = formattedName.inOrder.filter(Boolean).join(" ");
2275
2309
  if (this.displayName === "none") {
@@ -2282,8 +2316,8 @@ var KinshipTranslatorDe = class extends KinshipTranslatorBasic {
2282
2316
  if (!name || !relation) {
2283
2317
  return relation ?? "";
2284
2318
  }
2285
- if (relation.includes(" des ") || relation.includes(" von ")) {
2286
- return relation.replace(/ (des|von) /, ` $1 ${name}s `);
2319
+ if (relation.includes(" des ") || relation.includes(" der ") || relation.includes(" von ")) {
2320
+ return relation.replace(/ (des|der|von) /, ` $1 ${name}s `);
2287
2321
  }
2288
2322
  return `${name}s ${relation}`;
2289
2323
  }
@@ -2313,50 +2347,82 @@ var KinshipTranslatorDe = class extends KinshipTranslatorBasic {
2313
2347
  if (!relation || !this.pathN?.relation) {
2314
2348
  return relation ?? "";
2315
2349
  }
2316
- return `${this.pathN.relation} ${relation}`;
2350
+ const prefix = parentRelationsDe[this.pathN.relation];
2351
+ if (!prefix) {
2352
+ return relation;
2353
+ }
2354
+ if (prefix.endsWith("-") || prefix.endsWith(" ")) {
2355
+ return `${prefix}${relation}`;
2356
+ }
2357
+ return `${prefix}${relation.charAt(0).toLowerCase()}${relation.slice(1)}`;
2317
2358
  }
2318
2359
  };
2319
2360
 
2320
2361
  // src/kinship-translator/patterns.fr.ts
2362
+ var parentRelationsFr = {
2363
+ step: "step",
2364
+ foster: "foster",
2365
+ adopted: "adopted"
2366
+ };
2321
2367
  var InLawsFr = {
2322
2368
  "conjoint de (enfant|fille|fils)": "beau-fils/belle-fille",
2323
2369
  "\xE9pouse de (enfant|fille|fils)": "belle-fille",
2324
2370
  "mari de (enfant|fille|fils)": "gendre",
2325
- "m\xE8re du (conjoint|\xE9pouse|mari)": "belle-m\xE8re",
2326
- "p\xE8re du (conjoint|\xE9pouse|mari)": "beau-p\xE8re",
2327
- "parent du (conjoint|\xE9pouse|mari)": "beau-parent",
2371
+ "m\xE8re (du mari|du conjoint|de l'\xE9pouse)": "belle-m\xE8re",
2372
+ "p\xE8re (du mari|du conjoint|de l'\xE9pouse)": "beau-p\xE8re",
2373
+ "parent (du mari|du conjoint|de l'\xE9pouse)": "beau-parent",
2328
2374
  "\xE9pouse de (demi-)?(fr\xE8re/s\u0153ur|s\u0153ur|fr\xE8re)": "belle-s\u0153ur",
2329
2375
  "mari de (demi-)?(fr\xE8re/s\u0153ur|s\u0153ur|fr\xE8re)": "beau-fr\xE8re",
2330
2376
  "conjoint de (demi-)?(fr\xE8re/s\u0153ur|s\u0153ur|fr\xE8re)": "beau-fr\xE8re/belle-s\u0153ur",
2331
- "(demi-)?s\u0153ur du (conjoint|\xE9pouse|mari)": "belle-s\u0153ur",
2332
- "(demi-)?fr\xE8re du (conjoint|\xE9pouse|mari)": "beau-fr\xE8re",
2333
- "(demi-)?fr\xE8re/s\u0153ur du (conjoint|\xE9pouse|mari)": "beau-fr\xE8re/belle-s\u0153ur"
2377
+ "(demi-)?s\u0153ur (du mari|du conjoint|de l'\xE9pouse)": "belle-s\u0153ur",
2378
+ "(demi-)?fr\xE8re (du mari|du conjoint|de l'\xE9pouse)": "beau-fr\xE8re",
2379
+ "(demi-)?fr\xE8re/s\u0153ur (du mari|du conjoint|de l'\xE9pouse)": "beau-fr\xE8re/belle-s\u0153ur"
2334
2380
  };
2335
2381
 
2336
2382
  // src/kinship-translator/kinship-translator.fr.ts
2337
- var KinshipTranslatorFr = class extends KinshipTranslatorBasic {
2338
- directPrefix() {
2339
- const level = Math.abs(this.pathN?.level ?? 0);
2340
- if (level <= 1) {
2341
- return "";
2342
- }
2343
- if (level === 2) {
2344
- return "grand-";
2345
- }
2346
- if (level === 3) {
2347
- return "arri\xE8re-grand-";
2348
- }
2349
- return `arri\xE8re${level - 2}-grand-`;
2383
+ var sexOf2 = (person) => {
2384
+ if (person?.isMale?.()) {
2385
+ return "m";
2386
+ }
2387
+ if (person?.isFemale?.()) {
2388
+ return "f";
2350
2389
  }
2390
+ return "n";
2391
+ };
2392
+ var pick2 = (sex, male, female, neutral) => {
2393
+ if (sex === "m") {
2394
+ return male;
2395
+ }
2396
+ if (sex === "f") {
2397
+ return female;
2398
+ }
2399
+ return neutral;
2400
+ };
2401
+ var arriere = (count) => count > 0 ? "arri\xE8re-".repeat(count) : "";
2402
+ var frenchOrdinal = (n) => n === 1 ? "1er" : `${n}e`;
2403
+ var isFeminineRelation = (relation) => /mère|fille|sœur|tante|nièce|cousine|épouse/.test(relation);
2404
+ var ofSpousePrep = (spouseType) => {
2405
+ if (spouseType === "\xE9pouse") {
2406
+ return "de l'";
2407
+ }
2408
+ return "du ";
2409
+ };
2410
+ var KinshipTranslatorFr = class extends KinshipTranslatorBasic {
2351
2411
  indirect() {
2352
2412
  let degree = Math.abs(this.pathN?.degree ?? 0);
2353
2413
  if (degree > 0) {
2354
2414
  degree = degree - 1;
2355
2415
  }
2356
- if (degree === 1) {
2357
- return `cousin`;
2416
+ const cousin = pick2(
2417
+ sexOf2(this.personN),
2418
+ "cousin",
2419
+ "cousine",
2420
+ "cousin/cousine"
2421
+ );
2422
+ if (degree <= 1) {
2423
+ return cousin;
2358
2424
  }
2359
- return `cousin au ${ordinalize(degree)} degr\xE9`;
2425
+ return `${cousin} au ${frenchOrdinal(degree)} degr\xE9`;
2360
2426
  }
2361
2427
  removal() {
2362
2428
  const level = this.pathN?.level ?? 0;
@@ -2367,56 +2433,57 @@ var KinshipTranslatorFr = class extends KinshipTranslatorBasic {
2367
2433
  if (!degree) {
2368
2434
  return level < 0 ? this.nibling() : this.auncle();
2369
2435
  }
2370
- return `cousin au ${ordinalize(degree)} degr\xE9 ${Math.abs(level)}\xD7 \xE9loign\xE9`;
2436
+ return `${this.indirect()} ${Math.abs(level)}\xD7 \xE9loign\xE9`;
2371
2437
  }
2372
2438
  auncle() {
2373
- const prefix = this.directPrefix();
2374
- if (this.personN?.isMale()) {
2375
- return `${prefix}oncle`;
2376
- }
2377
- if (this.personN?.isFemale()) {
2378
- return `${prefix}tante`;
2439
+ const level = Math.abs(this.pathN?.level ?? 0);
2440
+ const sex = sexOf2(this.personN);
2441
+ const base = pick2(sex, "oncle", "tante", "oncle/tante");
2442
+ if (level <= 1) {
2443
+ return base;
2379
2444
  }
2380
- return `${prefix}oncle/tante`;
2445
+ const grands = pick2(
2446
+ sex,
2447
+ "grand-oncle",
2448
+ "grand-tante",
2449
+ "grand-oncle/tante"
2450
+ );
2451
+ return `${arriere(level - 2)}${grands}`;
2381
2452
  }
2382
2453
  nibling() {
2383
- const prefix = this.directPrefix();
2384
- if (this.personN?.isMale()) {
2385
- return `${prefix}neveu`;
2386
- }
2387
- if (this.personN?.isFemale()) {
2388
- return `${prefix}ni\xE8ce`;
2454
+ const level = Math.abs(this.pathN?.level ?? 0);
2455
+ const sex = sexOf2(this.personN);
2456
+ if (level <= 1) {
2457
+ return pick2(sex, "neveu", "ni\xE8ce", "neveu/ni\xE8ce");
2389
2458
  }
2390
- return `${prefix}neveu/ni\xE8ce`;
2459
+ const grands = pick2(
2460
+ sex,
2461
+ "grand-neveu",
2462
+ "grande-ni\xE8ce",
2463
+ "grand-neveu/grande-ni\xE8ce"
2464
+ );
2465
+ return `${arriere(level - 2)}${grands}`;
2391
2466
  }
2392
2467
  parent() {
2393
- const prefix = this.directPrefix();
2394
- if (this.personN?.isMale()) {
2395
- return `${prefix}p\xE8re`;
2396
- }
2397
- if (this.personN?.isFemale()) {
2398
- return `${prefix}m\xE8re`;
2468
+ const level = Math.abs(this.pathN?.level ?? 0);
2469
+ const sex = sexOf2(this.personN);
2470
+ if (level <= 1) {
2471
+ return pick2(sex, "p\xE8re", "m\xE8re", "parent");
2399
2472
  }
2400
- return `${prefix}parent`;
2473
+ const grands = pick2(sex, "grand-p\xE8re", "grand-m\xE8re", "grand-parent");
2474
+ return `${arriere(level - 2)}${grands}`;
2401
2475
  }
2402
2476
  child() {
2403
- const prefix = this.directPrefix();
2404
- if (this.personN?.isMale()) {
2405
- return `${prefix}fils`;
2406
- }
2407
- if (this.personN?.isFemale()) {
2408
- return `${prefix}fille`;
2477
+ const level = Math.abs(this.pathN?.level ?? 0);
2478
+ const sex = sexOf2(this.personN);
2479
+ if (level <= 1) {
2480
+ return pick2(sex, "fils", "fille", "enfant");
2409
2481
  }
2410
- return `${prefix}enfant`;
2482
+ const petits = pick2(sex, "petit-fils", "petite-fille", "petit-enfant");
2483
+ return `${arriere(level - 2)}${petits}`;
2411
2484
  }
2412
2485
  sibling() {
2413
- if (this.personN?.isMale()) {
2414
- return "fr\xE8re";
2415
- }
2416
- if (this.personN?.isFemale()) {
2417
- return "s\u0153ur";
2418
- }
2419
- return "fr\xE8re/s\u0153ur";
2486
+ return pick2(sexOf2(this.personN), "fr\xE8re", "s\u0153ur", "fr\xE8re/s\u0153ur");
2420
2487
  }
2421
2488
  halfBlood(relation) {
2422
2489
  if (!relation || !this.isHalfBlood) {
@@ -2425,45 +2492,35 @@ var KinshipTranslatorFr = class extends KinshipTranslatorBasic {
2425
2492
  return `demi-${relation}`;
2426
2493
  }
2427
2494
  spouse() {
2428
- if (this.personN?.isMale()) {
2429
- return "mari";
2430
- }
2431
- if (this.personN?.isFemale()) {
2432
- return "\xE9pouse";
2433
- }
2434
- return "conjoint";
2495
+ return pick2(sexOf2(this.personN), "mari", "\xE9pouse", "conjoint");
2435
2496
  }
2436
2497
  ofSpouse(relation) {
2437
2498
  if (!relation) {
2438
2499
  return "";
2439
2500
  }
2440
- const spouse = this.path?.[1].indi;
2441
- let spouseType = "conjoint";
2442
- if (spouse?.isMale()) {
2443
- spouseType = "mari";
2444
- }
2445
- if (spouse?.isFemale()) {
2446
- spouseType = "\xE9pouse";
2447
- }
2448
- return `${relation} du ${spouseType}`;
2501
+ const spouseType = pick2(
2502
+ sexOf2(this.path?.[1].indi),
2503
+ "mari",
2504
+ "\xE9pouse",
2505
+ "conjoint"
2506
+ );
2507
+ return `${relation} ${ofSpousePrep(spouseType)}${spouseType}`;
2449
2508
  }
2450
2509
  spouseOf(relation) {
2451
2510
  if (!relation) {
2452
2511
  return "";
2453
2512
  }
2454
- const spouse = this.path?.[this.path.length - 1].indi;
2455
- let spouseType = "conjoint";
2456
- if (spouse?.isMale()) {
2457
- spouseType = "mari";
2458
- }
2459
- if (spouse?.isFemale()) {
2460
- spouseType = "\xE9pouse";
2461
- }
2513
+ const spouseType = pick2(
2514
+ sexOf2(this.path?.[this.path.length - 1].indi),
2515
+ "mari",
2516
+ "\xE9pouse",
2517
+ "conjoint"
2518
+ );
2462
2519
  return `${spouseType} de ${relation}`;
2463
2520
  }
2464
2521
  of(relation) {
2465
2522
  const formattedName = nameFormatter(this.path?.[0]?.indi, {
2466
- nameOrder: "first-last"
2523
+ nameOrder: this.nameOrder
2467
2524
  });
2468
2525
  let name = formattedName.inOrder.filter(Boolean).join(" ");
2469
2526
  if (this.displayName === "none") {
@@ -2479,6 +2536,9 @@ var KinshipTranslatorFr = class extends KinshipTranslatorBasic {
2479
2536
  if (relation.includes(" du ") || relation.includes(" de ")) {
2480
2537
  return relation.replace(/ (du|de) /, ` $1 ${name} `);
2481
2538
  }
2539
+ if (relation.includes(" de l'")) {
2540
+ return relation.replace(" de l'", ` de ${name} l'`);
2541
+ }
2482
2542
  return `${relation} de ${name}`;
2483
2543
  }
2484
2544
  inLaw(relation) {
@@ -2507,50 +2567,118 @@ var KinshipTranslatorFr = class extends KinshipTranslatorBasic {
2507
2567
  if (!relation || !this.pathN?.relation) {
2508
2568
  return relation ?? "";
2509
2569
  }
2510
- return `${this.pathN.relation} ${relation}`;
2570
+ const kind = parentRelationsFr[this.pathN.relation];
2571
+ if (!kind) {
2572
+ return relation;
2573
+ }
2574
+ if (kind === "step") {
2575
+ return `${isFeminineRelation(relation) ? "belle-" : "beau-"}${relation}`;
2576
+ }
2577
+ if (kind === "adopted") {
2578
+ return `${relation} ${isFeminineRelation(relation) ? "adoptive" : "adoptif"}`;
2579
+ }
2580
+ if (kind === "foster") {
2581
+ return `${relation} d'accueil`;
2582
+ }
2583
+ return relation;
2511
2584
  }
2512
2585
  };
2513
2586
 
2514
2587
  // src/kinship-translator/patterns.es.ts
2588
+ var parentRelationsEs = {
2589
+ step: {
2590
+ padre: "padrastro",
2591
+ madre: "madrastra",
2592
+ hijo: "hijastro",
2593
+ hija: "hijastra",
2594
+ hermano: "hermanastro",
2595
+ hermana: "hermanastra",
2596
+ abuelo: "abuelastro",
2597
+ abuela: "abuelastra"
2598
+ }
2599
+ };
2515
2600
  var InLawsEs = {
2516
2601
  "c\xF3nyuge de (hijo/hija|hija|hijo)": "yerno/nuera",
2517
2602
  "esposa de (hijo/hija|hija|hijo)": "nuera",
2518
2603
  "esposo de (hijo/hija|hija|hijo)": "yerno",
2519
- "madre del (c\xF3nyuge|esposa|esposo)": "suegra",
2520
- "padre del (c\xF3nyuge|esposa|esposo)": "suegro",
2521
- "padre/madre del (c\xF3nyuge|esposa|esposo)": "suegro/suegra",
2604
+ "madre (del c\xF3nyuge|del esposo|de la esposa)": "suegra",
2605
+ "padre (del c\xF3nyuge|del esposo|de la esposa)": "suegro",
2606
+ "padre/madre (del c\xF3nyuge|del esposo|de la esposa)": "suegro/suegra",
2522
2607
  "esposa de (medio |media |medio/a )?(hermano/hermana|hermana|hermano)": "cu\xF1ada",
2523
2608
  "esposo de (medio |media |medio/a )?(hermano/hermana|hermana|hermano)": "cu\xF1ado",
2524
2609
  "c\xF3nyuge de (medio |media |medio/a )?(hermano/hermana|hermana|hermano)": "cu\xF1ado/cu\xF1ada",
2525
- "(medio |media |medio/a )?hermana del (c\xF3nyuge|esposa|esposo)": "cu\xF1ada",
2526
- "(medio |media |medio/a )?hermano del (c\xF3nyuge|esposa|esposo)": "cu\xF1ado",
2527
- "(medio |media |medio/a )?hermano/hermana del (c\xF3nyuge|esposa|esposo)": "cu\xF1ado/cu\xF1ada"
2610
+ "(medio |media |medio/a )?hermana (del c\xF3nyuge|del esposo|de la esposa)": "cu\xF1ada",
2611
+ "(medio |media |medio/a )?hermano (del c\xF3nyuge|del esposo|de la esposa)": "cu\xF1ado",
2612
+ "(medio |media |medio/a )?hermano/hermana (del c\xF3nyuge|del esposo|de la esposa)": "cu\xF1ado/cu\xF1ada"
2528
2613
  };
2529
2614
 
2530
2615
  // src/kinship-translator/kinship-translator.es.ts
2531
- var KinshipTranslatorEs = class extends KinshipTranslatorBasic {
2532
- directPrefix() {
2533
- const level = Math.abs(this.pathN?.level ?? 0);
2534
- if (level <= 1) {
2535
- return "";
2536
- }
2537
- if (level === 2) {
2538
- return "bisabuel";
2539
- }
2540
- if (level === 3) {
2541
- return "tatarabuel";
2542
- }
2543
- return `t\xE1tara${level - 2}-abuel`;
2616
+ var sexOf3 = (person) => {
2617
+ if (person?.isMale?.()) {
2618
+ return "m";
2544
2619
  }
2620
+ if (person?.isFemale?.()) {
2621
+ return "f";
2622
+ }
2623
+ return "n";
2624
+ };
2625
+ var pick3 = (sex, male, female, neutral) => {
2626
+ if (sex === "m") {
2627
+ return male;
2628
+ }
2629
+ if (sex === "f") {
2630
+ return female;
2631
+ }
2632
+ return neutral;
2633
+ };
2634
+ var SPANISH_ORDINALS_M = [
2635
+ "",
2636
+ "",
2637
+ "segundo",
2638
+ "tercero",
2639
+ "cuarto",
2640
+ "quinto",
2641
+ "sexto",
2642
+ "s\xE9ptimo",
2643
+ "octavo",
2644
+ "noveno",
2645
+ "d\xE9cimo"
2646
+ ];
2647
+ var SPANISH_ORDINALS_F = [
2648
+ "",
2649
+ "",
2650
+ "segunda",
2651
+ "tercera",
2652
+ "cuarta",
2653
+ "quinta",
2654
+ "sexta",
2655
+ "s\xE9ptima",
2656
+ "octava",
2657
+ "novena",
2658
+ "d\xE9cima"
2659
+ ];
2660
+ var spanishOrdinal = (n, sex) => {
2661
+ const list = sex === "f" ? SPANISH_ORDINALS_F : SPANISH_ORDINALS_M;
2662
+ return list[n] ?? `${n}.\xBA`;
2663
+ };
2664
+ var ofSpousePrep2 = (spouseType) => {
2665
+ if (spouseType === "esposa") {
2666
+ return "de la ";
2667
+ }
2668
+ return "del ";
2669
+ };
2670
+ var KinshipTranslatorEs = class extends KinshipTranslatorBasic {
2545
2671
  indirect() {
2546
2672
  let degree = Math.abs(this.pathN?.degree ?? 0);
2547
2673
  if (degree > 0) {
2548
2674
  degree = degree - 1;
2549
2675
  }
2550
- if (degree === 1) {
2551
- return `primo`;
2676
+ const sex = sexOf3(this.personN);
2677
+ const cousin = pick3(sex, "primo", "prima", "primo/prima");
2678
+ if (degree <= 1) {
2679
+ return cousin;
2552
2680
  }
2553
- return `primo ${ordinalize(degree)}`;
2681
+ return `${cousin} ${spanishOrdinal(degree, sex)}`;
2554
2682
  }
2555
2683
  removal() {
2556
2684
  const level = this.pathN?.level ?? 0;
@@ -2561,56 +2689,133 @@ var KinshipTranslatorEs = class extends KinshipTranslatorBasic {
2561
2689
  if (!degree) {
2562
2690
  return level < 0 ? this.nibling() : this.auncle();
2563
2691
  }
2564
- return `primo ${ordinalize(degree)} ${Math.abs(level)}\xD7 separado`;
2692
+ return `${this.indirect()} ${Math.abs(level)}\xD7 separado`;
2565
2693
  }
2566
2694
  auncle() {
2567
- const prefix = this.directPrefix();
2568
- if (this.personN?.isMale()) {
2569
- return `${prefix}t\xEDo`;
2695
+ const level = Math.abs(this.pathN?.level ?? 0);
2696
+ const sex = sexOf3(this.personN);
2697
+ if (level <= 1) {
2698
+ return pick3(sex, "t\xEDo", "t\xEDa", "t\xEDo/t\xEDa");
2570
2699
  }
2571
- if (this.personN?.isFemale()) {
2572
- return `${prefix}t\xEDa`;
2700
+ if (level === 2) {
2701
+ return pick3(sex, "t\xEDo abuelo", "t\xEDa abuela", "t\xEDo/t\xEDa abuelo");
2702
+ }
2703
+ if (level === 3) {
2704
+ return pick3(
2705
+ sex,
2706
+ "t\xEDo bisabuelo",
2707
+ "t\xEDa bisabuela",
2708
+ "t\xEDo/t\xEDa bisabuelo"
2709
+ );
2573
2710
  }
2574
- return `${prefix}t\xEDo/t\xEDa`;
2711
+ return pick3(
2712
+ sex,
2713
+ `t\xEDo abuelo (${level - 1}.\xBA)`,
2714
+ `t\xEDa abuela (${level - 1}.\xAA)`,
2715
+ `t\xEDo/t\xEDa abuelo (${level - 1}.\xBA)`
2716
+ );
2575
2717
  }
2576
2718
  nibling() {
2577
- const prefix = this.directPrefix();
2578
- if (this.personN?.isMale()) {
2579
- return `${prefix}sobrino`;
2719
+ const level = Math.abs(this.pathN?.level ?? 0);
2720
+ const sex = sexOf3(this.personN);
2721
+ if (level <= 1) {
2722
+ return pick3(sex, "sobrino", "sobrina", "sobrino/sobrina");
2580
2723
  }
2581
- if (this.personN?.isFemale()) {
2582
- return `${prefix}sobrina`;
2724
+ if (level === 2) {
2725
+ return pick3(
2726
+ sex,
2727
+ "sobrino nieto",
2728
+ "sobrina nieta",
2729
+ "sobrino/sobrina nieto"
2730
+ );
2731
+ }
2732
+ if (level === 3) {
2733
+ return pick3(
2734
+ sex,
2735
+ "sobrino bisnieto",
2736
+ "sobrina bisnieta",
2737
+ "sobrino/sobrina bisnieto"
2738
+ );
2583
2739
  }
2584
- return `${prefix}sobrino/sobrina`;
2740
+ return pick3(
2741
+ sex,
2742
+ `sobrino nieto (${level - 1}.\xBA)`,
2743
+ `sobrina nieta (${level - 1}.\xAA)`,
2744
+ `sobrino/sobrina nieto (${level - 1}.\xBA)`
2745
+ );
2585
2746
  }
2586
2747
  parent() {
2587
- const prefix = this.directPrefix();
2588
- if (this.personN?.isMale()) {
2589
- return `${prefix}padre`;
2748
+ const level = Math.abs(this.pathN?.level ?? 0);
2749
+ const sex = sexOf3(this.personN);
2750
+ if (level <= 1) {
2751
+ return pick3(sex, "padre", "madre", "padre/madre");
2590
2752
  }
2591
- if (this.personN?.isFemale()) {
2592
- return `${prefix}madre`;
2753
+ if (level === 2) {
2754
+ return pick3(sex, "abuelo", "abuela", "abuelo/abuela");
2755
+ }
2756
+ if (level === 3) {
2757
+ return pick3(sex, "bisabuelo", "bisabuela", "bisabuelo/bisabuela");
2758
+ }
2759
+ if (level === 4) {
2760
+ return pick3(
2761
+ sex,
2762
+ "tatarabuelo",
2763
+ "tatarabuela",
2764
+ "tatarabuelo/tatarabuela"
2765
+ );
2766
+ }
2767
+ if (level === 5) {
2768
+ return pick3(
2769
+ sex,
2770
+ "trastatarabuelo",
2771
+ "trastatarabuela",
2772
+ "trastatarabuelo/trastatarabuela"
2773
+ );
2593
2774
  }
2594
- return `${prefix}padre/madre`;
2775
+ return pick3(
2776
+ sex,
2777
+ `abuelo (${level}.\xBA)`,
2778
+ `abuela (${level}.\xAA)`,
2779
+ `abuelo/abuela (${level}.\xBA)`
2780
+ );
2595
2781
  }
2596
2782
  child() {
2597
- const prefix = this.directPrefix();
2598
- if (this.personN?.isMale()) {
2599
- return `${prefix}hijo`;
2783
+ const level = Math.abs(this.pathN?.level ?? 0);
2784
+ const sex = sexOf3(this.personN);
2785
+ if (level <= 1) {
2786
+ return pick3(sex, "hijo", "hija", "hijo/hija");
2600
2787
  }
2601
- if (this.personN?.isFemale()) {
2602
- return `${prefix}hija`;
2788
+ if (level === 2) {
2789
+ return pick3(sex, "nieto", "nieta", "nieto/nieta");
2603
2790
  }
2604
- return `${prefix}hijo/hija`;
2605
- }
2606
- sibling() {
2607
- if (this.personN?.isMale()) {
2608
- return "hermano";
2791
+ if (level === 3) {
2792
+ return pick3(sex, "bisnieto", "bisnieta", "bisnieto/bisnieta");
2609
2793
  }
2610
- if (this.personN?.isFemale()) {
2611
- return "hermana";
2794
+ if (level === 4) {
2795
+ return pick3(
2796
+ sex,
2797
+ "tataranieto",
2798
+ "tataranieta",
2799
+ "tataranieto/tataranieta"
2800
+ );
2801
+ }
2802
+ if (level === 5) {
2803
+ return pick3(
2804
+ sex,
2805
+ "trastataranieto",
2806
+ "trastataranieta",
2807
+ "trastataranieto/trastataranieta"
2808
+ );
2612
2809
  }
2613
- return "hermano/hermana";
2810
+ return pick3(
2811
+ sex,
2812
+ `nieto (${level}.\xBA)`,
2813
+ `nieta (${level}.\xAA)`,
2814
+ `nieto/nieta (${level}.\xBA)`
2815
+ );
2816
+ }
2817
+ sibling() {
2818
+ return pick3(sexOf3(this.personN), "hermano", "hermana", "hermano/hermana");
2614
2819
  }
2615
2820
  halfBlood(relation) {
2616
2821
  if (!relation || !this.isHalfBlood) {
@@ -2625,45 +2830,35 @@ var KinshipTranslatorEs = class extends KinshipTranslatorBasic {
2625
2830
  return `medio/a ${relation}`;
2626
2831
  }
2627
2832
  spouse() {
2628
- if (this.personN?.isMale()) {
2629
- return "esposo";
2630
- }
2631
- if (this.personN?.isFemale()) {
2632
- return "esposa";
2633
- }
2634
- return "c\xF3nyuge";
2833
+ return pick3(sexOf3(this.personN), "esposo", "esposa", "c\xF3nyuge");
2635
2834
  }
2636
2835
  ofSpouse(relation) {
2637
2836
  if (!relation) {
2638
2837
  return "";
2639
2838
  }
2640
- const spouse = this.path?.[1].indi;
2641
- let spouseType = "c\xF3nyuge";
2642
- if (spouse?.isMale()) {
2643
- spouseType = "esposo";
2644
- }
2645
- if (spouse?.isFemale()) {
2646
- spouseType = "esposa";
2647
- }
2648
- return `${relation} del ${spouseType}`;
2839
+ const spouseType = pick3(
2840
+ sexOf3(this.path?.[1].indi),
2841
+ "esposo",
2842
+ "esposa",
2843
+ "c\xF3nyuge"
2844
+ );
2845
+ return `${relation} ${ofSpousePrep2(spouseType)}${spouseType}`;
2649
2846
  }
2650
2847
  spouseOf(relation) {
2651
2848
  if (!relation) {
2652
2849
  return "";
2653
2850
  }
2654
- const spouse = this.path?.[this.path.length - 1].indi;
2655
- let spouseType = "c\xF3nyuge";
2656
- if (spouse?.isMale()) {
2657
- spouseType = "esposo";
2658
- }
2659
- if (spouse?.isFemale()) {
2660
- spouseType = "esposa";
2661
- }
2851
+ const spouseType = pick3(
2852
+ sexOf3(this.path?.[this.path.length - 1].indi),
2853
+ "esposo",
2854
+ "esposa",
2855
+ "c\xF3nyuge"
2856
+ );
2662
2857
  return `${spouseType} de ${relation}`;
2663
2858
  }
2664
2859
  of(relation) {
2665
2860
  const formattedName = nameFormatter(this.path?.[0]?.indi, {
2666
- nameOrder: "first-last"
2861
+ nameOrder: this.nameOrder
2667
2862
  });
2668
2863
  let name = formattedName.inOrder.filter(Boolean).join(" ");
2669
2864
  if (this.displayName === "none") {
@@ -2676,8 +2871,8 @@ var KinshipTranslatorEs = class extends KinshipTranslatorBasic {
2676
2871
  if (!name || !relation) {
2677
2872
  return relation ?? "";
2678
2873
  }
2679
- if (relation.includes(" del ") || relation.includes(" de ")) {
2680
- return relation.replace(/ (del|de) /, ` $1 ${name} `);
2874
+ if (relation.includes(" del ") || relation.includes(" de la ") || relation.includes(" de ")) {
2875
+ return relation.replace(/ (del|de la|de) /, ` $1 ${name} `);
2681
2876
  }
2682
2877
  return `${relation} de ${name}`;
2683
2878
  }
@@ -2707,7 +2902,20 @@ var KinshipTranslatorEs = class extends KinshipTranslatorBasic {
2707
2902
  if (!relation || !this.pathN?.relation) {
2708
2903
  return relation ?? "";
2709
2904
  }
2710
- return `${this.pathN.relation} ${relation}`;
2905
+ const mapped = parentRelationsEs[this.pathN.relation]?.[relation];
2906
+ if (mapped) {
2907
+ return mapped;
2908
+ }
2909
+ if (this.pathN.relation === "step") {
2910
+ return `${relation} pol\xEDtico`;
2911
+ }
2912
+ if (this.pathN.relation === "adopted") {
2913
+ return `${relation} adoptivo`;
2914
+ }
2915
+ if (this.pathN.relation === "foster") {
2916
+ return `${relation} de acogida`;
2917
+ }
2918
+ return relation;
2711
2919
  }
2712
2920
  };
2713
2921
 
@@ -2716,15 +2924,35 @@ var InLawsRu = {
2716
2924
  "\u0441\u0443\u043F\u0440\u0443\u0433(?:\u0430)? (\u0440\u0435\u0431\u0451\u043D\u043A\u0430|\u0434\u043E\u0447\u0435\u0440\u0438|\u0441\u044B\u043D\u0430)": "\u0437\u044F\u0442\u044C/\u043D\u0435\u0432\u0435\u0441\u0442\u043A\u0430",
2717
2925
  "\u0436\u0435\u043D\u0430 (\u0440\u0435\u0431\u0451\u043D\u043A\u0430|\u0434\u043E\u0447\u0435\u0440\u0438|\u0441\u044B\u043D\u0430)": "\u043D\u0435\u0432\u0435\u0441\u0442\u043A\u0430",
2718
2926
  "\u043C\u0443\u0436 (\u0440\u0435\u0431\u0451\u043D\u043A\u0430|\u0434\u043E\u0447\u0435\u0440\u0438|\u0441\u044B\u043D\u0430)": "\u0437\u044F\u0442\u044C",
2719
- "\u043C\u0430\u0442\u044C (\u0441\u0443\u043F\u0440\u0443\u0433\u0430|\u0436\u0435\u043D\u044B|\u043C\u0443\u0436\u0430)": "\u0442\u0451\u0449\u0430",
2720
- "\u043E\u0442\u0435\u0446 (\u0441\u0443\u043F\u0440\u0443\u0433\u0430|\u0436\u0435\u043D\u044B|\u043C\u0443\u0436\u0430)": "\u0442\u0435\u0441\u0442\u044C",
2721
- "\u0440\u043E\u0434\u0438\u0442\u0435\u043B\u044C (\u0441\u0443\u043F\u0440\u0443\u0433\u0430|\u0436\u0435\u043D\u044B|\u043C\u0443\u0436\u0430)": "\u0442\u0435\u0441\u0442\u044C/\u0442\u0451\u0449\u0430",
2927
+ "\u043C\u0430\u0442\u044C \u0436\u0435\u043D\u044B": "\u0442\u0451\u0449\u0430",
2928
+ "\u043C\u0430\u0442\u044C \u043C\u0443\u0436\u0430": "\u0441\u0432\u0435\u043A\u0440\u043E\u0432\u044C",
2929
+ "\u043C\u0430\u0442\u044C \u0441\u0443\u043F\u0440\u0443\u0433\u0430": "\u0442\u0451\u0449\u0430/\u0441\u0432\u0435\u043A\u0440\u043E\u0432\u044C",
2930
+ "\u043E\u0442\u0435\u0446 \u0436\u0435\u043D\u044B": "\u0442\u0435\u0441\u0442\u044C",
2931
+ "\u043E\u0442\u0435\u0446 \u043C\u0443\u0436\u0430": "\u0441\u0432\u0451\u043A\u043E\u0440",
2932
+ "\u043E\u0442\u0435\u0446 \u0441\u0443\u043F\u0440\u0443\u0433\u0430": "\u0442\u0435\u0441\u0442\u044C/\u0441\u0432\u0451\u043A\u043E\u0440",
2933
+ "\u0440\u043E\u0434\u0438\u0442\u0435\u043B\u044C \u0436\u0435\u043D\u044B": "\u0442\u0435\u0441\u0442\u044C/\u0442\u0451\u0449\u0430",
2934
+ "\u0440\u043E\u0434\u0438\u0442\u0435\u043B\u044C \u043C\u0443\u0436\u0430": "\u0441\u0432\u0451\u043A\u043E\u0440/\u0441\u0432\u0435\u043A\u0440\u043E\u0432\u044C",
2935
+ "\u0440\u043E\u0434\u0438\u0442\u0435\u043B\u044C \u0441\u0443\u043F\u0440\u0443\u0433\u0430": "\u0442\u0435\u0441\u0442\u044C/\u0442\u0451\u0449\u0430",
2722
2936
  "\u0436\u0435\u043D\u0430 (\u0441\u0432\u043E\u0434\u043D(?:\u044B\u0439|\u0430\u044F) )?(\u0431\u0440\u0430\u0442\u0430|\u0441\u0435\u0441\u0442\u0440\u044B|\u0441\u0438\u0431\u043B\u0438\u043D\u0433\u0430)": "\u043D\u0435\u0432\u0435\u0441\u0442\u043A\u0430",
2723
2937
  "\u043C\u0443\u0436 (\u0441\u0432\u043E\u0434\u043D(?:\u044B\u0439|\u0430\u044F) )?(\u0431\u0440\u0430\u0442\u0430|\u0441\u0435\u0441\u0442\u0440\u044B|\u0441\u0438\u0431\u043B\u0438\u043D\u0433\u0430)": "\u0437\u044F\u0442\u044C",
2724
2938
  "\u0441\u0443\u043F\u0440\u0443\u0433(?:\u0430)? (\u0441\u0432\u043E\u0434\u043D(?:\u044B\u0439|\u0430\u044F) )?(\u0431\u0440\u0430\u0442\u0430|\u0441\u0435\u0441\u0442\u0440\u044B|\u0441\u0438\u0431\u043B\u0438\u043D\u0433\u0430)": "\u0437\u044F\u0442\u044C/\u043D\u0435\u0432\u0435\u0441\u0442\u043A\u0430",
2725
- "(\u0441\u0432\u043E\u0434\u043D(?:\u044B\u0439|\u0430\u044F) )?\u0441\u0435\u0441\u0442\u0440\u0430 (\u0441\u0443\u043F\u0440\u0443\u0433\u0430|\u0436\u0435\u043D\u044B|\u043C\u0443\u0436\u0430)": "\u0437\u043E\u043B\u043E\u0432\u043A\u0430",
2726
- "(\u0441\u0432\u043E\u0434\u043D(?:\u044B\u0439|\u0430\u044F) )?\u0431\u0440\u0430\u0442 (\u0441\u0443\u043F\u0440\u0443\u0433\u0430|\u0436\u0435\u043D\u044B|\u043C\u0443\u0436\u0430)": "\u0448\u0443\u0440\u0438\u043D",
2727
- "(\u0441\u0432\u043E\u0434\u043D(?:\u044B\u0439|\u0430\u044F) )?\u0441\u0438\u0431\u043B\u0438\u043D\u0433 (\u0441\u0443\u043F\u0440\u0443\u0433\u0430|\u0436\u0435\u043D\u044B|\u043C\u0443\u0436\u0430)": "\u0448\u0443\u0440\u0438\u043D/\u0437\u043E\u043B\u043E\u0432\u043A\u0430"
2939
+ "(\u0441\u0432\u043E\u0434\u043D(?:\u044B\u0439|\u0430\u044F) )?\u0441\u0435\u0441\u0442\u0440\u0430 \u0436\u0435\u043D\u044B": "\u0441\u0432\u043E\u044F\u0447\u0435\u043D\u0438\u0446\u0430",
2940
+ "(\u0441\u0432\u043E\u0434\u043D(?:\u044B\u0439|\u0430\u044F) )?\u0441\u0435\u0441\u0442\u0440\u0430 \u043C\u0443\u0436\u0430": "\u0437\u043E\u043B\u043E\u0432\u043A\u0430",
2941
+ "(\u0441\u0432\u043E\u0434\u043D(?:\u044B\u0439|\u0430\u044F) )?\u0441\u0435\u0441\u0442\u0440\u0430 \u0441\u0443\u043F\u0440\u0443\u0433\u0430": "\u0441\u0432\u043E\u044F\u0447\u0435\u043D\u0438\u0446\u0430/\u0437\u043E\u043B\u043E\u0432\u043A\u0430",
2942
+ "(\u0441\u0432\u043E\u0434\u043D(?:\u044B\u0439|\u0430\u044F) )?\u0431\u0440\u0430\u0442 \u0436\u0435\u043D\u044B": "\u0448\u0443\u0440\u0438\u043D",
2943
+ "(\u0441\u0432\u043E\u0434\u043D(?:\u044B\u0439|\u0430\u044F) )?\u0431\u0440\u0430\u0442 \u043C\u0443\u0436\u0430": "\u0434\u0435\u0432\u0435\u0440\u044C",
2944
+ "(\u0441\u0432\u043E\u0434\u043D(?:\u044B\u0439|\u0430\u044F) )?\u0431\u0440\u0430\u0442 \u0441\u0443\u043F\u0440\u0443\u0433\u0430": "\u0448\u0443\u0440\u0438\u043D/\u0434\u0435\u0432\u0435\u0440\u044C",
2945
+ "(\u0441\u0432\u043E\u0434\u043D(?:\u044B\u0439|\u0430\u044F) )?\u0441\u0438\u0431\u043B\u0438\u043D\u0433 \u0436\u0435\u043D\u044B": "\u0448\u0443\u0440\u0438\u043D/\u0441\u0432\u043E\u044F\u0447\u0435\u043D\u0438\u0446\u0430",
2946
+ "(\u0441\u0432\u043E\u0434\u043D(?:\u044B\u0439|\u0430\u044F) )?\u0441\u0438\u0431\u043B\u0438\u043D\u0433 \u043C\u0443\u0436\u0430": "\u0434\u0435\u0432\u0435\u0440\u044C/\u0437\u043E\u043B\u043E\u0432\u043A\u0430",
2947
+ "(\u0441\u0432\u043E\u0434\u043D(?:\u044B\u0439|\u0430\u044F) )?\u0441\u0438\u0431\u043B\u0438\u043D\u0433 \u0441\u0443\u043F\u0440\u0443\u0433\u0430": "\u0448\u0443\u0440\u0438\u043D/\u0437\u043E\u043B\u043E\u0432\u043A\u0430"
2948
+ };
2949
+ var parentRelationsRu = {
2950
+ step: {
2951
+ \u043E\u0442\u0435\u0446: "\u043E\u0442\u0447\u0438\u043C",
2952
+ \u043C\u0430\u0442\u044C: "\u043C\u0430\u0447\u0435\u0445\u0430",
2953
+ \u0441\u044B\u043D: "\u043F\u0430\u0441\u044B\u043D\u043E\u043A",
2954
+ \u0434\u043E\u0447\u044C: "\u043F\u0430\u0434\u0447\u0435\u0440\u0438\u0446\u0430"
2955
+ }
2728
2956
  };
2729
2957
 
2730
2958
  // src/kinship-translator/kinship-translator.ru.ts
@@ -2755,7 +2983,7 @@ var cousinWord = (degree, sex) => {
2755
2983
  return `${stem}\u044B\u0439 \u0431\u0440\u0430\u0442/\u0441\u0435\u0441\u0442\u0440\u0430`;
2756
2984
  };
2757
2985
  var praRepeat = (count) => count > 0 ? "\u043F\u0440\u0430".repeat(count) : "";
2758
- var sexOf = (person) => {
2986
+ var sexOf4 = (person) => {
2759
2987
  if (person?.isMale?.()) {
2760
2988
  return "m";
2761
2989
  }
@@ -2770,7 +2998,7 @@ var KinshipTranslatorRu = class extends KinshipTranslatorBasic {
2770
2998
  if (degree > 0) {
2771
2999
  degree = degree - 1;
2772
3000
  }
2773
- return cousinWord(degree, sexOf(this.personN));
3001
+ return cousinWord(degree, sexOf4(this.personN));
2774
3002
  }
2775
3003
  removal() {
2776
3004
  const level = this.pathN?.level ?? 0;
@@ -2782,35 +3010,53 @@ var KinshipTranslatorRu = class extends KinshipTranslatorBasic {
2782
3010
  return level < 0 ? this.nibling() : this.auncle();
2783
3011
  }
2784
3012
  const removed = Math.abs(level);
2785
- return `${cousinWord(degree, sexOf(this.personN))} (${removed}\xD7 \u0447\u0435\u0440\u0435\u0437 \u043F\u043E\u043A\u043E\u043B\u0435\u043D\u0438\u0435)`;
3013
+ return `${cousinWord(degree, sexOf4(this.personN))} (${removed}\xD7 \u0447\u0435\u0440\u0435\u0437 \u043F\u043E\u043A\u043E\u043B\u0435\u043D\u0438\u0435)`;
2786
3014
  }
2787
3015
  auncle() {
2788
3016
  const level = Math.abs(this.pathN?.level ?? 0);
2789
- const pra = praRepeat(Math.max(0, level - 2));
2790
- const sex = sexOf(this.personN);
3017
+ const sex = sexOf4(this.personN);
3018
+ if (level <= 1) {
3019
+ if (sex === "m") {
3020
+ return "\u0434\u044F\u0434\u044F";
3021
+ }
3022
+ if (sex === "f") {
3023
+ return "\u0442\u0451\u0442\u044F";
3024
+ }
3025
+ return "\u0434\u044F\u0434\u044F/\u0442\u0451\u0442\u044F";
3026
+ }
3027
+ const pra = praRepeat(level - 2);
2791
3028
  if (sex === "m") {
2792
- return `${pra}\u0434\u044F\u0434\u044F`;
3029
+ return `\u0434\u0432\u043E\u044E\u0440\u043E\u0434\u043D\u044B\u0439 ${pra}\u0434\u0435\u0434`;
2793
3030
  }
2794
3031
  if (sex === "f") {
2795
- return `${pra}\u0442\u0451\u0442\u044F`;
3032
+ return `\u0434\u0432\u043E\u044E\u0440\u043E\u0434\u043D\u0430\u044F ${pra}\u0431\u0430\u0431\u0443\u0448\u043A\u0430`;
2796
3033
  }
2797
- return `${pra}\u0434\u044F\u0434\u044F/\u0442\u0451\u0442\u044F`;
3034
+ return `\u0434\u0432\u043E\u044E\u0440\u043E\u0434\u043D\u044B\u0439 ${pra}\u0434\u0435\u0434/\u0431\u0430\u0431\u0443\u0448\u043A\u0430`;
2798
3035
  }
2799
3036
  nibling() {
2800
3037
  const level = Math.abs(this.pathN?.level ?? 0);
2801
- const pra = praRepeat(Math.max(0, level - 2));
2802
- const sex = sexOf(this.personN);
3038
+ const sex = sexOf4(this.personN);
3039
+ if (level <= 1) {
3040
+ if (sex === "m") {
3041
+ return "\u043F\u043B\u0435\u043C\u044F\u043D\u043D\u0438\u043A";
3042
+ }
3043
+ if (sex === "f") {
3044
+ return "\u043F\u043B\u0435\u043C\u044F\u043D\u043D\u0438\u0446\u0430";
3045
+ }
3046
+ return "\u043F\u043B\u0435\u043C\u044F\u043D\u043D\u0438\u043A/\u043F\u043B\u0435\u043C\u044F\u043D\u043D\u0438\u0446\u0430";
3047
+ }
3048
+ const pra = praRepeat(level - 2);
2803
3049
  if (sex === "m") {
2804
- return `${pra}\u043F\u043B\u0435\u043C\u044F\u043D\u043D\u0438\u043A`;
3050
+ return `${pra}\u0432\u043D\u0443\u0447\u0430\u0442\u044B\u0439 \u043F\u043B\u0435\u043C\u044F\u043D\u043D\u0438\u043A`;
2805
3051
  }
2806
3052
  if (sex === "f") {
2807
- return `${pra}\u043F\u043B\u0435\u043C\u044F\u043D\u043D\u0438\u0446\u0430`;
3053
+ return `${pra}\u0432\u043D\u0443\u0447\u0430\u0442\u0430\u044F \u043F\u043B\u0435\u043C\u044F\u043D\u043D\u0438\u0446\u0430`;
2808
3054
  }
2809
- return `${pra}\u043F\u043B\u0435\u043C\u044F\u043D\u043D\u0438\u043A/\u043F\u043B\u0435\u043C\u044F\u043D\u043D\u0438\u0446\u0430`;
3055
+ return `${pra}\u0432\u043D\u0443\u0447\u0430\u0442\u044B\u0439 \u043F\u043B\u0435\u043C\u044F\u043D\u043D\u0438\u043A/\u043F\u043B\u0435\u043C\u044F\u043D\u043D\u0438\u0446\u0430`;
2810
3056
  }
2811
3057
  parent() {
2812
3058
  const level = Math.abs(this.pathN?.level ?? 0);
2813
- const sex = sexOf(this.personN);
3059
+ const sex = sexOf4(this.personN);
2814
3060
  if (level <= 1) {
2815
3061
  if (sex === "m") {
2816
3062
  return "\u043E\u0442\u0435\u0446";
@@ -2840,7 +3086,7 @@ var KinshipTranslatorRu = class extends KinshipTranslatorBasic {
2840
3086
  }
2841
3087
  child() {
2842
3088
  const level = Math.abs(this.pathN?.level ?? 0);
2843
- const sex = sexOf(this.personN);
3089
+ const sex = sexOf4(this.personN);
2844
3090
  if (level <= 1) {
2845
3091
  if (sex === "m") {
2846
3092
  return "\u0441\u044B\u043D";
@@ -2869,14 +3115,14 @@ var KinshipTranslatorRu = class extends KinshipTranslatorBasic {
2869
3115
  return `${pra}\u0432\u043D\u0443\u043A/\u0432\u043D\u0443\u0447\u043A\u0430`;
2870
3116
  }
2871
3117
  sibling() {
2872
- const sex = sexOf(this.personN);
3118
+ const sex = sexOf4(this.personN);
2873
3119
  if (sex === "m") {
2874
3120
  return "\u0431\u0440\u0430\u0442";
2875
3121
  }
2876
3122
  if (sex === "f") {
2877
3123
  return "\u0441\u0435\u0441\u0442\u0440\u0430";
2878
3124
  }
2879
- return "\u0441\u0438\u0431\u043B\u0438\u043D\u0433";
3125
+ return "\u0431\u0440\u0430\u0442/\u0441\u0435\u0441\u0442\u0440\u0430";
2880
3126
  }
2881
3127
  halfBlood(relation) {
2882
3128
  if (!relation || !this.isHalfBlood) {
@@ -2890,7 +3136,7 @@ var KinshipTranslatorRu = class extends KinshipTranslatorBasic {
2890
3136
  return `\u0441\u0432\u043E\u0434\u043D\u044B\u0439 ${relation}`;
2891
3137
  }
2892
3138
  spouse() {
2893
- const sex = sexOf(this.personN);
3139
+ const sex = sexOf4(this.personN);
2894
3140
  if (sex === "m") {
2895
3141
  return "\u043C\u0443\u0436";
2896
3142
  }
@@ -2904,7 +3150,7 @@ var KinshipTranslatorRu = class extends KinshipTranslatorBasic {
2904
3150
  return "";
2905
3151
  }
2906
3152
  const spouse = this.path?.[1].indi;
2907
- const sex = sexOf(spouse);
3153
+ const sex = sexOf4(spouse);
2908
3154
  const spouseType = sex === "m" ? "\u043C\u0443\u0436" : sex === "f" ? "\u0436\u0435\u043D\u0430" : "\u0441\u0443\u043F\u0440\u0443\u0433";
2909
3155
  return `${relation} ${toGenitive(spouseType)}`;
2910
3156
  }
@@ -2913,13 +3159,13 @@ var KinshipTranslatorRu = class extends KinshipTranslatorBasic {
2913
3159
  return "";
2914
3160
  }
2915
3161
  const spouse = this.path?.[this.path.length - 1].indi;
2916
- const sex = sexOf(spouse);
3162
+ const sex = sexOf4(spouse);
2917
3163
  const spouseType = sex === "m" ? "\u043C\u0443\u0436" : sex === "f" ? "\u0436\u0435\u043D\u0430" : "\u0441\u0443\u043F\u0440\u0443\u0433";
2918
3164
  return `${spouseType} ${toGenitive(relation)}`;
2919
3165
  }
2920
3166
  of(relation) {
2921
3167
  const formattedName = nameFormatter(this.path?.[0]?.indi, {
2922
- nameOrder: "first-last"
3168
+ nameOrder: this.nameOrder
2923
3169
  });
2924
3170
  let name = formattedName.inOrder.filter(Boolean).join(" ");
2925
3171
  if (this.displayName === "none") {
@@ -2950,7 +3196,22 @@ var KinshipTranslatorRu = class extends KinshipTranslatorBasic {
2950
3196
  if (!relation || !this.pathN?.relation) {
2951
3197
  return relation ?? "";
2952
3198
  }
2953
- return `${this.pathN.relation} ${relation}`;
3199
+ const mapped = parentRelationsRu[this.pathN.relation]?.[relation];
3200
+ if (mapped) {
3201
+ return mapped;
3202
+ }
3203
+ if (this.pathN.relation === "step") {
3204
+ return `\u043D\u0435\u0440\u043E\u0434\u043D\u043E\u0439 ${relation}`;
3205
+ }
3206
+ if (this.pathN.relation === "adopted") {
3207
+ return /сестра|дочь|мать|тётя|бабушка|жена|племянница|внучка/.test(
3208
+ relation
3209
+ ) ? `\u043F\u0440\u0438\u0451\u043C\u043D\u0430\u044F ${relation}` : `\u043F\u0440\u0438\u0451\u043C\u043D\u044B\u0439 ${relation}`;
3210
+ }
3211
+ if (this.pathN.relation === "foster") {
3212
+ return `\u043F\u0440\u0438\u0451\u043C\u043D\u044B\u0439 ${relation}`;
3213
+ }
3214
+ return relation;
2954
3215
  }
2955
3216
  };
2956
3217
 
@@ -2974,7 +3235,7 @@ var InLawsJa = {
2974
3235
  };
2975
3236
 
2976
3237
  // src/kinship-translator/kinship-translator.ja.ts
2977
- var sexOf2 = (person) => {
3238
+ var sexOf5 = (person) => {
2978
3239
  if (person?.isMale?.()) {
2979
3240
  return "m";
2980
3241
  }
@@ -2983,7 +3244,7 @@ var sexOf2 = (person) => {
2983
3244
  }
2984
3245
  return "n";
2985
3246
  };
2986
- var pick = (sex, male, female, neutral) => {
3247
+ var pick4 = (sex, male, female, neutral) => {
2987
3248
  if (sex === "m") {
2988
3249
  return male;
2989
3250
  }
@@ -2996,18 +3257,18 @@ var lineal = (level, sex, kind) => {
2996
3257
  const L = Math.max(1, level);
2997
3258
  if (kind === "asc") {
2998
3259
  if (L <= 1) {
2999
- return pick(sex, "\u7236", "\u6BCD", "\u89AA");
3260
+ return pick4(sex, "\u7236", "\u6BCD", "\u89AA");
3000
3261
  }
3001
3262
  if (L === 2) {
3002
- return pick(sex, "\u7956\u7236", "\u7956\u6BCD", "\u7956\u7236\u6BCD");
3263
+ return pick4(sex, "\u7956\u7236", "\u7956\u6BCD", "\u7956\u7236\u6BCD");
3003
3264
  }
3004
3265
  if (L === 3) {
3005
- return pick(sex, "\u66FE\u7956\u7236", "\u66FE\u7956\u6BCD", "\u66FE\u7956\u7236\u6BCD");
3266
+ return pick4(sex, "\u66FE\u7956\u7236", "\u66FE\u7956\u6BCD", "\u66FE\u7956\u7236\u6BCD");
3006
3267
  }
3007
3268
  if (L === 4) {
3008
- return pick(sex, "\u9AD8\u7956\u7236", "\u9AD8\u7956\u6BCD", "\u9AD8\u7956\u7236\u6BCD");
3269
+ return pick4(sex, "\u9AD8\u7956\u7236", "\u9AD8\u7956\u6BCD", "\u9AD8\u7956\u7236\u6BCD");
3009
3270
  }
3010
- return pick(
3271
+ return pick4(
3011
3272
  sex,
3012
3273
  `${L - 1}\u4E16\u306E\u7956\u7236`,
3013
3274
  `${L - 1}\u4E16\u306E\u7956\u6BCD`,
@@ -3015,7 +3276,7 @@ var lineal = (level, sex, kind) => {
3015
3276
  );
3016
3277
  }
3017
3278
  if (L <= 1) {
3018
- return pick(sex, "\u606F\u5B50", "\u5A18", "\u5B50");
3279
+ return pick4(sex, "\u606F\u5B50", "\u5A18", "\u5B50");
3019
3280
  }
3020
3281
  if (L === 2) {
3021
3282
  return "\u5B6B";
@@ -3062,52 +3323,52 @@ var KinshipTranslatorJa = class extends KinshipTranslatorBasic {
3062
3323
  }
3063
3324
  auncle() {
3064
3325
  const level = Math.abs(this.pathN?.level ?? 0);
3065
- const sex = sexOf2(this.personN);
3066
- if (level <= 2) {
3067
- return pick(sex, "\u304A\u3058", "\u304A\u3070", "\u304A\u3058/\u304A\u3070");
3326
+ const sex = sexOf5(this.personN);
3327
+ if (level <= 1) {
3328
+ return pick4(sex, "\u304A\u3058", "\u304A\u3070", "\u304A\u3058/\u304A\u3070");
3068
3329
  }
3069
- if (level === 3) {
3070
- return pick(sex, "\u5927\u304A\u3058", "\u5927\u304A\u3070", "\u5927\u304A\u3058/\u5927\u304A\u3070");
3330
+ if (level === 2) {
3331
+ return pick4(sex, "\u5927\u304A\u3058", "\u5927\u304A\u3070", "\u5927\u304A\u3058/\u5927\u304A\u3070");
3071
3332
  }
3072
- return pick(
3333
+ return pick4(
3073
3334
  sex,
3074
- `${level - 2}\u4EE3\u524D\u306E\u304A\u3058`,
3075
- `${level - 2}\u4EE3\u524D\u306E\u304A\u3070`,
3076
- `${level - 2}\u4EE3\u524D\u306E\u304A\u3058/\u304A\u3070`
3335
+ `${level - 1}\u4EE3\u524D\u306E\u304A\u3058`,
3336
+ `${level - 1}\u4EE3\u524D\u306E\u304A\u3070`,
3337
+ `${level - 1}\u4EE3\u524D\u306E\u304A\u3058/\u304A\u3070`
3077
3338
  );
3078
3339
  }
3079
3340
  nibling() {
3080
3341
  const level = Math.abs(this.pathN?.level ?? 0);
3081
- const sex = sexOf2(this.personN);
3082
- if (level <= 2) {
3083
- return pick(sex, "\u7525", "\u59EA", "\u7525/\u59EA");
3342
+ const sex = sexOf5(this.personN);
3343
+ if (level <= 1) {
3344
+ return pick4(sex, "\u7525", "\u59EA", "\u7525/\u59EA");
3084
3345
  }
3085
- if (level === 3) {
3086
- return pick(sex, "\u5927\u7525", "\u5927\u59EA", "\u5927\u7525/\u5927\u59EA");
3346
+ if (level === 2) {
3347
+ return pick4(sex, "\u5927\u7525", "\u5927\u59EA", "\u5927\u7525/\u5927\u59EA");
3087
3348
  }
3088
- return pick(
3349
+ return pick4(
3089
3350
  sex,
3090
- `${level - 2}\u4EE3\u4E0B\u306E\u7525`,
3091
- `${level - 2}\u4EE3\u4E0B\u306E\u59EA`,
3092
- `${level - 2}\u4EE3\u4E0B\u306E\u7525/\u59EA`
3351
+ `${level - 1}\u4EE3\u4E0B\u306E\u7525`,
3352
+ `${level - 1}\u4EE3\u4E0B\u306E\u59EA`,
3353
+ `${level - 1}\u4EE3\u4E0B\u306E\u7525/\u59EA`
3093
3354
  );
3094
3355
  }
3095
3356
  parent() {
3096
3357
  return lineal(
3097
3358
  Math.abs(this.pathN?.level ?? 0),
3098
- sexOf2(this.personN),
3359
+ sexOf5(this.personN),
3099
3360
  "asc"
3100
3361
  );
3101
3362
  }
3102
3363
  child() {
3103
3364
  return lineal(
3104
3365
  Math.abs(this.pathN?.level ?? 0),
3105
- sexOf2(this.personN),
3366
+ sexOf5(this.personN),
3106
3367
  "desc"
3107
3368
  );
3108
3369
  }
3109
3370
  sibling() {
3110
- return pick(sexOf2(this.personN), "\u5144\u5F1F", "\u59C9\u59B9", "\u5144\u5F1F\u59C9\u59B9");
3371
+ return pick4(sexOf5(this.personN), "\u5144\u5F1F", "\u59C9\u59B9", "\u5144\u5F1F\u59C9\u59B9");
3111
3372
  }
3112
3373
  halfBlood(relation) {
3113
3374
  if (!relation || !this.isHalfBlood) {
@@ -3116,14 +3377,14 @@ var KinshipTranslatorJa = class extends KinshipTranslatorBasic {
3116
3377
  return `\u7570\u7236\u6BCD\u306E${relation}`;
3117
3378
  }
3118
3379
  spouse() {
3119
- return pick(sexOf2(this.personN), "\u592B", "\u59BB", "\u914D\u5076\u8005");
3380
+ return pick4(sexOf5(this.personN), "\u592B", "\u59BB", "\u914D\u5076\u8005");
3120
3381
  }
3121
3382
  ofSpouse(relation) {
3122
3383
  if (!relation) {
3123
3384
  return "";
3124
3385
  }
3125
- const spouseType = pick(
3126
- sexOf2(this.path?.[1].indi),
3386
+ const spouseType = pick4(
3387
+ sexOf5(this.path?.[1].indi),
3127
3388
  "\u592B",
3128
3389
  "\u59BB",
3129
3390
  "\u914D\u5076\u8005"
@@ -3135,12 +3396,12 @@ var KinshipTranslatorJa = class extends KinshipTranslatorBasic {
3135
3396
  return "";
3136
3397
  }
3137
3398
  const spouse = this.path?.[this.path.length - 1].indi;
3138
- const spouseType = pick(sexOf2(spouse), "\u592B", "\u59BB", "\u914D\u5076\u8005");
3399
+ const spouseType = pick4(sexOf5(spouse), "\u592B", "\u59BB", "\u914D\u5076\u8005");
3139
3400
  return `${relation}\u306E${spouseType}`;
3140
3401
  }
3141
3402
  of(relation) {
3142
3403
  const formattedName = nameFormatter(this.path?.[0]?.indi, {
3143
- nameOrder: "last-first"
3404
+ nameOrder: this.nameOrder
3144
3405
  });
3145
3406
  let name = formattedName.inOrder.filter(Boolean).join(" ");
3146
3407
  if (this.displayName === "none") {
@@ -3171,7 +3432,28 @@ var KinshipTranslatorJa = class extends KinshipTranslatorBasic {
3171
3432
  if (!relation || !this.pathN?.relation) {
3172
3433
  return relation ?? "";
3173
3434
  }
3174
- return `${this.pathN.relation}\u306E${relation}`;
3435
+ if (this.pathN.relation === "step") {
3436
+ if (relation === "\u7236") {
3437
+ return "\u7EE7\u7236";
3438
+ }
3439
+ if (relation === "\u6BCD") {
3440
+ return "\u7D99\u6BCD";
3441
+ }
3442
+ if (relation === "\u606F\u5B50") {
3443
+ return "\u7D99\u5B50";
3444
+ }
3445
+ if (relation === "\u5A18") {
3446
+ return "\u7D99\u5A18";
3447
+ }
3448
+ return `\u7D99${relation}`;
3449
+ }
3450
+ if (this.pathN.relation === "adopted") {
3451
+ return `\u990A\u5B50\u306E${relation}`;
3452
+ }
3453
+ if (this.pathN.relation === "foster") {
3454
+ return `\u91CC\u89AA\u306E${relation}`;
3455
+ }
3456
+ return relation;
3175
3457
  }
3176
3458
  };
3177
3459
 
@@ -3180,22 +3462,32 @@ var InLawsZh = {
3180
3462
  "(\u5B50\u5973|\u5973\u513F|\u513F\u5B50)\u7684\u914D\u5076": "\u513F\u5AB3/\u5973\u5A7F",
3181
3463
  "(\u5B50\u5973|\u5973\u513F|\u513F\u5B50)\u7684\u59BB\u5B50": "\u513F\u5AB3",
3182
3464
  "(\u5B50\u5973|\u5973\u513F|\u513F\u5B50)\u7684\u4E08\u592B": "\u5973\u5A7F",
3183
- "(\u914D\u5076|\u59BB\u5B50|\u4E08\u592B)\u7684\u6BCD\u4EB2": "\u5CB3\u6BCD/\u5A46\u5A46",
3184
- "(\u914D\u5076|\u59BB\u5B50|\u4E08\u592B)\u7684\u7236\u4EB2": "\u5CB3\u7236/\u516C\u516C",
3185
- "(\u914D\u5076|\u59BB\u5B50|\u4E08\u592B)\u7684\u7236\u6BCD": "\u5CB3\u7236\u5CB3\u6BCD/\u516C\u516C\u5A46\u5A46",
3465
+ "\u59BB\u5B50\u7684\u6BCD\u4EB2": "\u5CB3\u6BCD",
3466
+ "\u4E08\u592B\u7684\u6BCD\u4EB2": "\u5A46\u5A46",
3467
+ "(\u914D\u5076)\u7684\u6BCD\u4EB2": "\u5CB3\u6BCD/\u5A46\u5A46",
3468
+ "\u59BB\u5B50\u7684\u7236\u4EB2": "\u5CB3\u7236",
3469
+ "\u4E08\u592B\u7684\u7236\u4EB2": "\u516C\u516C",
3470
+ "(\u914D\u5076)\u7684\u7236\u4EB2": "\u5CB3\u7236/\u516C\u516C",
3471
+ "\u59BB\u5B50\u7684\u7236\u6BCD": "\u5CB3\u7236\u5CB3\u6BCD",
3472
+ "\u4E08\u592B\u7684\u7236\u6BCD": "\u516C\u516C\u5A46\u5A46",
3473
+ "(\u914D\u5076)\u7684\u7236\u6BCD": "\u5CB3\u7236\u5CB3\u6BCD/\u516C\u516C\u5A46\u5A46",
3186
3474
  "(\u5F02\u7236\u6BCD\u7684)?(\u5144\u5F1F\u59D0\u59B9|\u59D0\u59B9|\u5144\u5F1F)\u7684\u59BB\u5B50": "\u5AC2\u5B50/\u5F1F\u59B9",
3187
3475
  "(\u5F02\u7236\u6BCD\u7684)?(\u5144\u5F1F\u59D0\u59B9|\u59D0\u59B9|\u5144\u5F1F)\u7684\u4E08\u592B": "\u59D0\u592B/\u59B9\u592B",
3188
3476
  "(\u5F02\u7236\u6BCD\u7684)?(\u5144\u5F1F\u59D0\u59B9|\u59D0\u59B9|\u5144\u5F1F)\u7684\u914D\u5076": "\u59FB\u4EB2\u5144\u5F1F\u59D0\u59B9",
3189
3477
  "(\u5F02\u7236\u6BCD\u7684)?\u59D0\u59B9\u7684(\u914D\u5076|\u59BB\u5B50|\u4E08\u592B)": "\u59D0\u592B/\u59B9\u592B",
3190
3478
  "(\u5F02\u7236\u6BCD\u7684)?\u5144\u5F1F\u7684(\u914D\u5076|\u59BB\u5B50|\u4E08\u592B)": "\u5AC2\u5B50/\u5F1F\u59B9",
3191
3479
  "(\u5F02\u7236\u6BCD\u7684)?\u5144\u5F1F\u59D0\u59B9\u7684(\u914D\u5076|\u59BB\u5B50|\u4E08\u592B)": "\u59FB\u4EB2\u5144\u5F1F\u59D0\u59B9",
3192
- "(\u5F02\u7236\u6BCD\u7684)?(\u914D\u5076|\u59BB\u5B50|\u4E08\u592B)\u7684\u59D0\u59B9": "\u59D1\u5B50/\u59E8\u5B50",
3193
- "(\u5F02\u7236\u6BCD\u7684)?(\u914D\u5076|\u59BB\u5B50|\u4E08\u592B)\u7684\u5144\u5F1F": "\u5927\u4F2F/\u5C0F\u53D4/\u5185\u5144/\u5185\u5F1F",
3480
+ "(\u5F02\u7236\u6BCD\u7684)?\u59BB\u5B50\u7684\u59D0\u59B9": "\u59E8\u5B50",
3481
+ "(\u5F02\u7236\u6BCD\u7684)?\u4E08\u592B\u7684\u59D0\u59B9": "\u59D1\u5B50",
3482
+ "(\u5F02\u7236\u6BCD\u7684)?(\u914D\u5076)\u7684\u59D0\u59B9": "\u59D1\u5B50/\u59E8\u5B50",
3483
+ "(\u5F02\u7236\u6BCD\u7684)?\u59BB\u5B50\u7684\u5144\u5F1F": "\u5185\u5144/\u5185\u5F1F",
3484
+ "(\u5F02\u7236\u6BCD\u7684)?\u4E08\u592B\u7684\u5144\u5F1F": "\u5927\u4F2F/\u5C0F\u53D4",
3485
+ "(\u5F02\u7236\u6BCD\u7684)?(\u914D\u5076)\u7684\u5144\u5F1F": "\u5927\u4F2F/\u5C0F\u53D4/\u5185\u5144/\u5185\u5F1F",
3194
3486
  "(\u5F02\u7236\u6BCD\u7684)?(\u914D\u5076|\u59BB\u5B50|\u4E08\u592B)\u7684\u5144\u5F1F\u59D0\u59B9": "\u59FB\u4EB2\u5144\u5F1F\u59D0\u59B9"
3195
3487
  };
3196
3488
 
3197
3489
  // src/kinship-translator/kinship-translator.zh.ts
3198
- var sexOf3 = (person) => {
3490
+ var sexOf6 = (person) => {
3199
3491
  if (person?.isMale?.()) {
3200
3492
  return "m";
3201
3493
  }
@@ -3204,7 +3496,7 @@ var sexOf3 = (person) => {
3204
3496
  }
3205
3497
  return "n";
3206
3498
  };
3207
- var pick2 = (sex, male, female, neutral) => {
3499
+ var pick5 = (sex, male, female, neutral) => {
3208
3500
  if (sex === "m") {
3209
3501
  return male;
3210
3502
  }
@@ -3217,41 +3509,41 @@ var lineal2 = (level, sex, kind) => {
3217
3509
  const L = Math.max(1, level);
3218
3510
  if (kind === "asc") {
3219
3511
  if (L <= 1) {
3220
- return pick2(sex, "\u7236\u4EB2", "\u6BCD\u4EB2", "\u7236\u6BCD");
3512
+ return pick5(sex, "\u7236\u4EB2", "\u6BCD\u4EB2", "\u7236\u6BCD");
3221
3513
  }
3222
3514
  if (L === 2) {
3223
- return pick2(sex, "\u7956\u7236", "\u7956\u6BCD", "\u7956\u7236\u6BCD");
3515
+ return pick5(sex, "\u7956\u7236", "\u7956\u6BCD", "\u7956\u7236\u6BCD");
3224
3516
  }
3225
3517
  if (L === 3) {
3226
- return pick2(sex, "\u66FE\u7956\u7236", "\u66FE\u7956\u6BCD", "\u66FE\u7956\u7236\u6BCD");
3518
+ return pick5(sex, "\u66FE\u7956\u7236", "\u66FE\u7956\u6BCD", "\u66FE\u7956\u7236\u6BCD");
3227
3519
  }
3228
3520
  if (L === 4) {
3229
- return pick2(sex, "\u9AD8\u7956\u7236", "\u9AD8\u7956\u6BCD", "\u9AD8\u7956\u7236\u6BCD");
3521
+ return pick5(sex, "\u9AD8\u7956\u7236", "\u9AD8\u7956\u6BCD", "\u9AD8\u7956\u7236\u6BCD");
3230
3522
  }
3231
- return pick2(sex, `${L}\u4E16\u7956`, `${L}\u4E16\u7956\u6BCD`, `${L}\u4E16\u7956\u7236\u6BCD`);
3523
+ return pick5(sex, `${L}\u4E16\u7956`, `${L}\u4E16\u7956\u6BCD`, `${L}\u4E16\u7956\u7236\u6BCD`);
3232
3524
  }
3233
3525
  if (L <= 1) {
3234
- return pick2(sex, "\u513F\u5B50", "\u5973\u513F", "\u5B50\u5973");
3526
+ return pick5(sex, "\u513F\u5B50", "\u5973\u513F", "\u5B50\u5973");
3235
3527
  }
3236
3528
  if (L === 2) {
3237
- return pick2(sex, "\u5B59\u5B50", "\u5B59\u5973", "\u5B59\u5B50\u5973");
3529
+ return pick5(sex, "\u5B59\u5B50", "\u5B59\u5973", "\u5B59\u5B50\u5973");
3238
3530
  }
3239
3531
  if (L === 3) {
3240
- return pick2(sex, "\u66FE\u5B59", "\u66FE\u5B59\u5973", "\u66FE\u5B59\u5B50\u5973");
3532
+ return pick5(sex, "\u66FE\u5B59", "\u66FE\u5B59\u5973", "\u66FE\u5B59\u5B50\u5973");
3241
3533
  }
3242
3534
  if (L === 4) {
3243
- return pick2(sex, "\u7384\u5B59", "\u7384\u5B59\u5973", "\u7384\u5B59\u5B50\u5973");
3535
+ return pick5(sex, "\u7384\u5B59", "\u7384\u5B59\u5973", "\u7384\u5B59\u5B50\u5973");
3244
3536
  }
3245
- return pick2(sex, `${L}\u4E16\u5B59`, `${L}\u4E16\u5B59\u5973`, `${L}\u4E16\u5B59\u5B50\u5973`);
3537
+ return pick5(sex, `${L}\u4E16\u5B59`, `${L}\u4E16\u5B59\u5973`, `${L}\u4E16\u5B59\u5B50\u5973`);
3246
3538
  };
3247
3539
  var cousinPlain2 = (degree, sex) => {
3248
3540
  if (degree <= 1) {
3249
- return pick2(sex, "\u5802\u8868\u5144\u5F1F", "\u5802\u8868\u59D0\u59B9", "\u5802\u8868\u4EB2");
3541
+ return pick5(sex, "\u5802\u8868\u5144\u5F1F", "\u5802\u8868\u59D0\u59B9", "\u5802\u8868\u4EB2");
3250
3542
  }
3251
3543
  if (degree === 2) {
3252
- return pick2(sex, "\u4ECE\u5802\u8868\u5144\u5F1F", "\u4ECE\u5802\u8868\u59D0\u59B9", "\u4ECE\u5802\u8868\u4EB2");
3544
+ return pick5(sex, "\u4ECE\u5802\u8868\u5144\u5F1F", "\u4ECE\u5802\u8868\u59D0\u59B9", "\u4ECE\u5802\u8868\u4EB2");
3253
3545
  }
3254
- return pick2(
3546
+ return pick5(
3255
3547
  sex,
3256
3548
  `${degree}\u4EE3\u5802\u8868\u5144\u5F1F`,
3257
3549
  `${degree}\u4EE3\u5802\u8868\u59D0\u59B9`,
@@ -3264,7 +3556,7 @@ var KinshipTranslatorZh = class extends KinshipTranslatorBasic {
3264
3556
  if (degree > 0) {
3265
3557
  degree = degree - 1;
3266
3558
  }
3267
- return cousinPlain2(degree, sexOf3(this.personN));
3559
+ return cousinPlain2(degree, sexOf6(this.personN));
3268
3560
  }
3269
3561
  removal() {
3270
3562
  const level = this.pathN?.level ?? 0;
@@ -3276,56 +3568,56 @@ var KinshipTranslatorZh = class extends KinshipTranslatorBasic {
3276
3568
  return level < 0 ? this.nibling() : this.auncle();
3277
3569
  }
3278
3570
  const removed = Math.abs(level);
3279
- return `${cousinPlain2(degree, sexOf3(this.personN))}\uFF08\u9694${removed}\u4EE3\uFF09`;
3571
+ return `${cousinPlain2(degree, sexOf6(this.personN))}\uFF08\u9694${removed}\u4EE3\uFF09`;
3280
3572
  }
3281
3573
  auncle() {
3282
3574
  const level = Math.abs(this.pathN?.level ?? 0);
3283
- const sex = sexOf3(this.personN);
3284
- if (level <= 2) {
3285
- return pick2(sex, "\u53D4\u53D4", "\u963F\u59E8", "\u53D4\u4F2F/\u59D1\u59E8");
3575
+ const sex = sexOf6(this.personN);
3576
+ if (level <= 1) {
3577
+ return pick5(sex, "\u53D4\u53D4", "\u963F\u59E8", "\u53D4\u4F2F/\u59D1\u59E8");
3286
3578
  }
3287
- if (level === 3) {
3288
- return pick2(sex, "\u4F2F\u53D4\u7956\u7236", "\u59D1\u7956\u6BCD", "\u4F2F\u53D4\u7956\u7236\u6BCD");
3579
+ if (level === 2) {
3580
+ return pick5(sex, "\u4F2F\u53D4\u7956\u7236", "\u59D1\u7956\u6BCD", "\u4F2F\u53D4\u7956\u7236\u6BCD");
3289
3581
  }
3290
- return pick2(
3582
+ return pick5(
3291
3583
  sex,
3292
- `${level - 2}\u4EE3\u524D\u7684\u53D4\u53D4`,
3293
- `${level - 2}\u4EE3\u524D\u7684\u963F\u59E8`,
3294
- `${level - 2}\u4EE3\u524D\u7684\u53D4\u4F2F/\u59D1\u59E8`
3584
+ `${level - 1}\u4EE3\u524D\u7684\u53D4\u53D4`,
3585
+ `${level - 1}\u4EE3\u524D\u7684\u963F\u59E8`,
3586
+ `${level - 1}\u4EE3\u524D\u7684\u53D4\u4F2F/\u59D1\u59E8`
3295
3587
  );
3296
3588
  }
3297
3589
  nibling() {
3298
3590
  const level = Math.abs(this.pathN?.level ?? 0);
3299
- const sex = sexOf3(this.personN);
3300
- if (level <= 2) {
3301
- return pick2(sex, "\u4F84\u5B50", "\u4F84\u5973", "\u4F84\u5B50\u5973");
3591
+ const sex = sexOf6(this.personN);
3592
+ if (level <= 1) {
3593
+ return pick5(sex, "\u4F84\u5B50", "\u4F84\u5973", "\u4F84\u5B50\u5973");
3302
3594
  }
3303
- if (level === 3) {
3304
- return pick2(sex, "\u4F84\u5B59", "\u4F84\u5B59\u5973", "\u4F84\u5B59\u5B50\u5973");
3595
+ if (level === 2) {
3596
+ return pick5(sex, "\u4F84\u5B59", "\u4F84\u5B59\u5973", "\u4F84\u5B59\u5B50\u5973");
3305
3597
  }
3306
- return pick2(
3598
+ return pick5(
3307
3599
  sex,
3308
- `${level - 2}\u4EE3\u4E0B\u7684\u4F84\u5B50`,
3309
- `${level - 2}\u4EE3\u4E0B\u7684\u4F84\u5973`,
3310
- `${level - 2}\u4EE3\u4E0B\u7684\u4F84\u5B50\u5973`
3600
+ `${level - 1}\u4EE3\u4E0B\u7684\u4F84\u5B50`,
3601
+ `${level - 1}\u4EE3\u4E0B\u7684\u4F84\u5973`,
3602
+ `${level - 1}\u4EE3\u4E0B\u7684\u4F84\u5B50\u5973`
3311
3603
  );
3312
3604
  }
3313
3605
  parent() {
3314
3606
  return lineal2(
3315
3607
  Math.abs(this.pathN?.level ?? 0),
3316
- sexOf3(this.personN),
3608
+ sexOf6(this.personN),
3317
3609
  "asc"
3318
3610
  );
3319
3611
  }
3320
3612
  child() {
3321
3613
  return lineal2(
3322
3614
  Math.abs(this.pathN?.level ?? 0),
3323
- sexOf3(this.personN),
3615
+ sexOf6(this.personN),
3324
3616
  "desc"
3325
3617
  );
3326
3618
  }
3327
3619
  sibling() {
3328
- return pick2(sexOf3(this.personN), "\u5144\u5F1F", "\u59D0\u59B9", "\u5144\u5F1F\u59D0\u59B9");
3620
+ return pick5(sexOf6(this.personN), "\u5144\u5F1F", "\u59D0\u59B9", "\u5144\u5F1F\u59D0\u59B9");
3329
3621
  }
3330
3622
  halfBlood(relation) {
3331
3623
  if (!relation || !this.isHalfBlood) {
@@ -3334,14 +3626,14 @@ var KinshipTranslatorZh = class extends KinshipTranslatorBasic {
3334
3626
  return `\u5F02\u7236\u6BCD\u7684${relation}`;
3335
3627
  }
3336
3628
  spouse() {
3337
- return pick2(sexOf3(this.personN), "\u4E08\u592B", "\u59BB\u5B50", "\u914D\u5076");
3629
+ return pick5(sexOf6(this.personN), "\u4E08\u592B", "\u59BB\u5B50", "\u914D\u5076");
3338
3630
  }
3339
3631
  ofSpouse(relation) {
3340
3632
  if (!relation) {
3341
3633
  return "";
3342
3634
  }
3343
- const spouseType = pick2(
3344
- sexOf3(this.path?.[1].indi),
3635
+ const spouseType = pick5(
3636
+ sexOf6(this.path?.[1].indi),
3345
3637
  "\u4E08\u592B",
3346
3638
  "\u59BB\u5B50",
3347
3639
  "\u914D\u5076"
@@ -3353,12 +3645,12 @@ var KinshipTranslatorZh = class extends KinshipTranslatorBasic {
3353
3645
  return "";
3354
3646
  }
3355
3647
  const spouse = this.path?.[this.path.length - 1].indi;
3356
- const spouseType = pick2(sexOf3(spouse), "\u4E08\u592B", "\u59BB\u5B50", "\u914D\u5076");
3648
+ const spouseType = pick5(sexOf6(spouse), "\u4E08\u592B", "\u59BB\u5B50", "\u914D\u5076");
3357
3649
  return `${relation}\u7684${spouseType}`;
3358
3650
  }
3359
3651
  of(relation) {
3360
3652
  const formattedName = nameFormatter(this.path?.[0]?.indi, {
3361
- nameOrder: "last-first"
3653
+ nameOrder: this.nameOrder
3362
3654
  });
3363
3655
  let name = formattedName.inOrder.filter(Boolean).join(" ");
3364
3656
  if (this.displayName === "none") {
@@ -3389,27 +3681,68 @@ var KinshipTranslatorZh = class extends KinshipTranslatorBasic {
3389
3681
  if (!relation || !this.pathN?.relation) {
3390
3682
  return relation ?? "";
3391
3683
  }
3392
- return `${this.pathN.relation}${relation}`;
3684
+ if (this.pathN.relation === "step") {
3685
+ if (relation === "\u7236\u4EB2") {
3686
+ return "\u7EE7\u7236";
3687
+ }
3688
+ if (relation === "\u6BCD\u4EB2") {
3689
+ return "\u7EE7\u6BCD";
3690
+ }
3691
+ if (relation === "\u513F\u5B50") {
3692
+ return "\u7EE7\u5B50";
3693
+ }
3694
+ if (relation === "\u5973\u513F") {
3695
+ return "\u7EE7\u5973";
3696
+ }
3697
+ return `\u7EE7${relation}`;
3698
+ }
3699
+ if (this.pathN.relation === "adopted") {
3700
+ if (relation === "\u7236\u4EB2") {
3701
+ return "\u517B\u7236";
3702
+ }
3703
+ if (relation === "\u6BCD\u4EB2") {
3704
+ return "\u517B\u6BCD";
3705
+ }
3706
+ if (relation === "\u513F\u5B50") {
3707
+ return "\u517B\u5B50";
3708
+ }
3709
+ if (relation === "\u5973\u513F") {
3710
+ return "\u517B\u5973";
3711
+ }
3712
+ return `\u517B${relation}`;
3713
+ }
3714
+ if (this.pathN.relation === "foster") {
3715
+ return `\u5BC4\u517B${relation}`;
3716
+ }
3717
+ return relation;
3393
3718
  }
3394
3719
  };
3395
3720
 
3396
3721
  // src/kinship-translator/kinship-translator.ts
3722
+ var nameOrderForLang = (lang) => lang === "hu" || lang === "ja" || lang === "zh" ? "last-first" : "first-last";
3397
3723
  var KinshipTranslator = class {
3398
- constructor(person1, person2, lang = "en", entirePath, displayName = "givenname") {
3724
+ constructor(person1, person2, lang = "en", entirePath, displayName = "givenname", nameOrder) {
3399
3725
  this.displayName = displayName;
3400
3726
  this.lang = lang;
3401
3727
  this.entirePath = entirePath;
3402
3728
  this.person1 = person1;
3403
3729
  this.person2 = typeof person2 === "string" ? this.person1.getGedcom()?.indi(person2) : person2;
3404
3730
  this.path = this.person1.path(this.person2);
3731
+ const order = nameOrder ?? nameOrderForLang(lang);
3732
+ this.nameOrder = order;
3405
3733
  if (translators_exports[lang]) {
3406
3734
  this.translator = new translators_exports[lang](
3407
3735
  this.path ?? [],
3408
- displayName
3736
+ displayName,
3737
+ order
3409
3738
  );
3410
3739
  }
3411
3740
  if (!this.translator) {
3412
- this.translator = new KinshipTranslatorEn(this.path ?? [], displayName);
3741
+ this.translator = new KinshipTranslatorEn(
3742
+ this.path ?? [],
3743
+ displayName,
3744
+ order
3745
+ );
3413
3746
  }
3414
3747
  }
3415
3748
  get path0() {
@@ -3454,14 +3787,16 @@ var KinshipTranslator = class {
3454
3787
  showMainPerson,
3455
3788
  this.lang,
3456
3789
  false,
3457
- this.displayName
3790
+ this.displayName,
3791
+ this.nameOrder
3458
3792
  ),
3459
3793
  relative: this.path?.[index - 1]?.indi.kinship(
3460
3794
  path2.indi.id,
3461
3795
  showMainPerson,
3462
3796
  this.lang,
3463
3797
  false,
3464
- this.displayName
3798
+ this.displayName,
3799
+ this.nameOrder
3465
3800
  )
3466
3801
  }));
3467
3802
  return path;
@@ -7299,14 +7634,15 @@ var Indi = class extends Common {
7299
7634
  }
7300
7635
  return foundPath;
7301
7636
  }
7302
- kinship(other, showMainPerson, lang = "en", entirePath, displayName = "givenname") {
7637
+ kinship(other, showMainPerson, lang = "en", entirePath, displayName = "givenname", nameOrder) {
7303
7638
  const KinshipTranslatorClass2 = getKinshipTranslatorClass();
7304
7639
  const translator = new KinshipTranslatorClass2(
7305
7640
  this,
7306
7641
  other,
7307
7642
  lang,
7308
7643
  entirePath,
7309
- showMainPerson ? displayName : void 0
7644
+ showMainPerson ? displayName : void 0,
7645
+ nameOrder
7310
7646
  );
7311
7647
  return translator.translate(!!showMainPerson);
7312
7648
  }
@@ -8661,7 +8997,7 @@ var ensureExtensionSchema = (gedcom, extraTags) => {
8661
8997
 
8662
8998
  // package.json
8663
8999
  var package_default = {
8664
- version: "2.1.11"};
9000
+ version: "2.1.15"};
8665
9001
 
8666
9002
  // src/utils/get-product-details.ts
8667
9003
  var getVersion = () => package_default.version;