@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
@@ -171,11 +171,8 @@ var storeCache = {
171
171
  getCacheDbs().relativesOnDegreeCache.setItem(value);
172
172
  }
173
173
  }, 50),
174
- // profilePictureCache IS persisted to IndexedDB
174
+ // Image bytes are stored as one IndexedDB record per photo.
175
175
  profilePictureCache: debounce((value) => {
176
- if (value) {
177
- getCacheDbs().profilePictureCache.setItem(value);
178
- }
179
176
  }, 100)
180
177
  };
181
178
  var resetRelativesCache = () => {
@@ -555,6 +552,82 @@ var dateFormatter = (indi, showMarriages = false, showDays = false, showPlaces =
555
552
  // src/utils/gedcom-trailer.ts
556
553
  var GEDCOM_TRAILER_TAG = "TRLR";
557
554
  var isGedcomTrailerTag = (tag) => tag === GEDCOM_TRAILER_TAG;
555
+
556
+ // src/utils/media-utils.ts
557
+ var getFileExtension = (filename) => {
558
+ if (!filename) {
559
+ return "";
560
+ }
561
+ if (filename.startsWith("data:")) {
562
+ const mime = filename.slice(5).split(";")[0] || "";
563
+ const subtype = (mime.split("/")[1] || "").toLowerCase();
564
+ if (subtype === "jpeg") {
565
+ return "jpg";
566
+ }
567
+ return subtype.split("+")[0] || "";
568
+ }
569
+ const withoutQuery = filename.split(/[?#]/)[0] || filename;
570
+ const match = withoutQuery.match(/\.([^.]+)$/);
571
+ return match ? match[1].toLowerCase() : "";
572
+ };
573
+ var isImageFormat = (format2) => {
574
+ if (!format2) {
575
+ return false;
576
+ }
577
+ let normalized = format2.toLowerCase().trim();
578
+ if (normalized.startsWith("data:")) {
579
+ normalized = getFileExtension(normalized);
580
+ } else if (normalized.includes("/")) {
581
+ normalized = normalized.split("/")[1]?.split("+")[0] || "";
582
+ if (normalized === "jpeg") {
583
+ normalized = "jpg";
584
+ }
585
+ }
586
+ const imageFormats = [
587
+ "jpg",
588
+ "jpeg",
589
+ "png",
590
+ "gif",
591
+ "bmp",
592
+ "webp",
593
+ "svg",
594
+ "tiff",
595
+ "tif"
596
+ ];
597
+ return imageFormats.includes(normalized);
598
+ };
599
+ var resolveObjeForm = (obje) => {
600
+ const value = obje?.get?.("FILE.FORM")?.toValue?.() ?? obje?.get?.("FORM")?.toValue?.();
601
+ return typeof value === "string" && value.trim() ? value.trim() : void 0;
602
+ };
603
+ var mediaIdValue = (obje, path) => {
604
+ const value = obje?.get?.(path)?.toValue?.();
605
+ return typeof value === "string" && value.trim() ? value.trim() : void 0;
606
+ };
607
+ var resolveObjeMediaId = (obje) => mediaIdValue(obje, "RIN") || mediaIdValue(obje, "_CLON._OID") || mediaIdValue(obje, "_MSER._LKID") || mediaIdValue(obje, "_OID") || mediaIdValue(obje, "_LKID");
608
+ var ANCESTRY_MEDIA_RETRIEVAL_PREFIX = "https://www.ancestry.com/api/media/retrieval/v2/image";
609
+ var ANCESTRY_MEDIA_QUERY = "client=trees-mediaservice&imageQuality=hq";
610
+ var ancestryMediaPath = (namespace, imgId) => `/namespaces/${namespace}/media/${imgId}?${ANCESTRY_MEDIA_QUERY}`;
611
+ var ancestryMediaFileUrl = (namespace, imgId) => {
612
+ if (!namespace || !imgId) {
613
+ return void 0;
614
+ }
615
+ return `${ANCESTRY_MEDIA_RETRIEVAL_PREFIX}${ancestryMediaPath(namespace, imgId)}`;
616
+ };
617
+ var objeXrefKey = (obje, fallback = 0) => {
618
+ if (typeof obje?.id === "string" && obje.id) {
619
+ return obje.id;
620
+ }
621
+ const value = obje?.toValue?.();
622
+ if (typeof value === "string" && value.trim()) {
623
+ return value.trim();
624
+ }
625
+ if (typeof fallback === "string" && fallback.trim()) {
626
+ return fallback.trim();
627
+ }
628
+ return `@O${fallback}@`;
629
+ };
630
+ var objeNoteValue = (obje) => mediaIdValue(obje, "FILE.NOTE") || mediaIdValue(obje, "NOTE") || "";
558
631
  var List = class _List {
559
632
  // length = 0;
560
633
  constructor(items) {
@@ -1204,7 +1277,7 @@ var Common = class _Common {
1204
1277
  this,
1205
1278
  options.obje.namespace,
1206
1279
  options.obje.override,
1207
- void 0,
1280
+ this.isAncestry() ? ancestryMediaFileUrl : void 0,
1208
1281
  options.gedcomVersion
1209
1282
  );
1210
1283
  }
@@ -2152,65 +2225,23 @@ var isRemoteOrEmbeddedMediaUrl = (path) => {
2152
2225
  }
2153
2226
  return path.startsWith("data:") || path.startsWith("blob:") || /^https?:\/\//i.test(path);
2154
2227
  };
2155
- var resolveLocalMediaUrl = async (path) => {
2228
+ var resolveLocalMediaUrl = async (path, context) => {
2156
2229
  if (!path) {
2157
2230
  return void 0;
2158
2231
  }
2159
- if (isRemoteOrEmbeddedMediaUrl(path)) {
2232
+ if (path.startsWith("data:") || path.startsWith("blob:")) {
2160
2233
  return path;
2161
2234
  }
2162
- const resolved = await localMediaResolver?.(path);
2163
- return resolved;
2164
- };
2165
- var implemented = (type, ...args) => {
2166
- };
2167
-
2168
- // src/utils/media-utils.ts
2169
- var getFileExtension = (filename) => {
2170
- if (!filename) {
2171
- return "";
2172
- }
2173
- if (filename.startsWith("data:")) {
2174
- const mime = filename.slice(5).split(";")[0] || "";
2175
- const subtype = (mime.split("/")[1] || "").toLowerCase();
2176
- if (subtype === "jpeg") {
2177
- return "jpg";
2178
- }
2179
- return subtype.split("+")[0] || "";
2180
- }
2181
- const withoutQuery = filename.split(/[?#]/)[0] || filename;
2182
- const match = withoutQuery.match(/\.([^.]+)$/);
2183
- return match ? match[1].toLowerCase() : "";
2184
- };
2185
- var isImageFormat = (format2) => {
2186
- if (!format2) {
2187
- return false;
2235
+ const resolved = await localMediaResolver?.(path, context);
2236
+ if (resolved) {
2237
+ return resolved;
2188
2238
  }
2189
- let normalized = format2.toLowerCase().trim();
2190
- if (normalized.startsWith("data:")) {
2191
- normalized = getFileExtension(normalized);
2192
- } else if (normalized.includes("/")) {
2193
- normalized = normalized.split("/")[1]?.split("+")[0] || "";
2194
- if (normalized === "jpeg") {
2195
- normalized = "jpg";
2196
- }
2239
+ if (/^https?:\/\//i.test(path)) {
2240
+ return path;
2197
2241
  }
2198
- const imageFormats = [
2199
- "jpg",
2200
- "jpeg",
2201
- "png",
2202
- "gif",
2203
- "bmp",
2204
- "webp",
2205
- "svg",
2206
- "tiff",
2207
- "tif"
2208
- ];
2209
- return imageFormats.includes(normalized);
2242
+ return void 0;
2210
2243
  };
2211
- var resolveObjeForm = (obje) => {
2212
- const value = obje?.get?.("FILE.FORM")?.toValue?.() ?? obje?.get?.("FORM")?.toValue?.();
2213
- return typeof value === "string" && value.trim() ? value.trim() : void 0;
2244
+ var implemented = (type, ...args) => {
2214
2245
  };
2215
2246
  var uniqueItemsCache = /* @__PURE__ */ new WeakMap();
2216
2247
  var setNestedGroup = (obj, key, value, uniqueCounting = true) => {
@@ -3488,22 +3519,19 @@ var Indi = class extends Common {
3488
3519
  if (objeList) {
3489
3520
  await Promise.all(
3490
3521
  objeList.map(async (objeRef) => {
3491
- const key = objeRef?.id;
3522
+ const key = objeXrefKey(objeRef, 0);
3492
3523
  const obje = objeRef?.standardizeMedia(
3493
3524
  namespace,
3494
3525
  true,
3495
- (ns, iId) => {
3496
- return ns && iId ? `https://mediasvc.ancestry.com/v2/image/namespaces/${ns}/media/${iId}?client=trees-mediaservice&imageQuality=hq` : void 0;
3497
- }
3526
+ ancestryMediaFileUrl
3498
3527
  );
3499
3528
  const isPrimary = obje?.get("_PRIM")?.toValue() === "Y";
3500
- const media = obje?.RIN?.toValue() || obje?.get("_OID")?.toValue();
3501
- const clone = obje?.get("_CLON._OID")?.toValue();
3502
- const mser = obje?.get("_MSER._LKID")?.toValue();
3529
+ const media = resolveObjeMediaId(obje);
3503
3530
  let url = obje?.get("FILE")?.toValue();
3504
3531
  const title = obje?.get("FILE.TITL")?.toValue() ?? obje?.get("TITL")?.toValue() ?? "";
3532
+ const note = objeNoteValue(obje);
3505
3533
  const type = resolveObjeForm(obje) ?? (url ? getFileExtension(url) : void 0) ?? "raw";
3506
- let imgId = clone || mser;
3534
+ let imgId = media;
3507
3535
  const hasEmbeddedOrLocalFile = !!url && (url.startsWith("data:") || url.startsWith("blob:") || !/^https?:\/\//i.test(url));
3508
3536
  if (!hasEmbeddedOrLocalFile && (!www || !tree || !this.id)) {
3509
3537
  return;
@@ -3539,6 +3567,7 @@ var Indi = class extends Common {
3539
3567
  imgId,
3540
3568
  person: this.id,
3541
3569
  title,
3570
+ note,
3542
3571
  url,
3543
3572
  contentType: type,
3544
3573
  downloadName: `${this.id.replaceAll("@", "")}_${this.toNaturalName()?.replaceAll(" ", "-") || ""}_${(title || key.replaceAll("@", "").toString()).replaceAll(" ", "-")}`
@@ -3577,7 +3606,7 @@ var Indi = class extends Common {
3577
3606
  return;
3578
3607
  }
3579
3608
  const obje = o;
3580
- const key = `@O${index}@`;
3609
+ const key = objeXrefKey(obje, index);
3581
3610
  obje.standardizeMedia();
3582
3611
  const isPrimary = obje?.get("_PRIM")?.toValue() === "Y";
3583
3612
  const url = obje?.get("FILE")?.toValue();
@@ -3596,6 +3625,7 @@ var Indi = class extends Common {
3596
3625
  imgId,
3597
3626
  person: this.id,
3598
3627
  title,
3628
+ note: objeNoteValue(obje),
3599
3629
  url,
3600
3630
  contentType: type,
3601
3631
  downloadName: `${this.id.replaceAll("@", "")}_${this.toNaturalName()?.replaceAll(" ", "-") || ""}_${(title || key.replaceAll("@", "").toString()).replaceAll(" ", "-")}`
@@ -3704,7 +3734,7 @@ var Indi = class extends Common {
3704
3734
  if (!obje) {
3705
3735
  return;
3706
3736
  }
3707
- const key = `@O${index}@`;
3737
+ const key = objeXrefKey(obje, index);
3708
3738
  const isPrimary = obje?.get("_PRIM")?.toValue() === "Y";
3709
3739
  const url = obje?.get("FILE")?.toValue();
3710
3740
  const title = obje?.get("TITL")?.toValue() ?? "";
@@ -3721,6 +3751,7 @@ var Indi = class extends Common {
3721
3751
  imgId,
3722
3752
  person: this.id,
3723
3753
  title,
3754
+ note: objeNoteValue(obje),
3724
3755
  url,
3725
3756
  contentType: type,
3726
3757
  downloadName: `${this.id.replaceAll("@", "")}_${this.toNaturalName()?.replaceAll(" ", "-") || ""}_${(title || key.replaceAll("@", "").toString()).replaceAll(" ", "-")}`
@@ -3744,7 +3775,7 @@ var Indi = class extends Common {
3744
3775
  if (!obje) {
3745
3776
  return;
3746
3777
  }
3747
- const key = `@O${index}@`;
3778
+ const key = objeXrefKey(obje, index);
3748
3779
  obje.standardizeMedia();
3749
3780
  const isPrimary = obje?.get("_PRIM")?.toValue() === "Y";
3750
3781
  const url = obje?.get("FILE")?.toValue();
@@ -3761,6 +3792,7 @@ var Indi = class extends Common {
3761
3792
  imgId,
3762
3793
  person: this.id,
3763
3794
  title,
3795
+ note: objeNoteValue(obje),
3764
3796
  url,
3765
3797
  contentType: type,
3766
3798
  downloadName: `${this.id.replaceAll("@", "")}_${this.toNaturalName()?.replaceAll(" ", "-") || ""}_${(title || key.replaceAll("@", "").toString()).replaceAll(" ", "-")}`
@@ -3792,7 +3824,12 @@ var Indi = class extends Common {
3792
3824
  );
3793
3825
  if (cached !== void 0) {
3794
3826
  if (cached?.file && !isRemoteOrEmbeddedMediaUrl(cached.file)) {
3795
- const resolvedCached = await resolveLocalMediaUrl(cached.file);
3827
+ const resolvedCached = await resolveLocalMediaUrl(cached.file, {
3828
+ url: cached.file,
3829
+ person: this.id,
3830
+ tree: this.getTreeId?.(),
3831
+ treeName: this.getTreeName?.()
3832
+ });
3796
3833
  if (resolvedCached && isRemoteOrEmbeddedMediaUrl(resolvedCached)) {
3797
3834
  const refreshed = { ...cached, file: resolvedCached };
3798
3835
  profilePictureCache(
@@ -3817,7 +3854,16 @@ var Indi = class extends Common {
3817
3854
  }
3818
3855
  const mediaArray = Object.values(mediaList);
3819
3856
  const toDisplayableProfile = async (media, isPrimary) => {
3820
- const resolvedFile = await resolveLocalMediaUrl(media.url);
3857
+ const resolvedFile = await resolveLocalMediaUrl(media.url, {
3858
+ url: media.url,
3859
+ id: media.id,
3860
+ imgId: media.imgId,
3861
+ key: media.key,
3862
+ contentType: media.contentType,
3863
+ person: media.person || this.id,
3864
+ tree: media.tree || this.getTreeId?.(),
3865
+ treeName: this.getTreeName?.()
3866
+ });
3821
3867
  if (!resolvedFile || !isRemoteOrEmbeddedMediaUrl(resolvedFile)) {
3822
3868
  return void 0;
3823
3869
  }
@@ -5779,7 +5825,7 @@ var KinshipTranslatorHU = class extends KinshipTranslatorBasic {
5779
5825
  }
5780
5826
  return `${hungarianOrdinalize(
5781
5827
  degree
5782
- )}unokatestv\xE9r ${level}x elt\xE1vol\xEDtva`;
5828
+ )}unokatestv\xE9r ${Math.abs(level)}x elt\xE1vol\xEDtva`;
5783
5829
  }
5784
5830
  auncle() {
5785
5831
  const level = this.pathN?.level ?? 0;
@@ -5823,14 +5869,25 @@ var KinshipTranslatorHU = class extends KinshipTranslatorBasic {
5823
5869
  return `${ordinalized ? `${ordinalized}unoka` : ""}testv\xE9r ${origPrefix.replace(/nagy$/, "")}unok\xE1ja`;
5824
5870
  }
5825
5871
  parent() {
5872
+ const level = Math.abs(this.pathN?.level ?? 0);
5873
+ if (level <= 1) {
5874
+ if (this.personN?.isMale()) {
5875
+ return "apa";
5876
+ }
5877
+ if (this.personN?.isFemale()) {
5878
+ return "anya";
5879
+ }
5880
+ return "sz\xFCl\u0151";
5881
+ }
5826
5882
  const prefix = this.directPrefix();
5883
+ const gen = prefix === "nagy" ? "" : prefix;
5827
5884
  if (this.personN?.isMale()) {
5828
- return `${prefix}apa`;
5885
+ return `${gen}nagyapa`;
5829
5886
  }
5830
5887
  if (this.personN?.isFemale()) {
5831
- return `${prefix}anya`;
5888
+ return `${gen}nagyanya`;
5832
5889
  }
5833
- return `${prefix}sz\xFCl\u0151`;
5890
+ return `${gen}nagysz\xFCl\u0151`;
5834
5891
  }
5835
5892
  child() {
5836
5893
  const level = Math.abs(this.pathN?.level ?? 0);
@@ -6024,27 +6081,30 @@ var KinshipTranslatorEn = class extends KinshipTranslatorBasic {
6024
6081
  if (!degree) {
6025
6082
  return level < 0 ? this.nibling() : this.auncle();
6026
6083
  }
6027
- return `${ordinalize(degree)} cousin ${level}x removed`;
6084
+ return `${ordinalize(degree)} cousin ${Math.abs(level)}x removed`;
6028
6085
  }
6029
6086
  auncle() {
6030
- const prefix = this.directPrefix();
6087
+ const level = Math.abs(this.pathN?.level ?? 0);
6088
+ const greats = level <= 1 ? "" : "great-".repeat(level - 1);
6031
6089
  if (this.personN?.isMale()) {
6032
- return `${prefix}uncle`;
6090
+ return `${greats}uncle`;
6033
6091
  }
6034
6092
  if (this.personN?.isFemale()) {
6035
- return `${prefix}aunt`;
6093
+ return `${greats}aunt`;
6036
6094
  }
6037
- return `${prefix}auncle`;
6095
+ return greats ? `${greats}uncle/${greats}aunt` : "uncle/aunt";
6038
6096
  }
6039
6097
  nibling() {
6040
- const prefix = this.directPrefix();
6098
+ const level = Math.abs(this.pathN?.level ?? 0);
6099
+ const greats = level <= 2 ? "" : "great-".repeat(level - 2);
6100
+ const grand = level <= 1 ? "" : "grand";
6041
6101
  if (this.personN?.isMale()) {
6042
- return `${prefix}nephew`;
6102
+ return `${greats}${grand}nephew`;
6043
6103
  }
6044
6104
  if (this.personN?.isFemale()) {
6045
- return `${prefix}niece`;
6105
+ return `${greats}${grand}niece`;
6046
6106
  }
6047
- return `${prefix}nibling`;
6107
+ return greats || grand ? `${greats}${grand}nephew/${greats}${grand}niece` : "nephew/niece";
6048
6108
  }
6049
6109
  parent() {
6050
6110
  const prefix = this.directPrefix();
@@ -6172,45 +6232,64 @@ var KinshipTranslatorEn = class extends KinshipTranslatorBasic {
6172
6232
  };
6173
6233
 
6174
6234
  // src/kinship-translator/patterns.de.ts
6235
+ var parentRelationsDe = {
6236
+ step: "Stief",
6237
+ foster: "Pflege",
6238
+ adopted: "Adoptiv"
6239
+ };
6175
6240
  var InLawsDe = {
6176
- "Ehepartner von (kind|tochter|sohn)": "Schwiegerkind",
6177
- "Ehefrau von (kind|tochter|sohn)": "Schwiegertochter",
6178
- "Ehemann von (kind|tochter|sohn)": "Schwiegersohn",
6179
- "mutter des (Ehepartner|Ehefrau|Ehemann)s": "Schwiegermutter",
6180
- "vater des (Ehepartner|Ehefrau|Ehemann)s": "Schwiegervater",
6181
- "elternteil des (Ehepartner|Ehefrau|Ehemann)s": "Schwiegerelternteil",
6182
- "Ehefrau von (Halb)?(geschwister|schwester|bruder)": "Schw\xE4gerin",
6183
- "Ehemann von (Halb)?(geschwister|schwester|bruder)": "Schwager",
6184
- "Ehepartner von (Halb)?(geschwister|schwester|bruder)": "Schwager/Schw\xE4gerin",
6185
- "(Halb)?schwester des (Ehepartner|Ehefrau|Ehemann)s": "Schw\xE4gerin",
6186
- "(Halb)?bruder des (Ehepartner|Ehefrau|Ehemann)s": "Schwager",
6187
- "(Halb)?geschwister des (Ehepartner|Ehefrau|Ehemann)s": "Schwager/Schw\xE4gerin"
6241
+ "Ehepartner von (Kind|Tochter|Sohn)": "Schwiegerkind",
6242
+ "Ehefrau von (Kind|Tochter|Sohn)": "Schwiegertochter",
6243
+ "Ehemann von (Kind|Tochter|Sohn)": "Schwiegersohn",
6244
+ "Mutter (des Ehepartners|des Ehemanns|der Ehefrau)": "Schwiegermutter",
6245
+ "Vater (des Ehepartners|des Ehemanns|der Ehefrau)": "Schwiegervater",
6246
+ "Elternteil (des Ehepartners|des Ehemanns|der Ehefrau)": "Schwiegerelternteil",
6247
+ "Ehefrau von (Halb)?-?(Geschwister|Schwester|Bruder)": "Schw\xE4gerin",
6248
+ "Ehemann von (Halb)?-?(Geschwister|Schwester|Bruder)": "Schwager",
6249
+ "Ehepartner von (Halb)?-?(Geschwister|Schwester|Bruder)": "Schwager/Schw\xE4gerin",
6250
+ "(Halb)?-?(Schwester|schwester) (des Ehepartners|des Ehemanns|der Ehefrau)": "Schw\xE4gerin",
6251
+ "(Halb)?-?(Bruder|bruder) (des Ehepartners|des Ehemanns|der Ehefrau)": "Schwager",
6252
+ "(Halb)?-?(Geschwister|geschwister) (des Ehepartners|des Ehemanns|der Ehefrau)": "Schwager/Schw\xE4gerin"
6188
6253
  };
6189
6254
 
6190
6255
  // src/kinship-translator/kinship-translator.de.ts
6191
- var KinshipTranslatorDe = class extends KinshipTranslatorBasic {
6192
- directPrefix() {
6193
- const level = Math.abs(this.pathN?.level ?? 0);
6194
- if (level <= 1) {
6195
- return "";
6196
- }
6197
- if (level === 2) {
6198
- return "Gro\xDF";
6199
- }
6200
- if (level === 3) {
6201
- return "Urgro\xDF";
6202
- }
6203
- return `Ur${level - 2}-gro\xDF`;
6256
+ var sexOf = (person) => {
6257
+ if (person?.isMale?.()) {
6258
+ return "m";
6259
+ }
6260
+ if (person?.isFemale?.()) {
6261
+ return "f";
6262
+ }
6263
+ return "n";
6264
+ };
6265
+ var pick = (sex, male, female, neutral) => {
6266
+ if (sex === "m") {
6267
+ return male;
6268
+ }
6269
+ if (sex === "f") {
6270
+ return female;
6204
6271
  }
6272
+ return neutral;
6273
+ };
6274
+ var ur = (count) => count > 0 ? "Ur".repeat(count) : "";
6275
+ var genitiveArticle = (spouseType) => {
6276
+ if (spouseType === "Ehefrau") {
6277
+ return `der ${spouseType}`;
6278
+ }
6279
+ return `des ${spouseType}s`;
6280
+ };
6281
+ var KinshipTranslatorDe = class extends KinshipTranslatorBasic {
6205
6282
  indirect() {
6206
6283
  let degree = Math.abs(this.pathN?.degree ?? 0);
6207
6284
  if (degree > 0) {
6208
6285
  degree = degree - 1;
6209
6286
  }
6210
- if (degree === 1) {
6211
- return `Cousin`;
6287
+ const sex = sexOf(this.personN);
6288
+ const cousin = pick(sex, "Cousin", "Cousine", "Cousin/Cousine");
6289
+ if (degree <= 1) {
6290
+ return cousin;
6212
6291
  }
6213
- return `Cousin ${degree}. Grades`;
6292
+ return `${cousin} ${degree}. Grades`;
6214
6293
  }
6215
6294
  removal() {
6216
6295
  const level = this.pathN?.level ?? 0;
@@ -6221,101 +6300,101 @@ var KinshipTranslatorDe = class extends KinshipTranslatorBasic {
6221
6300
  if (!degree) {
6222
6301
  return level < 0 ? this.nibling() : this.auncle();
6223
6302
  }
6224
- return `Cousin ${degree}. Grades ${Math.abs(level)}\xD7 entfernt`;
6303
+ return `${this.indirect()} ${Math.abs(level)}\xD7 entfernt`;
6225
6304
  }
6226
6305
  auncle() {
6227
- const prefix = this.directPrefix();
6228
- if (this.personN?.isMale()) {
6229
- return `${prefix}onkel`;
6230
- }
6231
- if (this.personN?.isFemale()) {
6232
- return `${prefix}tante`;
6306
+ const level = Math.abs(this.pathN?.level ?? 0);
6307
+ const sex = sexOf(this.personN);
6308
+ if (level <= 1) {
6309
+ return pick(sex, "Onkel", "Tante", "Onkel/Tante");
6233
6310
  }
6234
- return `${prefix}onkel/tante`;
6311
+ const prefix = `${ur(level - 2)}Gro\xDF`;
6312
+ return pick(
6313
+ sex,
6314
+ `${prefix}onkel`,
6315
+ `${prefix}tante`,
6316
+ `${prefix}onkel/tante`
6317
+ );
6235
6318
  }
6236
6319
  nibling() {
6237
- const prefix = this.directPrefix();
6238
- if (this.personN?.isMale()) {
6239
- return `${prefix}neffe`;
6240
- }
6241
- if (this.personN?.isFemale()) {
6242
- return `${prefix}nichte`;
6320
+ const level = Math.abs(this.pathN?.level ?? 0);
6321
+ const sex = sexOf(this.personN);
6322
+ if (level <= 1) {
6323
+ return pick(sex, "Neffe", "Nichte", "Neffe/Nichte");
6243
6324
  }
6244
- return `${prefix}neffe/nichte`;
6325
+ const prefix = `${ur(level - 2)}Gro\xDF`;
6326
+ return pick(
6327
+ sex,
6328
+ `${prefix}neffe`,
6329
+ `${prefix}nichte`,
6330
+ `${prefix}neffe/nichte`
6331
+ );
6245
6332
  }
6246
6333
  parent() {
6247
- const prefix = this.directPrefix();
6248
- if (this.personN?.isMale()) {
6249
- return `${prefix}vater`;
6250
- }
6251
- if (this.personN?.isFemale()) {
6252
- return `${prefix}mutter`;
6334
+ const level = Math.abs(this.pathN?.level ?? 0);
6335
+ const sex = sexOf(this.personN);
6336
+ if (level <= 1) {
6337
+ return pick(sex, "Vater", "Mutter", "Elternteil");
6253
6338
  }
6254
- return `${prefix}elternteil`;
6339
+ const prefix = `${ur(level - 2)}Gro\xDF`;
6340
+ return pick(
6341
+ sex,
6342
+ `${prefix}vater`,
6343
+ `${prefix}mutter`,
6344
+ `${prefix}elternteil`
6345
+ );
6255
6346
  }
6256
6347
  child() {
6257
- const prefix = this.directPrefix();
6258
- if (this.personN?.isMale()) {
6259
- return `${prefix}sohn`;
6260
- }
6261
- if (this.personN?.isFemale()) {
6262
- return `${prefix}tochter`;
6348
+ const level = Math.abs(this.pathN?.level ?? 0);
6349
+ const sex = sexOf(this.personN);
6350
+ if (level <= 1) {
6351
+ return pick(sex, "Sohn", "Tochter", "Kind");
6263
6352
  }
6264
- return `${prefix}kind`;
6353
+ const prefix = ur(level - 2);
6354
+ return pick(
6355
+ sex,
6356
+ `${prefix}Enkel`,
6357
+ `${prefix}Enkelin`,
6358
+ `${prefix}Enkelkind`
6359
+ );
6265
6360
  }
6266
6361
  sibling() {
6267
- if (this.personN?.isMale()) {
6268
- return "bruder";
6269
- }
6270
- if (this.personN?.isFemale()) {
6271
- return "schwester";
6272
- }
6273
- return "geschwister";
6362
+ return pick(sexOf(this.personN), "Bruder", "Schwester", "Geschwister");
6274
6363
  }
6275
6364
  halfBlood(relation) {
6276
6365
  if (!relation || !this.isHalfBlood) {
6277
6366
  return relation ?? "";
6278
6367
  }
6279
- if (/^[A-ZÄÖÜ]/.test(relation) || /[-\s]/.test(relation)) {
6368
+ if (/[\s-]/.test(relation) || /^(Groß|Ur)/.test(relation)) {
6280
6369
  return `Halb-${relation}`;
6281
6370
  }
6282
- return `Halb${relation}`;
6371
+ return `Halb${relation.charAt(0).toLowerCase()}${relation.slice(1)}`;
6283
6372
  }
6284
6373
  spouse() {
6285
- if (this.personN?.isMale()) {
6286
- return "Ehemann";
6287
- }
6288
- if (this.personN?.isFemale()) {
6289
- return "Ehefrau";
6290
- }
6291
- return "Ehepartner";
6374
+ return pick(sexOf(this.personN), "Ehemann", "Ehefrau", "Ehepartner");
6292
6375
  }
6293
6376
  ofSpouse(relation) {
6294
6377
  if (!relation) {
6295
6378
  return "";
6296
6379
  }
6297
- const spouse = this.path?.[1].indi;
6298
- let spouseType = "Ehepartner";
6299
- if (spouse?.isMale()) {
6300
- spouseType = "Ehemann";
6301
- }
6302
- if (spouse?.isFemale()) {
6303
- spouseType = "Ehefrau";
6304
- }
6305
- return `${relation} des ${spouseType}s`;
6380
+ const spouseType = pick(
6381
+ sexOf(this.path?.[1].indi),
6382
+ "Ehemann",
6383
+ "Ehefrau",
6384
+ "Ehepartner"
6385
+ );
6386
+ return `${relation} ${genitiveArticle(spouseType)}`;
6306
6387
  }
6307
6388
  spouseOf(relation) {
6308
6389
  if (!relation) {
6309
6390
  return "";
6310
6391
  }
6311
- const spouse = this.path?.[this.path.length - 1].indi;
6312
- let spouseType = "Ehepartner";
6313
- if (spouse?.isMale()) {
6314
- spouseType = "Ehemann";
6315
- }
6316
- if (spouse?.isFemale()) {
6317
- spouseType = "Ehefrau";
6318
- }
6392
+ const spouseType = pick(
6393
+ sexOf(this.path?.[this.path.length - 1].indi),
6394
+ "Ehemann",
6395
+ "Ehefrau",
6396
+ "Ehepartner"
6397
+ );
6319
6398
  return `${spouseType} von ${relation}`;
6320
6399
  }
6321
6400
  of(relation) {
@@ -6333,8 +6412,8 @@ var KinshipTranslatorDe = class extends KinshipTranslatorBasic {
6333
6412
  if (!name || !relation) {
6334
6413
  return relation ?? "";
6335
6414
  }
6336
- if (relation.includes(" des ") || relation.includes(" von ")) {
6337
- return relation.replace(/ (des|von) /, ` $1 ${name}s `);
6415
+ if (relation.includes(" des ") || relation.includes(" der ") || relation.includes(" von ")) {
6416
+ return relation.replace(/ (des|der|von) /, ` $1 ${name}s `);
6338
6417
  }
6339
6418
  return `${name}s ${relation}`;
6340
6419
  }
@@ -6364,50 +6443,82 @@ var KinshipTranslatorDe = class extends KinshipTranslatorBasic {
6364
6443
  if (!relation || !this.pathN?.relation) {
6365
6444
  return relation ?? "";
6366
6445
  }
6367
- return `${this.pathN.relation} ${relation}`;
6446
+ const prefix = parentRelationsDe[this.pathN.relation];
6447
+ if (!prefix) {
6448
+ return relation;
6449
+ }
6450
+ if (prefix.endsWith("-") || prefix.endsWith(" ")) {
6451
+ return `${prefix}${relation}`;
6452
+ }
6453
+ return `${prefix}${relation.charAt(0).toLowerCase()}${relation.slice(1)}`;
6368
6454
  }
6369
6455
  };
6370
6456
 
6371
6457
  // src/kinship-translator/patterns.fr.ts
6458
+ var parentRelationsFr = {
6459
+ step: "step",
6460
+ foster: "foster",
6461
+ adopted: "adopted"
6462
+ };
6372
6463
  var InLawsFr = {
6373
6464
  "conjoint de (enfant|fille|fils)": "beau-fils/belle-fille",
6374
6465
  "\xE9pouse de (enfant|fille|fils)": "belle-fille",
6375
6466
  "mari de (enfant|fille|fils)": "gendre",
6376
- "m\xE8re du (conjoint|\xE9pouse|mari)": "belle-m\xE8re",
6377
- "p\xE8re du (conjoint|\xE9pouse|mari)": "beau-p\xE8re",
6378
- "parent du (conjoint|\xE9pouse|mari)": "beau-parent",
6467
+ "m\xE8re (du mari|du conjoint|de l'\xE9pouse)": "belle-m\xE8re",
6468
+ "p\xE8re (du mari|du conjoint|de l'\xE9pouse)": "beau-p\xE8re",
6469
+ "parent (du mari|du conjoint|de l'\xE9pouse)": "beau-parent",
6379
6470
  "\xE9pouse de (demi-)?(fr\xE8re/s\u0153ur|s\u0153ur|fr\xE8re)": "belle-s\u0153ur",
6380
6471
  "mari de (demi-)?(fr\xE8re/s\u0153ur|s\u0153ur|fr\xE8re)": "beau-fr\xE8re",
6381
6472
  "conjoint de (demi-)?(fr\xE8re/s\u0153ur|s\u0153ur|fr\xE8re)": "beau-fr\xE8re/belle-s\u0153ur",
6382
- "(demi-)?s\u0153ur du (conjoint|\xE9pouse|mari)": "belle-s\u0153ur",
6383
- "(demi-)?fr\xE8re du (conjoint|\xE9pouse|mari)": "beau-fr\xE8re",
6384
- "(demi-)?fr\xE8re/s\u0153ur du (conjoint|\xE9pouse|mari)": "beau-fr\xE8re/belle-s\u0153ur"
6473
+ "(demi-)?s\u0153ur (du mari|du conjoint|de l'\xE9pouse)": "belle-s\u0153ur",
6474
+ "(demi-)?fr\xE8re (du mari|du conjoint|de l'\xE9pouse)": "beau-fr\xE8re",
6475
+ "(demi-)?fr\xE8re/s\u0153ur (du mari|du conjoint|de l'\xE9pouse)": "beau-fr\xE8re/belle-s\u0153ur"
6385
6476
  };
6386
6477
 
6387
6478
  // src/kinship-translator/kinship-translator.fr.ts
6388
- var KinshipTranslatorFr = class extends KinshipTranslatorBasic {
6389
- directPrefix() {
6390
- const level = Math.abs(this.pathN?.level ?? 0);
6391
- if (level <= 1) {
6392
- return "";
6393
- }
6394
- if (level === 2) {
6395
- return "grand-";
6396
- }
6397
- if (level === 3) {
6398
- return "arri\xE8re-grand-";
6399
- }
6400
- return `arri\xE8re${level - 2}-grand-`;
6479
+ var sexOf2 = (person) => {
6480
+ if (person?.isMale?.()) {
6481
+ return "m";
6482
+ }
6483
+ if (person?.isFemale?.()) {
6484
+ return "f";
6485
+ }
6486
+ return "n";
6487
+ };
6488
+ var pick2 = (sex, male, female, neutral) => {
6489
+ if (sex === "m") {
6490
+ return male;
6491
+ }
6492
+ if (sex === "f") {
6493
+ return female;
6494
+ }
6495
+ return neutral;
6496
+ };
6497
+ var arriere = (count) => count > 0 ? "arri\xE8re-".repeat(count) : "";
6498
+ var frenchOrdinal = (n) => n === 1 ? "1er" : `${n}e`;
6499
+ var isFeminineRelation = (relation) => /mère|fille|sœur|tante|nièce|cousine|épouse/.test(relation);
6500
+ var ofSpousePrep = (spouseType) => {
6501
+ if (spouseType === "\xE9pouse") {
6502
+ return "de l'";
6401
6503
  }
6504
+ return "du ";
6505
+ };
6506
+ var KinshipTranslatorFr = class extends KinshipTranslatorBasic {
6402
6507
  indirect() {
6403
6508
  let degree = Math.abs(this.pathN?.degree ?? 0);
6404
6509
  if (degree > 0) {
6405
6510
  degree = degree - 1;
6406
6511
  }
6407
- if (degree === 1) {
6408
- return `cousin`;
6512
+ const cousin = pick2(
6513
+ sexOf2(this.personN),
6514
+ "cousin",
6515
+ "cousine",
6516
+ "cousin/cousine"
6517
+ );
6518
+ if (degree <= 1) {
6519
+ return cousin;
6409
6520
  }
6410
- return `cousin au ${ordinalize(degree)} degr\xE9`;
6521
+ return `${cousin} au ${frenchOrdinal(degree)} degr\xE9`;
6411
6522
  }
6412
6523
  removal() {
6413
6524
  const level = this.pathN?.level ?? 0;
@@ -6418,56 +6529,57 @@ var KinshipTranslatorFr = class extends KinshipTranslatorBasic {
6418
6529
  if (!degree) {
6419
6530
  return level < 0 ? this.nibling() : this.auncle();
6420
6531
  }
6421
- return `cousin au ${ordinalize(degree)} degr\xE9 ${Math.abs(level)}\xD7 \xE9loign\xE9`;
6532
+ return `${this.indirect()} ${Math.abs(level)}\xD7 \xE9loign\xE9`;
6422
6533
  }
6423
6534
  auncle() {
6424
- const prefix = this.directPrefix();
6425
- if (this.personN?.isMale()) {
6426
- return `${prefix}oncle`;
6427
- }
6428
- if (this.personN?.isFemale()) {
6429
- return `${prefix}tante`;
6535
+ const level = Math.abs(this.pathN?.level ?? 0);
6536
+ const sex = sexOf2(this.personN);
6537
+ const base = pick2(sex, "oncle", "tante", "oncle/tante");
6538
+ if (level <= 1) {
6539
+ return base;
6430
6540
  }
6431
- return `${prefix}oncle/tante`;
6541
+ const grands = pick2(
6542
+ sex,
6543
+ "grand-oncle",
6544
+ "grand-tante",
6545
+ "grand-oncle/tante"
6546
+ );
6547
+ return `${arriere(level - 2)}${grands}`;
6432
6548
  }
6433
6549
  nibling() {
6434
- const prefix = this.directPrefix();
6435
- if (this.personN?.isMale()) {
6436
- return `${prefix}neveu`;
6437
- }
6438
- if (this.personN?.isFemale()) {
6439
- return `${prefix}ni\xE8ce`;
6550
+ const level = Math.abs(this.pathN?.level ?? 0);
6551
+ const sex = sexOf2(this.personN);
6552
+ if (level <= 1) {
6553
+ return pick2(sex, "neveu", "ni\xE8ce", "neveu/ni\xE8ce");
6440
6554
  }
6441
- return `${prefix}neveu/ni\xE8ce`;
6555
+ const grands = pick2(
6556
+ sex,
6557
+ "grand-neveu",
6558
+ "grande-ni\xE8ce",
6559
+ "grand-neveu/grande-ni\xE8ce"
6560
+ );
6561
+ return `${arriere(level - 2)}${grands}`;
6442
6562
  }
6443
6563
  parent() {
6444
- const prefix = this.directPrefix();
6445
- if (this.personN?.isMale()) {
6446
- return `${prefix}p\xE8re`;
6447
- }
6448
- if (this.personN?.isFemale()) {
6449
- return `${prefix}m\xE8re`;
6564
+ const level = Math.abs(this.pathN?.level ?? 0);
6565
+ const sex = sexOf2(this.personN);
6566
+ if (level <= 1) {
6567
+ return pick2(sex, "p\xE8re", "m\xE8re", "parent");
6450
6568
  }
6451
- return `${prefix}parent`;
6569
+ const grands = pick2(sex, "grand-p\xE8re", "grand-m\xE8re", "grand-parent");
6570
+ return `${arriere(level - 2)}${grands}`;
6452
6571
  }
6453
6572
  child() {
6454
- const prefix = this.directPrefix();
6455
- if (this.personN?.isMale()) {
6456
- return `${prefix}fils`;
6457
- }
6458
- if (this.personN?.isFemale()) {
6459
- return `${prefix}fille`;
6573
+ const level = Math.abs(this.pathN?.level ?? 0);
6574
+ const sex = sexOf2(this.personN);
6575
+ if (level <= 1) {
6576
+ return pick2(sex, "fils", "fille", "enfant");
6460
6577
  }
6461
- return `${prefix}enfant`;
6578
+ const petits = pick2(sex, "petit-fils", "petite-fille", "petit-enfant");
6579
+ return `${arriere(level - 2)}${petits}`;
6462
6580
  }
6463
6581
  sibling() {
6464
- if (this.personN?.isMale()) {
6465
- return "fr\xE8re";
6466
- }
6467
- if (this.personN?.isFemale()) {
6468
- return "s\u0153ur";
6469
- }
6470
- return "fr\xE8re/s\u0153ur";
6582
+ return pick2(sexOf2(this.personN), "fr\xE8re", "s\u0153ur", "fr\xE8re/s\u0153ur");
6471
6583
  }
6472
6584
  halfBlood(relation) {
6473
6585
  if (!relation || !this.isHalfBlood) {
@@ -6476,40 +6588,30 @@ var KinshipTranslatorFr = class extends KinshipTranslatorBasic {
6476
6588
  return `demi-${relation}`;
6477
6589
  }
6478
6590
  spouse() {
6479
- if (this.personN?.isMale()) {
6480
- return "mari";
6481
- }
6482
- if (this.personN?.isFemale()) {
6483
- return "\xE9pouse";
6484
- }
6485
- return "conjoint";
6591
+ return pick2(sexOf2(this.personN), "mari", "\xE9pouse", "conjoint");
6486
6592
  }
6487
6593
  ofSpouse(relation) {
6488
6594
  if (!relation) {
6489
6595
  return "";
6490
6596
  }
6491
- const spouse = this.path?.[1].indi;
6492
- let spouseType = "conjoint";
6493
- if (spouse?.isMale()) {
6494
- spouseType = "mari";
6495
- }
6496
- if (spouse?.isFemale()) {
6497
- spouseType = "\xE9pouse";
6498
- }
6499
- return `${relation} du ${spouseType}`;
6597
+ const spouseType = pick2(
6598
+ sexOf2(this.path?.[1].indi),
6599
+ "mari",
6600
+ "\xE9pouse",
6601
+ "conjoint"
6602
+ );
6603
+ return `${relation} ${ofSpousePrep(spouseType)}${spouseType}`;
6500
6604
  }
6501
6605
  spouseOf(relation) {
6502
6606
  if (!relation) {
6503
6607
  return "";
6504
6608
  }
6505
- const spouse = this.path?.[this.path.length - 1].indi;
6506
- let spouseType = "conjoint";
6507
- if (spouse?.isMale()) {
6508
- spouseType = "mari";
6509
- }
6510
- if (spouse?.isFemale()) {
6511
- spouseType = "\xE9pouse";
6512
- }
6609
+ const spouseType = pick2(
6610
+ sexOf2(this.path?.[this.path.length - 1].indi),
6611
+ "mari",
6612
+ "\xE9pouse",
6613
+ "conjoint"
6614
+ );
6513
6615
  return `${spouseType} de ${relation}`;
6514
6616
  }
6515
6617
  of(relation) {
@@ -6530,6 +6632,9 @@ var KinshipTranslatorFr = class extends KinshipTranslatorBasic {
6530
6632
  if (relation.includes(" du ") || relation.includes(" de ")) {
6531
6633
  return relation.replace(/ (du|de) /, ` $1 ${name} `);
6532
6634
  }
6635
+ if (relation.includes(" de l'")) {
6636
+ return relation.replace(" de l'", ` de ${name} l'`);
6637
+ }
6533
6638
  return `${relation} de ${name}`;
6534
6639
  }
6535
6640
  inLaw(relation) {
@@ -6558,50 +6663,118 @@ var KinshipTranslatorFr = class extends KinshipTranslatorBasic {
6558
6663
  if (!relation || !this.pathN?.relation) {
6559
6664
  return relation ?? "";
6560
6665
  }
6561
- return `${this.pathN.relation} ${relation}`;
6666
+ const kind = parentRelationsFr[this.pathN.relation];
6667
+ if (!kind) {
6668
+ return relation;
6669
+ }
6670
+ if (kind === "step") {
6671
+ return `${isFeminineRelation(relation) ? "belle-" : "beau-"}${relation}`;
6672
+ }
6673
+ if (kind === "adopted") {
6674
+ return `${relation} ${isFeminineRelation(relation) ? "adoptive" : "adoptif"}`;
6675
+ }
6676
+ if (kind === "foster") {
6677
+ return `${relation} d'accueil`;
6678
+ }
6679
+ return relation;
6562
6680
  }
6563
6681
  };
6564
6682
 
6565
6683
  // src/kinship-translator/patterns.es.ts
6684
+ var parentRelationsEs = {
6685
+ step: {
6686
+ padre: "padrastro",
6687
+ madre: "madrastra",
6688
+ hijo: "hijastro",
6689
+ hija: "hijastra",
6690
+ hermano: "hermanastro",
6691
+ hermana: "hermanastra",
6692
+ abuelo: "abuelastro",
6693
+ abuela: "abuelastra"
6694
+ }
6695
+ };
6566
6696
  var InLawsEs = {
6567
6697
  "c\xF3nyuge de (hijo/hija|hija|hijo)": "yerno/nuera",
6568
6698
  "esposa de (hijo/hija|hija|hijo)": "nuera",
6569
6699
  "esposo de (hijo/hija|hija|hijo)": "yerno",
6570
- "madre del (c\xF3nyuge|esposa|esposo)": "suegra",
6571
- "padre del (c\xF3nyuge|esposa|esposo)": "suegro",
6572
- "padre/madre del (c\xF3nyuge|esposa|esposo)": "suegro/suegra",
6700
+ "madre (del c\xF3nyuge|del esposo|de la esposa)": "suegra",
6701
+ "padre (del c\xF3nyuge|del esposo|de la esposa)": "suegro",
6702
+ "padre/madre (del c\xF3nyuge|del esposo|de la esposa)": "suegro/suegra",
6573
6703
  "esposa de (medio |media |medio/a )?(hermano/hermana|hermana|hermano)": "cu\xF1ada",
6574
6704
  "esposo de (medio |media |medio/a )?(hermano/hermana|hermana|hermano)": "cu\xF1ado",
6575
6705
  "c\xF3nyuge de (medio |media |medio/a )?(hermano/hermana|hermana|hermano)": "cu\xF1ado/cu\xF1ada",
6576
- "(medio |media |medio/a )?hermana del (c\xF3nyuge|esposa|esposo)": "cu\xF1ada",
6577
- "(medio |media |medio/a )?hermano del (c\xF3nyuge|esposa|esposo)": "cu\xF1ado",
6578
- "(medio |media |medio/a )?hermano/hermana del (c\xF3nyuge|esposa|esposo)": "cu\xF1ado/cu\xF1ada"
6706
+ "(medio |media |medio/a )?hermana (del c\xF3nyuge|del esposo|de la esposa)": "cu\xF1ada",
6707
+ "(medio |media |medio/a )?hermano (del c\xF3nyuge|del esposo|de la esposa)": "cu\xF1ado",
6708
+ "(medio |media |medio/a )?hermano/hermana (del c\xF3nyuge|del esposo|de la esposa)": "cu\xF1ado/cu\xF1ada"
6579
6709
  };
6580
6710
 
6581
6711
  // src/kinship-translator/kinship-translator.es.ts
6582
- var KinshipTranslatorEs = class extends KinshipTranslatorBasic {
6583
- directPrefix() {
6584
- const level = Math.abs(this.pathN?.level ?? 0);
6585
- if (level <= 1) {
6586
- return "";
6587
- }
6588
- if (level === 2) {
6589
- return "bisabuel";
6590
- }
6591
- if (level === 3) {
6592
- return "tatarabuel";
6593
- }
6594
- return `t\xE1tara${level - 2}-abuel`;
6712
+ var sexOf3 = (person) => {
6713
+ if (person?.isMale?.()) {
6714
+ return "m";
6715
+ }
6716
+ if (person?.isFemale?.()) {
6717
+ return "f";
6595
6718
  }
6719
+ return "n";
6720
+ };
6721
+ var pick3 = (sex, male, female, neutral) => {
6722
+ if (sex === "m") {
6723
+ return male;
6724
+ }
6725
+ if (sex === "f") {
6726
+ return female;
6727
+ }
6728
+ return neutral;
6729
+ };
6730
+ var SPANISH_ORDINALS_M = [
6731
+ "",
6732
+ "",
6733
+ "segundo",
6734
+ "tercero",
6735
+ "cuarto",
6736
+ "quinto",
6737
+ "sexto",
6738
+ "s\xE9ptimo",
6739
+ "octavo",
6740
+ "noveno",
6741
+ "d\xE9cimo"
6742
+ ];
6743
+ var SPANISH_ORDINALS_F = [
6744
+ "",
6745
+ "",
6746
+ "segunda",
6747
+ "tercera",
6748
+ "cuarta",
6749
+ "quinta",
6750
+ "sexta",
6751
+ "s\xE9ptima",
6752
+ "octava",
6753
+ "novena",
6754
+ "d\xE9cima"
6755
+ ];
6756
+ var spanishOrdinal = (n, sex) => {
6757
+ const list = sex === "f" ? SPANISH_ORDINALS_F : SPANISH_ORDINALS_M;
6758
+ return list[n] ?? `${n}.\xBA`;
6759
+ };
6760
+ var ofSpousePrep2 = (spouseType) => {
6761
+ if (spouseType === "esposa") {
6762
+ return "de la ";
6763
+ }
6764
+ return "del ";
6765
+ };
6766
+ var KinshipTranslatorEs = class extends KinshipTranslatorBasic {
6596
6767
  indirect() {
6597
6768
  let degree = Math.abs(this.pathN?.degree ?? 0);
6598
6769
  if (degree > 0) {
6599
6770
  degree = degree - 1;
6600
6771
  }
6601
- if (degree === 1) {
6602
- return `primo`;
6772
+ const sex = sexOf3(this.personN);
6773
+ const cousin = pick3(sex, "primo", "prima", "primo/prima");
6774
+ if (degree <= 1) {
6775
+ return cousin;
6603
6776
  }
6604
- return `primo ${ordinalize(degree)}`;
6777
+ return `${cousin} ${spanishOrdinal(degree, sex)}`;
6605
6778
  }
6606
6779
  removal() {
6607
6780
  const level = this.pathN?.level ?? 0;
@@ -6612,56 +6785,133 @@ var KinshipTranslatorEs = class extends KinshipTranslatorBasic {
6612
6785
  if (!degree) {
6613
6786
  return level < 0 ? this.nibling() : this.auncle();
6614
6787
  }
6615
- return `primo ${ordinalize(degree)} ${Math.abs(level)}\xD7 separado`;
6788
+ return `${this.indirect()} ${Math.abs(level)}\xD7 separado`;
6616
6789
  }
6617
6790
  auncle() {
6618
- const prefix = this.directPrefix();
6619
- if (this.personN?.isMale()) {
6620
- return `${prefix}t\xEDo`;
6791
+ const level = Math.abs(this.pathN?.level ?? 0);
6792
+ const sex = sexOf3(this.personN);
6793
+ if (level <= 1) {
6794
+ return pick3(sex, "t\xEDo", "t\xEDa", "t\xEDo/t\xEDa");
6621
6795
  }
6622
- if (this.personN?.isFemale()) {
6623
- return `${prefix}t\xEDa`;
6796
+ if (level === 2) {
6797
+ return pick3(sex, "t\xEDo abuelo", "t\xEDa abuela", "t\xEDo/t\xEDa abuelo");
6798
+ }
6799
+ if (level === 3) {
6800
+ return pick3(
6801
+ sex,
6802
+ "t\xEDo bisabuelo",
6803
+ "t\xEDa bisabuela",
6804
+ "t\xEDo/t\xEDa bisabuelo"
6805
+ );
6624
6806
  }
6625
- return `${prefix}t\xEDo/t\xEDa`;
6807
+ return pick3(
6808
+ sex,
6809
+ `t\xEDo abuelo (${level - 1}.\xBA)`,
6810
+ `t\xEDa abuela (${level - 1}.\xAA)`,
6811
+ `t\xEDo/t\xEDa abuelo (${level - 1}.\xBA)`
6812
+ );
6626
6813
  }
6627
6814
  nibling() {
6628
- const prefix = this.directPrefix();
6629
- if (this.personN?.isMale()) {
6630
- return `${prefix}sobrino`;
6815
+ const level = Math.abs(this.pathN?.level ?? 0);
6816
+ const sex = sexOf3(this.personN);
6817
+ if (level <= 1) {
6818
+ return pick3(sex, "sobrino", "sobrina", "sobrino/sobrina");
6631
6819
  }
6632
- if (this.personN?.isFemale()) {
6633
- return `${prefix}sobrina`;
6820
+ if (level === 2) {
6821
+ return pick3(
6822
+ sex,
6823
+ "sobrino nieto",
6824
+ "sobrina nieta",
6825
+ "sobrino/sobrina nieto"
6826
+ );
6827
+ }
6828
+ if (level === 3) {
6829
+ return pick3(
6830
+ sex,
6831
+ "sobrino bisnieto",
6832
+ "sobrina bisnieta",
6833
+ "sobrino/sobrina bisnieto"
6834
+ );
6634
6835
  }
6635
- return `${prefix}sobrino/sobrina`;
6836
+ return pick3(
6837
+ sex,
6838
+ `sobrino nieto (${level - 1}.\xBA)`,
6839
+ `sobrina nieta (${level - 1}.\xAA)`,
6840
+ `sobrino/sobrina nieto (${level - 1}.\xBA)`
6841
+ );
6636
6842
  }
6637
6843
  parent() {
6638
- const prefix = this.directPrefix();
6639
- if (this.personN?.isMale()) {
6640
- return `${prefix}padre`;
6844
+ const level = Math.abs(this.pathN?.level ?? 0);
6845
+ const sex = sexOf3(this.personN);
6846
+ if (level <= 1) {
6847
+ return pick3(sex, "padre", "madre", "padre/madre");
6641
6848
  }
6642
- if (this.personN?.isFemale()) {
6643
- return `${prefix}madre`;
6849
+ if (level === 2) {
6850
+ return pick3(sex, "abuelo", "abuela", "abuelo/abuela");
6644
6851
  }
6645
- return `${prefix}padre/madre`;
6852
+ if (level === 3) {
6853
+ return pick3(sex, "bisabuelo", "bisabuela", "bisabuelo/bisabuela");
6854
+ }
6855
+ if (level === 4) {
6856
+ return pick3(
6857
+ sex,
6858
+ "tatarabuelo",
6859
+ "tatarabuela",
6860
+ "tatarabuelo/tatarabuela"
6861
+ );
6862
+ }
6863
+ if (level === 5) {
6864
+ return pick3(
6865
+ sex,
6866
+ "trastatarabuelo",
6867
+ "trastatarabuela",
6868
+ "trastatarabuelo/trastatarabuela"
6869
+ );
6870
+ }
6871
+ return pick3(
6872
+ sex,
6873
+ `abuelo (${level}.\xBA)`,
6874
+ `abuela (${level}.\xAA)`,
6875
+ `abuelo/abuela (${level}.\xBA)`
6876
+ );
6646
6877
  }
6647
6878
  child() {
6648
- const prefix = this.directPrefix();
6649
- if (this.personN?.isMale()) {
6650
- return `${prefix}hijo`;
6879
+ const level = Math.abs(this.pathN?.level ?? 0);
6880
+ const sex = sexOf3(this.personN);
6881
+ if (level <= 1) {
6882
+ return pick3(sex, "hijo", "hija", "hijo/hija");
6651
6883
  }
6652
- if (this.personN?.isFemale()) {
6653
- return `${prefix}hija`;
6884
+ if (level === 2) {
6885
+ return pick3(sex, "nieto", "nieta", "nieto/nieta");
6654
6886
  }
6655
- return `${prefix}hijo/hija`;
6656
- }
6657
- sibling() {
6658
- if (this.personN?.isMale()) {
6659
- return "hermano";
6887
+ if (level === 3) {
6888
+ return pick3(sex, "bisnieto", "bisnieta", "bisnieto/bisnieta");
6660
6889
  }
6661
- if (this.personN?.isFemale()) {
6662
- return "hermana";
6890
+ if (level === 4) {
6891
+ return pick3(
6892
+ sex,
6893
+ "tataranieto",
6894
+ "tataranieta",
6895
+ "tataranieto/tataranieta"
6896
+ );
6897
+ }
6898
+ if (level === 5) {
6899
+ return pick3(
6900
+ sex,
6901
+ "trastataranieto",
6902
+ "trastataranieta",
6903
+ "trastataranieto/trastataranieta"
6904
+ );
6663
6905
  }
6664
- return "hermano/hermana";
6906
+ return pick3(
6907
+ sex,
6908
+ `nieto (${level}.\xBA)`,
6909
+ `nieta (${level}.\xAA)`,
6910
+ `nieto/nieta (${level}.\xBA)`
6911
+ );
6912
+ }
6913
+ sibling() {
6914
+ return pick3(sexOf3(this.personN), "hermano", "hermana", "hermano/hermana");
6665
6915
  }
6666
6916
  halfBlood(relation) {
6667
6917
  if (!relation || !this.isHalfBlood) {
@@ -6676,40 +6926,30 @@ var KinshipTranslatorEs = class extends KinshipTranslatorBasic {
6676
6926
  return `medio/a ${relation}`;
6677
6927
  }
6678
6928
  spouse() {
6679
- if (this.personN?.isMale()) {
6680
- return "esposo";
6681
- }
6682
- if (this.personN?.isFemale()) {
6683
- return "esposa";
6684
- }
6685
- return "c\xF3nyuge";
6929
+ return pick3(sexOf3(this.personN), "esposo", "esposa", "c\xF3nyuge");
6686
6930
  }
6687
6931
  ofSpouse(relation) {
6688
6932
  if (!relation) {
6689
6933
  return "";
6690
6934
  }
6691
- const spouse = this.path?.[1].indi;
6692
- let spouseType = "c\xF3nyuge";
6693
- if (spouse?.isMale()) {
6694
- spouseType = "esposo";
6695
- }
6696
- if (spouse?.isFemale()) {
6697
- spouseType = "esposa";
6698
- }
6699
- return `${relation} del ${spouseType}`;
6935
+ const spouseType = pick3(
6936
+ sexOf3(this.path?.[1].indi),
6937
+ "esposo",
6938
+ "esposa",
6939
+ "c\xF3nyuge"
6940
+ );
6941
+ return `${relation} ${ofSpousePrep2(spouseType)}${spouseType}`;
6700
6942
  }
6701
6943
  spouseOf(relation) {
6702
6944
  if (!relation) {
6703
6945
  return "";
6704
6946
  }
6705
- const spouse = this.path?.[this.path.length - 1].indi;
6706
- let spouseType = "c\xF3nyuge";
6707
- if (spouse?.isMale()) {
6708
- spouseType = "esposo";
6709
- }
6710
- if (spouse?.isFemale()) {
6711
- spouseType = "esposa";
6712
- }
6947
+ const spouseType = pick3(
6948
+ sexOf3(this.path?.[this.path.length - 1].indi),
6949
+ "esposo",
6950
+ "esposa",
6951
+ "c\xF3nyuge"
6952
+ );
6713
6953
  return `${spouseType} de ${relation}`;
6714
6954
  }
6715
6955
  of(relation) {
@@ -6727,8 +6967,8 @@ var KinshipTranslatorEs = class extends KinshipTranslatorBasic {
6727
6967
  if (!name || !relation) {
6728
6968
  return relation ?? "";
6729
6969
  }
6730
- if (relation.includes(" del ") || relation.includes(" de ")) {
6731
- return relation.replace(/ (del|de) /, ` $1 ${name} `);
6970
+ if (relation.includes(" del ") || relation.includes(" de la ") || relation.includes(" de ")) {
6971
+ return relation.replace(/ (del|de la|de) /, ` $1 ${name} `);
6732
6972
  }
6733
6973
  return `${relation} de ${name}`;
6734
6974
  }
@@ -6758,7 +6998,20 @@ var KinshipTranslatorEs = class extends KinshipTranslatorBasic {
6758
6998
  if (!relation || !this.pathN?.relation) {
6759
6999
  return relation ?? "";
6760
7000
  }
6761
- return `${this.pathN.relation} ${relation}`;
7001
+ const mapped = parentRelationsEs[this.pathN.relation]?.[relation];
7002
+ if (mapped) {
7003
+ return mapped;
7004
+ }
7005
+ if (this.pathN.relation === "step") {
7006
+ return `${relation} pol\xEDtico`;
7007
+ }
7008
+ if (this.pathN.relation === "adopted") {
7009
+ return `${relation} adoptivo`;
7010
+ }
7011
+ if (this.pathN.relation === "foster") {
7012
+ return `${relation} de acogida`;
7013
+ }
7014
+ return relation;
6762
7015
  }
6763
7016
  };
6764
7017
 
@@ -6767,15 +7020,35 @@ var InLawsRu = {
6767
7020
  "\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",
6768
7021
  "\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",
6769
7022
  "\u043C\u0443\u0436 (\u0440\u0435\u0431\u0451\u043D\u043A\u0430|\u0434\u043E\u0447\u0435\u0440\u0438|\u0441\u044B\u043D\u0430)": "\u0437\u044F\u0442\u044C",
6770
- "\u043C\u0430\u0442\u044C (\u0441\u0443\u043F\u0440\u0443\u0433\u0430|\u0436\u0435\u043D\u044B|\u043C\u0443\u0436\u0430)": "\u0442\u0451\u0449\u0430",
6771
- "\u043E\u0442\u0435\u0446 (\u0441\u0443\u043F\u0440\u0443\u0433\u0430|\u0436\u0435\u043D\u044B|\u043C\u0443\u0436\u0430)": "\u0442\u0435\u0441\u0442\u044C",
6772
- "\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",
7023
+ "\u043C\u0430\u0442\u044C \u0436\u0435\u043D\u044B": "\u0442\u0451\u0449\u0430",
7024
+ "\u043C\u0430\u0442\u044C \u043C\u0443\u0436\u0430": "\u0441\u0432\u0435\u043A\u0440\u043E\u0432\u044C",
7025
+ "\u043C\u0430\u0442\u044C \u0441\u0443\u043F\u0440\u0443\u0433\u0430": "\u0442\u0451\u0449\u0430/\u0441\u0432\u0435\u043A\u0440\u043E\u0432\u044C",
7026
+ "\u043E\u0442\u0435\u0446 \u0436\u0435\u043D\u044B": "\u0442\u0435\u0441\u0442\u044C",
7027
+ "\u043E\u0442\u0435\u0446 \u043C\u0443\u0436\u0430": "\u0441\u0432\u0451\u043A\u043E\u0440",
7028
+ "\u043E\u0442\u0435\u0446 \u0441\u0443\u043F\u0440\u0443\u0433\u0430": "\u0442\u0435\u0441\u0442\u044C/\u0441\u0432\u0451\u043A\u043E\u0440",
7029
+ "\u0440\u043E\u0434\u0438\u0442\u0435\u043B\u044C \u0436\u0435\u043D\u044B": "\u0442\u0435\u0441\u0442\u044C/\u0442\u0451\u0449\u0430",
7030
+ "\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",
7031
+ "\u0440\u043E\u0434\u0438\u0442\u0435\u043B\u044C \u0441\u0443\u043F\u0440\u0443\u0433\u0430": "\u0442\u0435\u0441\u0442\u044C/\u0442\u0451\u0449\u0430",
6773
7032
  "\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",
6774
7033
  "\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",
6775
7034
  "\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",
6776
- "(\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",
6777
- "(\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",
6778
- "(\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"
7035
+ "(\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",
7036
+ "(\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",
7037
+ "(\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",
7038
+ "(\u0441\u0432\u043E\u0434\u043D(?:\u044B\u0439|\u0430\u044F) )?\u0431\u0440\u0430\u0442 \u0436\u0435\u043D\u044B": "\u0448\u0443\u0440\u0438\u043D",
7039
+ "(\u0441\u0432\u043E\u0434\u043D(?:\u044B\u0439|\u0430\u044F) )?\u0431\u0440\u0430\u0442 \u043C\u0443\u0436\u0430": "\u0434\u0435\u0432\u0435\u0440\u044C",
7040
+ "(\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",
7041
+ "(\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",
7042
+ "(\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",
7043
+ "(\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"
7044
+ };
7045
+ var parentRelationsRu = {
7046
+ step: {
7047
+ \u043E\u0442\u0435\u0446: "\u043E\u0442\u0447\u0438\u043C",
7048
+ \u043C\u0430\u0442\u044C: "\u043C\u0430\u0447\u0435\u0445\u0430",
7049
+ \u0441\u044B\u043D: "\u043F\u0430\u0441\u044B\u043D\u043E\u043A",
7050
+ \u0434\u043E\u0447\u044C: "\u043F\u0430\u0434\u0447\u0435\u0440\u0438\u0446\u0430"
7051
+ }
6779
7052
  };
6780
7053
 
6781
7054
  // src/kinship-translator/kinship-translator.ru.ts
@@ -6806,7 +7079,7 @@ var cousinWord = (degree, sex) => {
6806
7079
  return `${stem}\u044B\u0439 \u0431\u0440\u0430\u0442/\u0441\u0435\u0441\u0442\u0440\u0430`;
6807
7080
  };
6808
7081
  var praRepeat = (count) => count > 0 ? "\u043F\u0440\u0430".repeat(count) : "";
6809
- var sexOf = (person) => {
7082
+ var sexOf4 = (person) => {
6810
7083
  if (person?.isMale?.()) {
6811
7084
  return "m";
6812
7085
  }
@@ -6821,7 +7094,7 @@ var KinshipTranslatorRu = class extends KinshipTranslatorBasic {
6821
7094
  if (degree > 0) {
6822
7095
  degree = degree - 1;
6823
7096
  }
6824
- return cousinWord(degree, sexOf(this.personN));
7097
+ return cousinWord(degree, sexOf4(this.personN));
6825
7098
  }
6826
7099
  removal() {
6827
7100
  const level = this.pathN?.level ?? 0;
@@ -6833,35 +7106,53 @@ var KinshipTranslatorRu = class extends KinshipTranslatorBasic {
6833
7106
  return level < 0 ? this.nibling() : this.auncle();
6834
7107
  }
6835
7108
  const removed = Math.abs(level);
6836
- return `${cousinWord(degree, sexOf(this.personN))} (${removed}\xD7 \u0447\u0435\u0440\u0435\u0437 \u043F\u043E\u043A\u043E\u043B\u0435\u043D\u0438\u0435)`;
7109
+ return `${cousinWord(degree, sexOf4(this.personN))} (${removed}\xD7 \u0447\u0435\u0440\u0435\u0437 \u043F\u043E\u043A\u043E\u043B\u0435\u043D\u0438\u0435)`;
6837
7110
  }
6838
7111
  auncle() {
6839
7112
  const level = Math.abs(this.pathN?.level ?? 0);
6840
- const pra = praRepeat(Math.max(0, level - 2));
6841
- const sex = sexOf(this.personN);
7113
+ const sex = sexOf4(this.personN);
7114
+ if (level <= 1) {
7115
+ if (sex === "m") {
7116
+ return "\u0434\u044F\u0434\u044F";
7117
+ }
7118
+ if (sex === "f") {
7119
+ return "\u0442\u0451\u0442\u044F";
7120
+ }
7121
+ return "\u0434\u044F\u0434\u044F/\u0442\u0451\u0442\u044F";
7122
+ }
7123
+ const pra = praRepeat(level - 2);
6842
7124
  if (sex === "m") {
6843
- return `${pra}\u0434\u044F\u0434\u044F`;
7125
+ return `\u0434\u0432\u043E\u044E\u0440\u043E\u0434\u043D\u044B\u0439 ${pra}\u0434\u0435\u0434`;
6844
7126
  }
6845
7127
  if (sex === "f") {
6846
- return `${pra}\u0442\u0451\u0442\u044F`;
7128
+ return `\u0434\u0432\u043E\u044E\u0440\u043E\u0434\u043D\u0430\u044F ${pra}\u0431\u0430\u0431\u0443\u0448\u043A\u0430`;
6847
7129
  }
6848
- return `${pra}\u0434\u044F\u0434\u044F/\u0442\u0451\u0442\u044F`;
7130
+ return `\u0434\u0432\u043E\u044E\u0440\u043E\u0434\u043D\u044B\u0439 ${pra}\u0434\u0435\u0434/\u0431\u0430\u0431\u0443\u0448\u043A\u0430`;
6849
7131
  }
6850
7132
  nibling() {
6851
7133
  const level = Math.abs(this.pathN?.level ?? 0);
6852
- const pra = praRepeat(Math.max(0, level - 2));
6853
- const sex = sexOf(this.personN);
7134
+ const sex = sexOf4(this.personN);
7135
+ if (level <= 1) {
7136
+ if (sex === "m") {
7137
+ return "\u043F\u043B\u0435\u043C\u044F\u043D\u043D\u0438\u043A";
7138
+ }
7139
+ if (sex === "f") {
7140
+ return "\u043F\u043B\u0435\u043C\u044F\u043D\u043D\u0438\u0446\u0430";
7141
+ }
7142
+ return "\u043F\u043B\u0435\u043C\u044F\u043D\u043D\u0438\u043A/\u043F\u043B\u0435\u043C\u044F\u043D\u043D\u0438\u0446\u0430";
7143
+ }
7144
+ const pra = praRepeat(level - 2);
6854
7145
  if (sex === "m") {
6855
- return `${pra}\u043F\u043B\u0435\u043C\u044F\u043D\u043D\u0438\u043A`;
7146
+ return `${pra}\u0432\u043D\u0443\u0447\u0430\u0442\u044B\u0439 \u043F\u043B\u0435\u043C\u044F\u043D\u043D\u0438\u043A`;
6856
7147
  }
6857
7148
  if (sex === "f") {
6858
- return `${pra}\u043F\u043B\u0435\u043C\u044F\u043D\u043D\u0438\u0446\u0430`;
7149
+ return `${pra}\u0432\u043D\u0443\u0447\u0430\u0442\u0430\u044F \u043F\u043B\u0435\u043C\u044F\u043D\u043D\u0438\u0446\u0430`;
6859
7150
  }
6860
- return `${pra}\u043F\u043B\u0435\u043C\u044F\u043D\u043D\u0438\u043A/\u043F\u043B\u0435\u043C\u044F\u043D\u043D\u0438\u0446\u0430`;
7151
+ 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`;
6861
7152
  }
6862
7153
  parent() {
6863
7154
  const level = Math.abs(this.pathN?.level ?? 0);
6864
- const sex = sexOf(this.personN);
7155
+ const sex = sexOf4(this.personN);
6865
7156
  if (level <= 1) {
6866
7157
  if (sex === "m") {
6867
7158
  return "\u043E\u0442\u0435\u0446";
@@ -6891,7 +7182,7 @@ var KinshipTranslatorRu = class extends KinshipTranslatorBasic {
6891
7182
  }
6892
7183
  child() {
6893
7184
  const level = Math.abs(this.pathN?.level ?? 0);
6894
- const sex = sexOf(this.personN);
7185
+ const sex = sexOf4(this.personN);
6895
7186
  if (level <= 1) {
6896
7187
  if (sex === "m") {
6897
7188
  return "\u0441\u044B\u043D";
@@ -6920,14 +7211,14 @@ var KinshipTranslatorRu = class extends KinshipTranslatorBasic {
6920
7211
  return `${pra}\u0432\u043D\u0443\u043A/\u0432\u043D\u0443\u0447\u043A\u0430`;
6921
7212
  }
6922
7213
  sibling() {
6923
- const sex = sexOf(this.personN);
7214
+ const sex = sexOf4(this.personN);
6924
7215
  if (sex === "m") {
6925
7216
  return "\u0431\u0440\u0430\u0442";
6926
7217
  }
6927
7218
  if (sex === "f") {
6928
7219
  return "\u0441\u0435\u0441\u0442\u0440\u0430";
6929
7220
  }
6930
- return "\u0441\u0438\u0431\u043B\u0438\u043D\u0433";
7221
+ return "\u0431\u0440\u0430\u0442/\u0441\u0435\u0441\u0442\u0440\u0430";
6931
7222
  }
6932
7223
  halfBlood(relation) {
6933
7224
  if (!relation || !this.isHalfBlood) {
@@ -6941,7 +7232,7 @@ var KinshipTranslatorRu = class extends KinshipTranslatorBasic {
6941
7232
  return `\u0441\u0432\u043E\u0434\u043D\u044B\u0439 ${relation}`;
6942
7233
  }
6943
7234
  spouse() {
6944
- const sex = sexOf(this.personN);
7235
+ const sex = sexOf4(this.personN);
6945
7236
  if (sex === "m") {
6946
7237
  return "\u043C\u0443\u0436";
6947
7238
  }
@@ -6955,7 +7246,7 @@ var KinshipTranslatorRu = class extends KinshipTranslatorBasic {
6955
7246
  return "";
6956
7247
  }
6957
7248
  const spouse = this.path?.[1].indi;
6958
- const sex = sexOf(spouse);
7249
+ const sex = sexOf4(spouse);
6959
7250
  const spouseType = sex === "m" ? "\u043C\u0443\u0436" : sex === "f" ? "\u0436\u0435\u043D\u0430" : "\u0441\u0443\u043F\u0440\u0443\u0433";
6960
7251
  return `${relation} ${toGenitive(spouseType)}`;
6961
7252
  }
@@ -6964,7 +7255,7 @@ var KinshipTranslatorRu = class extends KinshipTranslatorBasic {
6964
7255
  return "";
6965
7256
  }
6966
7257
  const spouse = this.path?.[this.path.length - 1].indi;
6967
- const sex = sexOf(spouse);
7258
+ const sex = sexOf4(spouse);
6968
7259
  const spouseType = sex === "m" ? "\u043C\u0443\u0436" : sex === "f" ? "\u0436\u0435\u043D\u0430" : "\u0441\u0443\u043F\u0440\u0443\u0433";
6969
7260
  return `${spouseType} ${toGenitive(relation)}`;
6970
7261
  }
@@ -7001,7 +7292,22 @@ var KinshipTranslatorRu = class extends KinshipTranslatorBasic {
7001
7292
  if (!relation || !this.pathN?.relation) {
7002
7293
  return relation ?? "";
7003
7294
  }
7004
- return `${this.pathN.relation} ${relation}`;
7295
+ const mapped = parentRelationsRu[this.pathN.relation]?.[relation];
7296
+ if (mapped) {
7297
+ return mapped;
7298
+ }
7299
+ if (this.pathN.relation === "step") {
7300
+ return `\u043D\u0435\u0440\u043E\u0434\u043D\u043E\u0439 ${relation}`;
7301
+ }
7302
+ if (this.pathN.relation === "adopted") {
7303
+ return /сестра|дочь|мать|тётя|бабушка|жена|племянница|внучка/.test(
7304
+ relation
7305
+ ) ? `\u043F\u0440\u0438\u0451\u043C\u043D\u0430\u044F ${relation}` : `\u043F\u0440\u0438\u0451\u043C\u043D\u044B\u0439 ${relation}`;
7306
+ }
7307
+ if (this.pathN.relation === "foster") {
7308
+ return `\u043F\u0440\u0438\u0451\u043C\u043D\u044B\u0439 ${relation}`;
7309
+ }
7310
+ return relation;
7005
7311
  }
7006
7312
  };
7007
7313
 
@@ -7025,7 +7331,7 @@ var InLawsJa = {
7025
7331
  };
7026
7332
 
7027
7333
  // src/kinship-translator/kinship-translator.ja.ts
7028
- var sexOf2 = (person) => {
7334
+ var sexOf5 = (person) => {
7029
7335
  if (person?.isMale?.()) {
7030
7336
  return "m";
7031
7337
  }
@@ -7034,7 +7340,7 @@ var sexOf2 = (person) => {
7034
7340
  }
7035
7341
  return "n";
7036
7342
  };
7037
- var pick = (sex, male, female, neutral) => {
7343
+ var pick4 = (sex, male, female, neutral) => {
7038
7344
  if (sex === "m") {
7039
7345
  return male;
7040
7346
  }
@@ -7047,18 +7353,18 @@ var lineal = (level, sex, kind) => {
7047
7353
  const L = Math.max(1, level);
7048
7354
  if (kind === "asc") {
7049
7355
  if (L <= 1) {
7050
- return pick(sex, "\u7236", "\u6BCD", "\u89AA");
7356
+ return pick4(sex, "\u7236", "\u6BCD", "\u89AA");
7051
7357
  }
7052
7358
  if (L === 2) {
7053
- return pick(sex, "\u7956\u7236", "\u7956\u6BCD", "\u7956\u7236\u6BCD");
7359
+ return pick4(sex, "\u7956\u7236", "\u7956\u6BCD", "\u7956\u7236\u6BCD");
7054
7360
  }
7055
7361
  if (L === 3) {
7056
- return pick(sex, "\u66FE\u7956\u7236", "\u66FE\u7956\u6BCD", "\u66FE\u7956\u7236\u6BCD");
7362
+ return pick4(sex, "\u66FE\u7956\u7236", "\u66FE\u7956\u6BCD", "\u66FE\u7956\u7236\u6BCD");
7057
7363
  }
7058
7364
  if (L === 4) {
7059
- return pick(sex, "\u9AD8\u7956\u7236", "\u9AD8\u7956\u6BCD", "\u9AD8\u7956\u7236\u6BCD");
7365
+ return pick4(sex, "\u9AD8\u7956\u7236", "\u9AD8\u7956\u6BCD", "\u9AD8\u7956\u7236\u6BCD");
7060
7366
  }
7061
- return pick(
7367
+ return pick4(
7062
7368
  sex,
7063
7369
  `${L - 1}\u4E16\u306E\u7956\u7236`,
7064
7370
  `${L - 1}\u4E16\u306E\u7956\u6BCD`,
@@ -7066,7 +7372,7 @@ var lineal = (level, sex, kind) => {
7066
7372
  );
7067
7373
  }
7068
7374
  if (L <= 1) {
7069
- return pick(sex, "\u606F\u5B50", "\u5A18", "\u5B50");
7375
+ return pick4(sex, "\u606F\u5B50", "\u5A18", "\u5B50");
7070
7376
  }
7071
7377
  if (L === 2) {
7072
7378
  return "\u5B6B";
@@ -7113,52 +7419,52 @@ var KinshipTranslatorJa = class extends KinshipTranslatorBasic {
7113
7419
  }
7114
7420
  auncle() {
7115
7421
  const level = Math.abs(this.pathN?.level ?? 0);
7116
- const sex = sexOf2(this.personN);
7117
- if (level <= 2) {
7118
- return pick(sex, "\u304A\u3058", "\u304A\u3070", "\u304A\u3058/\u304A\u3070");
7422
+ const sex = sexOf5(this.personN);
7423
+ if (level <= 1) {
7424
+ return pick4(sex, "\u304A\u3058", "\u304A\u3070", "\u304A\u3058/\u304A\u3070");
7119
7425
  }
7120
- if (level === 3) {
7121
- return pick(sex, "\u5927\u304A\u3058", "\u5927\u304A\u3070", "\u5927\u304A\u3058/\u5927\u304A\u3070");
7426
+ if (level === 2) {
7427
+ return pick4(sex, "\u5927\u304A\u3058", "\u5927\u304A\u3070", "\u5927\u304A\u3058/\u5927\u304A\u3070");
7122
7428
  }
7123
- return pick(
7429
+ return pick4(
7124
7430
  sex,
7125
- `${level - 2}\u4EE3\u524D\u306E\u304A\u3058`,
7126
- `${level - 2}\u4EE3\u524D\u306E\u304A\u3070`,
7127
- `${level - 2}\u4EE3\u524D\u306E\u304A\u3058/\u304A\u3070`
7431
+ `${level - 1}\u4EE3\u524D\u306E\u304A\u3058`,
7432
+ `${level - 1}\u4EE3\u524D\u306E\u304A\u3070`,
7433
+ `${level - 1}\u4EE3\u524D\u306E\u304A\u3058/\u304A\u3070`
7128
7434
  );
7129
7435
  }
7130
7436
  nibling() {
7131
7437
  const level = Math.abs(this.pathN?.level ?? 0);
7132
- const sex = sexOf2(this.personN);
7133
- if (level <= 2) {
7134
- return pick(sex, "\u7525", "\u59EA", "\u7525/\u59EA");
7438
+ const sex = sexOf5(this.personN);
7439
+ if (level <= 1) {
7440
+ return pick4(sex, "\u7525", "\u59EA", "\u7525/\u59EA");
7135
7441
  }
7136
- if (level === 3) {
7137
- return pick(sex, "\u5927\u7525", "\u5927\u59EA", "\u5927\u7525/\u5927\u59EA");
7442
+ if (level === 2) {
7443
+ return pick4(sex, "\u5927\u7525", "\u5927\u59EA", "\u5927\u7525/\u5927\u59EA");
7138
7444
  }
7139
- return pick(
7445
+ return pick4(
7140
7446
  sex,
7141
- `${level - 2}\u4EE3\u4E0B\u306E\u7525`,
7142
- `${level - 2}\u4EE3\u4E0B\u306E\u59EA`,
7143
- `${level - 2}\u4EE3\u4E0B\u306E\u7525/\u59EA`
7447
+ `${level - 1}\u4EE3\u4E0B\u306E\u7525`,
7448
+ `${level - 1}\u4EE3\u4E0B\u306E\u59EA`,
7449
+ `${level - 1}\u4EE3\u4E0B\u306E\u7525/\u59EA`
7144
7450
  );
7145
7451
  }
7146
7452
  parent() {
7147
7453
  return lineal(
7148
7454
  Math.abs(this.pathN?.level ?? 0),
7149
- sexOf2(this.personN),
7455
+ sexOf5(this.personN),
7150
7456
  "asc"
7151
7457
  );
7152
7458
  }
7153
7459
  child() {
7154
7460
  return lineal(
7155
7461
  Math.abs(this.pathN?.level ?? 0),
7156
- sexOf2(this.personN),
7462
+ sexOf5(this.personN),
7157
7463
  "desc"
7158
7464
  );
7159
7465
  }
7160
7466
  sibling() {
7161
- return pick(sexOf2(this.personN), "\u5144\u5F1F", "\u59C9\u59B9", "\u5144\u5F1F\u59C9\u59B9");
7467
+ return pick4(sexOf5(this.personN), "\u5144\u5F1F", "\u59C9\u59B9", "\u5144\u5F1F\u59C9\u59B9");
7162
7468
  }
7163
7469
  halfBlood(relation) {
7164
7470
  if (!relation || !this.isHalfBlood) {
@@ -7167,14 +7473,14 @@ var KinshipTranslatorJa = class extends KinshipTranslatorBasic {
7167
7473
  return `\u7570\u7236\u6BCD\u306E${relation}`;
7168
7474
  }
7169
7475
  spouse() {
7170
- return pick(sexOf2(this.personN), "\u592B", "\u59BB", "\u914D\u5076\u8005");
7476
+ return pick4(sexOf5(this.personN), "\u592B", "\u59BB", "\u914D\u5076\u8005");
7171
7477
  }
7172
7478
  ofSpouse(relation) {
7173
7479
  if (!relation) {
7174
7480
  return "";
7175
7481
  }
7176
- const spouseType = pick(
7177
- sexOf2(this.path?.[1].indi),
7482
+ const spouseType = pick4(
7483
+ sexOf5(this.path?.[1].indi),
7178
7484
  "\u592B",
7179
7485
  "\u59BB",
7180
7486
  "\u914D\u5076\u8005"
@@ -7186,7 +7492,7 @@ var KinshipTranslatorJa = class extends KinshipTranslatorBasic {
7186
7492
  return "";
7187
7493
  }
7188
7494
  const spouse = this.path?.[this.path.length - 1].indi;
7189
- const spouseType = pick(sexOf2(spouse), "\u592B", "\u59BB", "\u914D\u5076\u8005");
7495
+ const spouseType = pick4(sexOf5(spouse), "\u592B", "\u59BB", "\u914D\u5076\u8005");
7190
7496
  return `${relation}\u306E${spouseType}`;
7191
7497
  }
7192
7498
  of(relation) {
@@ -7222,7 +7528,28 @@ var KinshipTranslatorJa = class extends KinshipTranslatorBasic {
7222
7528
  if (!relation || !this.pathN?.relation) {
7223
7529
  return relation ?? "";
7224
7530
  }
7225
- return `${this.pathN.relation}\u306E${relation}`;
7531
+ if (this.pathN.relation === "step") {
7532
+ if (relation === "\u7236") {
7533
+ return "\u7EE7\u7236";
7534
+ }
7535
+ if (relation === "\u6BCD") {
7536
+ return "\u7D99\u6BCD";
7537
+ }
7538
+ if (relation === "\u606F\u5B50") {
7539
+ return "\u7D99\u5B50";
7540
+ }
7541
+ if (relation === "\u5A18") {
7542
+ return "\u7D99\u5A18";
7543
+ }
7544
+ return `\u7D99${relation}`;
7545
+ }
7546
+ if (this.pathN.relation === "adopted") {
7547
+ return `\u990A\u5B50\u306E${relation}`;
7548
+ }
7549
+ if (this.pathN.relation === "foster") {
7550
+ return `\u91CC\u89AA\u306E${relation}`;
7551
+ }
7552
+ return relation;
7226
7553
  }
7227
7554
  };
7228
7555
 
@@ -7231,22 +7558,32 @@ var InLawsZh = {
7231
7558
  "(\u5B50\u5973|\u5973\u513F|\u513F\u5B50)\u7684\u914D\u5076": "\u513F\u5AB3/\u5973\u5A7F",
7232
7559
  "(\u5B50\u5973|\u5973\u513F|\u513F\u5B50)\u7684\u59BB\u5B50": "\u513F\u5AB3",
7233
7560
  "(\u5B50\u5973|\u5973\u513F|\u513F\u5B50)\u7684\u4E08\u592B": "\u5973\u5A7F",
7234
- "(\u914D\u5076|\u59BB\u5B50|\u4E08\u592B)\u7684\u6BCD\u4EB2": "\u5CB3\u6BCD/\u5A46\u5A46",
7235
- "(\u914D\u5076|\u59BB\u5B50|\u4E08\u592B)\u7684\u7236\u4EB2": "\u5CB3\u7236/\u516C\u516C",
7236
- "(\u914D\u5076|\u59BB\u5B50|\u4E08\u592B)\u7684\u7236\u6BCD": "\u5CB3\u7236\u5CB3\u6BCD/\u516C\u516C\u5A46\u5A46",
7561
+ "\u59BB\u5B50\u7684\u6BCD\u4EB2": "\u5CB3\u6BCD",
7562
+ "\u4E08\u592B\u7684\u6BCD\u4EB2": "\u5A46\u5A46",
7563
+ "(\u914D\u5076)\u7684\u6BCD\u4EB2": "\u5CB3\u6BCD/\u5A46\u5A46",
7564
+ "\u59BB\u5B50\u7684\u7236\u4EB2": "\u5CB3\u7236",
7565
+ "\u4E08\u592B\u7684\u7236\u4EB2": "\u516C\u516C",
7566
+ "(\u914D\u5076)\u7684\u7236\u4EB2": "\u5CB3\u7236/\u516C\u516C",
7567
+ "\u59BB\u5B50\u7684\u7236\u6BCD": "\u5CB3\u7236\u5CB3\u6BCD",
7568
+ "\u4E08\u592B\u7684\u7236\u6BCD": "\u516C\u516C\u5A46\u5A46",
7569
+ "(\u914D\u5076)\u7684\u7236\u6BCD": "\u5CB3\u7236\u5CB3\u6BCD/\u516C\u516C\u5A46\u5A46",
7237
7570
  "(\u5F02\u7236\u6BCD\u7684)?(\u5144\u5F1F\u59D0\u59B9|\u59D0\u59B9|\u5144\u5F1F)\u7684\u59BB\u5B50": "\u5AC2\u5B50/\u5F1F\u59B9",
7238
7571
  "(\u5F02\u7236\u6BCD\u7684)?(\u5144\u5F1F\u59D0\u59B9|\u59D0\u59B9|\u5144\u5F1F)\u7684\u4E08\u592B": "\u59D0\u592B/\u59B9\u592B",
7239
7572
  "(\u5F02\u7236\u6BCD\u7684)?(\u5144\u5F1F\u59D0\u59B9|\u59D0\u59B9|\u5144\u5F1F)\u7684\u914D\u5076": "\u59FB\u4EB2\u5144\u5F1F\u59D0\u59B9",
7240
7573
  "(\u5F02\u7236\u6BCD\u7684)?\u59D0\u59B9\u7684(\u914D\u5076|\u59BB\u5B50|\u4E08\u592B)": "\u59D0\u592B/\u59B9\u592B",
7241
7574
  "(\u5F02\u7236\u6BCD\u7684)?\u5144\u5F1F\u7684(\u914D\u5076|\u59BB\u5B50|\u4E08\u592B)": "\u5AC2\u5B50/\u5F1F\u59B9",
7242
7575
  "(\u5F02\u7236\u6BCD\u7684)?\u5144\u5F1F\u59D0\u59B9\u7684(\u914D\u5076|\u59BB\u5B50|\u4E08\u592B)": "\u59FB\u4EB2\u5144\u5F1F\u59D0\u59B9",
7243
- "(\u5F02\u7236\u6BCD\u7684)?(\u914D\u5076|\u59BB\u5B50|\u4E08\u592B)\u7684\u59D0\u59B9": "\u59D1\u5B50/\u59E8\u5B50",
7244
- "(\u5F02\u7236\u6BCD\u7684)?(\u914D\u5076|\u59BB\u5B50|\u4E08\u592B)\u7684\u5144\u5F1F": "\u5927\u4F2F/\u5C0F\u53D4/\u5185\u5144/\u5185\u5F1F",
7576
+ "(\u5F02\u7236\u6BCD\u7684)?\u59BB\u5B50\u7684\u59D0\u59B9": "\u59E8\u5B50",
7577
+ "(\u5F02\u7236\u6BCD\u7684)?\u4E08\u592B\u7684\u59D0\u59B9": "\u59D1\u5B50",
7578
+ "(\u5F02\u7236\u6BCD\u7684)?(\u914D\u5076)\u7684\u59D0\u59B9": "\u59D1\u5B50/\u59E8\u5B50",
7579
+ "(\u5F02\u7236\u6BCD\u7684)?\u59BB\u5B50\u7684\u5144\u5F1F": "\u5185\u5144/\u5185\u5F1F",
7580
+ "(\u5F02\u7236\u6BCD\u7684)?\u4E08\u592B\u7684\u5144\u5F1F": "\u5927\u4F2F/\u5C0F\u53D4",
7581
+ "(\u5F02\u7236\u6BCD\u7684)?(\u914D\u5076)\u7684\u5144\u5F1F": "\u5927\u4F2F/\u5C0F\u53D4/\u5185\u5144/\u5185\u5F1F",
7245
7582
  "(\u5F02\u7236\u6BCD\u7684)?(\u914D\u5076|\u59BB\u5B50|\u4E08\u592B)\u7684\u5144\u5F1F\u59D0\u59B9": "\u59FB\u4EB2\u5144\u5F1F\u59D0\u59B9"
7246
7583
  };
7247
7584
 
7248
7585
  // src/kinship-translator/kinship-translator.zh.ts
7249
- var sexOf3 = (person) => {
7586
+ var sexOf6 = (person) => {
7250
7587
  if (person?.isMale?.()) {
7251
7588
  return "m";
7252
7589
  }
@@ -7255,7 +7592,7 @@ var sexOf3 = (person) => {
7255
7592
  }
7256
7593
  return "n";
7257
7594
  };
7258
- var pick2 = (sex, male, female, neutral) => {
7595
+ var pick5 = (sex, male, female, neutral) => {
7259
7596
  if (sex === "m") {
7260
7597
  return male;
7261
7598
  }
@@ -7268,41 +7605,41 @@ var lineal2 = (level, sex, kind) => {
7268
7605
  const L = Math.max(1, level);
7269
7606
  if (kind === "asc") {
7270
7607
  if (L <= 1) {
7271
- return pick2(sex, "\u7236\u4EB2", "\u6BCD\u4EB2", "\u7236\u6BCD");
7608
+ return pick5(sex, "\u7236\u4EB2", "\u6BCD\u4EB2", "\u7236\u6BCD");
7272
7609
  }
7273
7610
  if (L === 2) {
7274
- return pick2(sex, "\u7956\u7236", "\u7956\u6BCD", "\u7956\u7236\u6BCD");
7611
+ return pick5(sex, "\u7956\u7236", "\u7956\u6BCD", "\u7956\u7236\u6BCD");
7275
7612
  }
7276
7613
  if (L === 3) {
7277
- return pick2(sex, "\u66FE\u7956\u7236", "\u66FE\u7956\u6BCD", "\u66FE\u7956\u7236\u6BCD");
7614
+ return pick5(sex, "\u66FE\u7956\u7236", "\u66FE\u7956\u6BCD", "\u66FE\u7956\u7236\u6BCD");
7278
7615
  }
7279
7616
  if (L === 4) {
7280
- return pick2(sex, "\u9AD8\u7956\u7236", "\u9AD8\u7956\u6BCD", "\u9AD8\u7956\u7236\u6BCD");
7617
+ return pick5(sex, "\u9AD8\u7956\u7236", "\u9AD8\u7956\u6BCD", "\u9AD8\u7956\u7236\u6BCD");
7281
7618
  }
7282
- return pick2(sex, `${L}\u4E16\u7956`, `${L}\u4E16\u7956\u6BCD`, `${L}\u4E16\u7956\u7236\u6BCD`);
7619
+ return pick5(sex, `${L}\u4E16\u7956`, `${L}\u4E16\u7956\u6BCD`, `${L}\u4E16\u7956\u7236\u6BCD`);
7283
7620
  }
7284
7621
  if (L <= 1) {
7285
- return pick2(sex, "\u513F\u5B50", "\u5973\u513F", "\u5B50\u5973");
7622
+ return pick5(sex, "\u513F\u5B50", "\u5973\u513F", "\u5B50\u5973");
7286
7623
  }
7287
7624
  if (L === 2) {
7288
- return pick2(sex, "\u5B59\u5B50", "\u5B59\u5973", "\u5B59\u5B50\u5973");
7625
+ return pick5(sex, "\u5B59\u5B50", "\u5B59\u5973", "\u5B59\u5B50\u5973");
7289
7626
  }
7290
7627
  if (L === 3) {
7291
- return pick2(sex, "\u66FE\u5B59", "\u66FE\u5B59\u5973", "\u66FE\u5B59\u5B50\u5973");
7628
+ return pick5(sex, "\u66FE\u5B59", "\u66FE\u5B59\u5973", "\u66FE\u5B59\u5B50\u5973");
7292
7629
  }
7293
7630
  if (L === 4) {
7294
- return pick2(sex, "\u7384\u5B59", "\u7384\u5B59\u5973", "\u7384\u5B59\u5B50\u5973");
7631
+ return pick5(sex, "\u7384\u5B59", "\u7384\u5B59\u5973", "\u7384\u5B59\u5B50\u5973");
7295
7632
  }
7296
- return pick2(sex, `${L}\u4E16\u5B59`, `${L}\u4E16\u5B59\u5973`, `${L}\u4E16\u5B59\u5B50\u5973`);
7633
+ return pick5(sex, `${L}\u4E16\u5B59`, `${L}\u4E16\u5B59\u5973`, `${L}\u4E16\u5B59\u5B50\u5973`);
7297
7634
  };
7298
7635
  var cousinPlain2 = (degree, sex) => {
7299
7636
  if (degree <= 1) {
7300
- return pick2(sex, "\u5802\u8868\u5144\u5F1F", "\u5802\u8868\u59D0\u59B9", "\u5802\u8868\u4EB2");
7637
+ return pick5(sex, "\u5802\u8868\u5144\u5F1F", "\u5802\u8868\u59D0\u59B9", "\u5802\u8868\u4EB2");
7301
7638
  }
7302
7639
  if (degree === 2) {
7303
- return pick2(sex, "\u4ECE\u5802\u8868\u5144\u5F1F", "\u4ECE\u5802\u8868\u59D0\u59B9", "\u4ECE\u5802\u8868\u4EB2");
7640
+ return pick5(sex, "\u4ECE\u5802\u8868\u5144\u5F1F", "\u4ECE\u5802\u8868\u59D0\u59B9", "\u4ECE\u5802\u8868\u4EB2");
7304
7641
  }
7305
- return pick2(
7642
+ return pick5(
7306
7643
  sex,
7307
7644
  `${degree}\u4EE3\u5802\u8868\u5144\u5F1F`,
7308
7645
  `${degree}\u4EE3\u5802\u8868\u59D0\u59B9`,
@@ -7315,7 +7652,7 @@ var KinshipTranslatorZh = class extends KinshipTranslatorBasic {
7315
7652
  if (degree > 0) {
7316
7653
  degree = degree - 1;
7317
7654
  }
7318
- return cousinPlain2(degree, sexOf3(this.personN));
7655
+ return cousinPlain2(degree, sexOf6(this.personN));
7319
7656
  }
7320
7657
  removal() {
7321
7658
  const level = this.pathN?.level ?? 0;
@@ -7327,56 +7664,56 @@ var KinshipTranslatorZh = class extends KinshipTranslatorBasic {
7327
7664
  return level < 0 ? this.nibling() : this.auncle();
7328
7665
  }
7329
7666
  const removed = Math.abs(level);
7330
- return `${cousinPlain2(degree, sexOf3(this.personN))}\uFF08\u9694${removed}\u4EE3\uFF09`;
7667
+ return `${cousinPlain2(degree, sexOf6(this.personN))}\uFF08\u9694${removed}\u4EE3\uFF09`;
7331
7668
  }
7332
7669
  auncle() {
7333
7670
  const level = Math.abs(this.pathN?.level ?? 0);
7334
- const sex = sexOf3(this.personN);
7335
- if (level <= 2) {
7336
- return pick2(sex, "\u53D4\u53D4", "\u963F\u59E8", "\u53D4\u4F2F/\u59D1\u59E8");
7671
+ const sex = sexOf6(this.personN);
7672
+ if (level <= 1) {
7673
+ return pick5(sex, "\u53D4\u53D4", "\u963F\u59E8", "\u53D4\u4F2F/\u59D1\u59E8");
7337
7674
  }
7338
- if (level === 3) {
7339
- return pick2(sex, "\u4F2F\u53D4\u7956\u7236", "\u59D1\u7956\u6BCD", "\u4F2F\u53D4\u7956\u7236\u6BCD");
7675
+ if (level === 2) {
7676
+ return pick5(sex, "\u4F2F\u53D4\u7956\u7236", "\u59D1\u7956\u6BCD", "\u4F2F\u53D4\u7956\u7236\u6BCD");
7340
7677
  }
7341
- return pick2(
7678
+ return pick5(
7342
7679
  sex,
7343
- `${level - 2}\u4EE3\u524D\u7684\u53D4\u53D4`,
7344
- `${level - 2}\u4EE3\u524D\u7684\u963F\u59E8`,
7345
- `${level - 2}\u4EE3\u524D\u7684\u53D4\u4F2F/\u59D1\u59E8`
7680
+ `${level - 1}\u4EE3\u524D\u7684\u53D4\u53D4`,
7681
+ `${level - 1}\u4EE3\u524D\u7684\u963F\u59E8`,
7682
+ `${level - 1}\u4EE3\u524D\u7684\u53D4\u4F2F/\u59D1\u59E8`
7346
7683
  );
7347
7684
  }
7348
7685
  nibling() {
7349
7686
  const level = Math.abs(this.pathN?.level ?? 0);
7350
- const sex = sexOf3(this.personN);
7351
- if (level <= 2) {
7352
- return pick2(sex, "\u4F84\u5B50", "\u4F84\u5973", "\u4F84\u5B50\u5973");
7687
+ const sex = sexOf6(this.personN);
7688
+ if (level <= 1) {
7689
+ return pick5(sex, "\u4F84\u5B50", "\u4F84\u5973", "\u4F84\u5B50\u5973");
7353
7690
  }
7354
- if (level === 3) {
7355
- return pick2(sex, "\u4F84\u5B59", "\u4F84\u5B59\u5973", "\u4F84\u5B59\u5B50\u5973");
7691
+ if (level === 2) {
7692
+ return pick5(sex, "\u4F84\u5B59", "\u4F84\u5B59\u5973", "\u4F84\u5B59\u5B50\u5973");
7356
7693
  }
7357
- return pick2(
7694
+ return pick5(
7358
7695
  sex,
7359
- `${level - 2}\u4EE3\u4E0B\u7684\u4F84\u5B50`,
7360
- `${level - 2}\u4EE3\u4E0B\u7684\u4F84\u5973`,
7361
- `${level - 2}\u4EE3\u4E0B\u7684\u4F84\u5B50\u5973`
7696
+ `${level - 1}\u4EE3\u4E0B\u7684\u4F84\u5B50`,
7697
+ `${level - 1}\u4EE3\u4E0B\u7684\u4F84\u5973`,
7698
+ `${level - 1}\u4EE3\u4E0B\u7684\u4F84\u5B50\u5973`
7362
7699
  );
7363
7700
  }
7364
7701
  parent() {
7365
7702
  return lineal2(
7366
7703
  Math.abs(this.pathN?.level ?? 0),
7367
- sexOf3(this.personN),
7704
+ sexOf6(this.personN),
7368
7705
  "asc"
7369
7706
  );
7370
7707
  }
7371
7708
  child() {
7372
7709
  return lineal2(
7373
7710
  Math.abs(this.pathN?.level ?? 0),
7374
- sexOf3(this.personN),
7711
+ sexOf6(this.personN),
7375
7712
  "desc"
7376
7713
  );
7377
7714
  }
7378
7715
  sibling() {
7379
- return pick2(sexOf3(this.personN), "\u5144\u5F1F", "\u59D0\u59B9", "\u5144\u5F1F\u59D0\u59B9");
7716
+ return pick5(sexOf6(this.personN), "\u5144\u5F1F", "\u59D0\u59B9", "\u5144\u5F1F\u59D0\u59B9");
7380
7717
  }
7381
7718
  halfBlood(relation) {
7382
7719
  if (!relation || !this.isHalfBlood) {
@@ -7385,14 +7722,14 @@ var KinshipTranslatorZh = class extends KinshipTranslatorBasic {
7385
7722
  return `\u5F02\u7236\u6BCD\u7684${relation}`;
7386
7723
  }
7387
7724
  spouse() {
7388
- return pick2(sexOf3(this.personN), "\u4E08\u592B", "\u59BB\u5B50", "\u914D\u5076");
7725
+ return pick5(sexOf6(this.personN), "\u4E08\u592B", "\u59BB\u5B50", "\u914D\u5076");
7389
7726
  }
7390
7727
  ofSpouse(relation) {
7391
7728
  if (!relation) {
7392
7729
  return "";
7393
7730
  }
7394
- const spouseType = pick2(
7395
- sexOf3(this.path?.[1].indi),
7731
+ const spouseType = pick5(
7732
+ sexOf6(this.path?.[1].indi),
7396
7733
  "\u4E08\u592B",
7397
7734
  "\u59BB\u5B50",
7398
7735
  "\u914D\u5076"
@@ -7404,7 +7741,7 @@ var KinshipTranslatorZh = class extends KinshipTranslatorBasic {
7404
7741
  return "";
7405
7742
  }
7406
7743
  const spouse = this.path?.[this.path.length - 1].indi;
7407
- const spouseType = pick2(sexOf3(spouse), "\u4E08\u592B", "\u59BB\u5B50", "\u914D\u5076");
7744
+ const spouseType = pick5(sexOf6(spouse), "\u4E08\u592B", "\u59BB\u5B50", "\u914D\u5076");
7408
7745
  return `${relation}\u7684${spouseType}`;
7409
7746
  }
7410
7747
  of(relation) {
@@ -7440,7 +7777,40 @@ var KinshipTranslatorZh = class extends KinshipTranslatorBasic {
7440
7777
  if (!relation || !this.pathN?.relation) {
7441
7778
  return relation ?? "";
7442
7779
  }
7443
- return `${this.pathN.relation}${relation}`;
7780
+ if (this.pathN.relation === "step") {
7781
+ if (relation === "\u7236\u4EB2") {
7782
+ return "\u7EE7\u7236";
7783
+ }
7784
+ if (relation === "\u6BCD\u4EB2") {
7785
+ return "\u7EE7\u6BCD";
7786
+ }
7787
+ if (relation === "\u513F\u5B50") {
7788
+ return "\u7EE7\u5B50";
7789
+ }
7790
+ if (relation === "\u5973\u513F") {
7791
+ return "\u7EE7\u5973";
7792
+ }
7793
+ return `\u7EE7${relation}`;
7794
+ }
7795
+ if (this.pathN.relation === "adopted") {
7796
+ if (relation === "\u7236\u4EB2") {
7797
+ return "\u517B\u7236";
7798
+ }
7799
+ if (relation === "\u6BCD\u4EB2") {
7800
+ return "\u517B\u6BCD";
7801
+ }
7802
+ if (relation === "\u513F\u5B50") {
7803
+ return "\u517B\u5B50";
7804
+ }
7805
+ if (relation === "\u5973\u513F") {
7806
+ return "\u517B\u5973";
7807
+ }
7808
+ return `\u517B${relation}`;
7809
+ }
7810
+ if (this.pathN.relation === "foster") {
7811
+ return `\u5BC4\u517B${relation}`;
7812
+ }
7813
+ return relation;
7444
7814
  }
7445
7815
  };
7446
7816