@treeviz/gedcom-parser 2.1.9 → 2.1.12

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 (43) hide show
  1. package/dist/classes/common.d.ts.map +1 -1
  2. package/dist/classes/gedcom.d.ts +5 -0
  3. package/dist/classes/gedcom.d.ts.map +1 -1
  4. package/dist/classes/index.js +860 -464
  5. package/dist/classes/indi.d.ts.map +1 -1
  6. package/dist/classes/obje.d.ts.map +1 -1
  7. package/dist/cli/index.js +850 -454
  8. package/dist/constants/index.js +818 -448
  9. package/dist/factories/index.js +818 -448
  10. package/dist/index.js +865 -474
  11. package/dist/interfaces/indi.d.ts +1 -0
  12. package/dist/interfaces/indi.d.ts.map +1 -1
  13. package/dist/kinship-translator/index.js +818 -448
  14. package/dist/kinship-translator/kinship-translator.de.d.ts +2 -3
  15. package/dist/kinship-translator/kinship-translator.de.d.ts.map +1 -1
  16. package/dist/kinship-translator/kinship-translator.en.d.ts.map +1 -1
  17. package/dist/kinship-translator/kinship-translator.es.d.ts +2 -3
  18. package/dist/kinship-translator/kinship-translator.es.d.ts.map +1 -1
  19. package/dist/kinship-translator/kinship-translator.fr.d.ts +2 -3
  20. package/dist/kinship-translator/kinship-translator.fr.d.ts.map +1 -1
  21. package/dist/kinship-translator/kinship-translator.hu.d.ts.map +1 -1
  22. package/dist/kinship-translator/kinship-translator.ja.d.ts.map +1 -1
  23. package/dist/kinship-translator/kinship-translator.ru.d.ts +1 -1
  24. package/dist/kinship-translator/kinship-translator.ru.d.ts.map +1 -1
  25. package/dist/kinship-translator/kinship-translator.zh.d.ts.map +1 -1
  26. package/dist/kinship-translator/patterns.de.d.ts +1 -0
  27. package/dist/kinship-translator/patterns.de.d.ts.map +1 -1
  28. package/dist/kinship-translator/patterns.es.d.ts +1 -0
  29. package/dist/kinship-translator/patterns.es.d.ts.map +1 -1
  30. package/dist/kinship-translator/patterns.fr.d.ts +1 -0
  31. package/dist/kinship-translator/patterns.fr.d.ts.map +1 -1
  32. package/dist/kinship-translator/patterns.hu.d.ts.map +1 -1
  33. package/dist/kinship-translator/patterns.ru.d.ts +1 -0
  34. package/dist/kinship-translator/patterns.ru.d.ts.map +1 -1
  35. package/dist/kinship-translator/patterns.zh.d.ts.map +1 -1
  36. package/dist/utils/cache.d.ts.map +1 -1
  37. package/dist/utils/gedzip.d.ts.map +1 -1
  38. package/dist/utils/index.js +865 -474
  39. package/dist/utils/local-media.d.ts +7 -3
  40. package/dist/utils/local-media.d.ts.map +1 -1
  41. package/dist/utils/media-utils.d.ts +20 -0
  42. package/dist/utils/media-utils.d.ts.map +1 -1
  43. package/package.json +1 -1
@@ -350,6 +350,82 @@ var ORIG_HEAD_TAG = "_ORIGHEAD";
350
350
  // src/utils/gedcom-trailer.ts
351
351
  var GEDCOM_TRAILER_TAG = "TRLR";
352
352
  var isGedcomTrailerTag = (tag) => tag === GEDCOM_TRAILER_TAG;
353
+
354
+ // src/utils/media-utils.ts
355
+ var getFileExtension = (filename) => {
356
+ if (!filename) {
357
+ return "";
358
+ }
359
+ if (filename.startsWith("data:")) {
360
+ const mime = filename.slice(5).split(";")[0] || "";
361
+ const subtype = (mime.split("/")[1] || "").toLowerCase();
362
+ if (subtype === "jpeg") {
363
+ return "jpg";
364
+ }
365
+ return subtype.split("+")[0] || "";
366
+ }
367
+ const withoutQuery = filename.split(/[?#]/)[0] || filename;
368
+ const match = withoutQuery.match(/\.([^.]+)$/);
369
+ return match ? match[1].toLowerCase() : "";
370
+ };
371
+ var isImageFormat = (format2) => {
372
+ if (!format2) {
373
+ return false;
374
+ }
375
+ let normalized = format2.toLowerCase().trim();
376
+ if (normalized.startsWith("data:")) {
377
+ normalized = getFileExtension(normalized);
378
+ } else if (normalized.includes("/")) {
379
+ normalized = normalized.split("/")[1]?.split("+")[0] || "";
380
+ if (normalized === "jpeg") {
381
+ normalized = "jpg";
382
+ }
383
+ }
384
+ const imageFormats = [
385
+ "jpg",
386
+ "jpeg",
387
+ "png",
388
+ "gif",
389
+ "bmp",
390
+ "webp",
391
+ "svg",
392
+ "tiff",
393
+ "tif"
394
+ ];
395
+ return imageFormats.includes(normalized);
396
+ };
397
+ var resolveObjeForm = (obje) => {
398
+ const value = obje?.get?.("FILE.FORM")?.toValue?.() ?? obje?.get?.("FORM")?.toValue?.();
399
+ return typeof value === "string" && value.trim() ? value.trim() : void 0;
400
+ };
401
+ var mediaIdValue = (obje, path) => {
402
+ const value = obje?.get?.(path)?.toValue?.();
403
+ return typeof value === "string" && value.trim() ? value.trim() : void 0;
404
+ };
405
+ var resolveObjeMediaId = (obje) => mediaIdValue(obje, "RIN") || mediaIdValue(obje, "_CLON._OID") || mediaIdValue(obje, "_MSER._LKID") || mediaIdValue(obje, "_OID") || mediaIdValue(obje, "_LKID");
406
+ var ANCESTRY_MEDIA_RETRIEVAL_PREFIX = "https://www.ancestry.com/api/media/retrieval/v2/image";
407
+ var ANCESTRY_MEDIA_QUERY = "client=trees-mediaservice&imageQuality=hq";
408
+ var ancestryMediaPath = (namespace, imgId) => `/namespaces/${namespace}/media/${imgId}?${ANCESTRY_MEDIA_QUERY}`;
409
+ var ancestryMediaFileUrl = (namespace, imgId) => {
410
+ if (!namespace || !imgId) {
411
+ return void 0;
412
+ }
413
+ return `${ANCESTRY_MEDIA_RETRIEVAL_PREFIX}${ancestryMediaPath(namespace, imgId)}`;
414
+ };
415
+ var objeXrefKey = (obje, fallback = 0) => {
416
+ if (typeof obje?.id === "string" && obje.id) {
417
+ return obje.id;
418
+ }
419
+ const value = obje?.toValue?.();
420
+ if (typeof value === "string" && value.trim()) {
421
+ return value.trim();
422
+ }
423
+ if (typeof fallback === "string" && fallback.trim()) {
424
+ return fallback.trim();
425
+ }
426
+ return `@O${fallback}@`;
427
+ };
428
+ var objeNoteValue = (obje) => mediaIdValue(obje, "FILE.NOTE") || mediaIdValue(obje, "NOTE") || "";
353
429
  var List = class _List {
354
430
  // length = 0;
355
431
  constructor(items) {
@@ -999,7 +1075,7 @@ var Common = class _Common {
999
1075
  this,
1000
1076
  options.obje.namespace,
1001
1077
  options.obje.override,
1002
- void 0,
1078
+ this.isAncestry() ? ancestryMediaFileUrl : void 0,
1003
1079
  options.gedcomVersion
1004
1080
  );
1005
1081
  }
@@ -1930,11 +2006,8 @@ var storeCache = {
1930
2006
  getCacheDbs().relativesOnDegreeCache.setItem(value);
1931
2007
  }
1932
2008
  }, 50),
1933
- // profilePictureCache IS persisted to IndexedDB
2009
+ // Image bytes are stored as one IndexedDB record per photo.
1934
2010
  profilePictureCache: debounce((value) => {
1935
- if (value) {
1936
- getCacheDbs().profilePictureCache.setItem(value);
1937
- }
1938
2011
  }, 100)
1939
2012
  };
1940
2013
  var resetRelativesCache = () => {
@@ -2621,65 +2694,23 @@ var isRemoteOrEmbeddedMediaUrl = (path) => {
2621
2694
  }
2622
2695
  return path.startsWith("data:") || path.startsWith("blob:") || /^https?:\/\//i.test(path);
2623
2696
  };
