@treeviz/gedcom-parser 2.1.11 → 2.1.15

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (45) hide show
  1. package/dist/classes/index.js +732 -396
  2. package/dist/classes/indi.d.ts +2 -2
  3. package/dist/classes/indi.d.ts.map +1 -1
  4. package/dist/cli/index.js +733 -397
  5. package/dist/constants/index.js +731 -395
  6. package/dist/factories/index.js +731 -395
  7. package/dist/factories/kinship-factory.d.ts +2 -2
  8. package/dist/factories/kinship-factory.d.ts.map +1 -1
  9. package/dist/index.js +733 -397
  10. package/dist/kinship-translator/index.js +731 -395
  11. package/dist/kinship-translator/kinship-translator.basic.d.ts +3 -1
  12. package/dist/kinship-translator/kinship-translator.basic.d.ts.map +1 -1
  13. package/dist/kinship-translator/kinship-translator.d.ts +3 -2
  14. package/dist/kinship-translator/kinship-translator.d.ts.map +1 -1
  15. package/dist/kinship-translator/kinship-translator.de.d.ts +2 -3
  16. package/dist/kinship-translator/kinship-translator.de.d.ts.map +1 -1
  17. package/dist/kinship-translator/kinship-translator.en.d.ts.map +1 -1
  18. package/dist/kinship-translator/kinship-translator.es.d.ts +2 -3
  19. package/dist/kinship-translator/kinship-translator.es.d.ts.map +1 -1
  20. package/dist/kinship-translator/kinship-translator.fr.d.ts +2 -3
  21. package/dist/kinship-translator/kinship-translator.fr.d.ts.map +1 -1
  22. package/dist/kinship-translator/kinship-translator.hu.d.ts.map +1 -1
  23. package/dist/kinship-translator/kinship-translator.ja.d.ts.map +1 -1
  24. package/dist/kinship-translator/kinship-translator.ru.d.ts +1 -1
  25. package/dist/kinship-translator/kinship-translator.ru.d.ts.map +1 -1
  26. package/dist/kinship-translator/kinship-translator.zh.d.ts.map +1 -1
  27. package/dist/kinship-translator/patterns.de.d.ts +1 -0
  28. package/dist/kinship-translator/patterns.de.d.ts.map +1 -1
  29. package/dist/kinship-translator/patterns.es.d.ts +1 -0
  30. package/dist/kinship-translator/patterns.es.d.ts.map +1 -1
  31. package/dist/kinship-translator/patterns.fr.d.ts +1 -0
  32. package/dist/kinship-translator/patterns.fr.d.ts.map +1 -1
  33. package/dist/kinship-translator/patterns.hu.d.ts.map +1 -1
  34. package/dist/kinship-translator/patterns.ru.d.ts +1 -0
  35. package/dist/kinship-translator/patterns.ru.d.ts.map +1 -1
  36. package/dist/kinship-translator/patterns.zh.d.ts.map +1 -1
  37. package/dist/structures/gedcom.d.ts +1 -0
  38. package/dist/structures/gedcom.d.ts.map +1 -1
  39. package/dist/structures/individual.d.ts +1 -0
  40. package/dist/structures/individual.d.ts.map +1 -1
  41. package/dist/types/types.d.ts +2 -0
  42. package/dist/types/types.d.ts.map +1 -1
  43. package/dist/utils/common-creator.d.ts.map +1 -1
  44. package/dist/utils/index.js +733 -397
  45. package/package.json +1 -1
@@ -9,11 +9,12 @@ var __export = (target, all) => {
9
9
 
10
10
  // src/kinship-translator/kinship-translator.basic.ts
11
11
  var KinshipTranslatorBasic = class {
12
- constructor(path, displayName = "givenname") {
12
+ constructor(path, displayName = "givenname", nameOrder = "first-last") {
13
13
  this.isOfSpouse = false;
14
14
  this.isSpouseOf = false;
15
15
  this._path = path;
16
16
  this.displayName = displayName;
17
+ this.nameOrder = nameOrder;
17
18
  }
18
19
  get path() {
19
20
  return this._path;
@@ -464,7 +465,7 @@ var KinshipTranslatorHU = class extends KinshipTranslatorBasic {
464
465
  }
465
466
  return `${hungarianOrdinalize(
466
467
  degree
467
- )}unokatestv\xE9r ${level}x elt\xE1vol\xEDtva`;
468
+ )}unokatestv\xE9r ${Math.abs(level)}x elt\xE1vol\xEDtva`;
468
469
  }
469
470
  auncle() {
470
471
  const level = this.pathN?.level ?? 0;
@@ -508,14 +509,25 @@ var KinshipTranslatorHU = class extends KinshipTranslatorBasic {
508
509
  return `${ordinalized ? `${ordinalized}unoka` : ""}testv\xE9r ${origPrefix.replace(/nagy$/, "")}unok\xE1ja`;
509
510
  }
510
511
  parent() {
512
+ const level = Math.abs(this.pathN?.level ?? 0);
513
+ if (level <= 1) {
514
+ if (this.personN?.isMale()) {
515
+ return "apa";
516
+ }
517
+ if (this.personN?.isFemale()) {
518
+ return "anya";
519
+ }
520
+ return "sz\xFCl\u0151";
521
+ }
511
522
  const prefix = this.directPrefix();
523
+ const gen = prefix === "nagy" ? "" : prefix;
512
524
  if (this.personN?.isMale()) {
513
- return `${prefix}apa`;
525
+ return `${gen}nagyapa`;
514
526
  }
515
527
  if (this.personN?.isFemale()) {
516
- return `${prefix}anya`;
528
+ return `${gen}nagyanya`;
517
529
  }
518
- return `${prefix}sz\xFCl\u0151`;
530
+ return `${gen}nagysz\xFCl\u0151`;
519
531
  }
520
532
  child() {
521
533
  const level = Math.abs(this.pathN?.level ?? 0);
@@ -597,7 +609,7 @@ var KinshipTranslatorHU = class extends KinshipTranslatorBasic {
597
609
  }
598
610
  of(relation) {
599
611
  const formattedName = nameFormatter(this.path?.[0]?.indi, {
600
- nameOrder: "last-first"
612
+ nameOrder: this.nameOrder
601
613
  });
602
614
  let name = formattedName.inOrder.filter(Boolean).join(" ");
603
615
  if (this.displayName === "none") {
@@ -709,27 +721,30 @@ var KinshipTranslatorEn = class extends KinshipTranslatorBasic {
709
721
  if (!degree) {
710
722
  return level < 0 ? this.nibling() : this.auncle();
711
723
  }
712
- return `${ordinalize(degree)} cousin ${level}x removed`;
724
+ return `${ordinalize(degree)} cousin ${Math.abs(level)}x removed`;
713
725
  }
714
726
  auncle() {
715
- const prefix = this.directPrefix();
727
+ const level = Math.abs(this.pathN?.level ?? 0);
728
+ const greats = level <= 1 ? "" : "great-".repeat(level - 1);
716
729
  if (this.personN?.isMale()) {
717
- return `${prefix}uncle`;
730
+ return `${greats}uncle`;
718
731
  }
719
732
  if (this.personN?.isFemale()) {
720
- return `${prefix}aunt`;
733
+ return `${greats}aunt`;
721
734
  }
722
- return `${prefix}auncle`;
735
+ return greats ? `${greats}uncle/${greats}aunt` : "uncle/aunt";
723
736
  }
724
737
  nibling() {
725
- const prefix = this.directPrefix();
738
+ const level = Math.abs(this.pathN?.level ?? 0);
739
+ const greats = level <= 2 ? "" : "great-".repeat(level - 2);
740
+ const grand = level <= 1 ? "" : "grand";
726
741
  if (this.personN?.isMale()) {
727
- return `${prefix}nephew`;
742
+ return `${greats}${grand}nephew`;
728
743
  }
729
744
  if (this.personN?.isFemale()) {
730
- return `${prefix}niece`;
745
+ return `${greats}${grand}niece`;
731
746
  }
732
- return `${prefix}nibling`;
747
+ return greats || grand ? `${greats}${grand}nephew/${greats}${grand}niece` : "nephew/niece";
733
748
  }
734
749
  parent() {
735
750
  const prefix = this.directPrefix();
@@ -808,7 +823,7 @@ var KinshipTranslatorEn = class extends KinshipTranslatorBasic {
808
823
  }
809
824
  of(relation) {
810
825
  const formattedName = nameFormatter(this.path?.[0]?.indi, {
811
- nameOrder: "first-last"
826
+ nameOrder: this.nameOrder
812
827
  });
813
828
  let name = formattedName.inOrder.filter(Boolean).join(" ");
814
829
  if (this.displayName === "none") {
@@ -857,45 +872,70 @@ var KinshipTranslatorEn = class extends KinshipTranslatorBasic {
857
872
  };
858
873
 
859
874
  // src/kinship-translator/patterns.fr.ts
875
+ var parentRelationsFr = {
876
+ step: "step",
877
+ foster: "foster",
878
+ adopted: "adopted"
879
+ };
860
880
  var InLawsFr = {
861
881
  "conjoint de (enfant|fille|fils)": "beau-fils/belle-fille",
862
882
  "\xE9pouse de (enfant|fille|fils)": "belle-fille",
863
883
  "mari de (enfant|fille|fils)": "gendre",
864
- "m\xE8re du (conjoint|\xE9pouse|mari)": "belle-m\xE8re",
865
- "p\xE8re du (conjoint|\xE9pouse|mari)": "beau-p\xE8re",
866
- "parent du (conjoint|\xE9pouse|mari)": "beau-parent",
884
+ "m\xE8re (du mari|du conjoint|de l'\xE9pouse)": "belle-m\xE8re",
885
+ "p\xE8re (du mari|du conjoint|de l'\xE9pouse)": "beau-p\xE8re",
886
+ "parent (du mari|du conjoint|de l'\xE9pouse)": "beau-parent",
867
887
  "\xE9pouse de (demi-)?(fr\xE8re/s\u0153ur|s\u0153ur|fr\xE8re)": "belle-s\u0153ur",
868
888
  "mari de (demi-)?(fr\xE8re/s\u0153ur|s\u0153ur|fr\xE8re)": "beau-fr\xE8re",
869
889
  "conjoint de (demi-)?(fr\xE8re/s\u0153ur|s\u0153ur|fr\xE8re)": "beau-fr\xE8re/belle-s\u0153ur",
870
- "(demi-)?s\u0153ur du (conjoint|\xE9pouse|mari)": "belle-s\u0153ur",
871
- "(demi-)?fr\xE8re du (conjoint|\xE9pouse|mari)": "beau-fr\xE8re",
872
- "(demi-)?fr\xE8re/s\u0153ur du (conjoint|\xE9pouse|mari)": "beau-fr\xE8re/belle-s\u0153ur"
890
+ "(demi-)?s\u0153ur (du mari|du conjoint|de l'\xE9pouse)": "belle-s\u0153ur",
891
+ "(demi-)?fr\xE8re (du mari|du conjoint|de l'\xE9pouse)": "beau-fr\xE8re",
892
+ "(demi-)?fr\xE8re/s\u0153ur (du mari|du conjoint|de l'\xE9pouse)": "beau-fr\xE8re/belle-s\u0153ur"
873
893
  };
874
894
 
875
895
  // src/kinship-translator/kinship-translator.fr.ts
876
- var KinshipTranslatorFr = class extends KinshipTranslatorBasic {
877
- directPrefix() {
878
- const level = Math.abs(this.pathN?.level ?? 0);
879
- if (level <= 1) {
880
- return "";
881
- }
882
- if (level === 2) {
883
- return "grand-";
884
- }
885
- if (level === 3) {
886
- return "arri\xE8re-grand-";
887
- }
888
- return `arri\xE8re${level - 2}-grand-`;
896
+ var sexOf = (person) => {
897
+ if (person?.isMale?.()) {
898
+ return "m";
899
+ }
900
+ if (person?.isFemale?.()) {
901
+ return "f";
902
+ }
903
+ return "n";
904
+ };
905
+ var pick = (sex, male, female, neutral) => {
906
+ if (sex === "m") {
907
+ return male;
908
+ }
909
+ if (sex === "f") {
910
+ return female;
911
+ }
912
+ return neutral;
913
+ };
914
+ var arriere = (count) => count > 0 ? "arri\xE8re-".repeat(count) : "";
915
+ var frenchOrdinal = (n) => n === 1 ? "1er" : `${n}e`;
916
+ var isFeminineRelation = (relation) => /mère|fille|sœur|tante|nièce|cousine|épouse/.test(relation);
917
+ var ofSpousePrep = (spouseType) => {
918
+ if (spouseType === "\xE9pouse") {
919
+ return "de l'";
889
920
  }
921
+ return "du ";
922
+ };
923
+ var KinshipTranslatorFr = class extends KinshipTranslatorBasic {
890
924
  indirect() {
891
925
  let degree = Math.abs(this.pathN?.degree ?? 0);
892
926
  if (degree > 0) {
893
927
  degree = degree - 1;
894
928
  }
895
- if (degree === 1) {
896
- return `cousin`;
929
+ const cousin = pick(
930
+ sexOf(this.personN),
931
+ "cousin",
932
+ "cousine",
933
+ "cousin/cousine"
934
+ );
935
+ if (degree <= 1) {
936
+ return cousin;
897
937
  }
898
- return `cousin au ${ordinalize(degree)} degr\xE9`;
938
+ return `${cousin} au ${frenchOrdinal(degree)} degr\xE9`;
899
939
  }
900
940
  removal() {
901
941
  const level = this.pathN?.level ?? 0;
@@ -906,56 +946,57 @@ var KinshipTranslatorFr = class extends KinshipTranslatorBasic {
906
946
  if (!degree) {
907
947
  return level < 0 ? this.nibling() : this.auncle();
908
948
  }
909
- return `cousin au ${ordinalize(degree)} degr\xE9 ${Math.abs(level)}\xD7 \xE9loign\xE9`;
949
+ return `${this.indirect()} ${Math.abs(level)}\xD7 \xE9loign\xE9`;
910
950
  }
911
951
  auncle() {
912
- const prefix = this.directPrefix();
913
- if (this.personN?.isMale()) {
914
- return `${prefix}oncle`;
915
- }
916
- if (this.personN?.isFemale()) {
917
- return `${prefix}tante`;
952
+ const level = Math.abs(this.pathN?.level ?? 0);
953
+ const sex = sexOf(this.personN);
954
+ const base = pick(sex, "oncle", "tante", "oncle/tante");
955
+ if (level <= 1) {
956
+ return base;
918
957
  }
919
- return `${prefix}oncle/tante`;
958
+ const grands = pick(
959
+ sex,
960
+ "grand-oncle",
961
+ "grand-tante",
962
+ "grand-oncle/tante"
963
+ );
964
+ return `${arriere(level - 2)}${grands}`;
920
965
  }
921
966
  nibling() {
922
- const prefix = this.directPrefix();
923
- if (this.personN?.isMale()) {
924
- return `${prefix}neveu`;
925
- }
926
- if (this.personN?.isFemale()) {
927
- return `${prefix}ni\xE8ce`;
967
+ const level = Math.abs(this.pathN?.level ?? 0);
968
+ const sex = sexOf(this.personN);
969
+ if (level <= 1) {
970
+ return pick(sex, "neveu", "ni\xE8ce", "neveu/ni\xE8ce");
928
971
  }
929
- return `${prefix}neveu/ni\xE8ce`;
972
+ const grands = pick(
973
+ sex,
974
+ "grand-neveu",
975
+ "grande-ni\xE8ce",
976
+ "grand-neveu/grande-ni\xE8ce"
977
+ );
978
+ return `${arriere(level - 2)}${grands}`;
930
979
  }
931
980
  parent() {
932
- const prefix = this.directPrefix();
933
- if (this.personN?.isMale()) {
934
- return `${prefix}p\xE8re`;
935
- }
936
- if (this.personN?.isFemale()) {
937
- return `${prefix}m\xE8re`;
981
+ const level = Math.abs(this.pathN?.level ?? 0);
982
+ const sex = sexOf(this.personN);
983
+ if (level <= 1) {
984
+ return pick(sex, "p\xE8re", "m\xE8re", "parent");
938
985
  }
939
- return `${prefix}parent`;
986
+ const grands = pick(sex, "grand-p\xE8re", "grand-m\xE8re", "grand-parent");
987
+ return `${arriere(level - 2)}${grands}`;
940
988
  }
941
989
  child() {
942
- const prefix = this.directPrefix();
943
- if (this.personN?.isMale()) {
944
- return `${prefix}fils`;
945
- }
946
- if (this.personN?.isFemale()) {
947
- return `${prefix}fille`;
990
+ const level = Math.abs(this.pathN?.level ?? 0);
991
+ const sex = sexOf(this.personN);
992
+ if (level <= 1) {
993
+ return pick(sex, "fils", "fille", "enfant");
948
994
  }
949
- return `${prefix}enfant`;
995
+ const petits = pick(sex, "petit-fils", "petite-fille", "petit-enfant");
996
+ return `${arriere(level - 2)}${petits}`;
950
997
  }
951
998
  sibling() {
952
- if (this.personN?.isMale()) {
953
- return "fr\xE8re";
954
- }
955
- if (this.personN?.isFemale()) {
956
- return "s\u0153ur";
957
- }
958
- return "fr\xE8re/s\u0153ur";
999
+ return pick(sexOf(this.personN), "fr\xE8re", "s\u0153ur", "fr\xE8re/s\u0153ur");
959
1000
  }
960
1001
  halfBlood(relation) {
961
1002
  if (!relation || !this.isHalfBlood) {
@@ -964,45 +1005,35 @@ var KinshipTranslatorFr = class extends KinshipTranslatorBasic {
964
1005
  return `demi-${relation}`;
965
1006
  }
966
1007
  spouse() {
967
- if (this.personN?.isMale()) {
968
- return "mari";
969
- }
970
- if (this.personN?.isFemale()) {
971
- return "\xE9pouse";
972
- }
973
- return "conjoint";
1008
+ return pick(sexOf(this.personN), "mari", "\xE9pouse", "conjoint");
974
1009
  }
975
1010
  ofSpouse(relation) {
976
1011
  if (!relation) {
977
1012
  return "";
978
1013
  }
979
- const spouse = this.path?.[1].indi;
980
- let spouseType = "conjoint";
981
- if (spouse?.isMale()) {
982
- spouseType = "mari";
983
- }
984
- if (spouse?.isFemale()) {
985
- spouseType = "\xE9pouse";
986
- }
987
- return `${relation} du ${spouseType}`;
1014
+ const spouseType = pick(
1015
+ sexOf(this.path?.[1].indi),
1016
+ "mari",
1017
+ "\xE9pouse",
1018
+ "conjoint"
1019
+ );
1020
+ return `${relation} ${ofSpousePrep(spouseType)}${spouseType}`;
988
1021
  }
989
1022
  spouseOf(relation) {
990
1023
  if (!relation) {
991
1024
  return "";
992
1025
  }
993
- const spouse = this.path?.[this.path.length - 1].indi;
994
- let spouseType = "conjoint";
995
- if (spouse?.isMale()) {
996
- spouseType = "mari";
997
- }
998
- if (spouse?.isFemale()) {
999
- spouseType = "\xE9pouse";
1000
- }
1026
+ const spouseType = pick(
1027
+ sexOf(this.path?.[this.path.length - 1].indi),
1028
+ "mari",
1029
+ "\xE9pouse",
1030
+ "conjoint"
1031
+ );
1001
1032
  return `${spouseType} de ${relation}`;
1002
1033
  }
1003
1034
  of(relation) {
1004
1035
  const formattedName = nameFormatter(this.path?.[0]?.indi, {
1005
- nameOrder: "first-last"
1036
+ nameOrder: this.nameOrder
1006
1037
  });
1007
1038
  let name = formattedName.inOrder.filter(Boolean).join(" ");
1008
1039
  if (this.displayName === "none") {
@@ -1018,6 +1049,9 @@ var KinshipTranslatorFr = class extends KinshipTranslatorBasic {
1018
1049
  if (relation.includes(" du ") || relation.includes(" de ")) {
1019
1050
  return relation.replace(/ (du|de) /, ` $1 ${name} `);
1020
1051
  }
1052
+ if (relation.includes(" de l'")) {
1053
+ return relation.replace(" de l'", ` de ${name} l'`);
1054
+ }
1021
1055
  return `${relation} de ${name}`;
1022
1056
  }