2624
- var resolveLocalMediaUrl = async (path) => {
2697
+ var resolveLocalMediaUrl = async (path, context) => {
2625
2698
  if (!path) {
2626
2699
  return void 0;
2627
2700
  }
2628
- if (isRemoteOrEmbeddedMediaUrl(path)) {
2701
+ if (path.startsWith("data:") || path.startsWith("blob:")) {
2629
2702
  return path;
2630
2703
  }
2631
- const resolved = await localMediaResolver?.(path);
2632
- return resolved;
2633
- };
2634
- var implemented = (type, ...args) => {
2635
- };
2636
-
2637
- // src/utils/media-utils.ts
2638
- var getFileExtension = (filename) => {
2639
- if (!filename) {
2640
- return "";
2641
- }
2642
- if (filename.startsWith("data:")) {
2643
- const mime = filename.slice(5).split(";")[0] || "";
2644
- const subtype = (mime.split("/")[1] || "").toLowerCase();
2645
- if (subtype === "jpeg") {
2646
- return "jpg";
2647
- }
2648
- return subtype.split("+")[0] || "";
2649
- }
2650
- const withoutQuery = filename.split(/[?#]/)[0] || filename;
2651
- const match = withoutQuery.match(/\.([^.]+)$/);
2652
- return match ? match[1].toLowerCase() : "";
2653
- };
2654
- var isImageFormat = (format2) => {
2655
- if (!format2) {
2656
- return false;
2704
+ const resolved = await localMediaResolver?.(path, context);
2705
+ if (resolved) {
2706
+ return resolved;
2657
2707
  }
2658
- let normalized = format2.toLowerCase().trim();
2659
- if (normalized.startsWith("data:")) {
2660
- normalized = getFileExtension(normalized);
2661
- } else if (normalized.includes("/")) {
2662
- normalized = normalized.split("/")[1]?.split("+")[0] || "";
2663
- if (normalized === "jpeg") {
2664
- normalized = "jpg";
2665
- }
2708
+ if (/^https?:\/\//i.test(path)) {
2709
+ return path;
2666
2710
  }
2667
- const imageFormats = [
2668
- "jpg",
2669
- "jpeg",
2670
- "png",
2671
- "gif",
2672
- "bmp",
2673
- "webp",
2674
- "svg",
2675
- "tiff",
2676
- "tif"
2677
- ];
2678
- return imageFormats.includes(normalized);
2711
+ return void 0;
2679
2712
  };
2680
- var resolveObjeForm = (obje) => {
2681
- const value = obje?.get?.("FILE.FORM")?.toValue?.() ?? obje?.get?.("FORM")?.toValue?.();
2682
- return typeof value === "string" && value.trim() ? value.trim() : void 0;
2713
+ var implemented = (type, ...args) => {
2683
2714
  };
2684
2715
 
2685
2716
  // src/factories/place-parser-provider.ts
@@ -3985,22 +4016,19 @@ var Indi = class extends Common {
3985
4016
  if (objeList) {
3986
4017
  await Promise.all(
3987
4018
  objeList.map(async (objeRef) => {
3988
- const key = objeRef?.id;
4019
+ const key = objeXrefKey(objeRef, 0);
3989
4020
  const obje = objeRef?.standardizeMedia(
3990
4021
  namespace,
3991
4022
  true,
3992
- (ns, iId) => {
3993
- return ns && iId ? `https://mediasvc.ancestry.com/v2/image/namespaces/${ns}/media/${iId}?client=trees-mediaservice&imageQuality=hq` : void 0;
3994
- }
4023
+ ancestryMediaFileUrl
3995
4024
  );
3996
4025
  const isPrimary = obje?.get("_PRIM")?.toValue() === "Y";
3997
- const media = obje?.RIN?.toValue() || obje?.get("_OID")?.toValue();
3998
- const clone = obje?.get("_CLON._OID")?.toValue();
3999
- const mser = obje?.get("_MSER._LKID")?.toValue();
4026
+ const media = resolveObjeMediaId(obje);
4000
4027
  let url = obje?.get("FILE")?.toValue();
4001
4028
  const title = obje?.get("FILE.TITL")?.toValue() ?? obje?.get("TITL")?.toValue() ?? "";
4029
+ const note = objeNoteValue(obje);
4002
4030
  const type = resolveObjeForm(obje) ?? (url ? getFileExtension(url) : void 0) ?? "raw";
4003
- let imgId = clone || mser;
4031
+ let imgId = media;
4004
4032
  const hasEmbeddedOrLocalFile = !!url && (url.startsWith("data:") || url.startsWith("blob:") || !/^https?:\/\//i.test(url));
4005
4033
  if (!hasEmbeddedOrLocalFile && (!www || !tree || !this.id)) {
4006
4034
  return;
@@ -4036,6 +4064,7 @@ var Indi = class extends Common {
4036
4064
  imgId,
4037
4065
  person: this.id,
4038
4066
  title,
4067
+ note,
4039
4068
  url,
4040
4069
  contentType: type,
4041
4070
  downloadName: `${this.id.replaceAll("@", "")}_${this.toNaturalName()?.replaceAll(" ", "-") || ""}_${(title || key.replaceAll("@", "").toString()).replaceAll(" ", "-")}`
@@ -4074,7 +4103,7 @@ var Indi = class extends Common {
4074
4103
  return;
4075
4104
  }
4076
4105
  const obje = o;
4077
- const key = `@O${index}@`;
4106
+ const key = objeXrefKey(obje, index);
4078
4107
  obje.standardizeMedia();
4079
4108
  const isPrimary = obje?.get("_PRIM")?.toValue() === "Y";
4080
4109
  const url = obje?.get("FILE")?.toValue();
@@ -4093,6 +4122,7 @@ var Indi = class extends Common {
4093
4122
  imgId,
4094
4123
  person: this.id,
4095
4124
  title,
4125
+ note: objeNoteValue(obje),
4096
4126
  url,
4097
4127
  contentType: type,
4098
4128
  downloadName: `${this.id.replaceAll("@", "")}_${this.toNaturalName()?.replaceAll(" ", "-") || ""}_${(title || key.replaceAll("@", "").toString()).replaceAll(" ", "-")}`
@@ -4201,7 +4231,7 @@ var Indi = class extends Common {
4201
4231
  if (!obje) {
4202
4232
  return;
4203
4233
  }
4204
- const key = `@O${index}@`;
4234
+ const key = objeXrefKey(obje, index);
4205
4235
  const isPrimary = obje?.get("_PRIM")?.toValue() === "Y";
4206
4236
  const url = obje?.get("FILE")?.toValue();
4207
4237
  const title = obje?.get("TITL")?.toValue() ?? "";
@@ -4218,6 +4248,7 @@ var Indi = class extends Common {
4218
4248
  imgId,
4219
4249
  person: this.id,
4220
4250
  title,
4251
+ note: objeNoteValue(obje),
4221
4252
  url,
4222
4253
  contentType: type,
4223
4254
  downloadName: `${this.id.replaceAll("@", "")}_${this.toNaturalName()?.replaceAll(" ", "-") || ""}_${(title || key.replaceAll("@", "").toString()).replaceAll(" ", "-")}`
@@ -4241,7 +4272,7 @@ var Indi = class extends Common {
4241
4272
  if (!obje) {
4242
4273
  return;
4243
4274
  }
4244
- const key = `@O${index}@`;
4275
+ const key = objeXrefKey(obje, index);
4245
4276
  obje.standardizeMedia();
4246
4277
  const isPrimary = obje?.get("_PRIM")?.toValue() === "Y";
4247
4278
  const url = obje?.get("FILE")?.toValue();
@@ -4258,6 +4289,7 @@ var Indi = class extends Common {
4258
4289
  imgId,
4259
4290
  person: this.id,
4260
4291
  title,
4292
+ note: objeNoteValue(obje),
4261
4293
  url,
4262
4294
  contentType: type,
4263
4295
  downloadName: `${this.id.replaceAll("@", "")}_${this.toNaturalName()?.replaceAll(" ", "-") || ""}_${(title || key.replaceAll("@", "").toString()).replaceAll(" ", "-")}`
@@ -4289,7 +4321,12 @@ var Indi = class extends Common {
4289
4321
  );
4290
4322
  if (cached !== void 0) {
4291
4323
  if (cached?.file && !isRemoteOrEmbeddedMediaUrl(cached.file)) {
4292
- const resolvedCached = await resolveLocalMediaUrl(cached.file);
4324
+ const resolvedCached = await resolveLocalMediaUrl(cached.file, {
4325
+ url: cached.file,
4326
+ person: this.id,
4327
+ tree: this.getTreeId?.(),
4328
+ treeName: this.getTreeName?.()
4329
+ });
4293
4330
  if (resolvedCached && isRemoteOrEmbeddedMediaUrl(resolvedCached)) {
4294
4331
  const refreshed = { ...cached, file: resolvedCached };
4295
4332
  profilePictureCache(
@@ -4314,7 +4351,16 @@ var Indi = class extends Common {
4314
4351
  }
4315
4352
  const mediaArray = Object.values(mediaList);
4316
4353
  const toDisplayableProfile = async (media, isPrimary) => {
4317
- const resolvedFile = await resolveLocalMediaUrl(media.url);
4354
+ const resolvedFile = await resolveLocalMediaUrl(media.url, {
4355
+ url: media.url,
4356
+ id: media.id,
4357
+ imgId: media.imgId,
4358
+ key: media.key,
4359
+ contentType: media.contentType,
4360
+ person: media.person || this.id,
4361
+ tree: media.tree || this.getTreeId?.(),
4362
+ treeName: this.getTreeName?.()
4363
+ });
4318
4364
  if (!resolvedFile || !isRemoteOrEmbeddedMediaUrl(resolvedFile)) {
4319
4365
  return void 0;
4320
4366
  }
@@ -6276,7 +6322,7 @@ var KinshipTranslatorHU = class extends KinshipTranslatorBasic {
6276
6322
  }
6277
6323
  return `${hungarianOrdinalize(
6278
6324
  degree
6279
- )}unokatestv\xE9r ${level}x elt\xE1vol\xEDtva`;
6325
+ )}unokatestv\xE9r ${Math.abs(level)}x elt\xE1vol\xEDtva`;
6280
6326
  }
6281
6327
  auncle() {
6282
6328
  const level = this.pathN?.level ?? 0;
@@ -6320,14 +6366,25 @@ var KinshipTranslatorHU = class extends KinshipTranslatorBasic {
6320
6366
  return `${ordinalized ? `${ordinalized}unoka` : ""}testv\xE9r ${origPrefix.replace(/nagy$/, "")}unok\xE1ja`;
6321
6367
  }
6322
6368
  parent() {
6369
+ const level = Math.abs(this.pathN?.level ?? 0);
6370
+ if (level <= 1) {
6371
+ if (this.personN?.isMale()) {
6372
+ return "apa";
6373
+ }
6374
+ if (this.personN?.isFemale()) {
6375
+ return "anya";
6376
+ }
6377
+ return "sz\xFCl\u0151";
6378
+ }
6323
6379
  const prefix = this.directPrefix();
6380
+ const gen = prefix === "nagy" ? "" : prefix;
6324
6381
  if (this.personN?.isMale()) {
6325
- return `${prefix}apa`;
6382
+ return `${gen}nagyapa`;
6326
6383
  }
6327
6384
  if (this.personN?.isFemale()) {
6328
- return `${prefix}anya`;
6385
+ return `${gen}nagyanya`;
6329
6386
  }
6330
- return `${prefix}sz\xFCl\u0151`;
6387
+ return `${gen}nagysz\xFCl\u0151`;
6331
6388
  }
6332
6389
  child() {
6333
6390
  const level = Math.abs(this.pathN?.level ?? 0);
@@ -6521,27 +6578,30 @@ var KinshipTranslatorEn = class extends KinshipTranslatorBasic {
6521
6578
  if (!degree) {
6522
6579
  return level < 0 ? this.nibling() : this.auncle();
6523
6580
  }
6524
- return `${ordinalize(degree)} cousin ${level}x removed`;
6581
+ return `${ordinalize(degree)} cousin ${Math.abs(level)}x removed`;
6525
6582
  }
6526
6583
  auncle() {
6527
- const prefix = this.directPrefix();
6584
+ const level = Math.abs(this.pathN?.level ?? 0);
6585
+ const greats = level <= 1 ? "" : "great-".repeat(level - 1);
6528
6586
  if (this.personN?.isMale()) {
6529
- return `${prefix}uncle`;
6587
+ return `${greats}uncle`;
6530
6588
  }
6531
6589
  if (this.personN?.isFemale()) {
6532
- return `${prefix}aunt`;
6590
+ return `${greats}aunt`;
6533
6591
  }
6534
- return `${prefix}auncle`;
6592
+ return greats ? `${greats}uncle/${greats}aunt` : "uncle/aunt";
6535
6593
  }
6536
6594
  nibling() {
6537
- const prefix = this.directPrefix();
6595
+ const level = Math.abs(this.pathN?.level ?? 0);
6596
+ const greats = level <= 2 ? "" : "great-".repeat(level - 2);
6597
+ const grand = level <= 1 ? "" : "grand";
6538
6598
  if (this.personN?.isMale()) {
6539
- return `${prefix}nephew`;
6599
+ return `${greats}${grand}nephew`;
6540
6600
  }
6541
6601
  if (this.personN?.isFemale()) {
6542
- return `${prefix}niece`;
6602
+ return `${greats}${grand}niece`;
6543
6603
  }
6544
- return `${prefix}nibling`;
6604
+ return greats || grand ? `${greats}${grand}nephew/${greats}${grand}niece` : "nephew/niece";
6545
6605
  }
6546
6606
  parent() {
6547
6607
  const prefix = this.directPrefix();
@@ -6669,45 +6729,64 @@ var KinshipTranslatorEn = class extends KinshipTranslatorBasic {
6669
6729
  };
6670
6730
 
6671
6731
  // src/kinship-translator/patterns.de.ts
6732
+ var parentRelationsDe = {
6733
+ step: "Stief",
6734
+ foster: "Pflege",
6735
+ adopted: "Adoptiv"
6736
+ };
6672
6737
  var InLawsDe = {
6673
- "Ehepartner von (kind|tochter|sohn)": "Schwiegerkind",
6674
- "Ehefrau von (kind|tochter|sohn)": "Schwiegertochter",
6675
- "Ehemann von (kind|tochter|sohn)": "Schwiegersohn",
6676
- "mutter des (Ehepartner|Ehefrau|Ehemann)s": "Schwiegermutter",
6677
- "vater des (Ehepartner|Ehefrau|Ehemann)s": "Schwiegervater",
6678
- "elternteil des (Ehepartner|Ehefrau|Ehemann)s": "Schwiegerelternteil",
6679
- "Ehefrau von (Halb)?(geschwister|schwester|bruder)": "Schw\xE4gerin",
6680
- "Ehemann von (Halb)?(geschwister|schwester|bruder)": "Schwager",
6681
- "Ehepartner von (Halb)?(geschwister|schwester|bruder)": "Schwager/Schw\xE4gerin",
6682
- "(Halb)?schwester des (Ehepartner|Ehefrau|Ehemann)s": "Schw\xE4gerin",
6683
- "(Halb)?bruder des (Ehepartner|Ehefrau|Ehemann)s": "Schwager",
6684
- "(Halb)?geschwister des (Ehepartner|Ehefrau|Ehemann)s": "Schwager/Schw\xE4gerin"
6738
+ "Ehepartner von (Kind|Tochter|Sohn)": "Schwiegerkind",
6739
+ "Ehefrau von (Kind|Tochter|Sohn)": "Schwiegertochter",
6740
+ "Ehemann von (Kind|Tochter|Sohn)": "Schwiegersohn",
6741
+ "Mutter (des Ehepartners|des Ehemanns|der Ehefrau)": "Schwiegermutter",
6742
+ "Vater (des Ehepartners|des Ehemanns|der Ehefrau)": "Schwiegervater",
6743
+ "Elternteil (des Ehepartners|des Ehemanns|der Ehefrau)": "Schwiegerelternteil",
6744
+ "Ehefrau von (Halb)?-?(Geschwister|Schwester|Bruder)": "Schw\xE4gerin",
6745
+ "Ehemann von (Halb)?-?(Geschwister|Schwester|Bruder)": "Schwager",
6746
+ "Ehepartner von (Halb)?-?(Geschwister|Schwester|Bruder)": "Schwager/Schw\xE4gerin",
6747
+ "(Halb)?-?(Schwester|schwester) (des Ehepartners|des Ehemanns|der Ehefrau)": "Schw\xE4gerin",
6748
+ "(Halb)?-?(Bruder|bruder) (des Ehepartners|des Ehemanns|der Ehefrau)": "Schwager",
6749
+ "(Halb)?-?(Geschwister|geschwister) (des Ehepartners|des Ehemanns|der Ehefrau)": "Schwager/Schw\xE4gerin"
6685
6750
  };
6686
6751
 
6687
6752
  // src/kinship-translator/kinship-translator.de.ts
6688
- var KinshipTranslatorDe = class extends KinshipTranslatorBasic {
6689
- directPrefix() {
6690
- const level = Math.abs(this.pathN?.level ?? 0);
6691
- if (level <= 1) {
6692
- return "";
6693
- }
6694
- if (level === 2) {
6695
- return "Gro\xDF";
6696
- }
6697
- if (level === 3) {
6698
- return "Urgro\xDF";
6699
- }
6700
- return `Ur${level - 2}-gro\xDF`;
6753
+ var sexOf = (person) => {
6754
+ if (person?.isMale?.()) {
6755
+ return "m";
6756
+ }
6757
+ if (person?.isFemale?.()) {
6758
+ return "f";
6759
+ }
6760
+ return "n";
6761
+ };
6762
+ var pick = (sex, male, female, neutral) => {
6763
+ if (sex === "m") {
6764
+ return male;
6765
+ }
6766
+ if (sex === "f") {
6767
+ return female;
6701
6768
  }
6769
+ return neutral;
6770
+ };
6771
+ var ur = (count) => count > 0 ? "Ur".repeat(count) : "";
6772
+ var genitiveArticle = (spouseType) => {
6773
+ if (spouseType === "Ehefrau") {
6774
+ return `der ${spouseType}`;
6775
+ }
6776
+ return `des ${spouseType}s`;
6777
+ };
6778
+ var KinshipTranslatorDe = class extends KinshipTranslatorBasic {
6702
6779
  indirect() {
6703
6780
  let degree = Math.abs(this.pathN?.degree ?? 0);
6704
6781
  if (degree > 0) {
6705
6782
  degree = degree - 1;
6706
6783
  }
6707
- if (degree === 1) {
6708
- return `Cousin`;
6784
+ const sex = sexOf(this.personN);
6785
+ const cousin = pick(sex, "Cousin", "Cousine", "Cousin/Cousine");
6786
+ if (degree <= 1) {
6787
+ return cousin;
6709
6788
  }
6710
- return `Cousin ${degree}. Grades`;
6789
+ return `${cousin} ${degree}. Grades`;
6711
6790
  }
6712
6791
  removal() {
6713
6792
  const level = this.pathN?.level ?? 0;
@@ -6718,101 +6797,101 @@ var KinshipTranslatorDe = class extends KinshipTranslatorBasic {
6718
6797
  if (!degree) {
6719
6798
  return level < 0 ? this.nibling() : this.auncle();
6720
6799
  }
6721
- return `Cousin ${degree}. Grades ${Math.abs(level)}\xD7 entfernt`;
6800
+ return `${this.indirect()} ${Math.abs(level)}\xD7 entfernt`;
6722
6801
  }
6723
6802
  auncle() {
6724
- const prefix = this.directPrefix();
6725
- if (this.personN?.isMale()) {
6726
- return `${prefix}onkel`;
6727
- }
6728
- if (this.personN?.isFemale()) {
6729
- return `${prefix}tante`;
6803
+ const level = Math.abs(this.pathN?.level ?? 0);
6804
+ const sex = sexOf(this.personN);
6805
+ if (level <= 1) {
6806
+ return pick(sex, "Onkel", "Tante", "Onkel/Tante");
6730
6807
  }
6731
- return `${prefix}onkel/tante`;
6808
+ const prefix = `${ur(level - 2)}Gro\xDF`;
6809
+ return pick(
6810
+ sex,
6811
+ `${prefix}onkel`,
6812
+ `${prefix}tante`,
6813
+ `${prefix}onkel/tante`
6814
+ );
6732
6815
  }
6733
6816
  nibling() {
6734
- const prefix = this.directPrefix();
6735
- if (this.personN?.isMale()) {
6736
- return `${prefix}neffe`;
6737
- }
6738
- if (this.personN?.isFemale()) {
6739
- return `${prefix}nichte`;
6817
+ const level = Math.abs(this.pathN?.level ?? 0);
6818
+ const sex = sexOf(this.personN);
6819
+ if (level <= 1) {
6820
+ return pick(sex, "Neffe", "Nichte", "Neffe/Nichte");
6740
6821
  }
6741
- return `${prefix}neffe/nichte`;
6822
+ const prefix = `${ur(level - 2)}Gro\xDF`;
6823
+ return pick(
6824
+ sex,
6825
+ `${prefix}neffe`,
6826
+ `${prefix}nichte`,
6827
+ `${prefix}neffe/nichte`
6828
+ );
6742
6829
  }
6743
6830
  parent() {
6744
- const prefix = this.directPrefix();
6745
- if (this.personN?.isMale()) {
6746
- return `${prefix}vater`;
6747
- }
6748
- if (this.personN?.isFemale()) {
6749
- return `${prefix}mutter`;
6831
+ const level = Math.abs(this.pathN?.level ?? 0);
6832
+ const sex = sexOf(this.personN);
6833
+ if (level <= 1) {
6834
+ return pick(sex, "Vater", "Mutter", "Elternteil");
6750
6835
  }
6751
- return `${prefix}elternteil`;
6836
+ const prefix = `${ur(level - 2)}Gro\xDF`;
6837
+ return pick(
6838
+ sex,
6839
+ `${prefix}vater`,
6840
+ `${prefix}mutter`,
6841
+ `${prefix}elternteil`
6842
+ );
6752
6843
  }
6753
6844
  child() {
6754
- const prefix = this.directPrefix();
6755
- if (this.personN?.isMale()) {
6756
- return `${prefix}sohn`;
6757
- }
6758
- if (this.personN?.isFemale()) {
6759
- return `${prefix}tochter`;
6845
+ const level = Math.abs(this.pathN?.level ?? 0);
6846
+ const sex = sexOf(this.personN);
6847
+ if (level <= 1) {
6848
+ return pick(sex, "Sohn", "Tochter", "Kind");
6760
6849
  }
6761
- return `${prefix}kind`;
6850
+ const prefix = ur(level - 2);
6851
+ return pick(
6852
+ sex,
6853
+ `${prefix}Enkel`,
6854
+ `${prefix}Enkelin`,
6855
+ `${prefix}Enkelkind`
6856
+ );
6762
6857
  }
6763
6858
  sibling() {
6764
- if (this.personN?.isMale()) {
6765
- return "bruder";
6766
- }
6767
- if (this.personN?.isFemale()) {
6768
- return "schwester";
6769
- }
6770
- return "geschwister";
6859
+ return pick(sexOf(this.personN), "Bruder", "Schwester", "Geschwister");
6771
6860
  }
6772
6861
  halfBlood(relation) {
6773
6862
  if (!relation || !this.isHalfBlood) {
6774
6863
  return relation ?? "";
6775
6864
  }
6776
- if (/^[A-ZÄÖÜ]/.test(relation) || /[-\s]/.test(relation)) {
6865
+ if (/[\s-]/.test(relation) || /^(Groß|Ur)/.test(relation)) {
6777
6866
  return `Halb-${relation}`;
6778
6867
  }
6779
- return `Halb${relation}`;
6868
+ return `Halb${relation.charAt(0).toLowerCase()}${relation.slice(1)}`;
6780
6869
  }
6781
6870
  spouse() {
6782
- if (this.personN?.isMale()) {
6783
- return "Ehemann";
6784
- }
6785
- if (this.personN?.isFemale()) {
6786
- return "Ehefrau";
6787
- }
6788
- return "Ehepartner";
6871
+ return pick(sexOf(this.personN), "Ehemann", "Ehefrau", "Ehepartner");
6789
6872
  }
6790
6873
  ofSpouse(relation) {
6791
6874
  if (!relation) {
6792
6875
  return "";
6793
6876
  }
6794
- const spouse = this.path?.[1].indi;
6795
- let spouseType = "Ehepartner";
6796
- if (spouse?.isMale()) {
6797
- spouseType = "Ehemann";
6798
- }
6799
- if (spouse?.isFemale()) {
6800
- spouseType = "Ehefrau";
6801
- }
6802
- return `${relation} des ${spouseType}s`;
6877
+ const spouseType = pick(
6878
+ sexOf(this.path?.[1].indi),
6879
+ "Ehemann",
6880
+ "Ehefrau",
6881
+ "Ehepartner"
6882
+ );
6883
+ return `${relation} ${genitiveArticle(spouseType)}`;
6803
6884
  }
6804
6885
  spouseOf(relation) {
6805
6886
  if (!relation) {
6806
6887
  return "";
6807
6888
  }
6808
- const spouse = this.path?.[this.path.length - 1].indi;
6809
- let spouseType = "Ehepartner";
6810
- if (spouse?.isMale()) {
6811
- spouseType = "Ehemann";
6812
- }
6813
- if (spouse?.isFemale()) {
6814
- spouseType = "Ehefrau";
6815
- }
6889
+ const spouseType = pick(
6890
+ sexOf(this.path?.[this.path.length - 1].indi),
6891
+ "Ehemann",
6892
+ "Ehefrau",
6893
+ "Ehepartner"
6894
+ );
6816
6895
  return `${spouseType} von ${relation}`;
6817
6896
  }
6818
6897
  of(relation) {
@@ -6830,8 +6909,8 @@ var KinshipTranslatorDe = class extends KinshipTranslatorBasic {
6830
6909
  if (!name || !relation) {
6831
6910
  return relation ?? "";
6832
6911
  }
6833
- if (relation.includes(" des ") || relation.includes(" von ")) {
6834
- return relation.replace(/ (des|von) /, ` $1 ${name}s `);
6912
+ if (relation.includes(" des ") || relation.includes(" der ") || relation.includes(" von ")) {
6913
+ return relation.replace(/ (des|der|von) /, ` $1 ${name}s `);
6835
6914
  }
6836
6915
  return `${name}s ${relation}`;
6837
6916
  }
@@ -6861,50 +6940,82 @@ var KinshipTranslatorDe = class extends KinshipTranslatorBasic {
6861
6940
  if (!relation || !this.pathN?.relation) {
6862
6941
  return relation ?? "";
6863
6942
  }
6864
- return `${this.pathN.relation} ${relation}`;
6943
+ const prefix = parentRelationsDe[this.pathN.relation];
6944
+ if (!prefix) {
6945
+ return relation;
6946
+ }
6947
+ if (prefix.endsWith("-") || prefix.endsWith(" ")) {
6948
+ return `${prefix}${relation}`;
6949
+ }
6950
+ return `${prefix}${relation.charAt(0).toLowerCase()}${relation.slice(1)}`;
6865
6951
  }
6866
6952
  };
6867
6953
 
6868
6954
  // src/kinship-translator/patterns.fr.ts
6955
+ var parentRelationsFr = {
6956
+ step: "step",
6957
+ foster: "foster",
6958
+ adopted: "adopted"
6959
+ };
6869
6960
  var InLawsFr = {
6870
6961
  "conjoint de (enfant|fille|fils)": "beau-fils/belle-fille",
6871
6962
  "\xE9pouse de (enfant|fille|fils)": "belle-fille",
6872
6963
  "mari de (enfant|fille|fils)": "gendre",
6873
- "m\xE8re du (conjoint|\xE9pouse|mari)": "belle-m\xE8re",
6874
- "p\xE8re du (conjoint|\xE9pouse|mari)": "beau-p\xE8re",
6875
- "parent du (conjoint|\xE9pouse|mari)": "beau-parent",
6964
+ "m\xE8re (du mari|du conjoint|de l'\xE9pouse)": "belle-m\xE8re",
6965
+ "p\xE8re (du mari|du conjoint|de l'\xE9pouse)": "beau-p\xE8re",
6966
+ "parent (du mari|du conjoint|de l'\xE9pouse)": "beau-parent",
6876
6967
  "\xE9pouse de (demi-)?(fr\xE8re/s\u0153ur|s\u0153ur|fr\xE8re)": "belle-s\u0153ur",
6877
6968
  "mari de (demi-)?(fr\xE8re/s\u0153ur|s\u0153ur|fr\xE8re)": "beau-fr\xE8re",
6878
6969
  "conjoint de (demi-)?(fr\xE8re/s\u0153ur|s\u0153ur|fr\xE8re)": "beau-fr\xE8re/belle-s\u0153ur",
6879
- "(demi-)?s\u0153ur du (conjoint|\xE9pouse|mari)": "belle-s\u0153ur",
6880
- "(demi-)?fr\xE8re du (conjoint|\xE9pouse|mari)": "beau-fr\xE8re",
6881
- "(demi-)?fr\xE8re/s\u0153ur du (conjoint|\xE9pouse|mari)": "beau-fr\xE8re/belle-s\u0153ur"
6970
+ "(demi-)?s\u0153ur (du mari|du conjoint|de l'\xE9pouse)": "belle-s\u0153ur",
6971
+ "(demi-)?fr\xE8re (du mari|du conjoint|de l'\xE9pouse)": "beau-fr\xE8re",
6972
+ "(demi-)?fr\xE8re/s\u0153ur (du mari|du conjoint|de l'\xE9pouse)": "beau-fr\xE8re/belle-s\u0153ur"
6882
6973
  };
6883
6974
 
6884
6975
  // src/kinship-translator/kinship-translator.fr.ts
6885
- var KinshipTranslatorFr = class extends KinshipTranslatorBasic {
6886
- directPrefix() {
6887
- const level = Math.abs(this.pathN?.level ?? 0);
6888
- if (level <= 1) {
6889
- return "";
6890
- }
6891
- if (level === 2) {
6892
- return "grand-";
6893
- }
6894
- if (level === 3) {
6895
- return "arri\xE8re-grand-";
6896
- }
6897
- return `arri\xE8re${level - 2}-grand-`;
6976
+ var sexOf2 = (person) => {
6977
+ if (person?.isMale?.()) {
6978
+ return "m";
6979
+ }
6980
+ if (person?.isFemale?.()) {
6981
+ return "f";
6982
+ }
6983
+ return "n";
6984
+ };
6985
+ var pick2 = (sex, male, female, neutral) => {
6986
+ if (sex === "m") {
6987
+ return male;
6988
+ }
6989
+ if (sex === "f") {
6990
+ return female;
6991
+ }
6992
+ return neutral;
6993
+ };
6994
+ var arriere = (count) => count > 0 ? "arri\xE8re-".repeat(count) : "";
6995
+ var frenchOrdinal = (n) => n === 1 ? "1er" : `${n}e`;
6996
+ var isFeminineRelation = (relation) => /mère|fille|sœur|tante|nièce|cousine|épouse/.test(relation);
6997
+ var ofSpousePrep = (spouseType) => {
6998
+ if (spouseType === "\xE9pouse") {
6999
+ return "de l'";
6898
7000
  }
7001
+ return "du ";
7002
+ };
7003
+ var KinshipTranslatorFr = class extends KinshipTranslatorBasic {
6899
7004
  indirect() {
6900
7005
  let degree = Math.abs(this.pathN?.degree ?? 0);
6901
7006
  if (degree > 0) {
6902
7007
  degree = degree - 1;
6903
7008
  }
6904
- if (degree === 1) {
6905
- return `cousin`;
7009
+ const cousin = pick2(
7010
+ sexOf2(this.personN),
7011
+ "cousin",
7012
+ "cousine",
7013
+ "cousin/cousine"
7014
+ );
7015
+ if (degree <= 1) {
7016
+ return cousin;
6906
7017
  }
6907
- return `cousin au ${ordinalize(degree)} degr\xE9`;
7018
+ return `${cousin} au ${frenchOrdinal(degree)} degr\xE9`;
6908
7019
  }
6909
7020
  removal() {
6910
7021
  const level = this.pathN?.level ?? 0;
@@ -6915,56 +7026,57 @@ var KinshipTranslatorFr = class extends KinshipTranslatorBasic {
6915
7026
  if (!degree) {
6916
7027
  return level < 0 ? this.nibling() : this.auncle();
6917
7028
  }
6918
- return `cousin au ${ordinalize(degree)} degr\xE9 ${Math.abs(level)}\xD7 \xE9loign\xE9`;
7029
+ return `${this.indirect()} ${Math.abs(level)}\xD7 \xE9loign\xE9`;
6919
7030
  }
6920
7031
  auncle() {
6921
- const prefix = this.directPrefix();
6922
- if (this.personN?.isMale()) {
6923
- return `${prefix}oncle`;
6924
- }
6925
- if (this.personN?.isFemale()) {
6926
- return `${prefix}tante`;
7032
+ const level = Math.abs(this.pathN?.level ?? 0);
7033
+ const sex = sexOf2(this.personN);
7034
+ const base = pick2(sex, "oncle", "tante", "oncle/tante");
7035
+ if (level <= 1) {
7036
+ return base;
6927
7037
  }
6928
- return `${prefix}oncle/tante`;
7038
+ const grands = pick2(
7039
+ sex,
7040
+ "grand-oncle",
7041
+ "grand-tante",
7042
+ "grand-oncle/tante"
7043
+ );
7044
+ return `${arriere(level - 2)}${grands}`;
6929
7045
  }
6930
7046
  nibling() {
6931
- const prefix = this.directPrefix();
6932
- if (this.personN?.isMale()) {
6933
- return `${prefix}neveu`;
6934
- }
6935
- if (this.personN?.isFemale()) {
6936
- return `${prefix}ni\xE8ce`;
7047
+ const level = Math.abs(this.pathN?.level ?? 0);
7048
+ const sex = sexOf2(this.personN);
7049
+ if (level <= 1) {
7050
+ return pick2(sex, "neveu", "ni\xE8ce", "neveu/ni\xE8ce");
6937
7051
  }
6938
- return `${prefix}neveu/ni\xE8ce`;
7052
+ const grands = pick2(
7053
+ sex,
7054
+ "grand-neveu",
7055
+ "grande-ni\xE8ce",
7056
+ "grand-neveu/grande-ni\xE8ce"
7057
+ );
7058
+ return `${arriere(level - 2)}${grands}`;
6939
7059
  }
6940
7060
  parent() {
6941
- const prefix = this.directPrefix();
6942
- if (this.personN?.isMale()) {
6943
- return `${prefix}p\xE8re`;
6944
- }
6945
- if (this.personN?.isFemale()) {
6946
- return `${prefix}m\xE8re`;
7061
+ const level = Math.abs(this.pathN?.level ?? 0);
7062
+ const sex = sexOf2(this.personN);
7063
+ if (level <= 1) {
7064
+ return pick2(sex, "p\xE8re", "m\xE8re", "parent");
6947
7065
  }
6948
- return `${prefix}parent`;
7066
+ const grands = pick2(sex, "grand-p\xE8re", "grand-m\xE8re", "grand-parent");
7067
+ return `${arriere(level - 2)}${grands}`;
6949
7068
  }
6950
7069
  child() {
6951
- const prefix = this.directPrefix();
6952
- if (this.personN?.isMale()) {
6953
- return `${prefix}fils`;
6954
- }
6955
- if (this.personN?.isFemale()) {
6956
- return `${prefix}fille`;
7070
+ const level = Math.abs(this.pathN?.level ?? 0);
7071
+ const sex = sexOf2(this.personN);
7072
+ if (level <= 1) {
7073
+ return pick2(sex, "fils", "fille", "enfant");
6957
7074
  }
6958
- return `${prefix}enfant`;
7075
+ const petits = pick2(sex, "petit-fils", "petite-fille", "petit-enfant");
7076
+ return `${arriere(level - 2)}${petits}`;
6959
7077
  }
6960
7078
  sibling() {
6961
- if (this.personN?.isMale()) {
6962
- return "fr\xE8re";
6963
- }
6964
- if (this.personN?.isFemale()) {
6965
- return "s\u0153ur";
6966
- }
6967
- return "fr\xE8re/s\u0153ur";
7079
+ return pick2(sexOf2(this.personN), "fr\xE8re", "s\u0153ur", "fr\xE8re/s\u0153ur");
6968
7080
  }
6969
7081
  halfBlood(relation) {
6970
7082
  if (!relation || !this.isHalfBlood) {
@@ -6973,40 +7085,30 @@ var KinshipTranslatorFr = class extends KinshipTranslatorBasic {
6973
7085
  return `demi-${relation}`;
6974
7086
  }
6975
7087
  spouse() {
6976
- if (this.personN?.isMale()) {
6977
- return "mari";
6978
- }
6979
- if (this.personN?.isFemale()) {
6980
- return "\xE9pouse";
6981
- }
6982
- return "conjoint";
7088
+ return pick2(sexOf2(this.personN), "mari", "\xE9pouse", "conjoint");
6983
7089
  }
6984
7090
  ofSpouse(relation) {
6985
7091
  if (!relation) {
6986
7092
  return "";
6987
7093
  }
6988
- const spouse = this.path?.[1].indi;
6989
- let spouseType = "conjoint";
6990
- if (spouse?.isMale()) {
6991
- spouseType = "mari";
6992
- }
6993
- if (spouse?.isFemale()) {
6994
- spouseType = "\xE9pouse";
6995
- }
6996
- return `${relation} du ${spouseType}`;
7094
+ const spouseType = pick2(
7095
+ sexOf2(this.path?.[1].indi),
7096
+ "mari",
7097
+ "\xE9pouse",
7098
+ "conjoint"
7099
+ );
7100
+ return `${relation} ${ofSpousePrep(spouseType)}${spouseType}`;
6997
7101
  }
6998
7102
  spouseOf(relation) {
6999
7103
  if (!relation) {
7000
7104
  return "";
7001
7105
  }
7002
- const spouse = this.path?.[this.path.length - 1].indi;
7003
- let spouseType = "conjoint";
7004
- if (spouse?.isMale()) {
7005
- spouseType = "mari";
7006
- }
7007
- if (spouse?.isFemale()) {
7008
- spouseType = "\xE9pouse";
7009
- }
7106
+ const spouseType = pick2(
7107
+ sexOf2(this.path?.[this.path.length - 1].indi),
7108
+ "mari",
7109
+ "\xE9pouse",
7110
+ "conjoint"
7111
+ );
7010
7112
  return `${spouseType} de ${relation}`;
7011
7113
  }
7012
7114
  of(relation) {
@@ -7027,6 +7129,9 @@ var KinshipTranslatorFr = class extends KinshipTranslatorBasic {
7027
7129
  if (relation.includes(" du ") || relation.includes(" de ")) {
7028
7130
  return relation.replace(/ (du|de) /, ` $1 ${name} `);
7029
7131
  }
7132
+ if (relation.includes(" de l'")) {
7133
+ return relation.replace(" de l'", ` de ${name} l'`);
7134
+ }
7030
7135
  return `${relation} de ${name}`;
7031
7136
  }
7032
7137
  inLaw(relation) {
@@ -7055,50 +7160,118 @@ var KinshipTranslatorFr = class extends KinshipTranslatorBasic {
7055
7160
  if (!relation || !this.pathN?.relation) {
7056
7161
  return relation ?? "";
7057
7162
  }
7058
- return `${this.pathN.relation} ${relation}`;
7163
+ const kind = parentRelationsFr[this.pathN.relation];
7164
+ if (!kind) {
7165
+ return relation;
7166
+ }
7167
+ if (kind === "step") {
7168
+ return `${isFeminineRelation(relation) ? "belle-" : "beau-"}${relation}`;
7169
+ }
7170
+ if (kind === "adopted") {
7171
+ return `${relation} ${isFeminineRelation(relation) ? "adoptive" : "adoptif"}`;
7172
+ }
7173
+ if (kind === "foster") {
7174
+ return `${relation} d'accueil`;
7175
+ }
7176
+ return relation;
7059
7177
  }
7060
7178
  };
7061
7179
 
7062
7180
  // src/kinship-translator/patterns.es.ts
7181
+ var parentRelationsEs = {
7182
+ step: {
7183
+ padre: "padrastro",
7184
+ madre: "madrastra",
7185
+ hijo: "hijastro",
7186
+ hija: "hijastra",
7187
+ hermano: "hermanastro",
7188
+ hermana: "hermanastra",
7189
+ abuelo: "abuelastro",
7190
+ abuela: "abuelastra"
7191
+ }
7192
+ };
7063
7193
  var InLawsEs = {
7064
7194
  "c\xF3nyuge de (hijo/hija|hija|hijo)": "yerno/nuera",
7065
7195
  "esposa de (hijo/hija|hija|hijo)": "nuera",
7066
7196
  "esposo de (hijo/hija|hija|hijo)": "yerno",
7067
- "madre del (c\xF3nyuge|esposa|esposo)": "suegra",
7068
- "padre del (c\xF3nyuge|esposa|esposo)": "suegro",
7069
- "padre/madre del (c\xF3nyuge|esposa|esposo)": "suegro/suegra",
7197
+ "madre (del c\xF3nyuge|del esposo|de la esposa)": "suegra",
7198
+ "padre (del c\xF3nyuge|del esposo|de la esposa)": "suegro",
7199
+ "padre/madre (del c\xF3nyuge|del esposo|de la esposa)": "suegro/suegra",
7070
7200
  "esposa de (medio |media |medio/a )?(hermano/hermana|hermana|hermano)": "cu\xF1ada",
7071
7201
  "esposo de (medio |media |medio/a )?(hermano/hermana|hermana|hermano)": "cu\xF1ado",
7072
7202
  "c\xF3nyuge de (medio |media |medio/a )?(hermano/hermana|hermana|hermano)": "cu\xF1ado/cu\xF1ada",
7073
- "(medio |media |medio/a )?hermana del (c\xF3nyuge|esposa|esposo)": "cu\xF1ada",
7074
- "(medio |media |medio/a )?hermano del (c\xF3nyuge|esposa|esposo)": "cu\xF1ado",
7075
- "(medio |media |medio/a )?hermano/hermana del (c\xF3nyuge|esposa|esposo)": "cu\xF1ado/cu\xF1ada"
7203
+ "(medio |media |medio/a )?hermana (del c\xF3nyuge|del esposo|de la esposa)": "cu\xF1ada",
7204
+ "(medio |media |medio/a )?hermano (del c\xF3nyuge|del esposo|de la esposa)": "cu\xF1ado",
7205
+ "(medio |media |medio/a )?hermano/hermana (del c\xF3nyuge|del esposo|de la esposa)": "cu\xF1ado/cu\xF1ada"
7076
7206
  };
7077
7207
 
7078
7208
  // src/kinship-translator/kinship-translator.es.ts
7079
- var KinshipTranslatorEs = class extends KinshipTranslatorBasic {
7080
- directPrefix() {
7081
- const level = Math.abs(this.pathN?.level ?? 0);
7082
- if (level <= 1) {
7083
- return "";
7084
- }
7085
- if (level === 2) {
7086
- return "bisabuel";
7087
- }
7088
- if (level === 3) {
7089
- return "tatarabuel";
7090
- }
7091
- return `t\xE1tara${level - 2}-abuel`;
7209
+ var sexOf3 = (person) => {
7210
+ if (person?.isMale?.()) {
7211
+ return "m";
7212
+ }
7213
+ if (person?.isFemale?.()) {
7214
+ return "f";
7092
7215
  }
7216
+ return "n";
7217
+ };
7218
+ var pick3 = (sex, male, female, neutral) => {
7219
+ if (sex === "m") {
7220
+ return male;
7221
+ }
7222
+ if (sex === "f") {
7223
+ return female;
7224
+ }
7225
+ return neutral;
7226
+ };
7227
+ var SPANISH_ORDINALS_M = [
7228
+ "",
7229
+ "",
7230
+ "segundo",
7231
+ "tercero",
7232
+ "cuarto",
7233
+ "quinto",
7234
+ "sexto",
7235
+ "s\xE9ptimo",
7236
+ "octavo",
7237
+ "noveno",
7238
+ "d\xE9cimo"
7239
+ ];
7240
+ var SPANISH_ORDINALS_F = [
7241
+ "",
7242
+ "",
7243
+ "segunda",
7244
+ "tercera",
7245
+ "cuarta",
7246
+ "quinta",
7247
+ "sexta",
7248
+ "s\xE9ptima",
7249
+ "octava",
7250
+ "novena",
7251
+ "d\xE9cima"
7252
+ ];
7253
+ var spanishOrdinal = (n, sex) => {
7254
+ const list = sex === "f" ? SPANISH_ORDINALS_F : SPANISH_ORDINALS_M;
7255
+ return list[n] ?? `${n}.\xBA`;
7256
+ };
7257
+ var ofSpousePrep2 = (spouseType) => {
7258
+ if (spouseType === "esposa") {
7259
+ return "de la ";
7260
+ }
7261
+ return "del ";
7262
+ };
7263
+ var KinshipTranslatorEs = class extends KinshipTranslatorBasic {
7093
7264
  indirect() {
7094
7265
  let degree = Math.abs(this.pathN?.degree ?? 0);
7095
7266
  if (degree > 0) {
7096
7267
  degree = degree - 1;
7097
7268
  }
7098
- if (degree === 1) {
7099
- return `primo`;
7269
+ const sex = sexOf3(this.personN);
7270
+ const cousin = pick3(sex, "primo", "prima", "primo/prima");
7271
+ if (degree <= 1) {
7272
+ return cousin;
7100
7273
  }
7101
- return `primo ${ordinalize(degree)}`;
7274
+ return `${cousin} ${spanishOrdinal(degree, sex)}`;
7102
7275
  }
7103
7276
  removal() {
7104
7277
  const level = this.pathN?.level ?? 0;
@@ -7109,56 +7282,133 @@ var KinshipTranslatorEs = class extends KinshipTranslatorBasic {
7109
7282
  if (!degree) {
7110
7283
  return level < 0 ? this.nibling() : this.auncle();
7111
7284
  }
7112
- return `primo ${ordinalize(degree)} ${Math.abs(level)}\xD7 separado`;
7285
+ return `${this.indirect()} ${Math.abs(level)}\xD7 separado`;
7113
7286
  }
7114
7287
  auncle() {
7115
- const prefix = this.directPrefix();
7116
- if (this.personN?.isMale()) {
7117
- return `${prefix}t\xEDo`;
7288
+ const level = Math.abs(this.pathN?.level ?? 0);
7289
+ const sex = sexOf3(this.personN);
7290
+ if (level <= 1) {
7291
+ return pick3(sex, "t\xEDo", "t\xEDa", "t\xEDo/t\xEDa");
7118
7292
  }
7119
- if (this.personN?.isFemale()) {
7120
- return `${prefix}t\xEDa`;
7293
+ if (level === 2) {
7294
+ return pick3(sex, "t\xEDo abuelo", "t\xEDa abuela", "t\xEDo/t\xEDa abuelo");
7295
+ }
7296
+ if (level === 3) {
7297
+ return pick3(
7298
+ sex,
7299
+ "t\xEDo bisabuelo",
7300
+ "t\xEDa bisabuela",
7301
+ "t\xEDo/t\xEDa bisabuelo"
7302
+ );
7121
7303
  }
7122
- return `${prefix}t\xEDo/t\xEDa`;
7304
+ return pick3(
7305
+ sex,
7306
+ `t\xEDo abuelo (${level - 1}.\xBA)`,
7307
+ `t\xEDa abuela (${level - 1}.\xAA)`,
7308
+ `t\xEDo/t\xEDa abuelo (${level - 1}.\xBA)`
7309
+ );
7123
7310
  }
7124
7311
  nibling() {
7125
- const prefix = this.directPrefix();
7126
- if (this.personN?.isMale()) {
7127
- return `${prefix}sobrino`;
7312
+ const level = Math.abs(this.pathN?.level ?? 0);
7313
+ const sex = sexOf3(this.personN);
7314
+ if (level <= 1) {
7315
+ return pick3(sex, "sobrino", "sobrina", "sobrino/sobrina");
7128
7316
  }
7129
- if (this.personN?.isFemale()) {
7130
- return `${prefix}sobrina`;
7317
+ if (level === 2) {
7318
+ return pick3(
7319
+ sex,
7320
+ "sobrino nieto",
7321
+ "sobrina nieta",
7322
+ "sobrino/sobrina nieto"
7323
+ );
7324
+ }
7325
+ if (level === 3) {
7326
+ return pick3(
7327
+ sex,
7328
+ "sobrino bisnieto",
7329
+ "sobrina bisnieta",
7330
+ "sobrino/sobrina bisnieto"
7331
+ );
7131
7332
  }
7132
- return `${prefix}sobrino/sobrina`;
7333
+ return pick3(
7334
+ sex,
7335
+ `sobrino nieto (${level - 1}.\xBA)`,
7336
+ `sobrina nieta (${level - 1}.\xAA)`,
7337
+ `sobrino/sobrina nieto (${level - 1}.\xBA)`
7338
+ );
7133
7339
  }
7134
7340
  parent() {
7135
- const prefix = this.directPrefix();
7136
- if (this.personN?.isMale()) {
7137
- return `${prefix}padre`;
7341
+ const level = Math.abs(this.pathN?.level ?? 0);
7342
+ const sex = sexOf3(this.personN);
7343
+ if (level <= 1) {
7344
+ return pick3(sex, "padre", "madre", "padre/madre");
7138
7345
  }
7139
- if (this.personN?.isFemale()) {
7140
- return `${prefix}madre`;
7346
+ if (level === 2) {
7347
+ return pick3(sex, "abuelo", "abuela", "abuelo/abuela");
7141
7348
  }
7142
- return `${prefix}padre/madre`;
7349
+ if (level === 3) {
7350
+ return pick3(sex, "bisabuelo", "bisabuela", "bisabuelo/bisabuela");
7351
+ }
7352
+ if (level === 4) {
7353
+ return pick3(
7354
+ sex,
7355
+ "tatarabuelo",
7356
+ "tatarabuela",
7357
+ "tatarabuelo/tatarabuela"
7358
+ );
7359
+ }
7360
+ if (level === 5) {
7361
+ return pick3(
7362
+ sex,
7363
+ "trastatarabuelo",
7364
+ "trastatarabuela",
7365
+ "trastatarabuelo/trastatarabuela"
7366
+ );
7367
+ }
7368
+ return pick3(
7369
+ sex,
7370
+ `abuelo (${level}.\xBA)`,
7371
+ `abuela (${level}.\xAA)`,
7372
+ `abuelo/abuela (${level}.\xBA)`
7373
+ );
7143
7374
  }
7144
7375
  child() {
7145
- const prefix = this.directPrefix();
7146
- if (this.personN?.isMale()) {
7147
- return `${prefix}hijo`;
7376
+ const level = Math.abs(this.pathN?.level ?? 0);
7377
+ const sex = sexOf3(this.personN);
7378
+ if (level <= 1) {
7379
+ return pick3(sex, "hijo", "hija", "hijo/hija");
7148
7380
  }
7149
- if (this.personN?.isFemale()) {
7150
- return `${prefix}hija`;
7381
+ if (level === 2) {
7382
+ return pick3(sex, "nieto", "nieta", "nieto/nieta");
7151
7383
  }
7152
- return `${prefix}hijo/hija`;
7153
- }
7154
- sibling() {
7155
- if (this.personN?.isMale()) {
7156
- return "hermano";
7384
+ if (level === 3) {
7385
+ return pick3(sex, "bisnieto", "bisnieta", "bisnieto/bisnieta");
7157
7386
  }
7158
- if (this.personN?.isFemale()) {
7159
- return "hermana";
7387
+ if (level === 4) {
7388
+ return pick3(
7389
+ sex,
7390
+ "tataranieto",
7391
+ "tataranieta",
7392
+ "tataranieto/tataranieta"
7393
+ );
7394
+ }
7395
+ if (level === 5) {
7396
+ return pick3(
7397
+ sex,
7398
+ "trastataranieto",
7399
+ "trastataranieta",
7400
+ "trastataranieto/trastataranieta"
7401
+ );
7160
7402
  }
7161
- return "hermano/hermana";
7403
+ return pick3(
7404
+ sex,
7405
+ `nieto (${level}.\xBA)`,
7406
+ `nieta (${level}.\xAA)`,
7407
+ `nieto/nieta (${level}.\xBA)`
7408
+ );
7409
+ }
7410
+ sibling() {
7411
+ return pick3(sexOf3(this.personN), "hermano", "hermana", "hermano/hermana");
7162
7412
  }
7163
7413
  halfBlood(relation) {
7164
7414
  if (!relation || !this.isHalfBlood) {
@@ -7173,40 +7423,30 @@ var KinshipTranslatorEs = class extends KinshipTranslatorBasic {
7173
7423
  return `medio/a ${relation}`;
7174
7424
  }
7175
7425
  spouse() {
7176
- if (this.personN?.isMale()) {
7177
- return "esposo";
7178
- }
7179
- if (this.personN?.isFemale()) {
7180
- return "esposa";
7181
- }
7182
- return "c\xF3nyuge";
7426
+ return pick3(sexOf3(this.personN), "esposo", "esposa", "c\xF3nyuge");
7183
7427
  }
7184
7428
  ofSpouse(relation) {
7185
7429
  if (!relation) {
7186
7430
  return "";
7187
7431
  }
7188
- const spouse = this.path?.[1].indi;
7189
- let spouseType = "c\xF3nyuge";
7190
- if (spouse?.isMale()) {
7191
- spouseType = "esposo";
7192
- }
7193
- if (spouse?.isFemale()) {
7194
- spouseType = "esposa";
7195
- }
7196
- return `${relation} del ${spouseType}`;
7432
+ const spouseType = pick3(
7433
+ sexOf3(this.path?.[1].indi),
7434
+ "esposo",
7435
+ "esposa",
7436
+ "c\xF3nyuge"
7437
+ );
7438
+ return `${relation} ${ofSpousePrep2(spouseType)}${spouseType}`;
7197
7439
  }
7198
7440
  spouseOf(relation) {
7199
7441
  if (!relation) {
7200
7442
  return "";
7201
7443
  }
7202
- const spouse = this.path?.[this.path.length - 1].indi;
7203
- let spouseType = "c\xF3nyuge";
7204
- if (spouse?.isMale()) {
7205
- spouseType = "esposo";
7206
- }
7207
- if (spouse?.isFemale()) {
7208
- spouseType = "esposa";
7209
- }
7444
+ const spouseType = pick3(
7445
+ sexOf3(this.path?.[this.path.length - 1].indi),
7446
+ "esposo",
7447
+ "esposa",
7448
+ "c\xF3nyuge"
7449
+ );
7210
7450
  return `${spouseType} de ${relation}`;
7211
7451
  }
7212
7452
  of(relation) {
@@ -7224,8 +7464,8 @@ var KinshipTranslatorEs = class extends KinshipTranslatorBasic {
7224
7464
  if (!name || !relation) {
7225
7465
  return relation ?? "";
7226
7466
  }
7227
- if (relation.includes(" del ") || relation.includes(" de ")) {
7228
- return relation.replace(/ (del|de) /, ` $1 ${name} `);
7467
+ if (relation.includes(" del ") || relation.includes(" de la ") || relation.includes(" de ")) {
7468
+ return relation.replace(/ (del|de la|de) /, ` $1 ${name} `);
7229
7469
  }
7230
7470
  return `${relation} de ${name}`;
7231
7471
  }
@@ -7255,7 +7495,20 @@ var KinshipTranslatorEs = class extends KinshipTranslatorBasic {
7255
7495
  if (!relation || !this.pathN?.relation) {
7256
7496
  return relation ?? "";
7257
7497
  }
7258
- return `${this.pathN.relation} ${relation}`;
7498
+ const mapped = parentRelationsEs[this.pathN.relation]?.[relation];
7499
+ if (mapped) {
7500
+ return mapped;
7501
+ }
7502
+ if (this.pathN.relation === "step") {
7503
+ return `${relation} pol\xEDtico`;
7504
+ }
7505
+ if (this.pathN.relation === "adopted") {
7506
+ return `${relation} adoptivo`;
7507
+ }
7508
+ if (this.pathN.relation === "foster") {
7509
+ return `${relation} de acogida`;
7510
+ }
7511
+ return relation;
7259
7512
  }
7260
7513
  };
7261
7514
 
@@ -7264,15 +7517,35 @@ var InLawsRu = {
7264
7517
  "\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",
7265
7518
  "\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",
7266
7519
  "\u043C\u0443\u0436 (\u0440\u0435\u0431\u0451\u043D\u043A\u0430|\u0434\u043E\u0447\u0435\u0440\u0438|\u0441\u044B\u043D\u0430)": "\u0437\u044F\u0442\u044C",
7267
- "\u043C\u0430\u0442\u044C (\u0441\u0443\u043F\u0440\u0443\u0433\u0430|\u0436\u0435\u043D\u044B|\u043C\u0443\u0436\u0430)": "\u0442\u0451\u0449\u0430",
7268
- "\u043E\u0442\u0435\u0446 (\u0441\u0443\u043F\u0440\u0443\u0433\u0430|\u0436\u0435\u043D\u044B|\u043C\u0443\u0436\u0430)": "\u0442\u0435\u0441\u0442\u044C",
7269
- "\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",
7520
+ "\u043C\u0430\u0442\u044C \u0436\u0435\u043D\u044B": "\u0442\u0451\u0449\u0430",
7521
+ "\u043C\u0430\u0442\u044C \u043C\u0443\u0436\u0430": "\u0441\u0432\u0435\u043A\u0440\u043E\u0432\u044C",
7522
+ "\u043C\u0430\u0442\u044C \u0441\u0443\u043F\u0440\u0443\u0433\u0430": "\u0442\u0451\u0449\u0430/\u0441\u0432\u0435\u043A\u0440\u043E\u0432\u044C",
7523
+ "\u043E\u0442\u0435\u0446 \u0436\u0435\u043D\u044B": "\u0442\u0435\u0441\u0442\u044C",
7524
+ "\u043E\u0442\u0435\u0446 \u043C\u0443\u0436\u0430": "\u0441\u0432\u0451\u043A\u043E\u0440",
7525
+ "\u043E\u0442\u0435\u0446 \u0441\u0443\u043F\u0440\u0443\u0433\u0430": "\u0442\u0435\u0441\u0442\u044C/\u0441\u0432\u0451\u043A\u043E\u0440",
7526
+ "\u0440\u043E\u0434\u0438\u0442\u0435\u043B\u044C \u0436\u0435\u043D\u044B": "\u0442\u0435\u0441\u0442\u044C/\u0442\u0451\u0449\u0430",
7527
+ "\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",
7528
+ "\u0440\u043E\u0434\u0438\u0442\u0435\u043B\u044C \u0441\u0443\u043F\u0440\u0443\u0433\u0430": "\u0442\u0435\u0441\u0442\u044C/\u0442\u0451\u0449\u0430",
7270
7529
  "\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",
7271
7530
  "\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",
7272
7531
  "\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",
7273
- "(\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",
7274
- "(\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",
7275
- "(\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"
7532
+ "(\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",
7533
+ "(\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",
7534
+ "(\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",
7535
+ "(\u0441\u0432\u043E\u0434\u043D(?:\u044B\u0439|\u0430\u044F) )?\u0431\u0440\u0430\u0442 \u0436\u0435\u043D\u044B": "\u0448\u0443\u0440\u0438\u043D",
7536
+ "(\u0441\u0432\u043E\u0434\u043D(?:\u044B\u0439|\u0430\u044F) )?\u0431\u0440\u0430\u0442 \u043C\u0443\u0436\u0430": "\u0434\u0435\u0432\u0435\u0440\u044C",
7537
+ "(\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",
7538
+ "(\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",
7539
+ "(\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",
7540
+ "(\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"
7541
+ };
7542
+ var parentRelationsRu = {
7543
+ step: {
7544
+ \u043E\u0442\u0435\u0446: "\u043E\u0442\u0447\u0438\u043C",
7545
+ \u043C\u0430\u0442\u044C: "\u043C\u0430\u0447\u0435\u0445\u0430",
7546
+ \u0441\u044B\u043D: "\u043F\u0430\u0441\u044B\u043D\u043E\u043A",
7547
+ \u0434\u043E\u0447\u044C: "\u043F\u0430\u0434\u0447\u0435\u0440\u0438\u0446\u0430"
7548
+ }
7276
7549
  };
7277
7550
 
7278
7551
  // src/kinship-translator/kinship-translator.ru.ts
@@ -7303,7 +7576,7 @@ var cousinWord = (degree, sex) => {
7303
7576
  return `${stem}\u044B\u0439 \u0431\u0440\u0430\u0442/\u0441\u0435\u0441\u0442\u0440\u0430`;
7304
7577
  };
7305
7578
  var praRepeat = (count) => count > 0 ? "\u043F\u0440\u0430".repeat(count) : "";
7306
- var sexOf = (person) => {
7579
+ var sexOf4 = (person) => {
7307
7580
  if (person?.isMale?.()) {
7308
7581
  return "m";
7309
7582
  }
@@ -7318,7 +7591,7 @@ var KinshipTranslatorRu = class extends KinshipTranslatorBasic {
7318
7591
  if (degree > 0) {
7319
7592
  degree = degree - 1;
7320
7593
  }
7321
- return cousinWord(degree, sexOf(this.personN));
7594
+ return cousinWord(degree, sexOf4(this.personN));
7322
7595
  }
7323
7596
  removal() {
7324
7597
  const level = this.pathN?.level ?? 0;
@@ -7330,35 +7603,53 @@ var KinshipTranslatorRu = class extends KinshipTranslatorBasic {
7330
7603
  return level < 0 ? this.nibling() : this.auncle();
7331
7604
  }
7332
7605
  const removed = Math.abs(level);
7333
- return `${cousinWord(degree, sexOf(this.personN))} (${removed}\xD7 \u0447\u0435\u0440\u0435\u0437 \u043F\u043E\u043A\u043E\u043B\u0435\u043D\u0438\u0435)`;
7606
+ return `${cousinWord(degree, sexOf4(this.personN))} (${removed}\xD7 \u0447\u0435\u0440\u0435\u0437 \u043F\u043E\u043A\u043E\u043B\u0435\u043D\u0438\u0435)`;
7334
7607
  }
7335
7608
  auncle() {
7336
7609
  const level = Math.abs(this.pathN?.level ?? 0);
7337
- const pra = praRepeat(Math.max(0, level - 2));
7338
- const sex = sexOf(this.personN);
7610
+ const sex = sexOf4(this.personN);
7611
+ if (level <= 1) {
7612
+ if (sex === "m") {
7613
+ return "\u0434\u044F\u0434\u044F";
7614
+ }
7615
+ if (sex === "f") {
7616
+ return "\u0442\u0451\u0442\u044F";
7617
+ }
7618
+ return "\u0434\u044F\u0434\u044F/\u0442\u0451\u0442\u044F";
7619
+ }
7620
+ const pra = praRepeat(level - 2);
7339
7621
  if (sex === "m") {
7340
- return `${pra}\u0434\u044F\u0434\u044F`;
7622
+ return `\u0434\u0432\u043E\u044E\u0440\u043E\u0434\u043D\u044B\u0439 ${pra}\u0434\u0435\u0434`;
7341
7623
  }
7342
7624
  if (sex === "f") {
7343
- return `${pra}\u0442\u0451\u0442\u044F`;
7625
+ return `\u0434\u0432\u043E\u044E\u0440\u043E\u0434\u043D\u0430\u044F ${pra}\u0431\u0430\u0431\u0443\u0448\u043A\u0430`;
7344
7626
  }
7345
- return `${pra}\u0434\u044F\u0434\u044F/\u0442\u0451\u0442\u044F`;
7627
+ return `\u0434\u0432\u043E\u044E\u0440\u043E\u0434\u043D\u044B\u0439 ${pra}\u0434\u0435\u0434/\u0431\u0430\u0431\u0443\u0448\u043A\u0430`;
7346
7628
  }
7347
7629
  nibling() {
7348
7630
  const level = Math.abs(this.pathN?.level ?? 0);
7349
- const pra = praRepeat(Math.max(0, level - 2));
7350
- const sex = sexOf(this.personN);
7631
+ const sex = sexOf4(this.personN);
7632
+ if (level <= 1) {
7633
+ if (sex === "m") {
7634
+ return "\u043F\u043B\u0435\u043C\u044F\u043D\u043D\u0438\u043A";
7635
+ }
7636
+ if (sex === "f") {
7637
+ return "\u043F\u043B\u0435\u043C\u044F\u043D\u043D\u0438\u0446\u0430";
7638
+ }
7639
+ return "\u043F\u043B\u0435\u043C\u044F\u043D\u043D\u0438\u043A/\u043F\u043B\u0435\u043C\u044F\u043D\u043D\u0438\u0446\u0430";
7640
+ }
7641
+ const pra = praRepeat(level - 2);
7351
7642
  if (sex === "m") {
7352
- return `${pra}\u043F\u043B\u0435\u043C\u044F\u043D\u043D\u0438\u043A`;
7643
+ return `${pra}\u0432\u043D\u0443\u0447\u0430\u0442\u044B\u0439 \u043F\u043B\u0435\u043C\u044F\u043D\u043D\u0438\u043A`;
7353
7644
  }
7354
7645
  if (sex === "f") {
7355
- return `${pra}\u043F\u043B\u0435\u043C\u044F\u043D\u043D\u0438\u0446\u0430`;
7646
+ return `${pra}\u0432\u043D\u0443\u0447\u0430\u0442\u0430\u044F \u043F\u043B\u0435\u043C\u044F\u043D\u043D\u0438\u0446\u0430`;
7356
7647
  }
7357
- return `${pra}\u043F\u043B\u0435\u043C\u044F\u043D\u043D\u0438\u043A/\u043F\u043B\u0435\u043C\u044F\u043D\u043D\u0438\u0446\u0430`;
7648
+ 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`;
7358
7649
  }
7359
7650
  parent() {
7360
7651
  const level = Math.abs(this.pathN?.level ?? 0);
7361
- const sex = sexOf(this.personN);
7652
+ const sex = sexOf4(this.personN);
7362
7653
  if (level <= 1) {
7363
7654
  if (sex === "m") {
7364
7655
  return "\u043E\u0442\u0435\u0446";
@@ -7388,7 +7679,7 @@ var KinshipTranslatorRu = class extends KinshipTranslatorBasic {
7388
7679
  }
7389
7680
  child() {
7390
7681
  const level = Math.abs(this.pathN?.level ?? 0);
7391
- const sex = sexOf(this.personN);
7682
+ const sex = sexOf4(this.personN);
7392
7683
  if (level <= 1) {
7393
7684
  if (sex === "m") {
7394
7685
  return "\u0441\u044B\u043D";
@@ -7417,14 +7708,14 @@ var KinshipTranslatorRu = class extends KinshipTranslatorBasic {
7417
7708
  return `${pra}\u0432\u043D\u0443\u043A/\u0432\u043D\u0443\u0447\u043A\u0430`;
7418
7709
  }
7419
7710
  sibling() {
7420
- const sex = sexOf(this.personN);
7711
+ const sex = sexOf4(this.personN);
7421
7712
  if (sex === "m") {
7422
7713
  return "\u0431\u0440\u0430\u0442";
7423
7714
  }
7424
7715
  if (sex === "f") {
7425
7716
  return "\u0441\u0435\u0441\u0442\u0440\u0430";
7426
7717
  }
7427
- return "\u0441\u0438\u0431\u043B\u0438\u043D\u0433";
7718
+ return "\u0431\u0440\u0430\u0442/\u0441\u0435\u0441\u0442\u0440\u0430";
7428
7719
  }
7429
7720
  halfBlood(relation) {
7430
7721
  if (!relation || !this.isHalfBlood) {
@@ -7438,7 +7729,7 @@ var KinshipTranslatorRu = class extends KinshipTranslatorBasic {
7438
7729
  return `\u0441\u0432\u043E\u0434\u043D\u044B\u0439 ${relation}`;
7439
7730
  }
7440
7731
  spouse() {
7441
- const sex = sexOf(this.personN);
7732
+ const sex = sexOf4(this.personN);
7442
7733
  if (sex === "m") {
7443
7734
  return "\u043C\u0443\u0436";
7444
7735
  }
@@ -7452,7 +7743,7 @@ var KinshipTranslatorRu = class extends KinshipTranslatorBasic {
7452
7743
  return "";
7453
7744
  }
7454
7745
  const spouse = this.path?.[1].indi;
7455
- const sex = sexOf(spouse);
7746
+ const sex = sexOf4(spouse);
7456
7747
  const spouseType = sex === "m" ? "\u043C\u0443\u0436" : sex === "f" ? "\u0436\u0435\u043D\u0430" : "\u0441\u0443\u043F\u0440\u0443\u0433";
7457
7748
  return `${relation} ${toGenitive(spouseType)}`;
7458
7749
  }
@@ -7461,7 +7752,7 @@ var KinshipTranslatorRu = class extends KinshipTranslatorBasic {
7461
7752
  return "";
7462
7753
  }
7463
7754
  const spouse = this.path?.[this.path.length - 1].indi;
7464
- const sex = sexOf(spouse);
7755
+ const sex = sexOf4(spouse);
7465
7756
  const spouseType = sex === "m" ? "\u043C\u0443\u0436" : sex === "f" ? "\u0436\u0435\u043D\u0430" : "\u0441\u0443\u043F\u0440\u0443\u0433";
7466
7757
  return `${spouseType} ${toGenitive(relation)}`;
7467
7758
  }
@@ -7498,7 +7789,22 @@ var KinshipTranslatorRu = class extends KinshipTranslatorBasic {
7498
7789
  if (!relation || !this.pathN?.relation) {
7499
7790
  return relation ?? "";
7500
7791
  }
7501
- return `${this.pathN.relation} ${relation}`;
7792
+ const mapped = parentRelationsRu[this.pathN.relation]?.[relation];
7793
+ if (mapped) {
7794
+ return mapped;
7795
+ }
7796
+ if (this.pathN.relation === "step") {
7797
+ return `\u043D\u0435\u0440\u043E\u0434\u043D\u043E\u0439 ${relation}`;
7798
+ }
7799
+ if (this.pathN.relation === "adopted") {
7800
+ return /сестра|дочь|мать|тётя|бабушка|жена|племянница|внучка/.test(
7801
+ relation
7802
+ ) ? `\u043F\u0440\u0438\u0451\u043C\u043D\u0430\u044F ${relation}` : `\u043F\u0440\u0438\u0451\u043C\u043D\u044B\u0439 ${relation}`;
7803
+ }
7804
+ if (this.pathN.relation === "foster") {
7805
+ return `\u043F\u0440\u0438\u0451\u043C\u043D\u044B\u0439 ${relation}`;
7806
+ }
7807
+ return relation;
7502
7808
  }
7503
7809
  };
7504
7810
 
@@ -7522,7 +7828,7 @@ var InLawsJa = {
7522
7828
  };
7523
7829
 
7524
7830
  // src/kinship-translator/kinship-translator.ja.ts
7525
- var sexOf2 = (person) => {
7831
+ var sexOf5 = (person) => {
7526
7832
  if (person?.isMale?.()) {
7527
7833
  return "m";
7528
7834
  }
@@ -7531,7 +7837,7 @@ var sexOf2 = (person) => {
7531
7837
  }
7532
7838
  return "n";
7533
7839
  };
7534
- var pick = (sex, male, female, neutral) => {
7840
+ var pick4 = (sex, male, female, neutral) => {
7535
7841
  if (sex === "m") {
7536
7842
  return male;
7537
7843
  }
@@ -7544,18 +7850,18 @@ var lineal = (level, sex, kind) => {
7544
7850
  const L = Math.max(1, level);
7545
7851
  if (kind === "asc") {
7546
7852
  if (L <= 1) {
7547
- return pick(sex, "\u7236", "\u6BCD", "\u89AA");
7853
+ return pick4(sex, "\u7236", "\u6BCD", "\u89AA");
7548
7854
  }
7549
7855
  if (L === 2) {
7550
- return pick(sex, "\u7956\u7236", "\u7956\u6BCD", "\u7956\u7236\u6BCD");
7856
+ return pick4(sex, "\u7956\u7236", "\u7956\u6BCD", "\u7956\u7236\u6BCD");
7551
7857
  }
7552
7858
  if (L === 3) {
7553
- return pick(sex, "\u66FE\u7956\u7236", "\u66FE\u7956\u6BCD", "\u66FE\u7956\u7236\u6BCD");
7859
+ return pick4(sex, "\u66FE\u7956\u7236", "\u66FE\u7956\u6BCD", "\u66FE\u7956\u7236\u6BCD");
7554
7860
  }
7555
7861
  if (L === 4) {
7556
- return pick(sex, "\u9AD8\u7956\u7236", "\u9AD8\u7956\u6BCD", "\u9AD8\u7956\u7236\u6BCD");
7862
+ return pick4(sex, "\u9AD8\u7956\u7236", "\u9AD8\u7956\u6BCD", "\u9AD8\u7956\u7236\u6BCD");
7557
7863
  }
7558
- return pick(
7864
+ return pick4(
7559
7865
  sex,
7560
7866
  `${L - 1}\u4E16\u306E\u7956\u7236`,
7561
7867
  `${L - 1}\u4E16\u306E\u7956\u6BCD`,
@@ -7563,7 +7869,7 @@ var lineal = (level, sex, kind) => {
7563
7869
  );
7564
7870
  }
7565
7871
  if (L <= 1) {
7566
- return pick(sex, "\u606F\u5B50", "\u5A18", "\u5B50");
7872
+ return pick4(sex, "\u606F\u5B50", "\u5A18", "\u5B50");
7567
7873
  }
7568
7874
  if (L === 2) {
7569
7875
  return "\u5B6B";
@@ -7610,52 +7916,52 @@ var KinshipTranslatorJa = class extends KinshipTranslatorBasic {
7610
7916
  }
7611
7917
  auncle() {
7612
7918
  const level = Math.abs(this.pathN?.level ?? 0);
7613
- const sex = sexOf2(this.personN);
7614
- if (level <= 2) {
7615
- return pick(sex, "\u304A\u3058", "\u304A\u3070", "\u304A\u3058/\u304A\u3070");
7919
+ const sex = sexOf5(this.personN);
7920
+ if (level <= 1) {
7921
+ return pick4(sex, "\u304A\u3058", "\u304A\u3070", "\u304A\u3058/\u304A\u3070");
7616
7922
  }
7617
- if (level === 3) {
7618
- return pick(sex, "\u5927\u304A\u3058", "\u5927\u304A\u3070", "\u5927\u304A\u3058/\u5927\u304A\u3070");
7923
+ if (level === 2) {
7924
+ return pick4(sex, "\u5927\u304A\u3058", "\u5927\u304A\u3070", "\u5927\u304A\u3058/\u5927\u304A\u3070");
7619
7925
  }
7620
- return pick(
7926
+ return pick4(
7621
7927
  sex,
7622
- `${level - 2}\u4EE3\u524D\u306E\u304A\u3058`,
7623
- `${level - 2}\u4EE3\u524D\u306E\u304A\u3070`,
7624
- `${level - 2}\u4EE3\u524D\u306E\u304A\u3058/\u304A\u3070`
7928
+ `${level - 1}\u4EE3\u524D\u306E\u304A\u3058`,
7929
+ `${level - 1}\u4EE3\u524D\u306E\u304A\u3070`,
7930
+ `${level - 1}\u4EE3\u524D\u306E\u304A\u3058/\u304A\u3070`
7625
7931
  );
7626
7932
  }
7627
7933
  nibling() {
7628
7934
  const level = Math.abs(this.pathN?.level ?? 0);
7629
- const sex = sexOf2(this.personN);
7630
- if (level <= 2) {
7631
- return pick(sex, "\u7525", "\u59EA", "\u7525/\u59EA");
7935
+ const sex = sexOf5(this.personN);
7936
+ if (level <= 1) {
7937
+ return pick4(sex, "\u7525", "\u59EA", "\u7525/\u59EA");
7632
7938
  }
7633
- if (level === 3) {
7634
- return pick(sex, "\u5927\u7525", "\u5927\u59EA", "\u5927\u7525/\u5927\u59EA");
7939
+ if (level === 2) {
7940
+ return pick4(sex, "\u5927\u7525", "\u5927\u59EA", "\u5927\u7525/\u5927\u59EA");
7635
7941
  }
7636
- return pick(
7942
+ return pick4(
7637
7943
  sex,
7638
- `${level - 2}\u4EE3\u4E0B\u306E\u7525`,
7639
- `${level - 2}\u4EE3\u4E0B\u306E\u59EA`,
7640
- `${level - 2}\u4EE3\u4E0B\u306E\u7525/\u59EA`
7944
+ `${level - 1}\u4EE3\u4E0B\u306E\u7525`,
7945
+ `${level - 1}\u4EE3\u4E0B\u306E\u59EA`,
7946
+ `${level - 1}\u4EE3\u4E0B\u306E\u7525/\u59EA`
7641
7947
  );
7642
7948
  }
7643
7949
  parent() {
7644
7950
  return lineal(
7645
7951
  Math.abs(this.pathN?.level ?? 0),
7646
- sexOf2(this.personN),
7952
+ sexOf5(this.personN),
7647
7953
  "asc"
7648
7954
  );
7649
7955
  }
7650
7956
  child() {
7651
7957
  return lineal(
7652
7958
  Math.abs(this.pathN?.level ?? 0),
7653
- sexOf2(this.personN),
7959
+ sexOf5(this.personN),
7654
7960
  "desc"
7655
7961
  );
7656
7962
  }
7657
7963
  sibling() {
7658
- return pick(sexOf2(this.personN), "\u5144\u5F1F", "\u59C9\u59B9", "\u5144\u5F1F\u59C9\u59B9");
7964
+ return pick4(sexOf5(this.personN), "\u5144\u5F1F", "\u59C9\u59B9", "\u5144\u5F1F\u59C9\u59B9");
7659
7965
  }
7660
7966
  halfBlood(relation) {
7661
7967
  if (!relation || !this.isHalfBlood) {
@@ -7664,14 +7970,14 @@ var KinshipTranslatorJa = class extends KinshipTranslatorBasic {
7664
7970
  return `\u7570\u7236\u6BCD\u306E${relation}`;
7665
7971
  }
7666
7972
  spouse() {
7667
- return pick(sexOf2(this.personN), "\u592B", "\u59BB", "\u914D\u5076\u8005");
7973
+ return pick4(sexOf5(this.personN), "\u592B", "\u59BB", "\u914D\u5076\u8005");
7668
7974
  }
7669
7975
  ofSpouse(relation) {
7670
7976
  if (!relation) {
7671
7977
  return "";
7672
7978
  }
7673
- const spouseType = pick(
7674
- sexOf2(this.path?.[1].indi),
7979
+ const spouseType = pick4(
7980
+ sexOf5(this.path?.[1].indi),
7675
7981
  "\u592B",
7676
7982
  "\u59BB",
7677
7983
  "\u914D\u5076\u8005"
@@ -7683,7 +7989,7 @@ var KinshipTranslatorJa = class extends KinshipTranslatorBasic {
7683
7989
  return "";
7684
7990
  }
7685
7991
  const spouse = this.path?.[this.path.length - 1].indi;
7686
- const spouseType = pick(sexOf2(spouse), "\u592B", "\u59BB", "\u914D\u5076\u8005");
7992
+ const spouseType = pick4(sexOf5(spouse), "\u592B", "\u59BB", "\u914D\u5076\u8005");
7687
7993
  return `${relation}\u306E${spouseType}`;
7688
7994
  }
7689
7995
  of(relation) {
@@ -7719,7 +8025,28 @@ var KinshipTranslatorJa = class extends KinshipTranslatorBasic {
7719
8025
  if (!relation || !this.pathN?.relation) {
7720
8026
  return relation ?? "";
7721
8027
  }
7722
- return `${this.pathN.relation}\u306E${relation}`;
8028
+ if (this.pathN.relation === "step") {
8029
+ if (relation === "\u7236") {
8030
+ return "\u7EE7\u7236";
8031
+ }
8032
+ if (relation === "\u6BCD") {
8033
+ return "\u7D99\u6BCD";
8034
+ }
8035
+ if (relation === "\u606F\u5B50") {
8036
+ return "\u7D99\u5B50";
8037
+ }
8038
+ if (relation === "\u5A18") {
8039
+ return "\u7D99\u5A18";
8040
+ }
8041
+ return `\u7D99${relation}`;
8042
+ }
8043
+ if (this.pathN.relation === "adopted") {
8044
+ return `\u990A\u5B50\u306E${relation}`;
8045
+ }
8046
+ if (this.pathN.relation === "foster") {
8047
+ return `\u91CC\u89AA\u306E${relation}`;
8048
+ }
8049
+ return relation;
7723
8050
  }
7724
8051
  };
7725
8052
 
@@ -7728,22 +8055,32 @@ var InLawsZh = {
7728
8055
  "(\u5B50\u5973|\u5973\u513F|\u513F\u5B50)\u7684\u914D\u5076": "\u513F\u5AB3/\u5973\u5A7F",
7729
8056
  "(\u5B50\u5973|\u5973\u513F|\u513F\u5B50)\u7684\u59BB\u5B50": "\u513F\u5AB3",
7730
8057
  "(\u5B50\u5973|\u5973\u513F|\u513F\u5B50)\u7684\u4E08\u592B": "\u5973\u5A7F",
7731
- "(\u914D\u5076|\u59BB\u5B50|\u4E08\u592B)\u7684\u6BCD\u4EB2": "\u5CB3\u6BCD/\u5A46\u5A46",
7732
- "(\u914D\u5076|\u59BB\u5B50|\u4E08\u592B)\u7684\u7236\u4EB2": "\u5CB3\u7236/\u516C\u516C",
7733
- "(\u914D\u5076|\u59BB\u5B50|\u4E08\u592B)\u7684\u7236\u6BCD": "\u5CB3\u7236\u5CB3\u6BCD/\u516C\u516C\u5A46\u5A46",
8058
+ "\u59BB\u5B50\u7684\u6BCD\u4EB2": "\u5CB3\u6BCD",
8059
+ "\u4E08\u592B\u7684\u6BCD\u4EB2": "\u5A46\u5A46",
8060
+ "(\u914D\u5076)\u7684\u6BCD\u4EB2": "\u5CB3\u6BCD/\u5A46\u5A46",
8061
+ "\u59BB\u5B50\u7684\u7236\u4EB2": "\u5CB3\u7236",
8062
+ "\u4E08\u592B\u7684\u7236\u4EB2": "\u516C\u516C",
8063
+ "(\u914D\u5076)\u7684\u7236\u4EB2": "\u5CB3\u7236/\u516C\u516C",
8064
+ "\u59BB\u5B50\u7684\u7236\u6BCD": "\u5CB3\u7236\u5CB3\u6BCD",
8065
+ "\u4E08\u592B\u7684\u7236\u6BCD": "\u516C\u516C\u5A46\u5A46",
8066
+ "(\u914D\u5076)\u7684\u7236\u6BCD": "\u5CB3\u7236\u5CB3\u6BCD/\u516C\u516C\u5A46\u5A46",
7734
8067
  "(\u5F02\u7236\u6BCD\u7684)?(\u5144\u5F1F\u59D0\u59B9|\u59D0\u59B9|\u5144\u5F1F)\u7684\u59BB\u5B50": "\u5AC2\u5B50/\u5F1F\u59B9",
7735
8068
  "(\u5F02\u7236\u6BCD\u7684)?(\u5144\u5F1F\u59D0\u59B9|\u59D0\u59B9|\u5144\u5F1F)\u7684\u4E08\u592B": "\u59D0\u592B/\u59B9\u592B",
7736
8069
  "(\u5F02\u7236\u6BCD\u7684)?(\u5144\u5F1F\u59D0\u59B9|\u59D0\u59B9|\u5144\u5F1F)\u7684\u914D\u5076": "\u59FB\u4EB2\u5144\u5F1F\u59D0\u59B9",
7737
8070
  "(\u5F02\u7236\u6BCD\u7684)?\u59D0\u59B9\u7684(\u914D\u5076|\u59BB\u5B50|\u4E08\u592B)": "\u59D0\u592B/\u59B9\u592B",
7738
8071
  "(\u5F02\u7236\u6BCD\u7684)?\u5144\u5F1F\u7684(\u914D\u5076|\u59BB\u5B50|\u4E08\u592B)": "\u5AC2\u5B50/\u5F1F\u59B9",
7739
8072
  "(\u5F02\u7236\u6BCD\u7684)?\u5144\u5F1F\u59D0\u59B9\u7684(\u914D\u5076|\u59BB\u5B50|\u4E08\u592B)": "\u59FB\u4EB2\u5144\u5F1F\u59D0\u59B9",
7740
- "(\u5F02\u7236\u6BCD\u7684)?(\u914D\u5076|\u59BB\u5B50|\u4E08\u592B)\u7684\u59D0\u59B9": "\u59D1\u5B50/\u59E8\u5B50",
7741
- "(\u5F02\u7236\u6BCD\u7684)?(\u914D\u5076|\u59BB\u5B50|\u4E08\u592B)\u7684\u5144\u5F1F": "\u5927\u4F2F/\u5C0F\u53D4/\u5185\u5144/\u5185\u5F1F",
8073
+ "(\u5F02\u7236\u6BCD\u7684)?\u59BB\u5B50\u7684\u59D0\u59B9": "\u59E8\u5B50",
8074
+ "(\u5F02\u7236\u6BCD\u7684)?\u4E08\u592B\u7684\u59D0\u59B9": "\u59D1\u5B50",
8075
+ "(\u5F02\u7236\u6BCD\u7684)?(\u914D\u5076)\u7684\u59D0\u59B9": "\u59D1\u5B50/\u59E8\u5B50",
8076
+ "(\u5F02\u7236\u6BCD\u7684)?\u59BB\u5B50\u7684\u5144\u5F1F": "\u5185\u5144/\u5185\u5F1F",
8077
+ "(\u5F02\u7236\u6BCD\u7684)?\u4E08\u592B\u7684\u5144\u5F1F": "\u5927\u4F2F/\u5C0F\u53D4",
8078
+ "(\u5F02\u7236\u6BCD\u7684)?(\u914D\u5076)\u7684\u5144\u5F1F": "\u5927\u4F2F/\u5C0F\u53D4/\u5185\u5144/\u5185\u5F1F",
7742
8079
  "(\u5F02\u7236\u6BCD\u7684)?(\u914D\u5076|\u59BB\u5B50|\u4E08\u592B)\u7684\u5144\u5F1F\u59D0\u59B9": "\u59FB\u4EB2\u5144\u5F1F\u59D0\u59B9"
7743
8080
  };
7744
8081
 
7745
8082
  // src/kinship-translator/kinship-translator.zh.ts
7746
- var sexOf3 = (person) => {
8083
+ var sexOf6 = (person) => {
7747
8084
  if (person?.isMale?.()) {
7748
8085
  return "m";
7749
8086
  }
@@ -7752,7 +8089,7 @@ var sexOf3 = (person) => {
7752
8089
  }
7753
8090
  return "n";
7754
8091
  };
7755
- var pick2 = (sex, male, female, neutral) => {
8092
+ var pick5 = (sex, male, female, neutral) => {
7756
8093
  if (sex === "m") {
7757
8094
  return male;
7758
8095
  }
@@ -7765,41 +8102,41 @@ var lineal2 = (level, sex, kind) => {
7765
8102
  const L = Math.max(1, level);
7766
8103
  if (kind === "asc") {
7767
8104
  if (L <= 1) {
7768
- return pick2(sex, "\u7236\u4EB2", "\u6BCD\u4EB2", "\u7236\u6BCD");
8105
+ return pick5(sex, "\u7236\u4EB2", "\u6BCD\u4EB2", "\u7236\u6BCD");
7769
8106
  }
7770
8107
  if (L === 2) {
7771
- return pick2(sex, "\u7956\u7236", "\u7956\u6BCD", "\u7956\u7236\u6BCD");
8108
+ return pick5(sex, "\u7956\u7236", "\u7956\u6BCD", "\u7956\u7236\u6BCD");
7772
8109
  }
7773
8110
  if (L === 3) {
7774
- return pick2(sex, "\u66FE\u7956\u7236", "\u66FE\u7956\u6BCD", "\u66FE\u7956\u7236\u6BCD");
8111
+ return pick5(sex, "\u66FE\u7956\u7236", "\u66FE\u7956\u6BCD", "\u66FE\u7956\u7236\u6BCD");
7775
8112
  }
7776
8113
  if (L === 4) {
7777
- return pick2(sex, "\u9AD8\u7956\u7236", "\u9AD8\u7956\u6BCD", "\u9AD8\u7956\u7236\u6BCD");
8114
+ return pick5(sex, "\u9AD8\u7956\u7236", "\u9AD8\u7956\u6BCD", "\u9AD8\u7956\u7236\u6BCD");
7778
8115
  }
7779
- return pick2(sex, `${L}\u4E16\u7956`, `${L}\u4E16\u7956\u6BCD`, `${L}\u4E16\u7956\u7236\u6BCD`);
8116
+ return pick5(sex, `${L}\u4E16\u7956`, `${L}\u4E16\u7956\u6BCD`, `${L}\u4E16\u7956\u7236\u6BCD`);
7780
8117
  }
7781
8118
  if (L <= 1) {
7782
- return pick2(sex, "\u513F\u5B50", "\u5973\u513F", "\u5B50\u5973");
8119
+ return pick5(sex, "\u513F\u5B50", "\u5973\u513F", "\u5B50\u5973");
7783
8120
  }
7784
8121
  if (L === 2) {
7785
- return pick2(sex, "\u5B59\u5B50", "\u5B59\u5973", "\u5B59\u5B50\u5973");
8122
+ return pick5(sex, "\u5B59\u5B50", "\u5B59\u5973", "\u5B59\u5B50\u5973");
7786
8123
  }
7787
8124
  if (L === 3) {
7788
- return pick2(sex, "\u66FE\u5B59", "\u66FE\u5B59\u5973", "\u66FE\u5B59\u5B50\u5973");
8125
+ return pick5(sex, "\u66FE\u5B59", "\u66FE\u5B59\u5973", "\u66FE\u5B59\u5B50\u5973");
7789
8126
  }
7790
8127
  if (L === 4) {
7791
- return pick2(sex, "\u7384\u5B59", "\u7384\u5B59\u5973", "\u7384\u5B59\u5B50\u5973");
8128
+ return pick5(sex, "\u7384\u5B59", "\u7384\u5B59\u5973", "\u7384\u5B59\u5B50\u5973");
7792
8129
  }
7793
- return pick2(sex, `${L}\u4E16\u5B59`, `${L}\u4E16\u5B59\u5973`, `${L}\u4E16\u5B59\u5B50\u5973`);
8130
+ return pick5(sex, `${L}\u4E16\u5B59`, `${L}\u4E16\u5B59\u5973`, `${L}\u4E16\u5B59\u5B50\u5973`);
7794
8131
  };
7795
8132
  var cousinPlain2 = (degree, sex) => {
7796
8133
  if (degree <= 1) {
7797
- return pick2(sex, "\u5802\u8868\u5144\u5F1F", "\u5802\u8868\u59D0\u59B9", "\u5802\u8868\u4EB2");
8134
+ return pick5(sex, "\u5802\u8868\u5144\u5F1F", "\u5802\u8868\u59D0\u59B9", "\u5802\u8868\u4EB2");
7798
8135
  }
7799
8136
  if (degree === 2) {
7800
- return pick2(sex, "\u4ECE\u5802\u8868\u5144\u5F1F", "\u4ECE\u5802\u8868\u59D0\u59B9", "\u4ECE\u5802\u8868\u4EB2");
8137
+ return pick5(sex, "\u4ECE\u5802\u8868\u5144\u5F1F", "\u4ECE\u5802\u8868\u59D0\u59B9", "\u4ECE\u5802\u8868\u4EB2");
7801
8138
  }
7802
- return pick2(
8139
+ return pick5(
7803
8140
  sex,
7804
8141
  `${degree}\u4EE3\u5802\u8868\u5144\u5F1F`,
7805
8142
  `${degree}\u4EE3\u5802\u8868\u59D0\u59B9`,
@@ -7812,7 +8149,7 @@ var KinshipTranslatorZh = class extends KinshipTranslatorBasic {
7812
8149
  if (degree > 0) {
7813
8150
  degree = degree - 1;
7814
8151
  }
7815
- return cousinPlain2(degree, sexOf3(this.personN));
8152
+ return cousinPlain2(degree, sexOf6(this.personN));
7816
8153
  }
7817
8154
  removal() {
7818
8155
  const level = this.pathN?.level ?? 0;
@@ -7824,56 +8161,56 @@ var KinshipTranslatorZh = class extends KinshipTranslatorBasic {
7824
8161
  return level < 0 ? this.nibling() : this.auncle();
7825
8162
  }
7826
8163
  const removed = Math.abs(level);
7827
- return `${cousinPlain2(degree, sexOf3(this.personN))}\uFF08\u9694${removed}\u4EE3\uFF09`;
8164
+ return `${cousinPlain2(degree, sexOf6(this.personN))}\uFF08\u9694${removed}\u4EE3\uFF09`;
7828
8165
  }
7829
8166
  auncle() {
7830
8167
  const level = Math.abs(this.pathN?.level ?? 0);
7831
- const sex = sexOf3(this.personN);
7832
- if (level <= 2) {
7833
- return pick2(sex, "\u53D4\u53D4", "\u963F\u59E8", "\u53D4\u4F2F/\u59D1\u59E8");
8168
+ const sex = sexOf6(this.personN);
8169
+ if (level <= 1) {
8170
+ return pick5(sex, "\u53D4\u53D4", "\u963F\u59E8", "\u53D4\u4F2F/\u59D1\u59E8");
7834
8171
  }
7835
- if (level === 3) {
7836
- return pick2(sex, "\u4F2F\u53D4\u7956\u7236", "\u59D1\u7956\u6BCD", "\u4F2F\u53D4\u7956\u7236\u6BCD");
8172
+ if (level === 2) {
8173
+ return pick5(sex, "\u4F2F\u53D4\u7956\u7236", "\u59D1\u7956\u6BCD", "\u4F2F\u53D4\u7956\u7236\u6BCD");
7837
8174
  }
7838
- return pick2(
8175
+ return pick5(
7839
8176
  sex,
7840
- `${level - 2}\u4EE3\u524D\u7684\u53D4\u53D4`,
7841
- `${level - 2}\u4EE3\u524D\u7684\u963F\u59E8`,
7842
- `${level - 2}\u4EE3\u524D\u7684\u53D4\u4F2F/\u59D1\u59E8`
8177
+ `${level - 1}\u4EE3\u524D\u7684\u53D4\u53D4`,
8178
+ `${level - 1}\u4EE3\u524D\u7684\u963F\u59E8`,
8179
+ `${level - 1}\u4EE3\u524D\u7684\u53D4\u4F2F/\u59D1\u59E8`
7843
8180
  );
7844
8181
  }
7845
8182
  nibling() {
7846
8183
  const level = Math.abs(this.pathN?.level ?? 0);
7847
- const sex = sexOf3(this.personN);
7848
- if (level <= 2) {
7849
- return pick2(sex, "\u4F84\u5B50", "\u4F84\u5973", "\u4F84\u5B50\u5973");
8184
+ const sex = sexOf6(this.personN);
8185
+ if (level <= 1) {
8186
+ return pick5(sex, "\u4F84\u5B50", "\u4F84\u5973", "\u4F84\u5B50\u5973");
7850
8187
  }
7851
- if (level === 3) {
7852
- return pick2(sex, "\u4F84\u5B59", "\u4F84\u5B59\u5973", "\u4F84\u5B59\u5B50\u5973");
8188
+ if (level === 2) {
8189
+ return pick5(sex, "\u4F84\u5B59", "\u4F84\u5B59\u5973", "\u4F84\u5B59\u5B50\u5973");
7853
8190
  }
7854
- return pick2(
8191
+ return pick5(
7855
8192
  sex,
7856
- `${level - 2}\u4EE3\u4E0B\u7684\u4F84\u5B50`,
7857
- `${level - 2}\u4EE3\u4E0B\u7684\u4F84\u5973`,
7858
- `${level - 2}\u4EE3\u4E0B\u7684\u4F84\u5B50\u5973`
8193
+ `${level - 1}\u4EE3\u4E0B\u7684\u4F84\u5B50`,
8194
+ `${level - 1}\u4EE3\u4E0B\u7684\u4F84\u5973`,
8195
+ `${level - 1}\u4EE3\u4E0B\u7684\u4F84\u5B50\u5973`
7859
8196
  );
7860
8197
  }
7861
8198
  parent() {
7862
8199
  return lineal2(
7863
8200
  Math.abs(this.pathN?.level ?? 0),
7864
- sexOf3(this.personN),
8201
+ sexOf6(this.personN),
7865
8202
  "asc"
7866
8203
  );
7867
8204
  }
7868
8205
  child() {
7869
8206
  return lineal2(
7870
8207
  Math.abs(this.pathN?.level ?? 0),
7871
- sexOf3(this.personN),
8208
+ sexOf6(this.personN),
7872
8209
  "desc"
7873
8210
  );
7874
8211
  }
7875
8212
  sibling() {
7876
- return pick2(sexOf3(this.personN), "\u5144\u5F1F", "\u59D0\u59B9", "\u5144\u5F1F\u59D0\u59B9");
8213
+ return pick5(sexOf6(this.personN), "\u5144\u5F1F", "\u59D0\u59B9", "\u5144\u5F1F\u59D0\u59B9");
7877
8214
  }
7878
8215
  halfBlood(relation) {
7879
8216
  if (!relation || !this.isHalfBlood) {
@@ -7882,14 +8219,14 @@ var KinshipTranslatorZh = class extends KinshipTranslatorBasic {
7882
8219
  return `\u5F02\u7236\u6BCD\u7684${relation}`;
7883
8220
  }
7884
8221
  spouse() {
7885
- return pick2(sexOf3(this.personN), "\u4E08\u592B", "\u59BB\u5B50", "\u914D\u5076");
8222
+ return pick5(sexOf6(this.personN), "\u4E08\u592B", "\u59BB\u5B50", "\u914D\u5076");
7886
8223
  }
7887
8224
  ofSpouse(relation) {
7888
8225
  if (!relation) {
7889
8226
  return "";
7890
8227
  }
7891
- const spouseType = pick2(
7892
- sexOf3(this.path?.[1].indi),
8228
+ const spouseType = pick5(
8229
+ sexOf6(this.path?.[1].indi),
7893
8230
  "\u4E08\u592B",
7894
8231
  "\u59BB\u5B50",
7895
8232
  "\u914D\u5076"
@@ -7901,7 +8238,7 @@ var KinshipTranslatorZh = class extends KinshipTranslatorBasic {
7901
8238
  return "";
7902
8239
  }
7903
8240
  const spouse = this.path?.[this.path.length - 1].indi;
7904
- const spouseType = pick2(sexOf3(spouse), "\u4E08\u592B", "\u59BB\u5B50", "\u914D\u5076");
8241
+ const spouseType = pick5(sexOf6(spouse), "\u4E08\u592B", "\u59BB\u5B50", "\u914D\u5076");
7905
8242
  return `${relation}\u7684${spouseType}`;
7906
8243
  }
7907
8244
  of(relation) {
@@ -7937,7 +8274,40 @@ var KinshipTranslatorZh = class extends KinshipTranslatorBasic {
7937
8274
  if (!relation || !this.pathN?.relation) {
7938
8275
  return relation ?? "";
7939
8276
  }
7940
- return `${this.pathN.relation}${relation}`;
8277
+ if (this.pathN.relation === "step") {
8278
+ if (relation === "\u7236\u4EB2") {
8279
+ return "\u7EE7\u7236";
8280
+ }
8281
+ if (relation === "\u6BCD\u4EB2") {
8282
+ return "\u7EE7\u6BCD";
8283
+ }
8284
+ if (relation === "\u513F\u5B50") {
8285
+ return "\u7EE7\u5B50";
8286
+ }
8287
+ if (relation === "\u5973\u513F") {
8288
+ return "\u7EE7\u5973";
8289
+ }
8290
+ return `\u7EE7${relation}`;
8291
+ }
8292
+ if (this.pathN.relation === "adopted") {
8293
+ if (relation === "\u7236\u4EB2") {
8294
+ return "\u517B\u7236";
8295
+ }
8296
+ if (relation === "\u6BCD\u4EB2") {
8297
+ return "\u517B\u6BCD";
8298
+ }
8299
+ if (relation === "\u513F\u5B50") {
8300
+ return "\u517B\u5B50";
8301
+ }
8302
+ if (relation === "\u5973\u513F") {
8303
+ return "\u517B\u5973";
8304
+ }
8305
+ return `\u517B${relation}`;
8306
+ }
8307
+ if (this.pathN.relation === "foster") {
8308
+ return `\u5BC4\u517B${relation}`;
8309
+ }
8310
+ return relation;
7941
8311
  }
7942
8312
  };
7943
8313