1023
1057
  inLaw(relation) {
@@ -1046,50 +1080,118 @@ var KinshipTranslatorFr = class extends KinshipTranslatorBasic {
1046
1080
  if (!relation || !this.pathN?.relation) {
1047
1081
  return relation ?? "";
1048
1082
  }
1049
- return `${this.pathN.relation} ${relation}`;
1083
+ const kind = parentRelationsFr[this.pathN.relation];
1084
+ if (!kind) {
1085
+ return relation;
1086
+ }
1087
+ if (kind === "step") {
1088
+ return `${isFeminineRelation(relation) ? "belle-" : "beau-"}${relation}`;
1089
+ }
1090
+ if (kind === "adopted") {
1091
+ return `${relation} ${isFeminineRelation(relation) ? "adoptive" : "adoptif"}`;
1092
+ }
1093
+ if (kind === "foster") {
1094
+ return `${relation} d'accueil`;
1095
+ }
1096
+ return relation;
1050
1097
  }
1051
1098
  };
1052
1099
 
1053
1100
  // src/kinship-translator/patterns.es.ts
1101
+ var parentRelationsEs = {
1102
+ step: {
1103
+ padre: "padrastro",
1104
+ madre: "madrastra",
1105
+ hijo: "hijastro",
1106
+ hija: "hijastra",
1107
+ hermano: "hermanastro",
1108
+ hermana: "hermanastra",
1109
+ abuelo: "abuelastro",
1110
+ abuela: "abuelastra"
1111
+ }
1112
+ };
1054
1113
  var InLawsEs = {
1055
1114
  "c\xF3nyuge de (hijo/hija|hija|hijo)": "yerno/nuera",
1056
1115
  "esposa de (hijo/hija|hija|hijo)": "nuera",
1057
1116
  "esposo de (hijo/hija|hija|hijo)": "yerno",
1058
- "madre del (c\xF3nyuge|esposa|esposo)": "suegra",
1059
- "padre del (c\xF3nyuge|esposa|esposo)": "suegro",
1060
- "padre/madre del (c\xF3nyuge|esposa|esposo)": "suegro/suegra",
1117
+ "madre (del c\xF3nyuge|del esposo|de la esposa)": "suegra",
1118
+ "padre (del c\xF3nyuge|del esposo|de la esposa)": "suegro",
1119
+ "padre/madre (del c\xF3nyuge|del esposo|de la esposa)": "suegro/suegra",
1061
1120
  "esposa de (medio |media |medio/a )?(hermano/hermana|hermana|hermano)": "cu\xF1ada",
1062
1121
  "esposo de (medio |media |medio/a )?(hermano/hermana|hermana|hermano)": "cu\xF1ado",
1063
1122
  "c\xF3nyuge de (medio |media |medio/a )?(hermano/hermana|hermana|hermano)": "cu\xF1ado/cu\xF1ada",
1064
- "(medio |media |medio/a )?hermana del (c\xF3nyuge|esposa|esposo)": "cu\xF1ada",
1065
- "(medio |media |medio/a )?hermano del (c\xF3nyuge|esposa|esposo)": "cu\xF1ado",
1066
- "(medio |media |medio/a )?hermano/hermana del (c\xF3nyuge|esposa|esposo)": "cu\xF1ado/cu\xF1ada"
1123
+ "(medio |media |medio/a )?hermana (del c\xF3nyuge|del esposo|de la esposa)": "cu\xF1ada",
1124
+ "(medio |media |medio/a )?hermano (del c\xF3nyuge|del esposo|de la esposa)": "cu\xF1ado",
1125
+ "(medio |media |medio/a )?hermano/hermana (del c\xF3nyuge|del esposo|de la esposa)": "cu\xF1ado/cu\xF1ada"
1067
1126
  };
1068
1127
 
1069
1128
  // src/kinship-translator/kinship-translator.es.ts
1070
- var KinshipTranslatorEs = class extends KinshipTranslatorBasic {
1071
- directPrefix() {
1072
- const level = Math.abs(this.pathN?.level ?? 0);
1073
- if (level <= 1) {
1074
- return "";
1075
- }
1076
- if (level === 2) {
1077
- return "bisabuel";
1078
- }
1079
- if (level === 3) {
1080
- return "tatarabuel";
1081
- }
1082
- return `t\xE1tara${level - 2}-abuel`;
1129
+ var sexOf2 = (person) => {
1130
+ if (person?.isMale?.()) {
1131
+ return "m";
1132
+ }
1133
+ if (person?.isFemale?.()) {
1134
+ return "f";
1135
+ }
1136
+ return "n";
1137
+ };
1138
+ var pick2 = (sex, male, female, neutral) => {
1139
+ if (sex === "m") {
1140
+ return male;
1141
+ }
1142
+ if (sex === "f") {
1143
+ return female;
1144
+ }
1145
+ return neutral;
1146
+ };
1147
+ var SPANISH_ORDINALS_M = [
1148
+ "",
1149
+ "",
1150
+ "segundo",
1151
+ "tercero",
1152
+ "cuarto",
1153
+ "quinto",
1154
+ "sexto",
1155
+ "s\xE9ptimo",
1156
+ "octavo",
1157
+ "noveno",
1158
+ "d\xE9cimo"
1159
+ ];
1160
+ var SPANISH_ORDINALS_F = [
1161
+ "",
1162
+ "",
1163
+ "segunda",
1164
+ "tercera",
1165
+ "cuarta",
1166
+ "quinta",
1167
+ "sexta",
1168
+ "s\xE9ptima",
1169
+ "octava",
1170
+ "novena",
1171
+ "d\xE9cima"
1172
+ ];
1173
+ var spanishOrdinal = (n, sex) => {
1174
+ const list = sex === "f" ? SPANISH_ORDINALS_F : SPANISH_ORDINALS_M;
1175
+ return list[n] ?? `${n}.\xBA`;
1176
+ };
1177
+ var ofSpousePrep2 = (spouseType) => {
1178
+ if (spouseType === "esposa") {
1179
+ return "de la ";
1083
1180
  }
1181
+ return "del ";
1182
+ };
1183
+ var KinshipTranslatorEs = class extends KinshipTranslatorBasic {
1084
1184
  indirect() {
1085
1185
  let degree = Math.abs(this.pathN?.degree ?? 0);
1086
1186
  if (degree > 0) {
1087
1187
  degree = degree - 1;
1088
1188
  }
1089
- if (degree === 1) {
1090
- return `primo`;
1189
+ const sex = sexOf2(this.personN);
1190
+ const cousin = pick2(sex, "primo", "prima", "primo/prima");
1191
+ if (degree <= 1) {
1192
+ return cousin;
1091
1193
  }
1092
- return `primo ${ordinalize(degree)}`;
1194
+ return `${cousin} ${spanishOrdinal(degree, sex)}`;
1093
1195
  }
1094
1196
  removal() {
1095
1197
  const level = this.pathN?.level ?? 0;
@@ -1100,56 +1202,133 @@ var KinshipTranslatorEs = class extends KinshipTranslatorBasic {
1100
1202
  if (!degree) {
1101
1203
  return level < 0 ? this.nibling() : this.auncle();
1102
1204
  }
1103
- return `primo ${ordinalize(degree)} ${Math.abs(level)}\xD7 separado`;
1205
+ return `${this.indirect()} ${Math.abs(level)}\xD7 separado`;
1104
1206
  }
1105
1207
  auncle() {
1106
- const prefix = this.directPrefix();
1107
- if (this.personN?.isMale()) {
1108
- return `${prefix}t\xEDo`;
1208
+ const level = Math.abs(this.pathN?.level ?? 0);
1209
+ const sex = sexOf2(this.personN);
1210
+ if (level <= 1) {
1211
+ return pick2(sex, "t\xEDo", "t\xEDa", "t\xEDo/t\xEDa");
1109
1212
  }
1110
- if (this.personN?.isFemale()) {
1111
- return `${prefix}t\xEDa`;
1213
+ if (level === 2) {
1214
+ return pick2(sex, "t\xEDo abuelo", "t\xEDa abuela", "t\xEDo/t\xEDa abuelo");
1112
1215
  }
1113
- return `${prefix}t\xEDo/t\xEDa`;
1216
+ if (level === 3) {
1217
+ return pick2(
1218
+ sex,
1219
+ "t\xEDo bisabuelo",
1220
+ "t\xEDa bisabuela",
1221
+ "t\xEDo/t\xEDa bisabuelo"
1222
+ );
1223
+ }
1224
+ return pick2(
1225
+ sex,
1226
+ `t\xEDo abuelo (${level - 1}.\xBA)`,
1227
+ `t\xEDa abuela (${level - 1}.\xAA)`,
1228
+ `t\xEDo/t\xEDa abuelo (${level - 1}.\xBA)`
1229
+ );
1114
1230
  }
1115
1231
  nibling() {
1116
- const prefix = this.directPrefix();
1117
- if (this.personN?.isMale()) {
1118
- return `${prefix}sobrino`;
1232
+ const level = Math.abs(this.pathN?.level ?? 0);
1233
+ const sex = sexOf2(this.personN);
1234
+ if (level <= 1) {
1235
+ return pick2(sex, "sobrino", "sobrina", "sobrino/sobrina");
1119
1236
  }
1120
- if (this.personN?.isFemale()) {
1121
- return `${prefix}sobrina`;
1237
+ if (level === 2) {
1238
+ return pick2(
1239
+ sex,
1240
+ "sobrino nieto",
1241
+ "sobrina nieta",
1242
+ "sobrino/sobrina nieto"
1243
+ );
1122
1244
  }
1123
- return `${prefix}sobrino/sobrina`;
1245
+ if (level === 3) {
1246
+ return pick2(
1247
+ sex,
1248
+ "sobrino bisnieto",
1249
+ "sobrina bisnieta",
1250
+ "sobrino/sobrina bisnieto"
1251
+ );
1252
+ }
1253
+ return pick2(
1254
+ sex,
1255
+ `sobrino nieto (${level - 1}.\xBA)`,
1256
+ `sobrina nieta (${level - 1}.\xAA)`,
1257
+ `sobrino/sobrina nieto (${level - 1}.\xBA)`
1258
+ );
1124
1259
  }
1125
1260
  parent() {
1126
- const prefix = this.directPrefix();
1127
- if (this.personN?.isMale()) {
1128
- return `${prefix}padre`;
1261
+ const level = Math.abs(this.pathN?.level ?? 0);
1262
+ const sex = sexOf2(this.personN);
1263
+ if (level <= 1) {
1264
+ return pick2(sex, "padre", "madre", "padre/madre");
1129
1265
  }
1130
- if (this.personN?.isFemale()) {
1131
- return `${prefix}madre`;
1266
+ if (level === 2) {
1267
+ return pick2(sex, "abuelo", "abuela", "abuelo/abuela");
1268
+ }
1269
+ if (level === 3) {
1270
+ return pick2(sex, "bisabuelo", "bisabuela", "bisabuelo/bisabuela");
1271
+ }
1272
+ if (level === 4) {
1273
+ return pick2(
1274
+ sex,
1275
+ "tatarabuelo",
1276
+ "tatarabuela",
1277
+ "tatarabuelo/tatarabuela"
1278
+ );
1132
1279
  }
1133
- return `${prefix}padre/madre`;
1280
+ if (level === 5) {
1281
+ return pick2(
1282
+ sex,
1283
+ "trastatarabuelo",
1284
+ "trastatarabuela",
1285
+ "trastatarabuelo/trastatarabuela"
1286
+ );
1287
+ }
1288
+ return pick2(
1289
+ sex,
1290
+ `abuelo (${level}.\xBA)`,
1291
+ `abuela (${level}.\xAA)`,
1292
+ `abuelo/abuela (${level}.\xBA)`
1293
+ );
1134
1294
  }
1135
1295
  child() {
1136
- const prefix = this.directPrefix();
1137
- if (this.personN?.isMale()) {
1138
- return `${prefix}hijo`;
1296
+ const level = Math.abs(this.pathN?.level ?? 0);
1297
+ const sex = sexOf2(this.personN);
1298
+ if (level <= 1) {
1299
+ return pick2(sex, "hijo", "hija", "hijo/hija");
1139
1300
  }
1140
- if (this.personN?.isFemale()) {
1141
- return `${prefix}hija`;
1301
+ if (level === 2) {
1302
+ return pick2(sex, "nieto", "nieta", "nieto/nieta");
1142
1303
  }
1143
- return `${prefix}hijo/hija`;
1144
- }
1145
- sibling() {
1146
- if (this.personN?.isMale()) {
1147
- return "hermano";
1304
+ if (level === 3) {
1305
+ return pick2(sex, "bisnieto", "bisnieta", "bisnieto/bisnieta");
1148
1306
  }
1149
- if (this.personN?.isFemale()) {
1150
- return "hermana";
1307
+ if (level === 4) {
1308
+ return pick2(
1309
+ sex,
1310
+ "tataranieto",
1311
+ "tataranieta",
1312
+ "tataranieto/tataranieta"
1313
+ );
1151
1314
  }
1152
- return "hermano/hermana";
1315
+ if (level === 5) {
1316
+ return pick2(
1317
+ sex,
1318
+ "trastataranieto",
1319
+ "trastataranieta",
1320
+ "trastataranieto/trastataranieta"
1321
+ );
1322
+ }
1323
+ return pick2(
1324
+ sex,
1325
+ `nieto (${level}.\xBA)`,
1326
+ `nieta (${level}.\xAA)`,
1327
+ `nieto/nieta (${level}.\xBA)`
1328
+ );
1329
+ }
1330
+ sibling() {
1331
+ return pick2(sexOf2(this.personN), "hermano", "hermana", "hermano/hermana");
1153
1332
  }
1154
1333
  halfBlood(relation) {
1155
1334
  if (!relation || !this.isHalfBlood) {
@@ -1164,45 +1343,35 @@ var KinshipTranslatorEs = class extends KinshipTranslatorBasic {
1164
1343
  return `medio/a ${relation}`;
1165
1344
  }
1166
1345
  spouse() {
1167
- if (this.personN?.isMale()) {
1168
- return "esposo";
1169
- }
1170
- if (this.personN?.isFemale()) {
1171
- return "esposa";
1172
- }
1173
- return "c\xF3nyuge";
1346
+ return pick2(sexOf2(this.personN), "esposo", "esposa", "c\xF3nyuge");
1174
1347
  }
1175
1348
  ofSpouse(relation) {
1176
1349
  if (!relation) {
1177
1350
  return "";
1178
1351
  }
1179
- const spouse = this.path?.[1].indi;
1180
- let spouseType = "c\xF3nyuge";
1181
- if (spouse?.isMale()) {
1182
- spouseType = "esposo";
1183
- }
1184
- if (spouse?.isFemale()) {
1185
- spouseType = "esposa";
1186
- }
1187
- return `${relation} del ${spouseType}`;
1352
+ const spouseType = pick2(
1353
+ sexOf2(this.path?.[1].indi),
1354
+ "esposo",
1355
+ "esposa",
1356
+ "c\xF3nyuge"
1357
+ );
1358
+ return `${relation} ${ofSpousePrep2(spouseType)}${spouseType}`;
1188
1359
  }
1189
1360
  spouseOf(relation) {
1190
1361
  if (!relation) {
1191
1362
  return "";
1192
1363
  }
1193
- const spouse = this.path?.[this.path.length - 1].indi;
1194
- let spouseType = "c\xF3nyuge";
1195
- if (spouse?.isMale()) {
1196
- spouseType = "esposo";
1197
- }
1198
- if (spouse?.isFemale()) {
1199
- spouseType = "esposa";
1200
- }
1364
+ const spouseType = pick2(
1365
+ sexOf2(this.path?.[this.path.length - 1].indi),
1366
+ "esposo",
1367
+ "esposa",
1368
+ "c\xF3nyuge"
1369
+ );
1201
1370
  return `${spouseType} de ${relation}`;
1202
1371
  }
1203
1372
  of(relation) {
1204
1373
  const formattedName = nameFormatter(this.path?.[0]?.indi, {
1205
- nameOrder: "first-last"
1374
+ nameOrder: this.nameOrder
1206
1375
  });
1207
1376
  let name = formattedName.inOrder.filter(Boolean).join(" ");
1208
1377
  if (this.displayName === "none") {
@@ -1215,8 +1384,8 @@ var KinshipTranslatorEs = class extends KinshipTranslatorBasic {
1215
1384
  if (!name || !relation) {
1216
1385
  return relation ?? "";
1217
1386
  }
1218
- if (relation.includes(" del ") || relation.includes(" de ")) {
1219
- return relation.replace(/ (del|de) /, ` $1 ${name} `);
1387
+ if (relation.includes(" del ") || relation.includes(" de la ") || relation.includes(" de ")) {
1388
+ return relation.replace(/ (del|de la|de) /, ` $1 ${name} `);
1220
1389
  }
1221
1390
  return `${relation} de ${name}`;
1222
1391
  }
@@ -1246,7 +1415,20 @@ var KinshipTranslatorEs = class extends KinshipTranslatorBasic {
1246
1415
  if (!relation || !this.pathN?.relation) {
1247
1416
  return relation ?? "";
1248
1417
  }
1249
- return `${this.pathN.relation} ${relation}`;
1418
+ const mapped = parentRelationsEs[this.pathN.relation]?.[relation];
1419
+ if (mapped) {
1420
+ return mapped;
1421
+ }
1422
+ if (this.pathN.relation === "step") {
1423
+ return `${relation} pol\xEDtico`;
1424
+ }
1425
+ if (this.pathN.relation === "adopted") {
1426
+ return `${relation} adoptivo`;
1427
+ }
1428
+ if (this.pathN.relation === "foster") {
1429
+ return `${relation} de acogida`;
1430
+ }
1431
+ return relation;
1250
1432
  }
1251
1433
  };
1252
1434
 
@@ -1255,15 +1437,35 @@ var InLawsRu = {
1255
1437
  "\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",
1256
1438
  "\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",
1257
1439
  "\u043C\u0443\u0436 (\u0440\u0435\u0431\u0451\u043D\u043A\u0430|\u0434\u043E\u0447\u0435\u0440\u0438|\u0441\u044B\u043D\u0430)": "\u0437\u044F\u0442\u044C",
1258
- "\u043C\u0430\u0442\u044C (\u0441\u0443\u043F\u0440\u0443\u0433\u0430|\u0436\u0435\u043D\u044B|\u043C\u0443\u0436\u0430)": "\u0442\u0451\u0449\u0430",
1259
- "\u043E\u0442\u0435\u0446 (\u0441\u0443\u043F\u0440\u0443\u0433\u0430|\u0436\u0435\u043D\u044B|\u043C\u0443\u0436\u0430)": "\u0442\u0435\u0441\u0442\u044C",
1260
- "\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",
1440
+ "\u043C\u0430\u0442\u044C \u0436\u0435\u043D\u044B": "\u0442\u0451\u0449\u0430",
1441
+ "\u043C\u0430\u0442\u044C \u043C\u0443\u0436\u0430": "\u0441\u0432\u0435\u043A\u0440\u043E\u0432\u044C",
1442
+ "\u043C\u0430\u0442\u044C \u0441\u0443\u043F\u0440\u0443\u0433\u0430": "\u0442\u0451\u0449\u0430/\u0441\u0432\u0435\u043A\u0440\u043E\u0432\u044C",
1443
+ "\u043E\u0442\u0435\u0446 \u0436\u0435\u043D\u044B": "\u0442\u0435\u0441\u0442\u044C",
1444
+ "\u043E\u0442\u0435\u0446 \u043C\u0443\u0436\u0430": "\u0441\u0432\u0451\u043A\u043E\u0440",
1445
+ "\u043E\u0442\u0435\u0446 \u0441\u0443\u043F\u0440\u0443\u0433\u0430": "\u0442\u0435\u0441\u0442\u044C/\u0441\u0432\u0451\u043A\u043E\u0440",
1446
+ "\u0440\u043E\u0434\u0438\u0442\u0435\u043B\u044C \u0436\u0435\u043D\u044B": "\u0442\u0435\u0441\u0442\u044C/\u0442\u0451\u0449\u0430",
1447
+ "\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",
1448
+ "\u0440\u043E\u0434\u0438\u0442\u0435\u043B\u044C \u0441\u0443\u043F\u0440\u0443\u0433\u0430": "\u0442\u0435\u0441\u0442\u044C/\u0442\u0451\u0449\u0430",
1261
1449
  "\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",
1262
1450
  "\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",
1263
1451
  "\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",
1264
- "(\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",
1265
- "(\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",
1266
- "(\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"
1452
+ "(\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",
1453
+ "(\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",
1454
+ "(\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",
1455
+ "(\u0441\u0432\u043E\u0434\u043D(?:\u044B\u0439|\u0430\u044F) )?\u0431\u0440\u0430\u0442 \u0436\u0435\u043D\u044B": "\u0448\u0443\u0440\u0438\u043D",
1456
+ "(\u0441\u0432\u043E\u0434\u043D(?:\u044B\u0439|\u0430\u044F) )?\u0431\u0440\u0430\u0442 \u043C\u0443\u0436\u0430": "\u0434\u0435\u0432\u0435\u0440\u044C",
1457
+ "(\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",
1458
+ "(\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",
1459
+ "(\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",
1460
+ "(\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"
1461
+ };
1462
+ var parentRelationsRu = {
1463
+ step: {
1464
+ \u043E\u0442\u0435\u0446: "\u043E\u0442\u0447\u0438\u043C",
1465
+ \u043C\u0430\u0442\u044C: "\u043C\u0430\u0447\u0435\u0445\u0430",
1466
+ \u0441\u044B\u043D: "\u043F\u0430\u0441\u044B\u043D\u043E\u043A",
1467
+ \u0434\u043E\u0447\u044C: "\u043F\u0430\u0434\u0447\u0435\u0440\u0438\u0446\u0430"
1468
+ }
1267
1469
  };
1268
1470
 
1269
1471
  // src/kinship-translator/kinship-translator.ru.ts
@@ -1294,7 +1496,7 @@ var cousinWord = (degree, sex) => {
1294
1496
  return `${stem}\u044B\u0439 \u0431\u0440\u0430\u0442/\u0441\u0435\u0441\u0442\u0440\u0430`;
1295
1497
  };
1296
1498
  var praRepeat = (count) => count > 0 ? "\u043F\u0440\u0430".repeat(count) : "";
1297
- var sexOf = (person) => {
1499
+ var sexOf3 = (person) => {
1298
1500
  if (person?.isMale?.()) {
1299
1501
  return "m";
1300
1502
  }
@@ -1309,7 +1511,7 @@ var KinshipTranslatorRu = class extends KinshipTranslatorBasic {
1309
1511
  if (degree > 0) {
1310
1512
  degree = degree - 1;
1311
1513
  }
1312
- return cousinWord(degree, sexOf(this.personN));
1514
+ return cousinWord(degree, sexOf3(this.personN));
1313
1515
  }
1314
1516
  removal() {
1315
1517
  const level = this.pathN?.level ?? 0;
@@ -1321,35 +1523,53 @@ var KinshipTranslatorRu = class extends KinshipTranslatorBasic {
1321
1523
  return level < 0 ? this.nibling() : this.auncle();
1322
1524
  }
1323
1525
  const removed = Math.abs(level);
1324
- return `${cousinWord(degree, sexOf(this.personN))} (${removed}\xD7 \u0447\u0435\u0440\u0435\u0437 \u043F\u043E\u043A\u043E\u043B\u0435\u043D\u0438\u0435)`;
1526
+ return `${cousinWord(degree, sexOf3(this.personN))} (${removed}\xD7 \u0447\u0435\u0440\u0435\u0437 \u043F\u043E\u043A\u043E\u043B\u0435\u043D\u0438\u0435)`;
1325
1527
  }
1326
1528
  auncle() {
1327
1529
  const level = Math.abs(this.pathN?.level ?? 0);
1328
- const pra = praRepeat(Math.max(0, level - 2));
1329
- const sex = sexOf(this.personN);
1530
+ const sex = sexOf3(this.personN);
1531
+ if (level <= 1) {
1532
+ if (sex === "m") {
1533
+ return "\u0434\u044F\u0434\u044F";
1534
+ }
1535
+ if (sex === "f") {
1536
+ return "\u0442\u0451\u0442\u044F";
1537
+ }
1538
+ return "\u0434\u044F\u0434\u044F/\u0442\u0451\u0442\u044F";
1539
+ }
1540
+ const pra = praRepeat(level - 2);
1330
1541
  if (sex === "m") {
1331
- return `${pra}\u0434\u044F\u0434\u044F`;
1542
+ return `\u0434\u0432\u043E\u044E\u0440\u043E\u0434\u043D\u044B\u0439 ${pra}\u0434\u0435\u0434`;
1332
1543
  }
1333
1544
  if (sex === "f") {
1334
- return `${pra}\u0442\u0451\u0442\u044F`;
1545
+ return `\u0434\u0432\u043E\u044E\u0440\u043E\u0434\u043D\u0430\u044F ${pra}\u0431\u0430\u0431\u0443\u0448\u043A\u0430`;
1335
1546
  }
1336
- return `${pra}\u0434\u044F\u0434\u044F/\u0442\u0451\u0442\u044F`;
1547
+ return `\u0434\u0432\u043E\u044E\u0440\u043E\u0434\u043D\u044B\u0439 ${pra}\u0434\u0435\u0434/\u0431\u0430\u0431\u0443\u0448\u043A\u0430`;
1337
1548
  }
1338
1549
  nibling() {
1339
1550
  const level = Math.abs(this.pathN?.level ?? 0);
1340
- const pra = praRepeat(Math.max(0, level - 2));
1341
- const sex = sexOf(this.personN);
1551
+ const sex = sexOf3(this.personN);
1552
+ if (level <= 1) {
1553
+ if (sex === "m") {
1554
+ return "\u043F\u043B\u0435\u043C\u044F\u043D\u043D\u0438\u043A";
1555
+ }
1556
+ if (sex === "f") {
1557
+ return "\u043F\u043B\u0435\u043C\u044F\u043D\u043D\u0438\u0446\u0430";
1558
+ }
1559
+ return "\u043F\u043B\u0435\u043C\u044F\u043D\u043D\u0438\u043A/\u043F\u043B\u0435\u043C\u044F\u043D\u043D\u0438\u0446\u0430";
1560
+ }
1561
+ const pra = praRepeat(level - 2);
1342
1562
  if (sex === "m") {
1343
- return `${pra}\u043F\u043B\u0435\u043C\u044F\u043D\u043D\u0438\u043A`;
1563
+ return `${pra}\u0432\u043D\u0443\u0447\u0430\u0442\u044B\u0439 \u043F\u043B\u0435\u043C\u044F\u043D\u043D\u0438\u043A`;
1344
1564
  }
1345
1565
  if (sex === "f") {
1346
- return `${pra}\u043F\u043B\u0435\u043C\u044F\u043D\u043D\u0438\u0446\u0430`;
1566
+ return `${pra}\u0432\u043D\u0443\u0447\u0430\u0442\u0430\u044F \u043F\u043B\u0435\u043C\u044F\u043D\u043D\u0438\u0446\u0430`;
1347
1567
  }
1348
- return `${pra}\u043F\u043B\u0435\u043C\u044F\u043D\u043D\u0438\u043A/\u043F\u043B\u0435\u043C\u044F\u043D\u043D\u0438\u0446\u0430`;
1568
+ 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`;
1349
1569
  }
1350
1570
  parent() {
1351
1571
  const level = Math.abs(this.pathN?.level ?? 0);
1352
- const sex = sexOf(this.personN);
1572
+ const sex = sexOf3(this.personN);
1353
1573
  if (level <= 1) {
1354
1574
  if (sex === "m") {
1355
1575
  return "\u043E\u0442\u0435\u0446";
@@ -1379,7 +1599,7 @@ var KinshipTranslatorRu = class extends KinshipTranslatorBasic {
1379
1599
  }
1380
1600
  child() {
1381
1601
  const level = Math.abs(this.pathN?.level ?? 0);
1382
- const sex = sexOf(this.personN);
1602
+ const sex = sexOf3(this.personN);
1383
1603
  if (level <= 1) {
1384
1604
  if (sex === "m") {
1385
1605
  return "\u0441\u044B\u043D";
@@ -1408,14 +1628,14 @@ var KinshipTranslatorRu = class extends KinshipTranslatorBasic {
1408
1628
  return `${pra}\u0432\u043D\u0443\u043A/\u0432\u043D\u0443\u0447\u043A\u0430`;
1409
1629
  }
1410
1630
  sibling() {
1411
- const sex = sexOf(this.personN);
1631
+ const sex = sexOf3(this.personN);
1412
1632
  if (sex === "m") {
1413
1633
  return "\u0431\u0440\u0430\u0442";
1414
1634
  }
1415
1635
  if (sex === "f") {
1416
1636
  return "\u0441\u0435\u0441\u0442\u0440\u0430";
1417
1637
  }
1418
- return "\u0441\u0438\u0431\u043B\u0438\u043D\u0433";
1638
+ return "\u0431\u0440\u0430\u0442/\u0441\u0435\u0441\u0442\u0440\u0430";
1419
1639
  }
1420
1640
  halfBlood(relation) {
1421
1641
  if (!relation || !this.isHalfBlood) {
@@ -1429,7 +1649,7 @@ var KinshipTranslatorRu = class extends KinshipTranslatorBasic {
1429
1649
  return `\u0441\u0432\u043E\u0434\u043D\u044B\u0439 ${relation}`;
1430
1650
  }
1431
1651
  spouse() {
1432
- const sex = sexOf(this.personN);
1652
+ const sex = sexOf3(this.personN);
1433
1653
  if (sex === "m") {
1434
1654
  return "\u043C\u0443\u0436";
1435
1655
  }
@@ -1443,7 +1663,7 @@ var KinshipTranslatorRu = class extends KinshipTranslatorBasic {
1443
1663
  return "";
1444
1664
  }
1445
1665
  const spouse = this.path?.[1].indi;
1446
- const sex = sexOf(spouse);
1666
+ const sex = sexOf3(spouse);
1447
1667
  const spouseType = sex === "m" ? "\u043C\u0443\u0436" : sex === "f" ? "\u0436\u0435\u043D\u0430" : "\u0441\u0443\u043F\u0440\u0443\u0433";
1448
1668
  return `${relation} ${toGenitive(spouseType)}`;
1449
1669
  }
@@ -1452,13 +1672,13 @@ var KinshipTranslatorRu = class extends KinshipTranslatorBasic {
1452
1672
  return "";
1453
1673
  }
1454
1674
  const spouse = this.path?.[this.path.length - 1].indi;
1455
- const sex = sexOf(spouse);
1675
+ const sex = sexOf3(spouse);
1456
1676
  const spouseType = sex === "m" ? "\u043C\u0443\u0436" : sex === "f" ? "\u0436\u0435\u043D\u0430" : "\u0441\u0443\u043F\u0440\u0443\u0433";
1457
1677
  return `${spouseType} ${toGenitive(relation)}`;
1458
1678
  }
1459
1679
  of(relation) {
1460
1680
  const formattedName = nameFormatter(this.path?.[0]?.indi, {
1461
- nameOrder: "first-last"
1681
+ nameOrder: this.nameOrder
1462
1682
  });
1463
1683
  let name = formattedName.inOrder.filter(Boolean).join(" ");
1464
1684
  if (this.displayName === "none") {
@@ -1489,7 +1709,22 @@ var KinshipTranslatorRu = class extends KinshipTranslatorBasic {
1489
1709
  if (!relation || !this.pathN?.relation) {
1490
1710
  return relation ?? "";
1491
1711
  }
1492
- return `${this.pathN.relation} ${relation}`;
1712
+ const mapped = parentRelationsRu[this.pathN.relation]?.[relation];
1713
+ if (mapped) {
1714
+ return mapped;
1715
+ }
1716
+ if (this.pathN.relation === "step") {
1717
+ return `\u043D\u0435\u0440\u043E\u0434\u043D\u043E\u0439 ${relation}`;
1718
+ }
1719
+ if (this.pathN.relation === "adopted") {
1720
+ return /сестра|дочь|мать|тётя|бабушка|жена|племянница|внучка/.test(
1721
+ relation
1722
+ ) ? `\u043F\u0440\u0438\u0451\u043C\u043D\u0430\u044F ${relation}` : `\u043F\u0440\u0438\u0451\u043C\u043D\u044B\u0439 ${relation}`;
1723
+ }
1724
+ if (this.pathN.relation === "foster") {
1725
+ return `\u043F\u0440\u0438\u0451\u043C\u043D\u044B\u0439 ${relation}`;
1726
+ }
1727
+ return relation;
1493
1728
  }
1494
1729
  };
1495
1730
 
@@ -1513,7 +1748,7 @@ var InLawsJa = {
1513
1748
  };
1514
1749
 
1515
1750
  // src/kinship-translator/kinship-translator.ja.ts
1516
- var sexOf2 = (person) => {
1751
+ var sexOf4 = (person) => {
1517
1752
  if (person?.isMale?.()) {
1518
1753
  return "m";
1519
1754
  }
@@ -1522,7 +1757,7 @@ var sexOf2 = (person) => {
1522
1757
  }
1523
1758
  return "n";
1524
1759
  };
1525
- var pick = (sex, male, female, neutral) => {
1760
+ var pick3 = (sex, male, female, neutral) => {
1526
1761
  if (sex === "m") {
1527
1762
  return male;
1528
1763
  }
@@ -1535,18 +1770,18 @@ var lineal = (level, sex, kind) => {
1535
1770
  const L = Math.max(1, level);
1536
1771
  if (kind === "asc") {
1537
1772
  if (L <= 1) {
1538
- return pick(sex, "\u7236", "\u6BCD", "\u89AA");
1773
+ return pick3(sex, "\u7236", "\u6BCD", "\u89AA");
1539
1774
  }
1540
1775
  if (L === 2) {
1541
- return pick(sex, "\u7956\u7236", "\u7956\u6BCD", "\u7956\u7236\u6BCD");
1776
+ return pick3(sex, "\u7956\u7236", "\u7956\u6BCD", "\u7956\u7236\u6BCD");
1542
1777
  }
1543
1778
  if (L === 3) {
1544
- return pick(sex, "\u66FE\u7956\u7236", "\u66FE\u7956\u6BCD", "\u66FE\u7956\u7236\u6BCD");
1779
+ return pick3(sex, "\u66FE\u7956\u7236", "\u66FE\u7956\u6BCD", "\u66FE\u7956\u7236\u6BCD");
1545
1780
  }
1546
1781
  if (L === 4) {
1547
- return pick(sex, "\u9AD8\u7956\u7236", "\u9AD8\u7956\u6BCD", "\u9AD8\u7956\u7236\u6BCD");
1782
+ return pick3(sex, "\u9AD8\u7956\u7236", "\u9AD8\u7956\u6BCD", "\u9AD8\u7956\u7236\u6BCD");
1548
1783
  }
1549
- return pick(
1784
+ return pick3(
1550
1785
  sex,
1551
1786
  `${L - 1}\u4E16\u306E\u7956\u7236`,
1552
1787
  `${L - 1}\u4E16\u306E\u7956\u6BCD`,
@@ -1554,7 +1789,7 @@ var lineal = (level, sex, kind) => {
1554
1789
  );
1555
1790
  }
1556
1791
  if (L <= 1) {
1557
- return pick(sex, "\u606F\u5B50", "\u5A18", "\u5B50");
1792
+ return pick3(sex, "\u606F\u5B50", "\u5A18", "\u5B50");
1558
1793
  }
1559
1794
  if (L === 2) {
1560
1795
  return "\u5B6B";
@@ -1601,52 +1836,52 @@ var KinshipTranslatorJa = class extends KinshipTranslatorBasic {
1601
1836
  }
1602
1837
  auncle() {
1603
1838
  const level = Math.abs(this.pathN?.level ?? 0);
1604
- const sex = sexOf2(this.personN);
1605
- if (level <= 2) {
1606
- return pick(sex, "\u304A\u3058", "\u304A\u3070", "\u304A\u3058/\u304A\u3070");
1839
+ const sex = sexOf4(this.personN);
1840
+ if (level <= 1) {
1841
+ return pick3(sex, "\u304A\u3058", "\u304A\u3070", "\u304A\u3058/\u304A\u3070");
1607
1842
  }
1608
- if (level === 3) {
1609
- return pick(sex, "\u5927\u304A\u3058", "\u5927\u304A\u3070", "\u5927\u304A\u3058/\u5927\u304A\u3070");
1843
+ if (level === 2) {
1844
+ return pick3(sex, "\u5927\u304A\u3058", "\u5927\u304A\u3070", "\u5927\u304A\u3058/\u5927\u304A\u3070");
1610
1845
  }
1611
- return pick(
1846
+ return pick3(
1612
1847
  sex,
1613
- `${level - 2}\u4EE3\u524D\u306E\u304A\u3058`,
1614
- `${level - 2}\u4EE3\u524D\u306E\u304A\u3070`,
1615
- `${level - 2}\u4EE3\u524D\u306E\u304A\u3058/\u304A\u3070`
1848
+ `${level - 1}\u4EE3\u524D\u306E\u304A\u3058`,
1849
+ `${level - 1}\u4EE3\u524D\u306E\u304A\u3070`,
1850
+ `${level - 1}\u4EE3\u524D\u306E\u304A\u3058/\u304A\u3070`
1616
1851
  );
1617
1852
  }
1618
1853
  nibling() {
1619
1854
  const level = Math.abs(this.pathN?.level ?? 0);
1620
- const sex = sexOf2(this.personN);
1621
- if (level <= 2) {
1622
- return pick(sex, "\u7525", "\u59EA", "\u7525/\u59EA");
1855
+ const sex = sexOf4(this.personN);
1856
+ if (level <= 1) {
1857
+ return pick3(sex, "\u7525", "\u59EA", "\u7525/\u59EA");
1623
1858
  }
1624
- if (level === 3) {
1625
- return pick(sex, "\u5927\u7525", "\u5927\u59EA", "\u5927\u7525/\u5927\u59EA");
1859
+ if (level === 2) {
1860
+ return pick3(sex, "\u5927\u7525", "\u5927\u59EA", "\u5927\u7525/\u5927\u59EA");
1626
1861
  }
1627
- return pick(
1862
+ return pick3(
1628
1863
  sex,
1629
- `${level - 2}\u4EE3\u4E0B\u306E\u7525`,
1630
- `${level - 2}\u4EE3\u4E0B\u306E\u59EA`,
1631
- `${level - 2}\u4EE3\u4E0B\u306E\u7525/\u59EA`
1864
+ `${level - 1}\u4EE3\u4E0B\u306E\u7525`,
1865
+ `${level - 1}\u4EE3\u4E0B\u306E\u59EA`,
1866
+ `${level - 1}\u4EE3\u4E0B\u306E\u7525/\u59EA`
1632
1867
  );
1633
1868
  }
1634
1869
  parent() {
1635
1870
  return lineal(
1636
1871
  Math.abs(this.pathN?.level ?? 0),
1637
- sexOf2(this.personN),
1872
+ sexOf4(this.personN),
1638
1873
  "asc"
1639
1874
  );
1640
1875
  }
1641
1876
  child() {
1642
1877
  return lineal(
1643
1878
  Math.abs(this.pathN?.level ?? 0),
1644
- sexOf2(this.personN),
1879
+ sexOf4(this.personN),
1645
1880
  "desc"
1646
1881
  );
1647
1882
  }
1648
1883
  sibling() {
1649
- return pick(sexOf2(this.personN), "\u5144\u5F1F", "\u59C9\u59B9", "\u5144\u5F1F\u59C9\u59B9");
1884
+ return pick3(sexOf4(this.personN), "\u5144\u5F1F", "\u59C9\u59B9", "\u5144\u5F1F\u59C9\u59B9");
1650
1885
  }
1651
1886
  halfBlood(relation) {
1652
1887
  if (!relation || !this.isHalfBlood) {
@@ -1655,14 +1890,14 @@ var KinshipTranslatorJa = class extends KinshipTranslatorBasic {
1655
1890
  return `\u7570\u7236\u6BCD\u306E${relation}`;
1656
1891
  }
1657
1892
  spouse() {
1658
- return pick(sexOf2(this.personN), "\u592B", "\u59BB", "\u914D\u5076\u8005");
1893
+ return pick3(sexOf4(this.personN), "\u592B", "\u59BB", "\u914D\u5076\u8005");
1659
1894
  }
1660
1895
  ofSpouse(relation) {
1661
1896
  if (!relation) {
1662
1897
  return "";
1663
1898
  }
1664
- const spouseType = pick(
1665
- sexOf2(this.path?.[1].indi),
1899
+ const spouseType = pick3(
1900
+ sexOf4(this.path?.[1].indi),
1666
1901
  "\u592B",
1667
1902
  "\u59BB",
1668
1903
  "\u914D\u5076\u8005"
@@ -1674,12 +1909,12 @@ var KinshipTranslatorJa = class extends KinshipTranslatorBasic {
1674
1909
  return "";
1675
1910
  }
1676
1911
  const spouse = this.path?.[this.path.length - 1].indi;
1677
- const spouseType = pick(sexOf2(spouse), "\u592B", "\u59BB", "\u914D\u5076\u8005");
1912
+ const spouseType = pick3(sexOf4(spouse), "\u592B", "\u59BB", "\u914D\u5076\u8005");
1678
1913
  return `${relation}\u306E${spouseType}`;
1679
1914
  }
1680
1915
  of(relation) {
1681
1916
  const formattedName = nameFormatter(this.path?.[0]?.indi, {
1682
- nameOrder: "last-first"
1917
+ nameOrder: this.nameOrder
1683
1918
  });
1684
1919
  let name = formattedName.inOrder.filter(Boolean).join(" ");
1685
1920
  if (this.displayName === "none") {
@@ -1710,7 +1945,28 @@ var KinshipTranslatorJa = class extends KinshipTranslatorBasic {
1710
1945
  if (!relation || !this.pathN?.relation) {
1711
1946
  return relation ?? "";
1712
1947
  }
1713
- return `${this.pathN.relation}\u306E${relation}`;
1948
+ if (this.pathN.relation === "step") {
1949
+ if (relation === "\u7236") {
1950
+ return "\u7EE7\u7236";
1951
+ }
1952
+ if (relation === "\u6BCD") {
1953
+ return "\u7D99\u6BCD";
1954
+ }
1955
+ if (relation === "\u606F\u5B50") {
1956
+ return "\u7D99\u5B50";
1957
+ }
1958
+ if (relation === "\u5A18") {
1959
+ return "\u7D99\u5A18";
1960
+ }
1961
+ return `\u7D99${relation}`;
1962
+ }
1963
+ if (this.pathN.relation === "adopted") {
1964
+ return `\u990A\u5B50\u306E${relation}`;
1965
+ }
1966
+ if (this.pathN.relation === "foster") {
1967
+ return `\u91CC\u89AA\u306E${relation}`;
1968
+ }
1969
+ return relation;
1714
1970
  }
1715
1971
  };
1716
1972
 
@@ -1719,22 +1975,32 @@ var InLawsZh = {
1719
1975
  "(\u5B50\u5973|\u5973\u513F|\u513F\u5B50)\u7684\u914D\u5076": "\u513F\u5AB3/\u5973\u5A7F",
1720
1976
  "(\u5B50\u5973|\u5973\u513F|\u513F\u5B50)\u7684\u59BB\u5B50": "\u513F\u5AB3",
1721
1977
  "(\u5B50\u5973|\u5973\u513F|\u513F\u5B50)\u7684\u4E08\u592B": "\u5973\u5A7F",
1722
- "(\u914D\u5076|\u59BB\u5B50|\u4E08\u592B)\u7684\u6BCD\u4EB2": "\u5CB3\u6BCD/\u5A46\u5A46",
1723
- "(\u914D\u5076|\u59BB\u5B50|\u4E08\u592B)\u7684\u7236\u4EB2": "\u5CB3\u7236/\u516C\u516C",
1724
- "(\u914D\u5076|\u59BB\u5B50|\u4E08\u592B)\u7684\u7236\u6BCD": "\u5CB3\u7236\u5CB3\u6BCD/\u516C\u516C\u5A46\u5A46",
1978
+ "\u59BB\u5B50\u7684\u6BCD\u4EB2": "\u5CB3\u6BCD",
1979
+ "\u4E08\u592B\u7684\u6BCD\u4EB2": "\u5A46\u5A46",
1980
+ "(\u914D\u5076)\u7684\u6BCD\u4EB2": "\u5CB3\u6BCD/\u5A46\u5A46",
1981
+ "\u59BB\u5B50\u7684\u7236\u4EB2": "\u5CB3\u7236",
1982
+ "\u4E08\u592B\u7684\u7236\u4EB2": "\u516C\u516C",
1983
+ "(\u914D\u5076)\u7684\u7236\u4EB2": "\u5CB3\u7236/\u516C\u516C",
1984
+ "\u59BB\u5B50\u7684\u7236\u6BCD": "\u5CB3\u7236\u5CB3\u6BCD",
1985
+ "\u4E08\u592B\u7684\u7236\u6BCD": "\u516C\u516C\u5A46\u5A46",
1986
+ "(\u914D\u5076)\u7684\u7236\u6BCD": "\u5CB3\u7236\u5CB3\u6BCD/\u516C\u516C\u5A46\u5A46",
1725
1987
  "(\u5F02\u7236\u6BCD\u7684)?(\u5144\u5F1F\u59D0\u59B9|\u59D0\u59B9|\u5144\u5F1F)\u7684\u59BB\u5B50": "\u5AC2\u5B50/\u5F1F\u59B9",
1726
1988
  "(\u5F02\u7236\u6BCD\u7684)?(\u5144\u5F1F\u59D0\u59B9|\u59D0\u59B9|\u5144\u5F1F)\u7684\u4E08\u592B": "\u59D0\u592B/\u59B9\u592B",
1727
1989
  "(\u5F02\u7236\u6BCD\u7684)?(\u5144\u5F1F\u59D0\u59B9|\u59D0\u59B9|\u5144\u5F1F)\u7684\u914D\u5076": "\u59FB\u4EB2\u5144\u5F1F\u59D0\u59B9",
1728
1990
  "(\u5F02\u7236\u6BCD\u7684)?\u59D0\u59B9\u7684(\u914D\u5076|\u59BB\u5B50|\u4E08\u592B)": "\u59D0\u592B/\u59B9\u592B",
1729
1991
  "(\u5F02\u7236\u6BCD\u7684)?\u5144\u5F1F\u7684(\u914D\u5076|\u59BB\u5B50|\u4E08\u592B)": "\u5AC2\u5B50/\u5F1F\u59B9",
1730
1992
  "(\u5F02\u7236\u6BCD\u7684)?\u5144\u5F1F\u59D0\u59B9\u7684(\u914D\u5076|\u59BB\u5B50|\u4E08\u592B)": "\u59FB\u4EB2\u5144\u5F1F\u59D0\u59B9",
1731
- "(\u5F02\u7236\u6BCD\u7684)?(\u914D\u5076|\u59BB\u5B50|\u4E08\u592B)\u7684\u59D0\u59B9": "\u59D1\u5B50/\u59E8\u5B50",
1732
- "(\u5F02\u7236\u6BCD\u7684)?(\u914D\u5076|\u59BB\u5B50|\u4E08\u592B)\u7684\u5144\u5F1F": "\u5927\u4F2F/\u5C0F\u53D4/\u5185\u5144/\u5185\u5F1F",
1993
+ "(\u5F02\u7236\u6BCD\u7684)?\u59BB\u5B50\u7684\u59D0\u59B9": "\u59E8\u5B50",
1994
+ "(\u5F02\u7236\u6BCD\u7684)?\u4E08\u592B\u7684\u59D0\u59B9": "\u59D1\u5B50",
1995
+ "(\u5F02\u7236\u6BCD\u7684)?(\u914D\u5076)\u7684\u59D0\u59B9": "\u59D1\u5B50/\u59E8\u5B50",
1996
+ "(\u5F02\u7236\u6BCD\u7684)?\u59BB\u5B50\u7684\u5144\u5F1F": "\u5185\u5144/\u5185\u5F1F",
1997
+ "(\u5F02\u7236\u6BCD\u7684)?\u4E08\u592B\u7684\u5144\u5F1F": "\u5927\u4F2F/\u5C0F\u53D4",
1998
+ "(\u5F02\u7236\u6BCD\u7684)?(\u914D\u5076)\u7684\u5144\u5F1F": "\u5927\u4F2F/\u5C0F\u53D4/\u5185\u5144/\u5185\u5F1F",
1733
1999
  "(\u5F02\u7236\u6BCD\u7684)?(\u914D\u5076|\u59BB\u5B50|\u4E08\u592B)\u7684\u5144\u5F1F\u59D0\u59B9": "\u59FB\u4EB2\u5144\u5F1F\u59D0\u59B9"
1734
2000
  };
1735
2001
 
1736
2002
  // src/kinship-translator/kinship-translator.zh.ts
1737
- var sexOf3 = (person) => {
2003
+ var sexOf5 = (person) => {
1738
2004
  if (person?.isMale?.()) {
1739
2005
  return "m";
1740
2006
  }
@@ -1743,7 +2009,7 @@ var sexOf3 = (person) => {
1743
2009
  }
1744
2010
  return "n";
1745
2011
  };
1746
- var pick2 = (sex, male, female, neutral) => {
2012
+ var pick4 = (sex, male, female, neutral) => {
1747
2013
  if (sex === "m") {
1748
2014
  return male;
1749
2015
  }
@@ -1756,41 +2022,41 @@ var lineal2 = (level, sex, kind) => {
1756
2022
  const L = Math.max(1, level);
1757
2023
  if (kind === "asc") {
1758
2024
  if (L <= 1) {
1759
- return pick2(sex, "\u7236\u4EB2", "\u6BCD\u4EB2", "\u7236\u6BCD");
2025
+ return pick4(sex, "\u7236\u4EB2", "\u6BCD\u4EB2", "\u7236\u6BCD");
1760
2026
  }
1761
2027
  if (L === 2) {
1762
- return pick2(sex, "\u7956\u7236", "\u7956\u6BCD", "\u7956\u7236\u6BCD");
2028
+ return pick4(sex, "\u7956\u7236", "\u7956\u6BCD", "\u7956\u7236\u6BCD");
1763
2029
  }
1764
2030
  if (L === 3) {
1765
- return pick2(sex, "\u66FE\u7956\u7236", "\u66FE\u7956\u6BCD", "\u66FE\u7956\u7236\u6BCD");
2031
+ return pick4(sex, "\u66FE\u7956\u7236", "\u66FE\u7956\u6BCD", "\u66FE\u7956\u7236\u6BCD");
1766
2032
  }
1767
2033
  if (L === 4) {
1768
- return pick2(sex, "\u9AD8\u7956\u7236", "\u9AD8\u7956\u6BCD", "\u9AD8\u7956\u7236\u6BCD");
2034
+ return pick4(sex, "\u9AD8\u7956\u7236", "\u9AD8\u7956\u6BCD", "\u9AD8\u7956\u7236\u6BCD");
1769
2035
  }
1770
- return pick2(sex, `${L}\u4E16\u7956`, `${L}\u4E16\u7956\u6BCD`, `${L}\u4E16\u7956\u7236\u6BCD`);
2036
+ return pick4(sex, `${L}\u4E16\u7956`, `${L}\u4E16\u7956\u6BCD`, `${L}\u4E16\u7956\u7236\u6BCD`);
1771
2037
  }
1772
2038
  if (L <= 1) {
1773
- return pick2(sex, "\u513F\u5B50", "\u5973\u513F", "\u5B50\u5973");
2039
+ return pick4(sex, "\u513F\u5B50", "\u5973\u513F", "\u5B50\u5973");
1774
2040
  }
1775
2041
  if (L === 2) {
1776
- return pick2(sex, "\u5B59\u5B50", "\u5B59\u5973", "\u5B59\u5B50\u5973");
2042
+ return pick4(sex, "\u5B59\u5B50", "\u5B59\u5973", "\u5B59\u5B50\u5973");
1777
2043
  }
1778
2044
  if (L === 3) {
1779
- return pick2(sex, "\u66FE\u5B59", "\u66FE\u5B59\u5973", "\u66FE\u5B59\u5B50\u5973");
2045
+ return pick4(sex, "\u66FE\u5B59", "\u66FE\u5B59\u5973", "\u66FE\u5B59\u5B50\u5973");
1780
2046
  }
1781
2047
  if (L === 4) {
1782
- return pick2(sex, "\u7384\u5B59", "\u7384\u5B59\u5973", "\u7384\u5B59\u5B50\u5973");
2048
+ return pick4(sex, "\u7384\u5B59", "\u7384\u5B59\u5973", "\u7384\u5B59\u5B50\u5973");
1783
2049
  }
1784
- return pick2(sex, `${L}\u4E16\u5B59`, `${L}\u4E16\u5B59\u5973`, `${L}\u4E16\u5B59\u5B50\u5973`);
2050
+ return pick4(sex, `${L}\u4E16\u5B59`, `${L}\u4E16\u5B59\u5973`, `${L}\u4E16\u5B59\u5B50\u5973`);
1785
2051
  };
1786
2052
  var cousinPlain2 = (degree, sex) => {
1787
2053
  if (degree <= 1) {
1788
- return pick2(sex, "\u5802\u8868\u5144\u5F1F", "\u5802\u8868\u59D0\u59B9", "\u5802\u8868\u4EB2");
2054
+ return pick4(sex, "\u5802\u8868\u5144\u5F1F", "\u5802\u8868\u59D0\u59B9", "\u5802\u8868\u4EB2");
1789
2055
  }
1790
2056
  if (degree === 2) {
1791
- return pick2(sex, "\u4ECE\u5802\u8868\u5144\u5F1F", "\u4ECE\u5802\u8868\u59D0\u59B9", "\u4ECE\u5802\u8868\u4EB2");
2057
+ return pick4(sex, "\u4ECE\u5802\u8868\u5144\u5F1F", "\u4ECE\u5802\u8868\u59D0\u59B9", "\u4ECE\u5802\u8868\u4EB2");
1792
2058
  }
1793
- return pick2(
2059
+ return pick4(
1794
2060
  sex,
1795
2061
  `${degree}\u4EE3\u5802\u8868\u5144\u5F1F`,
1796
2062
  `${degree}\u4EE3\u5802\u8868\u59D0\u59B9`,
@@ -1803,7 +2069,7 @@ var KinshipTranslatorZh = class extends KinshipTranslatorBasic {
1803
2069
  if (degree > 0) {
1804
2070
  degree = degree - 1;
1805
2071
  }
1806
- return cousinPlain2(degree, sexOf3(this.personN));
2072
+ return cousinPlain2(degree, sexOf5(this.personN));
1807
2073
  }
1808
2074
  removal() {
1809
2075
  const level = this.pathN?.level ?? 0;
@@ -1815,56 +2081,56 @@ var KinshipTranslatorZh = class extends KinshipTranslatorBasic {
1815
2081
  return level < 0 ? this.nibling() : this.auncle();
1816
2082
  }
1817
2083
  const removed = Math.abs(level);
1818
- return `${cousinPlain2(degree, sexOf3(this.personN))}\uFF08\u9694${removed}\u4EE3\uFF09`;
2084
+ return `${cousinPlain2(degree, sexOf5(this.personN))}\uFF08\u9694${removed}\u4EE3\uFF09`;
1819
2085
  }
1820
2086
  auncle() {
1821
2087
  const level = Math.abs(this.pathN?.level ?? 0);
1822
- const sex = sexOf3(this.personN);
1823
- if (level <= 2) {
1824
- return pick2(sex, "\u53D4\u53D4", "\u963F\u59E8", "\u53D4\u4F2F/\u59D1\u59E8");
2088
+ const sex = sexOf5(this.personN);
2089
+ if (level <= 1) {
2090
+ return pick4(sex, "\u53D4\u53D4", "\u963F\u59E8", "\u53D4\u4F2F/\u59D1\u59E8");
1825
2091
  }
1826
- if (level === 3) {
1827
- return pick2(sex, "\u4F2F\u53D4\u7956\u7236", "\u59D1\u7956\u6BCD", "\u4F2F\u53D4\u7956\u7236\u6BCD");
2092
+ if (level === 2) {
2093
+ return pick4(sex, "\u4F2F\u53D4\u7956\u7236", "\u59D1\u7956\u6BCD", "\u4F2F\u53D4\u7956\u7236\u6BCD");
1828
2094
  }
1829
- return pick2(
2095
+ return pick4(
1830
2096
  sex,
1831
- `${level - 2}\u4EE3\u524D\u7684\u53D4\u53D4`,
1832
- `${level - 2}\u4EE3\u524D\u7684\u963F\u59E8`,
1833
- `${level - 2}\u4EE3\u524D\u7684\u53D4\u4F2F/\u59D1\u59E8`
2097
+ `${level - 1}\u4EE3\u524D\u7684\u53D4\u53D4`,
2098
+ `${level - 1}\u4EE3\u524D\u7684\u963F\u59E8`,
2099
+ `${level - 1}\u4EE3\u524D\u7684\u53D4\u4F2F/\u59D1\u59E8`
1834
2100
  );
1835
2101
  }
1836
2102
  nibling() {
1837
2103
  const level = Math.abs(this.pathN?.level ?? 0);
1838
- const sex = sexOf3(this.personN);
1839
- if (level <= 2) {
1840
- return pick2(sex, "\u4F84\u5B50", "\u4F84\u5973", "\u4F84\u5B50\u5973");
2104
+ const sex = sexOf5(this.personN);
2105
+ if (level <= 1) {
2106
+ return pick4(sex, "\u4F84\u5B50", "\u4F84\u5973", "\u4F84\u5B50\u5973");
1841
2107
  }
1842
- if (level === 3) {
1843
- return pick2(sex, "\u4F84\u5B59", "\u4F84\u5B59\u5973", "\u4F84\u5B59\u5B50\u5973");
2108
+ if (level === 2) {
2109
+ return pick4(sex, "\u4F84\u5B59", "\u4F84\u5B59\u5973", "\u4F84\u5B59\u5B50\u5973");
1844
2110
  }
1845
- return pick2(
2111
+ return pick4(
1846
2112
  sex,
1847
- `${level - 2}\u4EE3\u4E0B\u7684\u4F84\u5B50`,
1848
- `${level - 2}\u4EE3\u4E0B\u7684\u4F84\u5973`,
1849
- `${level - 2}\u4EE3\u4E0B\u7684\u4F84\u5B50\u5973`
2113
+ `${level - 1}\u4EE3\u4E0B\u7684\u4F84\u5B50`,
2114
+ `${level - 1}\u4EE3\u4E0B\u7684\u4F84\u5973`,
2115
+ `${level - 1}\u4EE3\u4E0B\u7684\u4F84\u5B50\u5973`
1850
2116
  );
1851
2117
  }
1852
2118
  parent() {
1853
2119
  return lineal2(
1854
2120
  Math.abs(this.pathN?.level ?? 0),
1855
- sexOf3(this.personN),
2121
+ sexOf5(this.personN),
1856
2122
  "asc"
1857
2123
  );
1858
2124
  }
1859
2125
  child() {
1860
2126
  return lineal2(
1861
2127
  Math.abs(this.pathN?.level ?? 0),
1862
- sexOf3(this.personN),
2128
+ sexOf5(this.personN),
1863
2129
  "desc"
1864
2130
  );
1865
2131
  }
1866
2132
  sibling() {
1867
- return pick2(sexOf3(this.personN), "\u5144\u5F1F", "\u59D0\u59B9", "\u5144\u5F1F\u59D0\u59B9");
2133
+ return pick4(sexOf5(this.personN), "\u5144\u5F1F", "\u59D0\u59B9", "\u5144\u5F1F\u59D0\u59B9");
1868
2134
  }
1869
2135
  halfBlood(relation) {
1870
2136
  if (!relation || !this.isHalfBlood) {
@@ -1873,14 +2139,14 @@ var KinshipTranslatorZh = class extends KinshipTranslatorBasic {
1873
2139
  return `\u5F02\u7236\u6BCD\u7684${relation}`;
1874
2140
  }
1875
2141
  spouse() {
1876
- return pick2(sexOf3(this.personN), "\u4E08\u592B", "\u59BB\u5B50", "\u914D\u5076");
2142
+ return pick4(sexOf5(this.personN), "\u4E08\u592B", "\u59BB\u5B50", "\u914D\u5076");
1877
2143
  }
1878
2144
  ofSpouse(relation) {
1879
2145
  if (!relation) {
1880
2146
  return "";
1881
2147
  }
1882
- const spouseType = pick2(
1883
- sexOf3(this.path?.[1].indi),
2148
+ const spouseType = pick4(
2149
+ sexOf5(this.path?.[1].indi),
1884
2150
  "\u4E08\u592B",
1885
2151
  "\u59BB\u5B50",
1886
2152
  "\u914D\u5076"
@@ -1892,12 +2158,12 @@ var KinshipTranslatorZh = class extends KinshipTranslatorBasic {
1892
2158
  return "";
1893
2159
  }
1894
2160
  const spouse = this.path?.[this.path.length - 1].indi;
1895
- const spouseType = pick2(sexOf3(spouse), "\u4E08\u592B", "\u59BB\u5B50", "\u914D\u5076");
2161
+ const spouseType = pick4(sexOf5(spouse), "\u4E08\u592B", "\u59BB\u5B50", "\u914D\u5076");
1896
2162
  return `${relation}\u7684${spouseType}`;
1897
2163
  }
1898
2164
  of(relation) {
1899
2165
  const formattedName = nameFormatter(this.path?.[0]?.indi, {
1900
- nameOrder: "last-first"
2166
+ nameOrder: this.nameOrder
1901
2167
  });
1902
2168
  let name = formattedName.inOrder.filter(Boolean).join(" ");
1903
2169
  if (this.displayName === "none") {
@@ -1928,27 +2194,68 @@ var KinshipTranslatorZh = class extends KinshipTranslatorBasic {
1928
2194
  if (!relation || !this.pathN?.relation) {
1929
2195
  return relation ?? "";
1930
2196
  }
1931
- return `${this.pathN.relation}${relation}`;
2197
+ if (this.pathN.relation === "step") {
2198
+ if (relation === "\u7236\u4EB2") {
2199
+ return "\u7EE7\u7236";
2200
+ }
2201
+ if (relation === "\u6BCD\u4EB2") {
2202
+ return "\u7EE7\u6BCD";
2203
+ }
2204
+ if (relation === "\u513F\u5B50") {
2205
+ return "\u7EE7\u5B50";
2206
+ }
2207
+ if (relation === "\u5973\u513F") {
2208
+ return "\u7EE7\u5973";
2209
+ }
2210
+ return `\u7EE7${relation}`;
2211
+ }
2212
+ if (this.pathN.relation === "adopted") {
2213
+ if (relation === "\u7236\u4EB2") {
2214
+ return "\u517B\u7236";
2215
+ }
2216
+ if (relation === "\u6BCD\u4EB2") {
2217
+ return "\u517B\u6BCD";
2218
+ }
2219
+ if (relation === "\u513F\u5B50") {
2220
+ return "\u517B\u5B50";
2221
+ }
2222
+ if (relation === "\u5973\u513F") {
2223
+ return "\u517B\u5973";
2224
+ }
2225
+ return `\u517B${relation}`;
2226
+ }
2227
+ if (this.pathN.relation === "foster") {
2228
+ return `\u5BC4\u517B${relation}`;
2229
+ }
2230
+ return relation;
1932
2231
  }
1933
2232
  };
1934
2233
 
1935
2234
  // src/kinship-translator/kinship-translator.ts
2235
+ var nameOrderForLang = (lang) => lang === "hu" || lang === "ja" || lang === "zh" ? "last-first" : "first-last";
1936
2236
  var KinshipTranslator = class {
1937
- constructor(person1, person2, lang = "en", entirePath, displayName = "givenname") {
2237
+ constructor(person1, person2, lang = "en", entirePath, displayName = "givenname", nameOrder) {
1938
2238
  this.displayName = displayName;
1939
2239
  this.lang = lang;
1940
2240
  this.entirePath = entirePath;
1941
2241
  this.person1 = person1;
1942
2242
  this.person2 = typeof person2 === "string" ? this.person1.getGedcom()?.indi(person2) : person2;
1943
2243
  this.path = this.person1.path(this.person2);
2244
+ const order = nameOrder ?? nameOrderForLang(lang);
2245
+ this.nameOrder = order;
1944
2246
  if (translators_exports[lang]) {
1945
2247
  this.translator = new translators_exports[lang](
1946
2248
  this.path ?? [],
1947
- displayName
2249
+ displayName,
2250
+ order
1948
2251
  );
1949
2252
  }
1950
2253
  if (!this.translator) {
1951
- this.translator = new KinshipTranslatorEn(this.path ?? [], displayName);
2254
+ this.translator = new KinshipTranslatorEn(
2255
+ this.path ?? [],
2256
+ displayName,
2257
+ order
2258
+ );
1952
2259
  }
1953
2260
  }
1954
2261
  get path0() {
@@ -1993,14 +2300,16 @@ var KinshipTranslator = class {
1993
2300
  showMainPerson,
1994
2301
  this.lang,
1995
2302
  false,
1996
- this.displayName
2303
+ this.displayName,
2304
+ this.nameOrder
1997
2305
  ),
1998
2306
  relative: this.path?.[index - 1]?.indi.kinship(
1999
2307
  path2.indi.id,
2000
2308
  showMainPerson,
2001
2309
  this.lang,
2002
2310
  false,
2003
- this.displayName
2311
+ this.displayName,
2312
+ this.nameOrder
2004
2313
  )
2005
2314
  }));
2006
2315
  return path;
@@ -7022,14 +7331,15 @@ var Indi = class extends Common {
7022
7331
  }
7023
7332
  return foundPath;
7024
7333
  }
7025
- kinship(other, showMainPerson, lang = "en", entirePath, displayName = "givenname") {
7334
+ kinship(other, showMainPerson, lang = "en", entirePath, displayName = "givenname", nameOrder) {
7026
7335
  const KinshipTranslatorClass2 = getKinshipTranslatorClass();
7027
7336
  const translator = new KinshipTranslatorClass2(
7028
7337
  this,
7029
7338
  other,
7030
7339
  lang,
7031
7340
  entirePath,
7032
- showMainPerson ? displayName : void 0
7341
+ showMainPerson ? displayName : void 0,
7342
+ nameOrder
7033
7343
  );
7034
7344
  return translator.translate(!!showMainPerson);
7035
7345
  }
@@ -7856,45 +8166,64 @@ var nameFormatter = (indiName, settings, letterOnAll = true, indi, debug) => {
7856
8166
  };
7857
8167
 
7858
8168
  // src/kinship-translator/patterns.de.ts
8169
+ var parentRelationsDe = {
8170
+ step: "Stief",
8171
+ foster: "Pflege",
8172
+ adopted: "Adoptiv"
8173
+ };
7859
8174
  var InLawsDe = {
7860
- "Ehepartner von (kind|tochter|sohn)": "Schwiegerkind",
7861
- "Ehefrau von (kind|tochter|sohn)": "Schwiegertochter",
7862
- "Ehemann von (kind|tochter|sohn)": "Schwiegersohn",
7863
- "mutter des (Ehepartner|Ehefrau|Ehemann)s": "Schwiegermutter",
7864
- "vater des (Ehepartner|Ehefrau|Ehemann)s": "Schwiegervater",
7865
- "elternteil des (Ehepartner|Ehefrau|Ehemann)s": "Schwiegerelternteil",
7866
- "Ehefrau von (Halb)?(geschwister|schwester|bruder)": "Schw\xE4gerin",
7867
- "Ehemann von (Halb)?(geschwister|schwester|bruder)": "Schwager",
7868
- "Ehepartner von (Halb)?(geschwister|schwester|bruder)": "Schwager/Schw\xE4gerin",
7869
- "(Halb)?schwester des (Ehepartner|Ehefrau|Ehemann)s": "Schw\xE4gerin",
7870
- "(Halb)?bruder des (Ehepartner|Ehefrau|Ehemann)s": "Schwager",
7871
- "(Halb)?geschwister des (Ehepartner|Ehefrau|Ehemann)s": "Schwager/Schw\xE4gerin"
8175
+ "Ehepartner von (Kind|Tochter|Sohn)": "Schwiegerkind",
8176
+ "Ehefrau von (Kind|Tochter|Sohn)": "Schwiegertochter",
8177
+ "Ehemann von (Kind|Tochter|Sohn)": "Schwiegersohn",
8178
+ "Mutter (des Ehepartners|des Ehemanns|der Ehefrau)": "Schwiegermutter",
8179
+ "Vater (des Ehepartners|des Ehemanns|der Ehefrau)": "Schwiegervater",
8180
+ "Elternteil (des Ehepartners|des Ehemanns|der Ehefrau)": "Schwiegerelternteil",
8181
+ "Ehefrau von (Halb)?-?(Geschwister|Schwester|Bruder)": "Schw\xE4gerin",
8182
+ "Ehemann von (Halb)?-?(Geschwister|Schwester|Bruder)": "Schwager",
8183
+ "Ehepartner von (Halb)?-?(Geschwister|Schwester|Bruder)": "Schwager/Schw\xE4gerin",
8184
+ "(Halb)?-?(Schwester|schwester) (des Ehepartners|des Ehemanns|der Ehefrau)": "Schw\xE4gerin",
8185
+ "(Halb)?-?(Bruder|bruder) (des Ehepartners|des Ehemanns|der Ehefrau)": "Schwager",
8186
+ "(Halb)?-?(Geschwister|geschwister) (des Ehepartners|des Ehemanns|der Ehefrau)": "Schwager/Schw\xE4gerin"
7872
8187
  };
7873
8188
 
7874
8189
  // src/kinship-translator/kinship-translator.de.ts
7875
- var KinshipTranslatorDe = class extends KinshipTranslatorBasic {
7876
- directPrefix() {
7877
- const level = Math.abs(this.pathN?.level ?? 0);
7878
- if (level <= 1) {
7879
- return "";
7880
- }
7881
- if (level === 2) {
7882
- return "Gro\xDF";
7883
- }
7884
- if (level === 3) {
7885
- return "Urgro\xDF";
7886
- }
7887
- return `Ur${level - 2}-gro\xDF`;
8190
+ var sexOf6 = (person) => {
8191
+ if (person?.isMale?.()) {
8192
+ return "m";
8193
+ }
8194
+ if (person?.isFemale?.()) {
8195
+ return "f";
7888
8196
  }
8197
+ return "n";
8198
+ };
8199
+ var pick5 = (sex, male, female, neutral) => {
8200
+ if (sex === "m") {
8201
+ return male;
8202
+ }
8203
+ if (sex === "f") {
8204
+ return female;
8205
+ }
8206
+ return neutral;
8207
+ };
8208
+ var ur = (count) => count > 0 ? "Ur".repeat(count) : "";
8209
+ var genitiveArticle = (spouseType) => {
8210
+ if (spouseType === "Ehefrau") {
8211
+ return `der ${spouseType}`;
8212
+ }
8213
+ return `des ${spouseType}s`;
8214
+ };
8215
+ var KinshipTranslatorDe = class extends KinshipTranslatorBasic {
7889
8216
  indirect() {
7890
8217
  let degree = Math.abs(this.pathN?.degree ?? 0);
7891
8218
  if (degree > 0) {
7892
8219
  degree = degree - 1;
7893
8220
  }
7894
- if (degree === 1) {
7895
- return `Cousin`;
8221
+ const sex = sexOf6(this.personN);
8222
+ const cousin = pick5(sex, "Cousin", "Cousine", "Cousin/Cousine");
8223
+ if (degree <= 1) {
8224
+ return cousin;
7896
8225
  }
7897
- return `Cousin ${degree}. Grades`;
8226
+ return `${cousin} ${degree}. Grades`;
7898
8227
  }
7899
8228
  removal() {
7900
8229
  const level = this.pathN?.level ?? 0;
@@ -7905,106 +8234,106 @@ var KinshipTranslatorDe = class extends KinshipTranslatorBasic {
7905
8234
  if (!degree) {
7906
8235
  return level < 0 ? this.nibling() : this.auncle();
7907
8236
  }
7908
- return `Cousin ${degree}. Grades ${Math.abs(level)}\xD7 entfernt`;
8237
+ return `${this.indirect()} ${Math.abs(level)}\xD7 entfernt`;
7909
8238
  }
7910
8239
  auncle() {
7911
- const prefix = this.directPrefix();
7912
- if (this.personN?.isMale()) {
7913
- return `${prefix}onkel`;
7914
- }
7915
- if (this.personN?.isFemale()) {
7916
- return `${prefix}tante`;
8240
+ const level = Math.abs(this.pathN?.level ?? 0);
8241
+ const sex = sexOf6(this.personN);
8242
+ if (level <= 1) {
8243
+ return pick5(sex, "Onkel", "Tante", "Onkel/Tante");
7917
8244
  }
7918
- return `${prefix}onkel/tante`;
8245
+ const prefix = `${ur(level - 2)}Gro\xDF`;
8246
+ return pick5(
8247
+ sex,
8248
+ `${prefix}onkel`,
8249
+ `${prefix}tante`,
8250
+ `${prefix}onkel/tante`
8251
+ );
7919
8252
  }
7920
8253
  nibling() {
7921
- const prefix = this.directPrefix();
7922
- if (this.personN?.isMale()) {
7923
- return `${prefix}neffe`;
7924
- }
7925
- if (this.personN?.isFemale()) {
7926
- return `${prefix}nichte`;
8254
+ const level = Math.abs(this.pathN?.level ?? 0);
8255
+ const sex = sexOf6(this.personN);
8256
+ if (level <= 1) {
8257
+ return pick5(sex, "Neffe", "Nichte", "Neffe/Nichte");
7927
8258
  }
7928
- return `${prefix}neffe/nichte`;
8259
+ const prefix = `${ur(level - 2)}Gro\xDF`;
8260
+ return pick5(
8261
+ sex,
8262
+ `${prefix}neffe`,
8263
+ `${prefix}nichte`,
8264
+ `${prefix}neffe/nichte`
8265
+ );
7929
8266
  }
7930
8267
  parent() {
7931
- const prefix = this.directPrefix();
7932
- if (this.personN?.isMale()) {
7933
- return `${prefix}vater`;
7934
- }
7935
- if (this.personN?.isFemale()) {
7936
- return `${prefix}mutter`;
8268
+ const level = Math.abs(this.pathN?.level ?? 0);
8269
+ const sex = sexOf6(this.personN);
8270
+ if (level <= 1) {
8271
+ return pick5(sex, "Vater", "Mutter", "Elternteil");
7937
8272
  }
7938
- return `${prefix}elternteil`;
8273
+ const prefix = `${ur(level - 2)}Gro\xDF`;
8274
+ return pick5(
8275
+ sex,
8276
+ `${prefix}vater`,
8277
+ `${prefix}mutter`,
8278
+ `${prefix}elternteil`
8279
+ );
7939
8280
  }
7940
8281
  child() {
7941
- const prefix = this.directPrefix();
7942
- if (this.personN?.isMale()) {
7943
- return `${prefix}sohn`;
7944
- }
7945
- if (this.personN?.isFemale()) {
7946
- return `${prefix}tochter`;
8282
+ const level = Math.abs(this.pathN?.level ?? 0);
8283
+ const sex = sexOf6(this.personN);
8284
+ if (level <= 1) {
8285
+ return pick5(sex, "Sohn", "Tochter", "Kind");
7947
8286
  }
7948
- return `${prefix}kind`;
8287
+ const prefix = ur(level - 2);
8288
+ return pick5(
8289
+ sex,
8290
+ `${prefix}Enkel`,
8291
+ `${prefix}Enkelin`,
8292
+ `${prefix}Enkelkind`
8293
+ );
7949
8294
  }
7950
8295
  sibling() {
7951
- if (this.personN?.isMale()) {
7952
- return "bruder";
7953
- }
7954
- if (this.personN?.isFemale()) {
7955
- return "schwester";
7956
- }
7957
- return "geschwister";
8296
+ return pick5(sexOf6(this.personN), "Bruder", "Schwester", "Geschwister");
7958
8297
  }
7959
8298
  halfBlood(relation) {
7960
8299
  if (!relation || !this.isHalfBlood) {
7961
8300
  return relation ?? "";
7962
8301
  }
7963
- if (/^[A-ZÄÖÜ]/.test(relation) || /[-\s]/.test(relation)) {
8302
+ if (/[\s-]/.test(relation) || /^(Groß|Ur)/.test(relation)) {
7964
8303
  return `Halb-${relation}`;
7965
8304
  }
7966
- return `Halb${relation}`;
8305
+ return `Halb${relation.charAt(0).toLowerCase()}${relation.slice(1)}`;
7967
8306
  }
7968
8307
  spouse() {
7969
- if (this.personN?.isMale()) {
7970
- return "Ehemann";
7971
- }
7972
- if (this.personN?.isFemale()) {
7973
- return "Ehefrau";
7974
- }
7975
- return "Ehepartner";
8308
+ return pick5(sexOf6(this.personN), "Ehemann", "Ehefrau", "Ehepartner");
7976
8309
  }
7977
8310
  ofSpouse(relation) {
7978
8311
  if (!relation) {
7979
8312
  return "";
7980
8313
  }
7981
- const spouse = this.path?.[1].indi;
7982
- let spouseType = "Ehepartner";
7983
- if (spouse?.isMale()) {
7984
- spouseType = "Ehemann";
7985
- }
7986
- if (spouse?.isFemale()) {
7987
- spouseType = "Ehefrau";
7988
- }
7989
- return `${relation} des ${spouseType}s`;
8314
+ const spouseType = pick5(
8315
+ sexOf6(this.path?.[1].indi),
8316
+ "Ehemann",
8317
+ "Ehefrau",
8318
+ "Ehepartner"
8319
+ );
8320
+ return `${relation} ${genitiveArticle(spouseType)}`;
7990
8321
  }
7991
8322
  spouseOf(relation) {
7992
8323
  if (!relation) {
7993
8324
  return "";
7994
8325
  }
7995
- const spouse = this.path?.[this.path.length - 1].indi;
7996
- let spouseType = "Ehepartner";
7997
- if (spouse?.isMale()) {
7998
- spouseType = "Ehemann";
7999
- }
8000
- if (spouse?.isFemale()) {
8001
- spouseType = "Ehefrau";
8002
- }
8326
+ const spouseType = pick5(
8327
+ sexOf6(this.path?.[this.path.length - 1].indi),
8328
+ "Ehemann",
8329
+ "Ehefrau",
8330
+ "Ehepartner"
8331
+ );
8003
8332
  return `${spouseType} von ${relation}`;
8004
8333
  }
8005
8334
  of(relation) {
8006
8335
  const formattedName = nameFormatter(this.path?.[0]?.indi, {
8007
- nameOrder: "first-last"
8336
+ nameOrder: this.nameOrder
8008
8337
  });
8009
8338
  let name = formattedName.inOrder.filter(Boolean).join(" ");
8010
8339
  if (this.displayName === "none") {
@@ -8017,8 +8346,8 @@ var KinshipTranslatorDe = class extends KinshipTranslatorBasic {
8017
8346
  if (!name || !relation) {
8018
8347
  return relation ?? "";
8019
8348
  }
8020
- if (relation.includes(" des ") || relation.includes(" von ")) {
8021
- return relation.replace(/ (des|von) /, ` $1 ${name}s `);
8349
+ if (relation.includes(" des ") || relation.includes(" der ") || relation.includes(" von ")) {
8350
+ return relation.replace(/ (des|der|von) /, ` $1 ${name}s `);
8022
8351
  }
8023
8352
  return `${name}s ${relation}`;
8024
8353
  }
@@ -8048,7 +8377,14 @@ var KinshipTranslatorDe = class extends KinshipTranslatorBasic {
8048
8377
  if (!relation || !this.pathN?.relation) {
8049
8378
  return relation ?? "";
8050
8379
  }
8051
- return `${this.pathN.relation} ${relation}`;
8380
+ const prefix = parentRelationsDe[this.pathN.relation];
8381
+ if (!prefix) {
8382
+ return relation;
8383
+ }
8384
+ if (prefix.endsWith("-") || prefix.endsWith(" ")) {
8385
+ return `${prefix}${relation}`;
8386
+ }
8387
+ return `${prefix}${relation.charAt(0).toLowerCase()}${relation.slice(1)}`;
8052
8388
  }
8053
8389
  };
8054
8390