diff --git a/src/app/[lang]/marriage-advisors/page.tsx b/src/app/[lang]/marriage-advisors/page.tsx
new file mode 100644
index 0000000..a81d1e3
--- /dev/null
+++ b/src/app/[lang]/marriage-advisors/page.tsx
@@ -0,0 +1 @@
+export { default } from "@/app/marriage-advisors/page";
diff --git a/src/app/candidate-contact/page.tsx b/src/app/candidate-contact/page.tsx
index aefa130..48ba63d 100644
--- a/src/app/candidate-contact/page.tsx
+++ b/src/app/candidate-contact/page.tsx
@@ -119,7 +119,9 @@ export default function CandidateContactPage() {
@@ -133,7 +135,11 @@ export default function CandidateContactPage() {
{t["Congratulations! 🎉"]}
- {t["Wishing you a lifetime of love, joy, and happiness. Your profile has been successfully closed."]}
+ {
+ t[
+ "Wishing you a lifetime of love, joy, and happiness. Your profile has been successfully closed."
+ ]
+ }
) : (
@@ -151,7 +157,11 @@ export default function CandidateContactPage() {
{/* Title / Status message */}
- {t["The selected candidate will contact your family shortly."]}
+ {
+ t[
+ "The selected candidate will contact your family shortly."
+ ]
+ }
{caseStatus === "contacted" ? (
@@ -159,7 +169,11 @@ export default function CandidateContactPage() {
{/* Outcome instructions and button */}
- {t["Thank you for giving us feedback, we would be very happy if you also let us know the final result."]}
+ {
+ t[
+ "Thank you for giving us feedback, we would be very happy if you also let us know the final result."
+ ]
+ }
@@ -230,7 +244,11 @@ export default function CandidateContactPage() {
{/* Red warning box */}
- {t["To keep the process moving smoothly, the other party has a 48-hour (2-day) window to make initial contact with you or your family. If no contact is established after 2 days, you have the option to decline his request or notify us that he hasn't reached out."]}
+ {
+ t[
+ "To keep the process moving smoothly, the other party has a 48-hour (2-day) window to make initial contact with you or your family. If no contact is established after 2 days, you have the option to decline his request or notify us that he hasn't reached out."
+ ]
+ }
>
@@ -243,11 +261,15 @@ export default function CandidateContactPage() {
{/* Advisor section */}
{/* Profile Locked banner */}
diff --git a/src/app/finding-match/page.tsx b/src/app/finding-match/page.tsx
index ab1f991..7e7b1f0 100644
--- a/src/app/finding-match/page.tsx
+++ b/src/app/finding-match/page.tsx
@@ -153,7 +153,7 @@ export default function FindingMatchPage() {
avatars={advisorAvatars}
extraCount={7}
getAdvisorLabel={copy.getAdvisor}
- getAdvisorHref="/questions-list"
+ getAdvisorHref="/marriage-advisors"
/>
diff --git a/src/app/globals.css b/src/app/globals.css
index 3333b20..e5c92f1 100644
--- a/src/app/globals.css
+++ b/src/app/globals.css
@@ -288,31 +288,40 @@ body[data-page-background="custom"] .app-shell {
/* ─── Premium Shimmer Animations ─── */
@keyframes shimmer {
0% {
- background-position: 200% 0;
+ background-position: -200% 0;
}
100% {
- background-position: -200% 0;
+ background-position: 200% 0;
}
}
.shimmer-bg {
- background-color: rgba(0, 0, 0, 0.05);
- background-image: linear-gradient(
+ background: linear-gradient(
90deg,
- rgba(255, 255, 255, 0) 0%,
- rgba(255, 255, 255, 0.4) 50%,
- rgba(255, 255, 255, 0) 100%
+ rgba(0, 0, 0, 0.05) 25%,
+ rgba(0, 0, 0, 0.1) 37%,
+ rgba(0, 0, 0, 0.05) 63%
);
background-size: 200% 100%;
- background-repeat: no-repeat;
animation: shimmer 1.5s infinite linear;
}
.dark .shimmer-bg {
- background-color: rgba(255, 255, 255, 0.04);
- background-image: linear-gradient(
+ background: linear-gradient(
+ 90deg,
+ rgba(255, 255, 255, 0.04) 25%,
+ rgba(255, 255, 255, 0.09) 37%,
+ rgba(255, 255, 255, 0.04) 63%
+ );
+ background-size: 200% 100%;
+}
+
+.shimmer-white-bg {
+ background: linear-gradient(
90deg,
- rgba(255, 255, 255, 0) 0%,
- rgba(255, 255, 255, 0.06) 50%,
- rgba(255, 255, 255, 0) 100%
+ rgba(255, 255, 255, 0.12) 25%,
+ rgba(255, 255, 255, 0.24) 37%,
+ rgba(255, 255, 255, 0.12) 63%
);
background-size: 200% 100%;
+ animation: shimmer 1.5s infinite linear;
}
+
diff --git a/src/app/intro/page.tsx b/src/app/intro/page.tsx
index a7357ca..6a42bac 100644
--- a/src/app/intro/page.tsx
+++ b/src/app/intro/page.tsx
@@ -167,7 +167,11 @@ export default function Intro() {
{t["A Path to Heavenly Marriage"]}
- {t["We have come together with the goal of creating a secure and confidential path for \"permanent marriage\" among Muslims"]}
+ {
+ t[
+ 'We have come together with the goal of creating a secure and confidential path for "permanent marriage" among Muslims'
+ ]
+ }
@@ -180,7 +184,7 @@ export default function Intro() {
/>
120
-
+
{t["user profiles"]}
@@ -191,10 +195,11 @@ export default function Intro() {
alt={t["matches"]}
width={37}
height={37}
+ priority
/>
@@ -205,10 +210,11 @@ export default function Intro() {
alt={t["marriages"]}
width={37}
height={37}
+ priority
/>
diff --git a/src/app/marriage-advisors/page.tsx b/src/app/marriage-advisors/page.tsx
new file mode 100644
index 0000000..46c42dc
--- /dev/null
+++ b/src/app/marriage-advisors/page.tsx
@@ -0,0 +1,234 @@
+"use client";
+
+import { useState } from "react";
+import Image from "next/image";
+import { FiMessageSquare, FiPhone } from "react-icons/fi";
+import { FaStar } from "react-icons/fa";
+import StickyHeader from "@/components/Componentes/sticky-header";
+import NavigationButton from "@/components/Componentes/navigation-button";
+import { PageBackground } from "@/components/Componentes/page-background";
+import SupportSheet from "@/components/Componentes/support-sheet";
+import { useI18n } from "@/translations/provider";
+
+export default function MarriageAdvisorsPage() {
+ const { dictionary: t } = useI18n();
+ const [isSupportOpen, setIsSupportOpen] = useState(false);
+
+ const mainStyle = {
+ backgroundImage: `url("/assets/images/islamic_pattern_2_2892_3864.svg")`,
+ backgroundColor: "#F5F5F5",
+ backgroundRepeat: "repeat-y",
+ backgroundSize: "100% auto",
+ };
+
+ const advisors = [
+ {
+ id: "hasti-masoudi",
+ name: t["Dr. Hasti Masoudi"] || "Dr. Hasti Masoudi",
+ specialty:
+ t["Specialist in clinical psychology"] ||
+ "Specialist in clinical psychology",
+ avatar: "/assets/images/female_avatar.svg",
+ rating: "3.2",
+ tagsRow1: [
+ t["Personal Development"] || "Personal Development",
+ t["Team Manager"] || "Team Manager",
+ t["Science"] || "Science",
+ ],
+ tagsRow2: [
+ t["Manager"] || "Manager",
+ t["Team Manager"] || "Team Manager",
+ t["Science"] || "Science",
+ ],
+ online: true,
+ },
+ {
+ id: "ali-rezaei",
+ name: t["Dr. Ali Rezaei"] || "Dr. Ali Rezaei",
+ specialty:
+ t["Family & marriage counselor"] || "Family & marriage counselor",
+ avatar: "/assets/images/Avatar Image.png",
+ rating: "4.9",
+ tagsRow1: [
+ t["Premarital Counselling"] || "Premarital Counselling",
+ t["Conflict Resolution"] || "Conflict Resolution",
+ ],
+ tagsRow2: [
+ t["Behavioral Therapy"] || "Behavioral Therapy",
+ t["Self-Awareness"] || "Self-Awareness",
+ ],
+ online: true,
+ },
+ {
+ id: "sara-alavi",
+ name: t["Dr. Sara Alavi"] || "Dr. Sara Alavi",
+ specialty:
+ t["Relationship & intimacy coach"] || "Relationship & intimacy coach",
+ avatar: "/assets/images/Ellipse 370.png",
+ rating: "4.7",
+ tagsRow1: [
+ t["Emotional Health"] || "Emotional Health",
+ t["Communication Skills"] || "Communication Skills",
+ ],
+ tagsRow2: [
+ t["Relationship Coach"] || "Relationship Coach",
+ t["Personal Development"] || "Personal Development",
+ ],
+ online: false,
+ },
+ ];
+
+ return (
+ <>
+
+
+
+
+
+
+ {t["Marriage advisors"]}
+
+
+
+
+
+
+ {advisors.map((advisor) => (
+
+ {/* Top Frame containing Left (Avatar + Info) and Right (Rating) and Actions */}
+
+ {/* Header Row */}
+
+ {/* Left part: Avatar + Info */}
+
+ {/* Avatar Container */}
+
+
+ {/* Status indicator dot */}
+ {advisor.online && (
+
+
+
+
+ )}
+
+
+ {/* Name + Title Info */}
+
+
+ {advisor.name}
+
+
+ {advisor.specialty}
+
+
+
+
+ {/* Right part: Rating */}
+
+
+
+ {advisor.rating}
+
+
+
+
+ {/* Actions Row */}
+
+ {/* Text Contact Button */}
+ setIsSupportOpen(true)}
+ className="flex flex-row justify-center items-center px-2 py-0.5 gap-1.5 h-[22px] bg-[rgba(14,177,60,0.1)] rounded-[20px] text-[#0EB13C] font-semibold text-[10px] leading-[13px] transition-transform active:scale-95 cursor-pointer border-none"
+ >
+
+
+ {t["Text"] || "Text"}
+
+
+
+ {/* Voice Call Contact Button */}
+ setIsSupportOpen(true)}
+ className="flex flex-row justify-center items-center px-2 py-0.5 gap-1.5 h-[22px] bg-[rgba(14,177,60,0.1)] rounded-[20px] text-[#0EB13C] font-semibold text-[10px] leading-[13px] transition-transform active:scale-95 cursor-pointer border-none"
+ >
+
+
+ {t["Voice Call"] || "Voice Call"}
+
+
+
+
+
+ {/* Divider */}
+
+
+ {/* Tags Section */}
+
+ {/* Row 1 tags */}
+
+ {advisor.tagsRow1.map((tag, index) => (
+
+ {tag}
+
+ ))}
+
+
+ {/* Row 2 tags */}
+
+ {advisor.tagsRow2.map((tag, index) => (
+
+ {tag}
+
+ ))}
+
+
+
+ ))}
+
+
+
+
setIsSupportOpen(false)}
+ />
+ >
+ );
+}
diff --git a/src/app/new-match/page.tsx b/src/app/new-match/page.tsx
index 2844ad1..ec46360 100644
--- a/src/app/new-match/page.tsx
+++ b/src/app/new-match/page.tsx
@@ -355,8 +355,12 @@ export default function NewMatchPage() {
? t["New Marriage Proposal"]
: t["YOU HAVE A NEW MATCH!"];
const matchHeadingDescription = isFemaleProfile
- ? t["A suitable match has been found for you. If approved, your profile will be evaluated to proceed with the introduction process."]
- : t["If you proceed, we will notify the other party, and upon their approval, you can view each other's contact information."];
+ ? t[
+ "A suitable match has been found for you. If approved, your profile will be evaluated to proceed with the introduction process."
+ ]
+ : t[
+ "If you proceed, we will notify the other party, and upon their approval, you can view each other's contact information."
+ ];
const isMale = profile?.gender === "male";
const hasActiveSub = !!profile?.active_subscription;
@@ -458,7 +462,9 @@ export default function NewMatchPage() {
if (isMale && !hasActiveSub) {
setIsPaymentSheetOpen(true);
} else {
- router.push(localizePath("/new-match/profile", locale));
+ router.push(
+ localizePath("/new-match/profile", locale),
+ );
}
}}
className="mt-[15px] inline-flex w-full items-center justify-center rounded-[10px] border-none bg-white h-[40px] text-[16px] font-semibold text-[#F0445B] no-underline shadow-none hover:bg-white/95 transition-colors cursor-pointer"
@@ -477,11 +483,15 @@ export default function NewMatchPage() {
@@ -539,7 +549,9 @@ export default function NewMatchPage() {
- {t["This payment acts as a verification process for your account and activates a 3-month subscription to receive new case introductions. The cost of this subscription is 50 Habib Coins."] ||
+ {t[
+ "This payment acts as a verification process for your account and activates a 3-month subscription to receive new case introductions. The cost of this subscription is 50 Habib Coins."
+ ] ||
"This payment acts as a verification process for your account and activates a 3-month subscription to receive new case introductions. The cost of this subscription is 50 Habib Coins."}
@@ -553,7 +565,9 @@ export default function NewMatchPage() {
- {t["Please note that there is no guarantee for a specific number of cases, and the volume of incoming cases is solely subject to profile compatibility with other users."] ||
+ {t[
+ "Please note that there is no guarantee for a specific number of cases, and the volume of incoming cases is solely subject to profile compatibility with other users."
+ ] ||
"Please note that there is no guarantee for a specific number of cases, and the volume of incoming cases is solely subject to profile compatibility with other users."}
@@ -576,7 +590,9 @@ export default function NewMatchPage() {
{respondMutation.isPending ? (
) : (
- {t["Decline"] || "Decline"}
+
+ {t["Decline"] || "Decline"}
+
)}
@@ -594,7 +610,9 @@ export default function NewMatchPage() {
) : (
<>
- {t["Pay"] || "Pay"}
+
+ {t["Pay"] || "Pay"}
+
{
- if (typeof window !== "undefined") {
- (window as any).__queryClient = queryClient;
- }
-
- let lastReloadTime = 0;
- const handleReload = () => {
- const now = Date.now();
- if (now - lastReloadTime < 5000) {
- return;
- }
- lastReloadTime = now;
- // Invalidate all active queries so fresh data is reloaded from backend
- queryClient.invalidateQueries();
- };
-
- const handleVisibilityChange = () => {
- if (document.visibilityState === "visible") {
- handleReload();
- }
- };
-
- const handlePageShow = () => {
- handleReload();
- };
-
- window.addEventListener("focus", handleReload);
- window.addEventListener("pageshow", handlePageShow);
- document.addEventListener("visibilitychange", handleVisibilityChange);
-
- // Listen for Flutter response events if available
- const win = window as any;
- const unbindFlutter =
- typeof win.addFlutterResponseListener === "function"
- ? win.addFlutterResponseListener(() => handleReload())
- : null;
-
- return () => {
- window.removeEventListener("focus", handleReload);
- window.removeEventListener("pageshow", handlePageShow);
- document.removeEventListener("visibilitychange", handleVisibilityChange);
- if (typeof unbindFlutter === "function") {
- unbindFlutter();
- }
- };
- }, [queryClient]);
-
- return <>{children}>;
-}
+// AppFocusReloader was extracted to SilentReloader in silent-reloader.tsx
type ProvidersProps = {
children: ReactNode;
@@ -72,12 +21,19 @@ export default function Providers({ children }: ProvidersProps) {
new QueryClient({
defaultOptions: {
queries: {
+ // Keep the last successful response available while a fresh
+ // request runs. `isLoading` is therefore only true on the first
+ // visit to a query; later visits render cached data immediately.
refetchOnWindowFocus: "always",
refetchOnMount: "always",
refetchOnReconnect: "always",
retry: 1,
- staleTime: 0, // Always consider queries stale to ensure fresh data from backend on every page load
- gcTime: 10 * 60 * 1000, // 10 minutes
+ staleTime: 0,
+ // Retain page data long enough for back-navigation to be instant.
+ gcTime: 10 * 60 * 1000,
+ // React Query replaces only the changed branches of a response,
+ // preventing needless UI updates when a silent refresh is equal.
+ structuralSharing: true,
},
},
}),
@@ -85,11 +41,11 @@ export default function Providers({ children }: ProvidersProps) {
return (
-
+
{children}
-
+
);
}
diff --git a/src/app/questions-list/[slug]/page.tsx b/src/app/questions-list/[slug]/page.tsx
index d4d88e6..bf80a28 100644
--- a/src/app/questions-list/[slug]/page.tsx
+++ b/src/app/questions-list/[slug]/page.tsx
@@ -47,7 +47,11 @@ export default async function QuestionDetailPage({
locale={locale}
questionsListHref={questionsListHref}
title={t["Answer at Your Own Pace"]}
- description={t["You can pause the survey anytime and resume later. Your progress is saved automatically."]}
+ description={
+ t[
+ "You can pause the survey anytime and resume later. Your progress is saved automatically."
+ ]
+ }
closeLabel={t["Close questions list"]}
informationLabel={t["Information sheet"]}
continueLabel={t["Submit"]}
diff --git a/src/app/questions-list/[slug]/question-detail-client.tsx b/src/app/questions-list/[slug]/question-detail-client.tsx
index 66c92d6..474bd88 100644
--- a/src/app/questions-list/[slug]/question-detail-client.tsx
+++ b/src/app/questions-list/[slug]/question-detail-client.tsx
@@ -63,6 +63,10 @@ type StoredAnswers = {
fields?: StoredQuestionField[];
};
+function getTestDraftStorageKey(slug: string) {
+ return `marriage:tests:${slug}:draft`;
+}
+
function getQuestionStorageKey(slug: string) {
return `marriage:sections:${slug}:answers`;
}
@@ -124,7 +128,7 @@ function getStoredAge() {
return (
f.type === "number" ||
f.label === "Age" ||
- f.label === "سن" ||
+ f.label === "ط³ظ†" ||
(typeof f.key === "string" &&
(f.key.endsWith("_age") || f.key.endsWith("_sn")))
);
@@ -139,7 +143,7 @@ function getStoredAge() {
return (
f.type === "date" ||
f.label === "Date of Birth" ||
- f.label === "تاریخ تولد" ||
+ f.label === "طھط§ط±غŒط® طھظˆظ„ط¯" ||
(typeof f.key === "string" &&
(f.key.endsWith("_date_of_birth") || f.key.endsWith("_tarykh_twld")))
);
@@ -498,6 +502,30 @@ export default function QuestionDetailClient({
const router = useRouter();
const { dictionary: t } = useI18n();
const [isTestStarted, setIsTestStarted] = useState(false);
+ const [hasTestProgress, setHasTestProgress] = useState(false);
+
+ useEffect(() => {
+ if (typeof window !== "undefined") {
+ const draftKey = `marriage:tests:${itemSlug}:draft`;
+ const draftRaw = window.localStorage.getItem(draftKey);
+ if (draftRaw) {
+ try {
+ const parsed = JSON.parse(draftRaw);
+ if (
+ parsed &&
+ typeof parsed.answers === "object" &&
+ parsed.answers !== null &&
+ Object.keys(parsed.answers).length > 0
+ ) {
+ setHasTestProgress(true);
+ return;
+ }
+ } catch {}
+ }
+ setHasTestProgress(false);
+ }
+ }, [itemSlug, isTestStarted]);
+
const { data: profile, isLoading: isProfileLoading } =
useMarriageProfileQuery();
const profileGender = profile?.gender;
@@ -538,7 +566,7 @@ export default function QuestionDetailClient({
q.options && q.options.length > 0
? q.options
: locale === "fa"
- ? ["بله", "به اندازه کافی واضح نیست", "نه"]
+ ? ["ط¨ظ„ظ‡", "ط¨ظ‡ ط§ظ†ط¯ط§ط²ظ‡ ع©ط§ظپغŒ ظˆط§ط¶ط ظ†غŒط³طھ", "ظ†ظ‡"]
: ["Yes", "Not clear enough", "No"];
const mappedOptions = rawOptions.map((optText, idx) => ({
label: optText,
@@ -559,11 +587,17 @@ export default function QuestionDetailClient({
: glasserFallbackQuestions;
const defaultGlasserOptions = [
- { label: locale === "fa" ? "خیلی کم (۱)" : "Very Low (1)", value: 1 },
- { label: locale === "fa" ? "کم (۲)" : "Low (2)", value: 2 },
- { label: locale === "fa" ? "متوسط (۳)" : "Moderate (3)", value: 3 },
- { label: locale === "fa" ? "زیاد (۴)" : "High (4)", value: 4 },
- { label: locale === "fa" ? "خیلی زیاد (۵)" : "Very High (5)", value: 5 },
+ {
+ label: locale === "fa" ? "خیلی کم" : "Very Low",
+ value: 1,
+ },
+ { label: locale === "fa" ? "کم" : "Low", value: 2 },
+ { label: locale === "fa" ? "متوسط" : "Moderate", value: 3 },
+ { label: locale === "fa" ? "زیاد" : "High", value: 4 },
+ {
+ label: locale === "fa" ? "خیلی زیاد" : "Very High",
+ value: 5,
+ },
];
return questionsList.map((q) => ({
@@ -585,14 +619,14 @@ export default function QuestionDetailClient({
}
const hasDobQuestion = item.questions.some(
- (q) => q.title === "Date of Birth" || q.title === "تاریخ تولد",
+ (q) => q.title === "Date of Birth" || q.title === "طھط§ط±غŒط® طھظˆظ„ط¯",
);
return item.questions
.filter((question) => {
if (
hasDobQuestion &&
- (question.title === "Age" || question.title === "سن")
+ (question.title === "Age" || question.title === "ط³ظ†")
) {
return false;
}
@@ -622,7 +656,12 @@ export default function QuestionDetailClient({
}, [isProfileLoading, item, profileContext, questionsListHref, router]);
if (isProfileLoading && item) {
- return ;
+ return (
+
+ );
} else if (
!item ||
!isQuestionListItemVisibleForProfile(item, profileContext)
@@ -633,13 +672,13 @@ export default function QuestionDetailClient({
if (item && item.questions.length === 0) {
if (isTestStarted) {
const isQuestionsLoading = isCattellSlug
- ? cattellQuery.isLoading || cattellQuery.isFetching
+ ? cattellQuery.isLoading
: isGlasserSlug
- ? glasserQuery.isLoading || glasserQuery.isFetching
+ ? glasserQuery.isLoading
: false;
if (isQuestionsLoading) {
- return ;
+ return ;
}
const activeTestQuestions = isCattellSlug
@@ -665,10 +704,10 @@ export default function QuestionDetailClient({
{isError
? locale === "fa"
- ? "خطا در دریافت سوالات از سرور. لطفاً از اتصال اینترنت یا ورود به حساب کاربری اطمینان حاصل کنید."
+ ? "ط®ط·ط§ ط¯ط± ط¯ط±غŒط§ظپطھ ط³ظˆط§ظ„ط§طھ ط§ط² ط³ط±ظˆط±. ظ„ط·ظپط§ظ‹ ط§ط² ط§طھطµط§ظ„ ط§غŒظ†طھط±ظ†طھ غŒط§ ظˆط±ظˆط¯ ط¨ظ‡ طط³ط§ط¨ ع©ط§ط±ط¨ط±غŒ ط§ط·ظ…غŒظ†ط§ظ† طط§طµظ„ ع©ظ†غŒط¯."
: "Failed to load questions from server. Please check your connection or login status."
: locale === "fa"
- ? "سوالاتی برای این آزمون یافت نشد."
+ ? "ط³ظˆط§ظ„ط§طھغŒ ط¨ط±ط§غŒ ط§غŒظ† ط¢ط²ظ…ظˆظ† غŒط§ظپطھ ظ†ط´ط¯."
: "No questions found for this test."}
@@ -684,7 +723,7 @@ export default function QuestionDetailClient({
onClick={() => refetch()}
className="rounded-xl bg-[#F2465F] px-4 py-2 text-sm font-semibold text-white shadow-md"
>
- {locale === "fa" ? "تلاش مجدد" : "Retry"}
+ {locale === "fa" ? "طھظ„ط§ط´ ظ…ط¬ط¯ط¯" : "Retry"}
@@ -700,11 +739,7 @@ export default function QuestionDetailClient({
question_number: Number(qNum),
option: String(option),
}));
- try {
- await submitCattellMutation.mutateAsync({ responses });
- } catch {
- // Ignore if already submitted or API returned error
- }
+ await submitCattellMutation.mutateAsync({ responses });
try {
window.localStorage.setItem(
getQuestionStorageKey(item.slug),
@@ -716,11 +751,7 @@ export default function QuestionDetailClient({
question_number: Number(qNum),
score: Number(score),
}));
- try {
- await submitGlasserMutation.mutateAsync({ responses });
- } catch {
- // Ignore if already submitted
- }
+ await submitGlasserMutation.mutateAsync({ responses });
try {
window.localStorage.setItem(
getQuestionStorageKey(item.slug),
@@ -739,21 +770,37 @@ export default function QuestionDetailClient({
informationLabel={informationLabel}
onClose={() => setIsTestStarted(false)}
onFinish={handleTestFinish}
+ draftStorageKey={getTestDraftStorageKey(item.slug)}
/>
);
}
const bulletKey =
item.slug === "glasser_5_needs_test" ? "glasser" : "personality";
- const bullets = bulletKey === "glasser" ? [
- t["Understanding your five basic needs helps you recognize what truly drives your behavior in relationships."],
- t["Taking this test is not mandatory, but it will help you better understand your priorities and find a more compatible spouse."],
- t["By identifying your strongest needs, you can better communicate your expectations and build healthier relationships."]
- ] : [
- t["Do you struggle to understand the underlying psychological drivers that dictate your interpersonal connections and communication barriers?"],
- t["Taking this test is not mandatory, but it will help you better search for a spouse. The Personality test is a test for self-knowledge and better understanding of your spouse."],
- t["Do you operate based on superficial behavioral adaptations, or are you aware of the deep \"source traits\" that fundamentally control your decision-making processes?"]
- ];
+ const bullets =
+ bulletKey === "glasser"
+ ? [
+ t[
+ "Understanding your five basic needs helps you recognize what truly drives your behavior in relationships."
+ ],
+ t[
+ "Taking this test is not mandatory, but it will help you better understand your priorities and find a more compatible spouse."
+ ],
+ t[
+ "By identifying your strongest needs, you can better communicate your expectations and build healthier relationships."
+ ],
+ ]
+ : [
+ t[
+ "Do you struggle to understand the underlying psychological drivers that dictate your interpersonal connections and communication barriers?"
+ ],
+ t[
+ "Taking this test is not mandatory, but it will help you better search for a spouse. The Personality test is a test for self-knowledge and better understanding of your spouse."
+ ],
+ t[
+ 'Do you operate based on superficial behavioral adaptations, or are you aware of the deep "source traits" that fundamentally control your decision-making processes?'
+ ],
+ ];
return (
<>
@@ -786,13 +833,128 @@ export default function QuestionDetailClient({
title={item.title}
estimateTime={item.estimate}
description={t["Estimate time"]}
- bulletPoints={bullets}
- disclaimerText={t["All provided information is held in strict confidence and will not be disclosed to third parties. This data is utilized exclusively to ensure optimal matchmaking accuracy. Consequently, it is imperative that this assessment be completed with the utmost diligence, precision, and integrity."]}
- startLabel={t["Start"]}
+ bulletPoints={
+ isCattellSlug || isGlasserSlug ? undefined : bullets
+ }
+ disclaimerText={
+ t[
+ "All provided information is held in strict confidence and will not be disclosed to third parties. This data is utilized exclusively to ensure optimal matchmaking accuracy. Consequently, it is imperative that this assessment be completed with the utmost diligence, precision, and integrity."
+ ]
+ }
+ startLabel={hasTestProgress ? t["Continue"] : t["Start"]}
onStart={() => {
setIsTestStarted(true);
}}
- />
+ >
+ {isCattellSlug ? (
+
+
+ {[
+ {
+ title: t["Understanding Personality Traits"],
+ desc: t[
+ "Helps provide an overall picture of traits such as sociability, independence, emotional sensitivity, and interpersonal style."
+ ],
+ },
+ {
+ title: t["Assessing Communication Style"],
+ desc: t[
+ "Shows how a person typically communicates, expresses emotions, and builds closeness in relationships."
+ ],
+ },
+ {
+ title:
+ t["Understanding Responses to Stress and Conflict"],
+ desc: t[
+ "Offers insight into emotional stability, tension levels, and how a person may react in difficult or stressful situations."
+ ],
+ },
+ {
+ title: t["Assessing Independence and Decision-Making"],
+ desc: t[
+ "Helps identify the person’s level of independence, assertiveness, and preference for individual or shared decision-making."
+ ],
+ },
+ {
+ title:
+ t["Identifying Potential Differences and Challenges"],
+ desc: t[
+ "Comparing two individuals’ results can highlight personality differences that may require attention in a long-term relationship."
+ ],
+ },
+ {
+ title: t["Supporting Better Match Recommendations"],
+ desc: t[
+ "Alongside interviews and other relationship criteria, personality assessment can help make the matching process more targeted and improve the evaluation of compatibility."
+ ],
+ },
+ ].map((bullet, index) => (
+
+
+ {bullet.title}
+
+
+ {bullet.desc}
+
+
+ ))}
+
+
+ ) : isGlasserSlug ? (
+
+
+ {[
+ {
+ title: t["Understanding Core Psychological Needs"],
+ desc: t[
+ "Helps identify the importance of the five basic needs—love and belonging, power, freedom, fun, and survival—in each person’s life."
+ ],
+ },
+ {
+ title: t["Recognizing Relationship Expectations"],
+ desc: t[
+ "Provides insight into what each person expects from a relationship, such as closeness, independence, security, achievement, or shared enjoyment."
+ ],
+ },
+ {
+ title: t["Assessing Personality Compatibility"],
+ desc: t[
+ "Helps compare personality traits, behavioral tendencies, and interaction styles to identify areas of compatibility between two individuals."
+ ],
+ },
+ {
+ title: t["Identifying Potential Sources of Conflict"],
+ desc: t[
+ "Differences in needs or personality styles can highlight areas where misunderstandings, tension, or disagreements may arise in the relationship."
+ ],
+ },
+ {
+ title: t["Improving Mutual Understanding"],
+ desc: t[
+ "Helps individuals better understand their own needs as well as their partner’s motivations, preferences, and emotional priorities."
+ ],
+ },
+ {
+ title:
+ t["Supporting More Suitable Match Recommendations"],
+ desc: t[
+ "Combining needs and personality assessments with interviews and other marriage criteria can help make partner recommendations more personalized and well-matched."
+ ],
+ },
+ ].map((bullet, index) => (
+
+
+ {bullet.title}
+
+
+ {bullet.desc}
+
+
+ ))}
+
+
+ ) : null}
+
>
diff --git a/src/app/questions-list/page.tsx b/src/app/questions-list/page.tsx
index 2083d3f..32ddc56 100644
--- a/src/app/questions-list/page.tsx
+++ b/src/app/questions-list/page.tsx
@@ -146,9 +146,19 @@ export default function QuestionsListPage() {
useEffect(() => {
if (startMatchMutation.isError || isSyncError) {
- setToastMessage(t["Sending the match request failed. Please check your connection and try again."]);
+ setToastMessage(
+ t[
+ "Sending the match request failed. Please check your connection and try again."
+ ],
+ );
}
- }, [startMatchMutation.isError, isSyncError, t["Sending the match request failed. Please check your connection and try again."]]);
+ }, [
+ startMatchMutation.isError,
+ isSyncError,
+ t[
+ "Sending the match request failed. Please check your connection and try again."
+ ],
+ ]);
const handleCloseToast = () => {
setToastMessage(null);
@@ -304,7 +314,11 @@ export default function QuestionsListPage() {
title={t["Important Note"]}
description={
- {t["You've completed all required fields. However, filling in all sections will help us find better matches for you"]}
+ {
+ t[
+ "You've completed all required fields. However, filling in all sections will help us find better matches for you"
+ ]
+ }
}
onClose={() => setIsOptionalInfoSheetOpen(false)}
@@ -439,9 +453,7 @@ export default function QuestionsListPage() {
height={28}
className="shrink-0"
/>
-
- {t["Submit"]}
-
+ {t["Submit"]}
diff --git a/src/app/request-accepted/page.tsx b/src/app/request-accepted/page.tsx
index edc3ff0..8724d5f 100644
--- a/src/app/request-accepted/page.tsx
+++ b/src/app/request-accepted/page.tsx
@@ -204,8 +204,6 @@ export default function RequestAcceptedPage() {
}
}, [profile, router, locale, noContactReportedSuccess]);
-
-
const isRedirecting = useMemo(() => {
if (!profile) return false;
return getSubmitPath(profile) !== "/request-accepted";
@@ -497,7 +495,7 @@ export default function RequestAcceptedPage() {
-
+
{isFinalized ? (
@@ -566,127 +564,128 @@ export default function RequestAcceptedPage() {
)}
<>
- {caseStatus === "contacted" ||
- isFemaleContactConfirmed ||
- (isFemaleProfile && contactStatusMutation.isPending) ? (
-
- {isFemaleProfile &&
- contactStatusMutation.isPending ? null : isFemaleProfile ? (
+ {caseStatus === "contacted" ||
+ isFemaleContactConfirmed ||
+ (isFemaleProfile && contactStatusMutation.isPending) ? (
+
+ {isFemaleProfile &&
+ contactStatusMutation.isPending ? null : isFemaleProfile ? (
+ setIsOutcomeSheetOpen(true)}
+ disabled={outcomeMutation.isPending}
+ className="w-full max-w-[315px] h-[52px] rounded-[15px] bg-gradient-to-r from-[#FE6F82] to-[#E03950] text-white font-semibold group-14 flex items-center justify-center shadow-lg shadow-[#FE6F82]/30 transition-transform active:scale-[0.98] cursor-pointer hover:opacity-95 disabled:opacity-50"
+ >
+ {outcomeMutation.isPending ? (
+
+ ) : (
+ t["Share Result"]
+ )}
+
+ ) : (
+ <>
setIsOutcomeSheetOpen(true)}
- disabled={outcomeMutation.isPending}
- className="w-full max-w-[315px] h-[52px] rounded-[15px] bg-gradient-to-r from-[#FE6F82] to-[#E03950] text-white font-semibold group-14 flex items-center justify-center shadow-lg shadow-[#FE6F82]/30 transition-transform active:scale-[0.98] cursor-pointer hover:opacity-95 disabled:opacity-50"
+ onClick={() =>
+ router.push(
+ localizePath("/new-match/profile", locale),
+ )
+ }
+ className="flex-1 h-[52px] rounded-[15px] border border-[#BFBFBF] bg-white text-[#36363C] font-semibold group-14 flex items-center justify-center transition-transform active:scale-[0.98] cursor-pointer hover:bg-[#F5F5F5]"
>
- {outcomeMutation.isPending ? (
-
- ) : (
- t["Share Result"]
- )}
+ {t["View Profile"]}
- ) : (
- <>
-
- router.push(
- localizePath("/new-match/profile", locale),
- )
- }
- className="flex-1 h-[52px] rounded-[15px] border border-[#BFBFBF] bg-white text-[#36363C] font-semibold group-14 flex items-center justify-center transition-transform active:scale-[0.98] cursor-pointer hover:bg-[#F5F5F5]"
- >
- {t["View Profile"]}
-
-
- setIsOutcomeSheetOpen(true)}
- disabled={outcomeMutation.isPending}
- className="flex-1 h-[52px] rounded-[15px] bg-gradient-to-r from-[#FE6F82] to-[#E03950] text-white font-semibold group-14 flex items-center justify-center shadow-lg shadow-[#FE6F82]/30 transition-transform active:scale-[0.98] cursor-pointer hover:opacity-95 disabled:opacity-50"
- >
- {outcomeMutation.isPending ? (
-
- ) : (
- t["Submit Final Outcome"]
- )}
-
- >
- )}
-
- ) : (
-
- {isFemaleProfile ? (
+
setIsNoContactConfirmOpen(true)}
- disabled={
- contactStatusMutation.isPending || noContactReportedSuccess
- }
- className="flex-1 h-[44px] rounded-[15px] border border-[#BFBFBF] bg-white text-[#36363C] font-semibold group-14 flex items-center justify-center transition-all cursor-pointer hover:bg-[#F5F5F5] disabled:opacity-50 disabled:cursor-not-allowed disabled:hover:bg-white"
+ onClick={() => setIsOutcomeSheetOpen(true)}
+ disabled={outcomeMutation.isPending}
+ className="flex-1 h-[52px] rounded-[15px] bg-gradient-to-r from-[#FE6F82] to-[#E03950] text-white font-semibold group-14 flex items-center justify-center shadow-lg shadow-[#FE6F82]/30 transition-transform active:scale-[0.98] cursor-pointer hover:opacity-95 disabled:opacity-50"
>
- {contactStatusMutation.isPending ? (
-
+ {outcomeMutation.isPending ? (
+
) : (
- primaryActionText
+ t["Submit Final Outcome"]
)}
- ) : (
-
-
- {primaryActionText}
-
-
- )}
-
+ >
+ )}
+
+ ) : (
+
+ {isFemaleProfile ? (
{
- void handleSecondaryAction();
- }}
- disabled={paymentMutation.isPending}
- className={
- isFemaleProfile
- ? "flex-1 h-[44px] rounded-[15px] bg-gradient-to-r from-[#FE6F82] to-[#E03950] text-white font-semibold group-14 flex items-center justify-center shadow-md shadow-[#FE6F82]/30 transition-all cursor-pointer hover:opacity-95 disabled:opacity-50 disabled:cursor-not-allowed disabled:shadow-none"
- : "max-w-[212px] flex-1 appearance-none border-0 bg-transparent p-0 text-left"
+ onClick={() => setIsNoContactConfirmOpen(true)}
+ disabled={
+ contactStatusMutation.isPending ||
+ noContactReportedSuccess
}
+ className="flex-1 h-[44px] rounded-[15px] border border-[#BFBFBF] bg-white text-[#36363C] font-semibold group-14 flex items-center justify-center transition-all cursor-pointer hover:bg-[#F5F5F5] disabled:opacity-50 disabled:cursor-not-allowed disabled:hover:bg-white"
>
- {isFemaleProfile ? (
- paymentMutation.isPending ? (
-
- ) : (
- secondaryActionText
- )
+ {contactStatusMutation.isPending ? (
+
) : (
-
- {paymentMutation.isPending ? (
-
- ) : (
- secondaryActionText
- )}
-
+ primaryActionText
)}
-
- )}
-
- {caseStatus !== "contacted" &&
- !isFemaleContactConfirmed &&
- !noContactReportedSuccess &&
- !(isFemaleProfile && contactStatusMutation.isPending) ? (
-
-
- {
- t[
- "Please be informed that from the time of this introduction, you have 48 hours (2 days) to contact the person or their respected family to declare your readiness and begin the acquaintance process. At this stage, merely an initial call to announce your presence is sufficient, and planning for further steps (such as an in-person meeting) depends entirely on your subsequent mutual agreements. Since failing to make contact within the specified time might be considered socially disrespectful, if no action is taken within these 2 days, the introduced match will be removed according to the platform's rules. We also remind you that this issue may lead to restrictions such as delays in future introductions and financial penalties."
- ]
- }
-
-
- ) : null}
- >
+ ) : (
+
+
+ {primaryActionText}
+
+
+ )}
+
+
{
+ void handleSecondaryAction();
+ }}
+ disabled={paymentMutation.isPending}
+ className={
+ isFemaleProfile
+ ? "flex-1 h-[44px] rounded-[15px] bg-gradient-to-r from-[#FE6F82] to-[#E03950] text-white font-semibold group-14 flex items-center justify-center shadow-md shadow-[#FE6F82]/30 transition-all cursor-pointer hover:opacity-95 disabled:opacity-50 disabled:cursor-not-allowed disabled:shadow-none"
+ : "max-w-[212px] flex-1 appearance-none border-0 bg-transparent p-0 text-left"
+ }
+ >
+ {isFemaleProfile ? (
+ paymentMutation.isPending ? (
+
+ ) : (
+ secondaryActionText
+ )
+ ) : (
+
+ {paymentMutation.isPending ? (
+
+ ) : (
+ secondaryActionText
+ )}
+
+ )}
+
+
+ )}
+
+ {caseStatus !== "contacted" &&
+ !isFemaleContactConfirmed &&
+ !noContactReportedSuccess &&
+ !(isFemaleProfile && contactStatusMutation.isPending) ? (
+
+
+ {
+ t[
+ "Please be informed that from the time of this introduction, you have 48 hours (2 days) to contact the person or their respected family to declare your readiness and begin the acquaintance process. At this stage, merely an initial call to announce your presence is sufficient, and planning for further steps (such as an in-person meeting) depends entirely on your subsequent mutual agreements. Since failing to make contact within the specified time might be considered socially disrespectful, if no action is taken within these 2 days, the introduced match will be removed according to the platform's rules. We also remind you that this issue may lead to restrictions such as delays in future introductions and financial penalties."
+ ]
+ }
+
+
+ ) : null}
+ >
>
)}
@@ -703,7 +702,7 @@ export default function RequestAcceptedPage() {
avatars={advisorAvatars}
extraCount={7}
getAdvisorLabel={t["Get Advisor"]}
- getAdvisorHref="/questions-list"
+ getAdvisorHref="/marriage-advisors"
/>
diff --git a/src/app/request-sent/page.tsx b/src/app/request-sent/page.tsx
index 74e7f13..4c6c934 100644
--- a/src/app/request-sent/page.tsx
+++ b/src/app/request-sent/page.tsx
@@ -47,12 +47,18 @@ export default function RequestSentPage() {
const copy = {
advisorTitle: t["Get an advisor"],
- advisorDescription: t["Not sure what to do next? Our psychology section is here to guide you at every step."],
+ advisorDescription:
+ t[
+ "Not sure what to do next? Our psychology section is here to guide you at every step."
+ ],
getAdvisor: t["Get Advisor"],
};
const requestSentCopy = {
title: t["Request Sent"],
- description: t["Your request has been sent. Once the lady reviews your request, you will be notified."],
+ description:
+ t[
+ "Your request has been sent. Once the lady reviews your request, you will be notified."
+ ],
matchProfile: t["View More Details"],
profileLocked: t["Profile is locked"],
};
@@ -105,7 +111,7 @@ export default function RequestSentPage() {
avatars={advisorAvatars}
extraCount={7}
getAdvisorLabel={copy.getAdvisor}
- getAdvisorHref="/questions-list"
+ getAdvisorHref="/marriage-advisors"
/>
diff --git a/src/components/Componentes/call-result-sheet.tsx b/src/components/Componentes/call-result-sheet.tsx
index 5062423..feacb1c 100644
--- a/src/components/Componentes/call-result-sheet.tsx
+++ b/src/components/Componentes/call-result-sheet.tsx
@@ -31,7 +31,7 @@ export function CallResultSheet({
t["Different expectations"],
t["No connection felt"],
t["Location not suitable"],
- t["Other reasons"]
+ t["Other reasons"],
];
const groupId = useId();
const [isVisible, setIsVisible] = useState(true);
diff --git a/src/components/Componentes/dismiss-reason-sheet.tsx b/src/components/Componentes/dismiss-reason-sheet.tsx
index 29e746b..6cb10ec 100644
--- a/src/components/Componentes/dismiss-reason-sheet.tsx
+++ b/src/components/Componentes/dismiss-reason-sheet.tsx
@@ -30,7 +30,7 @@ export function DismissReasonSheet({
t["Different expectations"],
t["No connection felt"],
t["Location not suitable"],
- t["Other reasons"]
+ t["Other reasons"],
];
const groupId = useId();
const [isVisible, setIsVisible] = useState(true);
@@ -154,7 +154,11 @@ export function DismissReasonSheet({
- {t["Please provide the full reason for rejecting the submitted item"]}
+ {
+ t[
+ "Please provide the full reason for rejecting the submitted item"
+ ]
+ }
setReasonText(event.target.value)
diff --git a/src/components/Componentes/female-outcome-sheet.test.tsx b/src/components/Componentes/female-outcome-sheet.test.tsx
index 2e959e7..d2a325f 100644
--- a/src/components/Componentes/female-outcome-sheet.test.tsx
+++ b/src/components/Componentes/female-outcome-sheet.test.tsx
@@ -40,9 +40,7 @@ describe("FemaleOutcomeSheet", () => {
it("keeps the profile unchanged when the acquaintance process is still ongoing", async () => {
const onSubmit = renderSheet();
- await userEvent.click(
- screen.getByRole("button", { name: "Continue" }),
- );
+ await userEvent.click(screen.getByRole("button", { name: "Continue" }));
expect(onSubmit).toHaveBeenCalledWith("success");
});
diff --git a/src/components/Componentes/help-modal.tsx b/src/components/Componentes/help-modal.tsx
index 0ee36a1..8f363bb 100644
--- a/src/components/Componentes/help-modal.tsx
+++ b/src/components/Componentes/help-modal.tsx
@@ -36,12 +36,11 @@ export function HelpModal({
const resolvedTitle = "Tips";
const resolvedDescription =
description ??
- t["Psychologically, this practice fosters a sense of empathy and contentment, which can reduce financial stress. Socially, lending strengthens neighborhood bonds and creates support networks that can lead to economic opportunities. This hadith encourages believers to lend dough, bread, and fire to increase their sustenance."] ??
+ t[
+ "Psychologically, this practice fosters a sense of empathy and contentment, which can reduce financial stress. Socially, lending strengthens neighborhood bonds and creates support networks that can lead to economic opportunities. This hadith encourages believers to lend dough, bread, and fire to increase their sustenance."
+ ] ??
"Psychologically, this practice fosters a sense of empathy and contentment, which can reduce financial stress. Socially, lending strengthens neighborhood bonds and creates support networks that can lead to economic opportunities. This hadith encourages believers to lend dough, bread, and fire to increase their sustenance.";
- const resolvedButtonText =
- buttonText ??
- t["Got it"] ??
- "Got it";
+ const resolvedButtonText = buttonText ?? t["Got it"] ?? "Got it";
const closeSheet = useCallback(() => {
if (isClosing) return;
diff --git a/src/components/Componentes/information-sheet.tsx b/src/components/Componentes/information-sheet.tsx
index 6f9846b..89f4fb2 100644
--- a/src/components/Componentes/information-sheet.tsx
+++ b/src/components/Componentes/information-sheet.tsx
@@ -288,7 +288,9 @@ export function InformationSheet({
{description ? (
- {description}
+
+ {description}
+
) : null}
{resolvedButtons ? (
diff --git a/src/components/Componentes/loading-border-spinner.tsx b/src/components/Componentes/loading-border-spinner.tsx
index 337ac23..c3d5af5 100644
--- a/src/components/Componentes/loading-border-spinner.tsx
+++ b/src/components/Componentes/loading-border-spinner.tsx
@@ -1,12 +1,19 @@
import type { ComponentProps } from "react";
-export function LoadingBorderSpinner({ className = "", ...props }: ComponentProps<"span">) {
+export function LoadingBorderSpinner({
+ className = "",
+ ...props
+}: ComponentProps<"span">) {
const hasBorder = className.split(" ").some((c) => c.startsWith("border-"));
const borderClasses = hasBorder
? ""
: "border-2 border-rose-500/25 border-t-rose-500 dark:border-rose-400/20 dark:border-t-rose-400";
- const hasSize = className.split(" ").some((c) => c.startsWith("size-") || c.startsWith("w-") || c.startsWith("h-"));
+ const hasSize = className
+ .split(" ")
+ .some(
+ (c) => c.startsWith("size-") || c.startsWith("w-") || c.startsWith("h-"),
+ );
const sizeClasses = hasSize ? "" : "size-5";
return (
diff --git a/src/components/Componentes/loading-icon-spinner.tsx b/src/components/Componentes/loading-icon-spinner.tsx
index ec88fbe..d17d3d2 100644
--- a/src/components/Componentes/loading-icon-spinner.tsx
+++ b/src/components/Componentes/loading-icon-spinner.tsx
@@ -1,6 +1,9 @@
import type { ComponentProps } from "react";
-export function LoadingIconSpinner({ className = "", ...props }: ComponentProps<"svg">) {
+export function LoadingIconSpinner({
+ className = "",
+ ...props
+}: ComponentProps<"svg">) {
return (
-
-
+
+
);
}
diff --git a/src/components/Componentes/loading-select-spinner.tsx b/src/components/Componentes/loading-select-spinner.tsx
index c07333e..0b99311 100644
--- a/src/components/Componentes/loading-select-spinner.tsx
+++ b/src/components/Componentes/loading-select-spinner.tsx
@@ -1,4 +1,8 @@
-export function LoadingSelectSpinner({ className = "" }: { className?: string }) {
+export function LoadingSelectSpinner({
+ className = "",
+}: {
+ className?: string;
+}) {
return (
c.startsWith("rounded-"));
+ const hasRoundedClass = className
+ .split(" ")
+ .some((c) => c.startsWith("rounded-"));
const roundedClass = hasRoundedClass ? "" : "rounded-md";
return (
diff --git a/src/components/Componentes/loading-three-dot.tsx b/src/components/Componentes/loading-three-dot.tsx
index 0ffba4b..c4e9dad 100644
--- a/src/components/Componentes/loading-three-dot.tsx
+++ b/src/components/Componentes/loading-three-dot.tsx
@@ -2,7 +2,10 @@ import type { ComponentProps } from "react";
interface LoadingThreeDotProps extends ComponentProps<"span"> {}
-export function LoadingThreeDot({ className = "", ...props }: LoadingThreeDotProps) {
+export function LoadingThreeDot({
+ className = "",
+ ...props
+}: LoadingThreeDotProps) {
return (
- {isRenewing
- ? t["Renewing..."]
- : t["Renew Subscription"]}
+ {isRenewing ? t["Renewing..."] : t["Renew Subscription"]}
{!isRenewing && (
@@ -186,7 +187,11 @@ export function NavigationButton({
setIsSubscriptionInfoOpen(false)}
/>
@@ -210,14 +215,13 @@ export function NavigationButton({
return () => document.removeEventListener("mousedown", handleOutsideClick);
}, [isDropdownOpen]);
- // پشتیبانی برای هم خانمها و هم آقایان در هر وضعیتی فعال و در دسترس است
- const hasSupportAccess = true;
+ const canAccessSupport = hasSupportAccess(profile);
if (icon === "subscription" && isFemale) {
return
;
}
- if (icon === "support" && !hasSupportAccess) {
+ if (icon === "support" && !canAccessSupport) {
return
;
}
@@ -301,7 +305,9 @@ export function NavigationButton({
const resolvedHelpDescription =
helpDescription ??
(icon === "document"
- ? (t as any)["Taking this test is not mandatory, but it will help you better search for a spouse."]
+ ? (t as any)[
+ "Taking this test is not mandatory, but it will help you better search for a spouse."
+ ]
: undefined);
if (icon === "more") {
@@ -331,23 +337,25 @@ export function NavigationButton({
{isDropdownOpen && (
-
{
- setIsDropdownOpen(false);
- setIsSupportOpen(true);
- }}
- className="flex w-full items-center gap-3 px-4 py-3 text-start text-sm font-semibold text-gray-700 hover:bg-gray-50 cursor-pointer border-0 bg-transparent"
- >
-
- {t["Support"]}
-
+ {canAccessSupport && (
+
{
+ setIsDropdownOpen(false);
+ setIsSupportOpen(true);
+ }}
+ className="flex w-full items-center gap-3 px-4 py-3 text-start text-sm font-semibold text-gray-700 hover:bg-gray-50 cursor-pointer border-0 bg-transparent"
+ >
+
+ {t["Support"]}
+
+ )}
+
+
+ {/* Header */}
+
+
+
+ {/* Progress Section */}
+
+
+ {/* Question Section */}
+ {variant === "questions" ? (
+
+ ) : (
+
+
+
+
+
+ {[1, 2, 3].map((i) => (
+
+ ))}
+
+
+ )}
+
+
+ >
+ );
+ }
+
return (
<>
diff --git a/src/components/Componentes/progress-helper.ts b/src/components/Componentes/progress-helper.ts
index 8fc2e4a..0ba8c71 100644
--- a/src/components/Componentes/progress-helper.ts
+++ b/src/components/Componentes/progress-helper.ts
@@ -94,6 +94,28 @@ export function getLocalSectionProgress(
try {
if (typeof window === "undefined") return null;
+ if (item.slug === "personality_test" || item.slug === "glasser_5_needs_test") {
+ const draftKey = `marriage:tests:${item.slug}:draft`;
+ const draftRaw = window.localStorage.getItem(draftKey);
+ if (draftRaw) {
+ try {
+ const parsed = JSON.parse(draftRaw);
+ if (parsed && typeof parsed.answers === "object" && parsed.answers !== null) {
+ const answeredCount = Object.keys(parsed.answers).length;
+ const totalCount = item.slug === "personality_test" ? 187 : 35;
+ return Math.max(
+ 0,
+ Math.min(
+ 100,
+ Math.round((answeredCount / totalCount) * 100),
+ ),
+ );
+ }
+ } catch {}
+ }
+ return null;
+ }
+
const fields: Record[] = [];
let hasFoundStorage = false;
diff --git a/src/components/Componentes/question-birthplace.tsx b/src/components/Componentes/question-birthplace.tsx
index 7d806ff..dc0c42c 100644
--- a/src/components/Componentes/question-birthplace.tsx
+++ b/src/components/Componentes/question-birthplace.tsx
@@ -371,9 +371,20 @@ export function QuestionBirthplace({
fill="none"
className="shrink-0"
>
-
+
-
+
{locale === "fa" ? "خودکار" : "Auto"}
>
diff --git a/src/components/Componentes/question-file.tsx b/src/components/Componentes/question-file.tsx
index 7ccc5ce..61981c1 100644
--- a/src/components/Componentes/question-file.tsx
+++ b/src/components/Componentes/question-file.tsx
@@ -331,32 +331,30 @@ export function QuestionFile({
)}
+ ) : /* ────── DEFAULT EMPTY STATE ────── */
+ isPending ? (
+
) : (
- /* ────── DEFAULT EMPTY STATE ────── */
- isPending ? (
-
- ) : (
- <>
-
-
- {selectedFileName ?? "upload certificates"}
+ <>
+
+
+ {selectedFileName ?? "upload certificates"}
+
+ {uploadTmpMediaMutation.isError ? (
+
+ Upload failed. Please try again.
- {uploadTmpMediaMutation.isError ? (
-
- Upload failed. Please try again.
-
- ) : acceptedFiles ? (
-
- {acceptedFiles}
-
- ) : null}
- >
- )
+ ) : acceptedFiles ? (
+
+ {acceptedFiles}
+
+ ) : null}
+ >
)}
diff --git a/src/components/Componentes/question-number.tsx b/src/components/Componentes/question-number.tsx
index 6df31a9..990f972 100644
--- a/src/components/Componentes/question-number.tsx
+++ b/src/components/Componentes/question-number.tsx
@@ -365,8 +365,9 @@ export default function QuestionNumber({
{isOutOfRange ? (
- {t["The value entered seems incorrect. Please provide a realistic value."] ||
- `Please enter a value between ${min} and ${max}`}
+ {t[
+ "The value entered seems incorrect. Please provide a realistic value."
+ ] || `Please enter a value between ${min} and ${max}`}
) : null}
@@ -416,8 +417,9 @@ export default function QuestionNumber({
/>
{isOutOfRange ? (
- {t["The value entered seems incorrect. Please provide a realistic value."] ||
- `Please enter a value between ${min} and ${max}`}
+ {t[
+ "The value entered seems incorrect. Please provide a realistic value."
+ ] || `Please enter a value between ${min} and ${max}`}
) : null}
diff --git a/src/components/Componentes/question-section-flow.tsx b/src/components/Componentes/question-section-flow.tsx
index 4811fab..adc1dd4 100644
--- a/src/components/Componentes/question-section-flow.tsx
+++ b/src/components/Componentes/question-section-flow.tsx
@@ -172,8 +172,12 @@ function SectionFlowContent({
{isUnder27
- ? t["To preserve your peace of mind, security, and dignity, the acquaintance process on our platform follows authentic and respectful family traditions. Having a trusted person (preferably a father or mother) as a representative, in addition to reflecting your noble family background, encourages the other party to step forward with full seriousness, respect, and confidence."]
- : t["Our goal is to establish lasting bonds based on mutual trust. Although registering a representative is not mandatory for you, introducing a trusted person (such as a father, mother, or family elder) demonstrates your transparency and serious intent for marriage. Profiles that feature a trusted representative command significantly higher credibility and provide greater peace of mind to the other party's family."]}
+ ? t[
+ "To preserve your peace of mind, security, and dignity, the acquaintance process on our platform follows authentic and respectful family traditions. Having a trusted person (preferably a father or mother) as a representative, in addition to reflecting your noble family background, encourages the other party to step forward with full seriousness, respect, and confidence."
+ ]
+ : t[
+ "Our goal is to establish lasting bonds based on mutual trust. Although registering a representative is not mandatory for you, introducing a trusted person (such as a father, mother, or family elder) demonstrates your transparency and serious intent for marriage. Profiles that feature a trusted representative command significantly higher credibility and provide greater peace of mind to the other party's family."
+ ]}
)}
diff --git a/src/components/Componentes/question-text.tsx b/src/components/Componentes/question-text.tsx
index 0864b56..c145d66 100644
--- a/src/components/Componentes/question-text.tsx
+++ b/src/components/Componentes/question-text.tsx
@@ -133,7 +133,8 @@ export default function QuestionText({
className="h-[18px] w-[18px] shrink-0 rounded border-[#D0D5DD] text-[#F2465F] focus:ring-[#F2465F] accent-[#F2465F] cursor-pointer"
/>
- {t["This is not a priority for me"] ?? "This is not a priority for me"}
+ {t["This is not a priority for me"] ??
+ "This is not a priority for me"}
diff --git a/src/components/Componentes/question-title.tsx b/src/components/Componentes/question-title.tsx
index f0ac019..5a671c4 100644
--- a/src/components/Componentes/question-title.tsx
+++ b/src/components/Componentes/question-title.tsx
@@ -80,8 +80,12 @@ export function QuestionTitle({ question, className }: QuestionTitleProps) {
onClose={() => setIsHelpOpen(false)}
description={(() => {
const fullPath = "questions." + question.tooltip;
- const englishVal = (pathMap as Record)[fullPath];
- return englishVal ? (t as any)[englishVal] || englishVal : question.tooltip;
+ const englishVal = (pathMap as Record)[
+ fullPath
+ ];
+ return englishVal
+ ? (t as any)[englishVal] || englishVal
+ : question.tooltip;
})()}
/>
>
diff --git a/src/components/Componentes/required-steps-card.tsx b/src/components/Componentes/required-steps-card.tsx
index f1899c1..bfea451 100644
--- a/src/components/Componentes/required-steps-card.tsx
+++ b/src/components/Componentes/required-steps-card.tsx
@@ -142,8 +142,12 @@ export default function RequiredStepsCard({
{isCompleted
- ? t["You can now submit your request so we can start finding the right match for you"]
- : t["Please complete the required information so we can find suitable matches for you"]}
+ ? t[
+ "You can now submit your request so we can start finding the right match for you"
+ ]
+ : t[
+ "Please complete the required information so we can find suitable matches for you"
+ ]}
diff --git a/src/components/Componentes/silent-reloader.tsx b/src/components/Componentes/silent-reloader.tsx
new file mode 100644
index 0000000..71fe8aa
--- /dev/null
+++ b/src/components/Componentes/silent-reloader.tsx
@@ -0,0 +1,61 @@
+"use client";
+
+import { useQueryClient } from "@tanstack/react-query";
+import { type ReactNode, useEffect } from "react";
+
+type SilentReloaderProps = {
+ children: ReactNode;
+};
+
+export default function SilentReloader({ children }: SilentReloaderProps) {
+ const queryClient = useQueryClient();
+
+ useEffect(() => {
+ if (typeof window !== "undefined") {
+ (window as any).__queryClient = queryClient;
+ }
+
+ let lastReloadTime = 0;
+ const handleReload = () => {
+ const now = Date.now();
+ if (now - lastReloadTime < 5000) {
+ return;
+ }
+ lastReloadTime = now;
+ // Invalidate all active queries so fresh data is reloaded from backend
+ queryClient.invalidateQueries();
+ };
+
+ const handleVisibilityChange = () => {
+ if (document.visibilityState === "visible") {
+ handleReload();
+ }
+ };
+
+ const handlePageShow = () => {
+ handleReload();
+ };
+
+ window.addEventListener("focus", handleReload);
+ window.addEventListener("pageshow", handlePageShow);
+ document.addEventListener("visibilitychange", handleVisibilityChange);
+
+ // Listen for Flutter response events if available
+ const win = window as any;
+ const unbindFlutter =
+ typeof win.addFlutterResponseListener === "function"
+ ? win.addFlutterResponseListener(() => handleReload())
+ : null;
+
+ return () => {
+ window.removeEventListener("focus", handleReload);
+ window.removeEventListener("pageshow", handlePageShow);
+ document.removeEventListener("visibilitychange", handleVisibilityChange);
+ if (typeof unbindFlutter === "function") {
+ unbindFlutter();
+ }
+ };
+ }, [queryClient]);
+
+ return <>{children}>;
+}
diff --git a/src/components/Componentes/support-access.ts b/src/components/Componentes/support-access.ts
new file mode 100644
index 0000000..1ad455e
--- /dev/null
+++ b/src/components/Componentes/support-access.ts
@@ -0,0 +1,23 @@
+import type { MarriageProfile } from "@/hooks/marriage/types";
+
+/**
+ * Support is unavailable until a user has finished their profile. Women gain
+ * access on the waiting screen; men additionally need a currently valid
+ * subscription.
+ */
+export function hasSupportAccess(profile?: MarriageProfile): boolean {
+ if (!profile || !["waiting", "in_case", "matched"].includes(profile.status)) {
+ return false;
+ }
+
+ if (profile.gender === "female") {
+ return true;
+ }
+
+ const subscription = profile.active_subscription;
+ return (
+ profile.gender === "male" &&
+ subscription?.is_active === true &&
+ subscription.is_valid === true
+ );
+}
diff --git a/src/components/Componentes/support-sheet.tsx b/src/components/Componentes/support-sheet.tsx
index cfec2ea..a490c2f 100644
--- a/src/components/Componentes/support-sheet.tsx
+++ b/src/components/Componentes/support-sheet.tsx
@@ -137,7 +137,11 @@ export function SupportSheet({ isOpen, onClose }: SupportSheetProps) {
- {t["If you encounter any issues, please feel free to contact our support specialists in WhatsApp"]}
+ {
+ t[
+ "If you encounter any issues, please feel free to contact our support specialists in WhatsApp"
+ ]
+ }
diff --git a/src/components/Componentes/swipe-button.tsx b/src/components/Componentes/swipe-button.tsx
index 50c9f03..424c0fd 100644
--- a/src/components/Componentes/swipe-button.tsx
+++ b/src/components/Componentes/swipe-button.tsx
@@ -63,11 +63,7 @@ export function SwipeButton({
}
// Single Button full width
- return (
-
- {actionButton}
-
- );
+ return {actionButton}
;
}
export default SwipeButton;
diff --git a/src/components/Componentes/test-intro-page.tsx b/src/components/Componentes/test-intro-page.tsx
index 1b787de..656cfe1 100644
--- a/src/components/Componentes/test-intro-page.tsx
+++ b/src/components/Componentes/test-intro-page.tsx
@@ -1,6 +1,6 @@
"use client";
-import Image from "next/image";
+import type { ReactNode } from "react";
import { IoTimeOutline } from "react-icons/io5";
import Button from "./button";
@@ -8,39 +8,38 @@ type TestIntroPageProps = {
title: string;
estimateTime: string;
description: string;
- bulletPoints: readonly string[];
+ bulletPoints?: readonly string[];
disclaimerText: string;
startLabel: string;
onStart: () => void;
+ children?: ReactNode;
};
export default function TestIntroPage({
title,
estimateTime,
description,
- bulletPoints,
+ bulletPoints = [],
disclaimerText,
startLabel,
onStart,
+ children,
}: TestIntroPageProps) {
return (
{/* Hero Image */}
-
-
+
{/* Disclaimer Card */}
@@ -60,7 +59,9 @@ export default function TestIntroPage({
{/* Bullet Points */}
- {bulletPoints.length > 0 ? (
+ {children ? (
+ {children}
+ ) : bulletPoints.length > 0 ? (
{bulletPoints.map((point, index) => (
-
- {startLabel}
-
+ {startLabel}
);
diff --git a/src/components/Componentes/test-questions-flow.tsx b/src/components/Componentes/test-questions-flow.tsx
index b3042b9..0f9b188 100644
--- a/src/components/Componentes/test-questions-flow.tsx
+++ b/src/components/Componentes/test-questions-flow.tsx
@@ -1,13 +1,14 @@
"use client";
import { useRouter } from "next/navigation";
-import { useState } from "react";
-import { GoArrowLeft, GoCheck } from "react-icons/go";
-import { IoInformation } from "react-icons/io5";
+import { useEffect, useState } from "react";
+import { GoArrowLeft } from "react-icons/go";
+
import Button from "./button";
+import { ExplanationUiFont } from "./explanation-ui-font";
import NavigationButton from "./navigation-button";
-import StickyHeader from "./sticky-header";
import { PageBackground } from "./page-background";
+import StickyHeader from "./sticky-header";
import TestLoadingScreen from "./test-loading-screen";
export type QuestionOption = {
@@ -32,8 +33,73 @@ type TestQuestionsFlowProps = {
stepsLabel?: string;
onFinish?: (answers: Record) => void;
onClose?: () => void;
+ draftStorageKey?: string;
+};
+type StoredTestDraft = {
+ answers?: Record;
+ currentIndex?: number;
};
+function getStoredDraft(
+ storageKey: string | undefined,
+ totalQuestions: number,
+) {
+ if (!storageKey || typeof window === "undefined")
+ return { answers: {}, currentIndex: 0 };
+ try {
+ const rawDraft = window.localStorage.getItem(storageKey);
+ if (!rawDraft) return { answers: {}, currentIndex: 0 };
+ const draft = JSON.parse(rawDraft) as StoredTestDraft;
+ return {
+ answers:
+ draft.answers && typeof draft.answers === "object" ? draft.answers : {},
+ currentIndex: Number.isInteger(draft.currentIndex)
+ ? Math.min(
+ Math.max(draft.currentIndex ?? 0, 0),
+ Math.max(totalQuestions - 1, 0),
+ )
+ : 0,
+ };
+ } catch {
+ return { answers: {}, currentIndex: 0 };
+ }
+}
+
+function formatOptionLabel(str: string): string {
+ if (!str) return str;
+
+ let result = str.trim();
+
+ // Remove trailing numbers in parentheses, e.g., (1) or (۱)
+ result = result.replace(/\s*\([\d۱۲۳۴۵۶۷۸۹۰]+\)\s*$/, "");
+
+ if (result.startsWith(')')) {
+ result = result.slice(1).trim();
+ }
+ if (result.endsWith('(')) {
+ result = result.slice(0, -1).trim();
+ }
+
+ let openCount = 0;
+ let closeCount = 0;
+ for (let i = 0; i < result.length; i++) {
+ if (result[i] === '(') openCount++;
+ else if (result[i] === ')') closeCount++;
+ }
+
+ if (openCount > closeCount) {
+ result = result + ')'.repeat(openCount - closeCount);
+ } else if (closeCount > openCount) {
+ result = '('.repeat(closeCount - openCount) + result;
+ }
+
+ if (result.length > 0) {
+ result = result.charAt(0).toUpperCase() + result.slice(1);
+ }
+
+ return result;
+}
+
export default function TestQuestionsFlow({
title,
questions,
@@ -44,10 +110,15 @@ export default function TestQuestionsFlow({
stepsLabel = "Steps",
onFinish,
onClose,
+ draftStorageKey,
}: TestQuestionsFlowProps) {
const router = useRouter();
- const [currentIndex, setCurrentIndex] = useState(0);
- const [answers, setAnswers] = useState>({});
+ const [currentIndex, setCurrentIndex] = useState(
+ () => getStoredDraft(draftStorageKey, questions.length).currentIndex,
+ );
+ const [answers, setAnswers] = useState>(
+ () => getStoredDraft(draftStorageKey, questions.length).answers,
+ );
const [isSubmitting, setIsSubmitting] = useState(false);
const currentQuestion = questions[currentIndex] ?? questions[0];
@@ -56,6 +127,15 @@ export default function TestQuestionsFlow({
const selectedValue = currentQuestion
? answers[currentQuestion.id]
: undefined;
+ useEffect(() => {
+ if (!draftStorageKey) return;
+ try {
+ window.localStorage.setItem(
+ draftStorageKey,
+ JSON.stringify({ answers, currentIndex }),
+ );
+ } catch {}
+ }, [answers, currentIndex, draftStorageKey]);
const handleOptionSelect = (value: string | number) => {
if (!currentQuestion) return;
@@ -85,6 +165,7 @@ export default function TestQuestionsFlow({
if (onFinish) {
await onFinish(answers);
}
+ if (draftStorageKey) window.localStorage.removeItem(draftStorageKey);
router.back();
} catch {
// ignore
@@ -107,6 +188,9 @@ export default function TestQuestionsFlow({
}
const progressPercent = ((currentIndex + 1) / totalQuestions) * 100;
+ const areAllQuestionsAnswered = questions.every(
+ (question) => answers[question.id] !== undefined,
+ );
return (
<>
@@ -156,52 +240,77 @@ export default function TestQuestionsFlow({
{/* Question Section */}
{/* Question Title */}
-
- {currentQuestion.text}{" "}
-
-
-
+
+ {currentQuestion.text}
{/* Answer Options Stack */}
-
- {currentQuestion.options.map((option, idx) => {
- const isSelected = selectedValue === option.value;
-
- return (
-
handleOptionSelect(option.value)}
- className={`w-full rounded-[16px] px-4 py-4 flex items-center gap-3.5 text-left transition-all duration-200 cursor-pointer ${
- isSelected
- ? "bg-[#333336] text-white shadow-md"
- : "bg-[#EFEFEF] text-[#1B1B1B] hover:bg-[#E7E7E7]"
- }`}
- >
- {/* Circle Icon */}
-
- {isSelected ? (
-
- ) : null}
-
-
- {/* Option Text */}
-
- {option.label}
-
-
- );
- })}
-
+ {(() => {
+ const options = currentQuestion.options || [];
+
+ return (
+
+ {options.map((option) => {
+ const isSelected = selectedValue === option.value;
+
+ return (
+
handleOptionSelect(option.value)}
+ className={[
+ "cursor-pointer rounded-[16px] font-semibold text-[15px] transition-all duration-200 active:scale-[0.99] flex items-center gap-3",
+ "w-full px-5 py-4 text-start leading-snug",
+ isSelected
+ ? "bg-[#F0445B] text-white shadow-[0_8px_20px_rgba(240,68,91,0.25)]"
+ : "bg-[#FAFAFA] text-[#181818] hover:bg-white shadow-[0_2px_6px_rgba(0,0,0,0.03)] border border-[#F0EDED]",
+ ].join(" ")}
+ >
+
+ {isSelected && (
+
+ )}
+
+
+ {option.label.includes(" - ") ? (
+ (() => {
+ const parts = option.label.split(" - ");
+ const title = formatOptionLabel(parts[0]);
+ const description = formatOptionLabel(parts.slice(1).join(" - "));
+ return (
+
+ {title}
+
+ {description}
+
+
+ );
+ })()
+ ) : (
+ {formatOptionLabel(option.label)}
+ )}
+
+ );
+ })}
+
+ );
+ })()}
{/* Bottom Actions Bar */}
@@ -220,8 +329,12 @@ export default function TestQuestionsFlow({
{/* Finish Button on Last Question */}
{isLastQuestion ? (
{finishLabel}
diff --git a/src/data/cattell-fallback.ts b/src/data/cattell-fallback.ts
index a427181..ede0fff 100644
--- a/src/data/cattell-fallback.ts
+++ b/src/data/cattell-fallback.ts
@@ -162,7 +162,7 @@ export const cattellFallbackQuestions: CattellFallbackQuestion[] = [
{
question_number: 27,
text: "من تعیین شده ام برای انجام",
- options: [")فقط چند عملکرد (تا 5", "چندین عملکرد", "تعداد زیادی توابع"],
+ options: ["فقط چند عملکرد (تا 5)", "چندین عملکرد", "تعداد زیادی توابع"],
},
{
question_number: 28,
diff --git a/src/hooks/marriage/use-marriage-config.ts b/src/hooks/marriage/use-marriage-config.ts
index 51d9ea1..4d03281 100644
--- a/src/hooks/marriage/use-marriage-config.ts
+++ b/src/hooks/marriage/use-marriage-config.ts
@@ -18,7 +18,5 @@ export function useMarriageConfigQuery() {
return useQuery({
queryKey: ["marriage", "config"],
queryFn: getMarriageConfig,
- staleTime: 5 * 60 * 1000, // 5 minutes cache
- refetchOnWindowFocus: false,
});
}
diff --git a/src/lib/get-submit-path.ts b/src/lib/get-submit-path.ts
index 1358a8b..649e45f 100644
--- a/src/lib/get-submit-path.ts
+++ b/src/lib/get-submit-path.ts
@@ -4,7 +4,9 @@ import {
isWithinMatchStartGrace,
} from "./match-start-grace";
-export function getSubmitPath(profile: MarriageProfileResponse | undefined): string {
+export function getSubmitPath(
+ profile: MarriageProfileResponse | undefined,
+): string {
clearLegacyMatchSubmittedFlag();
if (!profile) {
diff --git a/src/translations/locales/en.json b/src/translations/locales/en.json
index b0e5fc9..7a6bc76 100644
--- a/src/translations/locales/en.json
+++ b/src/translations/locales/en.json
@@ -758,5 +758,51 @@
"{completed} of {total} required steps completed": "{completed} of {total} required steps completed",
"{days} days remaining of your subscription.": "{days} days remaining of your subscription.",
"⚠️ This section is completely confidential and is only used for matching and review by advisors.": "⚠️ This section is completely confidential and is only used for matching and review by advisors.",
- "Please select the reason for cancellation:": "Please select the reason for cancellation:"
+ "Please select the reason for cancellation:": "Please select the reason for cancellation:",
+ "Marriage advisors": "Marriage advisors",
+ "Dr. Hasti Masoudi": "Dr. Hasti Masoudi",
+ "Specialist in clinical psychology": "Specialist in clinical psychology",
+ "Personal Development": "Personal Development",
+ "Family Counselor": "Family Counselor",
+ "Relationship Coach": "Relationship Coach",
+ "Dr. Ali Rezaei": "Dr. Ali Rezaei",
+ "Family & marriage counselor": "Family & marriage counselor",
+ "Premarital Counselling": "Premarital Counselling",
+ "Conflict Resolution": "Conflict Resolution",
+ "Behavioral Therapy": "Behavioral Therapy",
+ "Dr. Sara Alavi": "Dr. Sara Alavi",
+ "Relationship & intimacy coach": "Relationship & intimacy coach",
+ "Emotional Health": "Emotional Health",
+ "Self-Awareness": "Self-Awareness",
+ "Communication Skills": "Communication Skills",
+ "Text": "Text",
+ "Voice Call": "Voice Call",
+ "Manager": "Manager",
+ "Team Manager": "Team Manager",
+ "Science": "Science",
+ "Key Applications of the Cattell Test in Partner Matching": "Key Applications of the Cattell Test in Partner Matching",
+ "Understanding Personality Traits": "Understanding Personality Traits",
+ "Helps provide an overall picture of traits such as sociability, independence, emotional sensitivity, and interpersonal style.": "Helps provide an overall picture of traits such as sociability, independence, emotional sensitivity, and interpersonal style.",
+ "Assessing Communication Style": "Assessing Communication Style",
+ "Shows how a person typically communicates, expresses emotions, and builds closeness in relationships.": "Shows how a person typically communicates, expresses emotions, and builds closeness in relationships.",
+ "Understanding Responses to Stress and Conflict": "Understanding Responses to Stress and Conflict",
+ "Offers insight into emotional stability, tension levels, and how a person may react in difficult or stressful situations.": "Offers insight into emotional stability, tension levels, and how a person may react in difficult or stressful situations.",
+ "Assessing Independence and Decision-Making": "Assessing Independence and Decision-Making",
+ "Helps identify the person’s level of independence, assertiveness, and preference for individual or shared decision-making.": "Helps identify the person’s level of independence, assertiveness, and preference for individual or shared decision-making.",
+ "Identifying Potential Differences and Challenges": "Identifying Potential Differences and Challenges",
+ "Comparing two individuals’ results can highlight personality differences that may require attention in a long-term relationship.": "Comparing two individuals’ results can highlight personality differences that may require attention in a long-term relationship.",
+ "Supporting Better Match Recommendations": "Supporting Better Match Recommendations",
+ "Alongside interviews and other relationship criteria, personality assessment can help make the matching process more targeted and improve the evaluation of compatibility.": "Alongside interviews and other relationship criteria, personality assessment can help make the matching process more targeted and improve the evaluation of compatibility.",
+ "Understanding Core Psychological Needs": "Understanding Core Psychological Needs",
+ "Helps identify the importance of the five basic needs—love and belonging, power, freedom, fun, and survival—in each person’s life.": "Helps identify the importance of the five basic needs—love and belonging, power, freedom, fun, and survival—in each person’s life.",
+ "Recognizing Relationship Expectations": "Recognizing Relationship Expectations",
+ "Provides insight into what each person expects from a relationship, such as closeness, independence, security, achievement, or shared enjoyment.": "Provides insight into what each person expects from a relationship, such as closeness, independence, security, achievement, or shared enjoyment.",
+ "Assessing Personality Compatibility": "Assessing Personality Compatibility",
+ "Helps compare personality traits, behavioral tendencies, and interaction styles to identify areas of compatibility between two individuals.": "Helps compare personality traits, behavioral tendencies, and interaction styles to identify areas of compatibility between two individuals.",
+ "Identifying Potential Sources of Conflict": "Identifying Potential Sources of Conflict",
+ "Differences in needs or personality styles can highlight areas where misunderstandings, tension, or disagreements may arise in the relationship.": "Differences in needs or personality styles can highlight areas where misunderstandings, tension, or disagreements may arise in the relationship.",
+ "Improving Mutual Understanding": "Improving Mutual Understanding",
+ "Helps individuals better understand their own needs as well as their partner’s motivations, preferences, and emotional priorities.": "Helps individuals better understand their own needs as well as their partner’s motivations, preferences, and emotional priorities.",
+ "Supporting More Suitable Match Recommendations": "Supporting More Suitable Match Recommendations",
+ "Combining needs and personality assessments with interviews and other marriage criteria can help make partner recommendations more personalized and well-matched.": "Combining needs and personality assessments with interviews and other marriage criteria can help make partner recommendations more personalized and well-matched."
}
diff --git a/src/translations/locales/fa.json b/src/translations/locales/fa.json
index 832a22d..a47728c 100644
--- a/src/translations/locales/fa.json
+++ b/src/translations/locales/fa.json
@@ -758,5 +758,51 @@
"{completed} of {total} required steps completed": "{completed} از {total} مرحله ضروری کامل شده است",
"{days} days remaining of your subscription.": "{days} روز از اعتبار اشتراک شما باقی مانده است.",
"⚠️ This section is completely confidential and is only used for matching and review by advisors.": "⚠️ این بخش کاملاً محرمانه است و فقط برای مچینگ و بررسی کارشناسان استفاده میشود.",
- "Please select the reason for cancellation:": "Please select the reason for cancellation:"
+ "Please select the reason for cancellation:": "Please select the reason for cancellation:",
+ "Marriage advisors": "مشاوران ازدواج",
+ "Dr. Hasti Masoudi": "دکتر هستی مسعودی",
+ "Specialist in clinical psychology": "متخصص روانشناسی بالینی",
+ "Personal Development": "رشد فردی",
+ "Family Counselor": "مشاور خانواده",
+ "Relationship Coach": "مربی روابط",
+ "Dr. Ali Rezaei": "دکتر علی رضایی",
+ "Family & marriage counselor": "مشاور خانواده و ازدواج",
+ "Premarital Counselling": "مشاوره پیش از ازدواج",
+ "Conflict Resolution": "حل تعارضات",
+ "Behavioral Therapy": "رفتار درمانی",
+ "Dr. Sara Alavi": "دکتر سارا علوی",
+ "Relationship & intimacy coach": "مربی روابط و صمیمیت",
+ "Emotional Health": "سلامت عاطفی",
+ "Self-Awareness": "خودآگاهی",
+ "Communication Skills": "مهارتهای ارتباطی",
+ "Text": "متنی",
+ "Voice Call": "تماس صوتی",
+ "Manager": "مدیر",
+ "Team Manager": "مدیر تیم",
+ "Science": "علمی",
+ "Key Applications of the Cattell Test in Partner Matching": "کاربردهای کلیدی آزمون کتل در زوجیابی",
+ "Understanding Personality Traits": "شناخت ویژگیهای شخصیتی",
+ "Helps provide an overall picture of traits such as sociability, independence, emotional sensitivity, and interpersonal style.": "به ارائه تصویری کلی از ویژگیهایی مانند اجتماعی بودن، استقلال، حساسیت عاطفی و سبک ارتباطی کمک میکند.",
+ "Assessing Communication Style": "ارزیابی سبک ارتباطی",
+ "Shows how a person typically communicates, expresses emotions, and builds closeness in relationships.": "نشان میدهد که فرد معمولاً چگونه ارتباط برقرار میکند، احساسات خود را ابراز میکند و در روابط صمیمیت ایجاد میکند.",
+ "Understanding Responses to Stress and Conflict": "درک واکنشها به استرس و تعارض",
+ "Offers insight into emotional stability, tension levels, and how a person may react in difficult or stressful situations.": "بینشی در مورد ثبات عاطفی، میزان تنش و نحوه واکنش فرد در موقعیتهای دشوار یا استرسزا ارائه میدهد.",
+ "Assessing Independence and Decision-Making": "ارزیابی استقلال و تصمیمگیری",
+ "Helps identify the person’s level of independence, assertiveness, and preference for individual or shared decision-making.": "به شناسایی سطح استقلال، قاطعیت و تمایل فرد به تصمیمگیری فردی یا مشترک کمک میکند.",
+ "Identifying Potential Differences and Challenges": "شناسایی تفاوتها و چالشهای بالقوه",
+ "Comparing two individuals’ results can highlight personality differences that may require attention in a long-term relationship.": "مقایسه نتایج دو فرد میتواند تفاوتهای شخصیتی را نشان دهد که ممکن است در یک رابطه طولانیمدت نیاز به توجه داشته باشد.",
+ "Supporting Better Match Recommendations": "پشتیبانی از پیشنهادهای همسریابی بهتر",
+ "Alongside interviews and other relationship criteria, personality assessment can help make the matching process more targeted and improve the evaluation of compatibility.": "در کنار مصاحبهها و سایر معیارهای رابطه، ارزیابی شخصیت میتواند به هدفمندتر شدن فرآیند همسریابی و بهبود ارزیابی سازگاری کمک کند.",
+ "Understanding Core Psychological Needs": "درک نیازهای روانی اساسی",
+ "Helps identify the importance of the five basic needs—love and belonging, power, freedom, fun, and survival—in each person’s life.": "به شناسایی اهمیت پنج نیاز اساسی — عشق و احساس تعلق، قدرت، آزادی، تفریح و بقا — در زندگی هر فرد کمک میکند.",
+ "Recognizing Relationship Expectations": "شناخت انتظارات از رابطه",
+ "Provides insight into what each person expects from a relationship, such as closeness, independence, security, achievement, or shared enjoyment.": "بینشی در مورد آنچه هر فرد از رابطه انتظار دارد، مانند صمیمیت، استقلال، امنیت، موفقیت یا لذت مشترک، ارائه میدهد.",
+ "Assessing Personality Compatibility": "ارزیابی سازگاری شخصیتی",
+ "Helps compare personality traits, behavioral tendencies, and interaction styles to identify areas of compatibility between two individuals.": "به مقایسه ویژگیهای شخصیتی، گرایشهای رفتاری و سبکهای تعاملی برای شناسایی زمینههای سازگاری بین دو فرد کمک میکند.",
+ "Identifying Potential Sources of Conflict": "شناسایی منابع بالقوه تعارض",
+ "Differences in needs or personality styles can highlight areas where misunderstandings, tension, or disagreements may arise in the relationship.": "تفاوت در نیازها یا سبکهای شخصیتی میتواند زمینههایی را نشان دهد که در آنها ممکن است سوءتفاهم، تنش یا اختلاف در رابطه ایجاد شود.",
+ "Improving Mutual Understanding": "بهبود درک متقابل",
+ "Helps individuals better understand their own needs as well as their partner’s motivations, preferences, and emotional priorities.": "به افراد کمک میکند تا نیازهای خود و همچنین انگیزهها، ترجیحات و اولویتهای عاطفی شریک زندگی خود را بهتر درک کنند.",
+ "Supporting More Suitable Match Recommendations": "پشتیبانی از پیشنهادهای همسریابی مناسبتر",
+ "Combining needs and personality assessments with interviews and other marriage criteria can help make partner recommendations more personalized and well-matched.": "ترکیب ارزیابی نیازها و شخصیت با مصاحبهها و سایر معیارهای ازدواج میتواند به شخصیسازی و هماهنگی بیشتر پیشنهادهای شریک زندگی کمک کند."
}
diff --git a/src/translations/locales/ru.json b/src/translations/locales/ru.json
index 0e57ebe..913f89e 100644
--- a/src/translations/locales/ru.json
+++ b/src/translations/locales/ru.json
@@ -1,289 +1,762 @@
{
+ "### Family Religious Atmosphere Options * **Religious and Strictly Observant:** This specifies a family highly dedicated to performing all **obligatory duties**, strictly maintaining **religious boundaries** (such as Mahram rules), and upholding **religious rituals and teachings** across all aspects of life. * **Religious (Observant of Obligations):** This indicates a family committed to core **religious duties** (such as prayer and fasting) and **Islamic ethics**, living within the standard frameworks of a religious society. * **Traditional (Respectful of Religious Values):** This describes a family that holds devotion to moral values and **respects religion**, but may not strictly execute every specific **religious law** or obligation. * **Non-religious / Secular:** This represents a family where **religious rituals and frameworks** do not significantly influence their daily **lifestyle, relationships, or decisions**, despite holding a general respect for religion.": "### Варианты религиозной атмосферы в семье * **Религиозные и строго соблюдающие**: это означает, что семья очень предана выполнению всех **обязательных обязанностей**, строго соблюдает **религиозные границы** (например, правила Махрама) и поддерживает **религиозные ритуалы и учения** во всех аспектах жизни. * **Религиозность (соблюдение обязательств):** Это указывает на семью, приверженную основным **религиозным обязанностям** (таким как молитва и пост) и **исламскую этику**, живущую в стандартных рамках религиозного общества. * **Традиционный (с уважением к религиозным ценностям):** описывает семью, которая придерживается моральных ценностей и **уважает религию**, но не может строго соблюдать каждый конкретный **религиозный закон** или обязательства. * **Нерелигиозные/светские.** Это семья, в которой **религиозные ритуалы и рамки** не оказывают существенного влияния на их повседневный **образ жизни, отношения или решения**, несмотря на общее уважение к религии.",
+ "(Complete Required Forms)": "(Заполните обязательные формы)",
+ "(after 2 days)": "(через 2 дня)",
+ "(currently living in)": "(в настоящее время проживает)",
+ "+44 7911 123456": "+44 7911 123456",
+ ".jpeg": ".jpeg",
+ ".jpg": ".jpg",
+ ".pdf": ".pdf",
+ ".png": ".png",
+ "1. Eligibility and Membership Requirements": "1. Требования к участию и членству",
+ "160 to 170": "от 160 до 170",
+ "170 to 180": "от 170 до 180",
+ "175": "175",
+ "180 to 190": "от 180 до 190",
+ "2": "2",
+ "2 minutes": "2 минуты",
+ "2. Privacy and Data Management": "2. Конфиденциальность и управление данными",
+ "25-30": "25-30",
+ "3 minutes": "3 минуты",
+ "3 years": "3 года",
+ "3500 GBP, 4000 USD": "3500 фунтов стерлингов, 4000 долларов США",
+ "4 minutes": "4 минуты",
+ "5 minutes": "5 минут",
+ "50 Coins": "50 монет",
+ "6 minutes": "6 минут",
+ "70": "70",
+ "8 minutes": "8 минут",
+ "A Path to Heavenly Marriage": "Путь к небесному браку",
+ "A precise address is not required. Just the general area of where you live is sufficient, such as the city, region, neighborhood, or nearest major city.": "Точный адрес не требуется. Достаточно указать только общую территорию вашего проживания, например город, регион, район или ближайший крупный город.",
+ "A suitable match has been found for you. If approved, your profile will be evaluated to proceed with the introduction process.": "Для вас найден подходящий вариант. В случае одобрения ваш профиль будет оценен для продолжения процесса внедрения.",
+ "Ability to Support Marriage Expenses": "Возможность покрыть расходы на брак",
+ "Able to support the main portion of expenses": "Возможность покрыть большую часть расходов",
+ "Above 190": "Выше 190",
+ "Accept": "Принимать",
+ "Accept Profile": "Принять профиль",
+ "Accept if not hindering healthy life": "Принимайте, если не мешает здоровой жизни",
+ "Accept in special conditions": "Принимаю на особых условиях",
+ "Acceptance depends on the type and extent of communication, custody conditions, and mutual trust.": "Принятие зависит от типа и степени общения, условий содержания и взаимного доверия.",
+ "Acceptance of Children from Previous Marriage": "Принятие детей от предыдущего брака",
+ "Acceptance of Chronic Illness or Disability": "Принятие хронической болезни или инвалидности",
+ "Acceptance of Future Spouse's Marriage History": "Принятие истории брака будущего супруга",
+ "Acceptance of Psychological Counseling History": "Принятие истории психологического консультирования",
+ "Acceptance of necessary communication between future spouse and the other parent": "Принятие необходимого общения между будущим супругом и другим родителем",
+ "Additional Comments and Red Lines": "Дополнительные комментарии и красные линии",
+ "Additional Comments on Economic and Housing Status": "Дополнительные комментарии по экономическому и жилищному состоянию",
+ "Additional details about family responsibility": "Дополнительная информация о семейной ответственности",
+ "Afghanistan": "Афганистан",
+ "Age": "Возраст",
+ "Alcohol is a serious red line": "Алкоголь – серьезная красная линия",
+ "Alcohol is a serious red line for me": "Алкоголь для меня – серьезная красная линия.",
+ "Alcoholic Beverages": "Алкогольные напитки",
+ "All provided information is held in strict confidence and will not be disclosed to third parties. This data is utilized exclusively to ensure optimal matchmaking accuracy. Consequently, it is imperative that this assessment be completed with the utmost diligence, precision, and integrity.": "Вся предоставленная информация хранится в строгой конфиденциальности и не будет передана третьим лицам. Эти данные используются исключительно для обеспечения оптимальной точности подбора игроков. Следовательно, крайне важно, чтобы эта оценка проводилась с максимальной тщательностью, точностью и честностью.",
+ "Always committed, but not necessarily at the earliest time": "Всегда привержены, но не обязательно в самое ближайшее время",
+ "Always committed, preferably at the earliest time": "Всегда преданы делу, желательно в самое ближайшее время",
+ "Answer at Your Own Pace": "Отвечайте в удобном для вас темпе",
+ "Any ongoing communication beyond essential child matters with the other parent is a red line for me.": "Любое постоянное общение с другим родителем, выходящее за рамки важных вопросов ребенка, является для меня красной линией.",
+ "Approving this profile will **display your contact number** to the gentleman. Ensure **family consensus** before proceeding.": "При одобрении этого профиля джентльмену **покажется ваш контактный номер**. Прежде чем продолжить, убедитесь в **семейном консенсусе**.",
+ "Approximately half the time (joint custody/schedule).": "Примерно в половине случаев (совместная опека/график).",
+ "Arabic": "арабский",
+ "Are you sure contact has been made?": "Вы уверены, что контакт состоялся?",
+ "Are you sure you want to officially introduce these two candidates to each other?": "Вы уверены, что хотите официально представить друг другу этих двух кандидатов?",
+ "Are you sure you've fully reviewed the profile and are ready to proceed?": "Вы уверены, что полностью просмотрели профиль и готовы продолжить?",
+ "Are you sure you've fully reviewed the profile and want to reject this profile?": "Вы уверены, что полностью просмотрели профиль и хотите отклонить его?",
+ "Art": "Искусство",
+ "Associate Degree": "Ассоциированная степень",
+ "At the start of career and financial path": "В начале карьеры и финансового пути",
+ "Athletic": "Атлетический",
+ "Attitude towards Music": "Отношение к музыке",
+ "Attitude towards Religion and Politics": "Отношение к религии и политике",
+ "Attitude towards Wedding Ceremony": "Отношение к свадебной церемонии",
+ "Australia": "Австралия",
+ "Average": "Средний",
+ "Ayatollah Sistani": "Аятолла Систани",
+ "Bachelor's Degree": "Степень бакалавра",
+ "Bachelor's degree in architecture": "Степень бакалавра архитектуры",
+ "Back": "Назад",
+ "Balochi": "Белуджи",
+ "Based on conditions": "В зависимости от условий",
+ "Based on family agreement": "По семейному договору",
+ "Before making a final decision, please carefully review the other person's profile again completely to make an informed choice.": "Прежде чем принять окончательное решение, пожалуйста, еще раз внимательно просмотрите полный профиль другого человека, чтобы сделать осознанный выбор.",
+ "Beliefs, Lifestyle, and Personal Boundaries": "Убеждения, образ жизни и личные границы",
+ "Below High School": "Ниже средней школы",
+ "Bio & Expectations": "Биография и ожидания",
+ "Birthplace": "Место рождения",
+ "Board Games / Puzzles": "Настольные игры/пазлы",
+ "Both parents are alive": "Оба родителя живы",
+ "Both parents have passed away": "Оба родителя скончались",
+ "Boundaries with the Opposite Sex": "Границы с противоположным полом",
+ "British": "Британский",
+ "Brother": "Брат",
+ "By identifying your strongest needs, you can better communicate your expectations and build healthier relationships.": "Определив свои самые сильные потребности, вы сможете лучше сообщить о своих ожиданиях и построить более здоровые отношения.",
+ "Cafes and Restaurants": "Кафе и рестораны",
+ "Call result": "Результат звонка",
+ "Calm and Introverted": "Спокойный и интровертный",
+ "Can buy a home": "Можно купить дом",
+ "Canada": "Канада",
+ "Cancel": "Отмена",
+ "Canceled": "Отменено",
+ "Case-by-case with consultation": "Индивидуально с консультацией",
+ "Children and Guardianship Status": "Дети и статус опеки",
+ "Children have reached legal age (custody is not applicable).": "Дети достигли совершеннолетия (опека не применяется).",
+ "Citizen / National": "Гражданин / Национальный",
+ "City and country of future residence": "Город и страна будущего проживания",
+ "City and country of residence": "Город и страна проживания",
+ "City, region, or neighborhood": "Город, регион или район",
+ "Close and active": "Близкий и активный",
+ "Close questions list": "Закрыть список вопросов",
+ "Close slider": "Закрыть ползунок",
+ "Collects details about your physical appearance, health status, and mental well-being.": "Собирает подробную информацию о вашем внешнем виде, состоянии здоровья и психическом благополучии.",
+ "Collects information about your educational background, employment status, and financial situation.": "Собирает информацию о вашем образовании, статусе занятости и финансовом положении.",
+ "Collects personal details to start the marriage application flow.": "Собирает личные данные, чтобы начать процесс подачи заявления о браке.",
+ "Commitment to Obligatory Prayers": "Приверженность обязательным молитвам",
+ "Commitment to Ramadan Fasting": "Приверженность посту Рамадан",
+ "Commitment to monogamy and intention for permanent marriage only (no simultaneous or temporary relationships).": "Приверженность моногамии и намерение заключать только постоянный брак (без одновременных или временных отношений).",
+ "Communicative": "Коммуникативный",
+ "Compatible with religious values": "Совместимость с религиозными ценностями",
+ "Computer Science": "Информатика",
+ "Confirm": "Подтверждать",
+ "Confirm Contacted": "Подтвердите контакт",
+ "Confirm Final Match": "Подтвердить финальный матч",
+ "Confirmation of Document and Information Accuracy": "Подтверждение достоверности документов и информации",
+ "Confirming this rejection will not result in any penalty. Instead, it simply enters your status into a 2-day decision window to finalize the case.": "Подтверждение этого отказа не повлечет за собой никаких штрафов. Вместо этого он просто вносит ваш статус в двухдневное окно принятия решения для завершения дела.",
+ "Congratulations! 🎉": "Поздравляем! 🎉",
+ "Consider in special cases": "Рассмотрим в особых случаях",
+ "Consultation": "Консультация",
+ "Contact": "Контакт",
+ "Contact Detail": "Контактная информация",
+ "Contact Information Released": "Контактная информация опубликована",
"Contact Received": "Контакт получен",
- "Contact info released": "Контактная информация раскрыта",
- "You can now view their family's contact details and arrange further steps.": "Теперь вы можете просмотреть контактные данные семьи и договориться о дальнейших шагах.",
- "View profile": "Посмотреть профиль",
- "View contact number": "Посмотреть номер телефона",
- "If they don't contact you within 2 days, please inform us.": "Если с вами не свяжутся в течение 2 дней, пожалуйста, сообщите нам.",
- "Profile is locked": "Профиль заблокирован",
+ "Contact Support": "Обратиться в службу поддержки",
+ "Contact details and residence.": "Контактные данные и место жительства.",
+ "Contact details are shared only after your approval.": "Контактные данные передаются только после вашего одобрения.",
+ "Contact info released": "Контактная информация опубликована",
+ "Contact information is not available yet.": "Контактная информация пока недоступна.",
+ "Contact, Residence, and Family Communication": "Контакт, проживание и семейное общение",
+ "Content Security:": "Безопасность контента:",
+ "Continue": "Продолжать",
+ "Cooking": "Кулинария",
+ "Country / city": "Страна/город",
+ "Country doesn't matter": "Страна не имеет значения",
+ "Criteria and Red Lines.": "Критерии и красные линии.",
+ "Current Housing Status": "Текущее состояние жилья",
+ "Current Marital Status": "Текущее семейное положение",
+ "Current Nationality / Citizenship": "Текущее гражданство / гражданство",
+ "Current Residence": "Текущее место жительства",
+ "Current user": "Текущий пользователь",
+ "Currently building suitable financial conditions": "В настоящее время создаем подходящие финансовые условия",
+ "Curvy/Full": "Пышная/Полная",
+ "Custody is with the other parent or another person.": "Опека осуществляется вторым родителем или другим лицом.",
+ "Customary but respectful": "Традиционно, но уважительно",
+ "Customary clothing with Hijab acceptable": "Приемлема обычная одежда с хиджабом.",
+ "Customary covering - Modest everyday clothing with general hair covering.": "Обычное покрывало – скромная повседневная одежда с общим прикрытием волос.",
+ "Dark / Black": "Темный / Черный",
+ "Dark Tan / Brown": "Темно-коричневый/коричневый",
+ "Date of Birth": "Дата рождения",
+ "Dear user, while welcoming you to the Habib Marij application, please read the following rules and regulations carefully before using the services of this platform. Your registration and use of this application constitutes full acceptance of these rules.": "Уважаемый пользователь, приветствуя вас в приложении Habib Marij, пожалуйста, внимательно прочтите следующие правила и положения, прежде чем пользоваться услугами этой платформы. Ваша регистрация и использование этого приложения означает полное согласие с этими правилами.",
+ "Decline": "Отклонить",
+ "Dedicated to Personal Growth": "Посвящается личностному росту",
+ "Depends on reason, duration, and conditions": "Зависит от причины, продолжительности и условий.",
+ "Depends on stability": "Зависит от стабильности",
+ "Depends on the country and future residence": "Зависит от страны и будущего проживания",
+ "Desired Age Range of Future Spouse": "Желаемый возраст будущего супруга",
+ "Desired Body Type of Future Spouse": "Желаемый тип телосложения будущего супруга",
+ "Desired Clothing style for Future Spouse": "Желаемый стиль одежды для будущего супруга",
+ "Desired Employment Status of Future Spouse": "Желаемый статус занятости будущего супруга",
+ "Desired Ethnicity, Language, or Nationality of Future Spouse": "Желаемая этническая принадлежность, язык или национальность будущего супруга",
+ "Desired Height Range of Future Spouse": "Желаемый рост будущего супруга",
+ "Desired Level of Religious Commitment": "Желаемый уровень религиозной приверженности",
+ "Desired Political Outlook": "Желаемый политический прогноз",
+ "Desired Skin Color of Future Spouse": "Желаемый цвет кожи будущего супруга",
+ "Desired Spouse's Family Status and Values": "Семейный статус и ценности желаемого супруга",
+ "Desired Spouse's Tendency for Employment": "Склонность желаемого супруга к трудоустройству",
+ "Desired Spouse's Tendency for Further Education": "Склонность желаемого супруга к дальнейшему образованию",
+ "Details about religious practice, public appearance, political outlook, habits, and lifestyle preferences.": "Подробная информация о религиозной практике, публичном появлении, политических взглядах, привычках и предпочтениях образа жизни.",
+ "Differences okay with mutual respect": "Разногласия допустимы при взаимном уважении",
+ "Different expectations": "Разные ожидания",
+ "Dismiss reasons": "Причины отклонения",
+ "Divorced; after living together": "В разводе; после совместной жизни",
+ "Do not consume at all": "Не употреблять вообще",
+ "Do not fast for religious or medical reasons": "Не поститесь по религиозным или медицинским причинам.",
+ "Do not listen to any music": "Не слушайте никакой музыки",
+ "Do not pray": "Не молитесь",
+ "Do not smoke at all": "Не курить вообще",
+ "Do not smoke hookah at all": "Ни в коем случае не курите кальян",
+ "Do not use at all": "Не используйте вообще",
+ "Do not wear makeup at all": "вообще не пользуйтесь косметикой",
+ "Do the supported individual(s) live with you?": "Проживают ли поддерживаемые лица с вами?",
+ "Do you currently have an ongoing financial, caregiving, or guardianship responsibility for a family member?": "Есть ли у вас в настоящее время постоянные финансовые обязанности, обязанности по уходу или опеке над членом семьи?",
+ "Do you operate based on superficial behavioral adaptations, or are you aware of the deep \"source traits\" that fundamentally control your decision-making processes?": "Действуете ли вы на основе поверхностных поведенческих адаптаций или осознаете глубокие «исходные черты», которые фундаментально контролируют ваши процессы принятия решений?",
+ "Do you struggle to understand the underlying psychological drivers that dictate your interpersonal connections and communication barriers?": "Вам сложно понять основные психологические факторы, определяющие ваши межличностные связи и коммуникационные барьеры?",
+ "Doctorate and Above": "Докторантура и выше",
+ "Doctorate or higher preferred": "Докторантура или выше приветствуется",
+ "Does the custody, visitation, or relocation schedule impact your residence or immigration?": "Влияет ли график опеки, посещений или переезда на ваше место жительства или иммиграцию?",
+ "Doesn't matter.": "Не имеет значения.",
+ "Dormitory / Student housing": "Общежитие/Студенческое общежитие",
+ "Dr. Hasti Masoudi": "Доктор Хасти Масуди",
+ "Drugs are a definite red line": "Наркотики – это определенная красная линия",
+ "Edit Profile": "Редактировать профиль",
+ "Education": "Образование",
+ "Education, Career, and Economic Status": "Образование, карьера и экономический статус",
+ "Emotional": "Эмоциональный",
+ "Employed": "трудоустроен",
+ "Employment Status": "Статус занятости",
+ "English": "Английский",
+ "English, French, etc.": "английский, французский и т. д.",
+ "Enter details here...": "Введите детали здесь...",
+ "Enter your explanation here...": "Введите здесь свое объяснение...",
+ "Entrepreneur / Business Owner": "Предприниматель/Владелец бизнеса",
+ "Estimate time": "Расчетное время",
+ "Ethnicity / Family Origin / Race": "Этническая принадлежность/семейное происхождение/раса",
+ "Exit": "Выход",
+ "Failed engagement / Annulled marriage; without living together": "Неудачная помолвка/аннулированный брак; не живя вместе",
+ "Fair / White": "Ярмарка / Белый",
+ "Family Background": "Семейное прошлое",
+ "Family Background, Marital Status, and Children": "Семейное происхождение, семейное положение и дети",
+ "Family Economic Status": "Экономический статус семьи",
+ "Family's Religious and Ideological Atmosphere": "Религиозно-идеологическая атмосфера семьи",
+ "Family-oriented": "Семейный",
+ "Father": "Отец",
+ "Father alive": "Отец жив",
+ "Father has passed away": "Отец скончался",
+ "Feel free to briefly explain your decision...": "Не стесняйтесь кратко объяснить свое решение...",
+ "Field of Study": "Область исследования",
+ "Final Consent": "Окончательное согласие",
+ "Final Match Introduction": "Введение в финальный матч",
+ "Final Notice": "Последнее уведомление",
+ "Find Matches": "Найти совпадения",
+ "Finish": "Заканчивать",
+ "Fit/Average": "Подходит/Средний",
+ "Flexible": "Гибкий",
+ "Form Sections Data": "Данные разделов формы",
+ "Formal, dignified, and religious": "Формальный, достойный и религиозный",
+ "France": "Франция",
+ "French": "Французский",
+ "From": "От",
+ "Full Hijab with modest clothing - Modest styling with hair completely covered.": "Полный хиджаб со скромной одеждой – скромная укладка с полностью закрытыми волосами.",
+ "Full Islamic covering (Maximum Hijab) - Abaya, Jilbab, Chador, or Niqab with full observance.": "Полное исламское покрытие (Максимальный хиджаб) – Абая, Джилбаб, Чадор или Никаб с полным соблюдением.",
+ "Full Islamic covering mandatory": "Полное исламское покрытие обязательно.",
+ "Full Name": "Полное имя",
+ "Full makeup": "Полный макияж",
+ "Full-time Employed": "Полный рабочий день",
+ "Fully able to support expenses": "Полностью в состоянии покрыть расходы",
+ "Fully committed": "Полностью предан",
+ "Fully flexible; moving to another city or country is not a problem.": "Полностью гибкий; переезд в другой город или страну не проблема.",
+ "Future Spouse Criteria and Red Lines": "Критерии будущего супруга и красные линии",
+ "Future Spouse's Boundaries with the Opposite Sex": "Границы будущего супруга с противоположным полом",
+ "General Health:": "Общее состояние здоровья:",
+ "German": "немецкий",
+ "Germany": "Германия",
+ "Get Advisor": "Получить советник",
+ "Get an advisor": "Получить советника",
+ "Glasser 5 Needs Test": "Глассер 5 нуждается в тесте",
+ "Go back": "Возвращаться",
+ "Good": "Хороший",
+ "Got it": "Понятно",
+ "Habib Marriage": "Хабиб Брак",
+ "Halal/permissible okay": "Халяль/разрешено, ок",
+ "Have a personal home for living together": "Иметь личный дом для совместного проживания",
+ "Have children living with me": "Иметь детей, живущих со мной",
+ "Have children not living with me": "Иметь детей, не живущих со мной",
+ "Height in Centimeters": "Рост в сантиметрах",
+ "Help": "Помощь",
+ "High School Diploma": "Диплом средней школы",
+ "Highest Level of Education": "Высший уровень образования",
+ "Homemaker": "Домохозяйка",
+ "Homeowner": "домовладелец",
+ "Hookah": "Кальян",
+ "Hookah is a red line": "Кальян – красная линия",
+ "How much time do the child(ren) usually live with you?": "Сколько времени ребенок(дети) обычно живут с вами?",
+ "Humorous": "Юмористический",
+ "I accept necessary, respectful, and limited communication regarding child matters.": "Я принимаю необходимое, уважительное и ограниченное общение по вопросам детей.",
+ "I am in perfect health.": "У меня прекрасное здоровье.",
+ "I am responsible for caring for my parent(s) (father, mother, or both).": "Я несу ответственность за уход за моим родителем(ями) (отцом, матерью или обоими).",
+ "I am responsible for the care, custody, or guardianship of other family members (sibling, etc.).": "Я несу ответственность за уход, опеку или попечительство над другими членами семьи (братьями, сестрами и т. д.).",
+ "I am undergoing pharmacotherapy.": "Я прохожу фармакотерапию.",
+ "I certify that the lady and her family have thoroughly reviewed this profile and grant preliminary consent for further communication.": "Я подтверждаю, что дама и ее семья тщательно просмотрели данную анкету и даю предварительное согласие на дальнейшее общение.",
+ "I confirm": "Я подтверждаю",
+ "I confirm that my name, age, photo, and identity details match the uploaded documents.": "Я подтверждаю, что мое имя, возраст, фотография и личные данные соответствуют загруженным документам.",
+ "I confirm the family has **reviewed this profile** and **consents to communicate**.": "Я подтверждаю, что члены семьи **просмотрели этот профиль** и **согласны на общение**.",
+ "I have a history of counseling or am currently undergoing treatment.": "Я консультировался или в настоящее время прохожу лечение.",
+ "I have a physical deformity, disability, or limitation.": "У меня есть физическое уродство, инвалидность или ограничение.",
+ "I have a specific or chronic illness.": "У меня специфическое или хроническое заболевание.",
+ "I have full custody of the child(ren).": "Я имею полную опеку над ребенком (детьми).",
+ "I have no specific issues.": "У меня нет конкретных проблем.",
+ "I have special family circumstances and will provide the details in the description.": "У меня особые семейные обстоятельства, и я предоставлю подробную информацию в описании.",
+ "I only accept formal and highly limited communication regarding essential child matters.": "Я принимаю только формальное и весьма ограниченное общение по важным вопросам, касающимся детей.",
+ "I prefer communication to go through an intermediary, a family member, or a lawyer as much as possible.": "Я предпочитаю, чтобы общение проходило через посредника, члена семьи или адвоката, насколько это возможно.",
+ "I regularly provide financial support for a family member's living expenses.": "Я регулярно оказываю финансовую поддержку для покрытия расходов на проживание члена семьи.",
+ "Identity & Demographics": "Идентичность и демография",
+ "Identity Verification and Documents": "Проверка личности и документы",
+ "Identity Verification:": "Проверка личности:",
+ "If you encounter any issues, please feel free to contact our support specialists in WhatsApp": "Если у вас возникнут какие-либо проблемы, пожалуйста, свяжитесь с нашими специалистами поддержки в WhatsApp.",
+ "If you have any special conditions regarding work, income, renting, home buying, migration, or future place of residence, please explain briefly.": "Если у вас есть какие-либо особые условия относительно работы, дохода, аренды, покупки жилья, миграции или будущего места жительства, пожалуйста, кратко объясните.",
+ "If you proceed, we will notify the other party, and upon their approval, you can view each other's contact information.": "Если вы продолжите, мы уведомим другую сторону, и после ее одобрения вы сможете просмотреть контактную информацию друг друга.",
+ "Important Note": "Важное примечание",
+ "In career growth path": "В пути карьерного роста",
+ "In treatment or recovery": "На лечении или восстановлении",
+ "Income is variable": "Доход является переменным",
+ "Independent": "Независимый",
+ "Information about your current marital status, previous marriages, and children.": "Информация о вашем текущем семейном положении, предыдущих браках и детях.",
+ "Information about your siblings, parents, and family lifestyle.": "Информация о ваших братьях и сестрах, родителях и семейном образе жизни.",
+ "Information sheet": "Информационный лист",
+ "Insufficient coin balance. Please recharge your account.": "Недостаточный баланс монет. Пожалуйста, пополните свой счет.",
+ "Insulin, etc.": "Инсулин и др.",
+ "Intent:": "Намерение:",
+ "Interior designer": "Дизайнер интерьеров",
+ "Iran": "Иран",
+ "Iranian": "Иранский",
+ "Iraq": "Ирак",
+ "Items Per Page": "Элементов на странице",
+ "Job Seeking / Unemployed": "Ищу работу / Безработный",
+ "Job Title": "Должность",
+ "Joint custody or periodic visitation/relocation between parents.": "Совместная опека или периодическое посещение/переезд родителей.",
+ "Kurdish": "курдский",
+ "Language Learning": "Изучение языка",
+ "Large frame": "Большая рамка",
+ "Legal Age:": "Юридический возраст:",
+ "Level of Family Communication Post-Marriage": "Уровень семейного общения после брака",
+ "Light Tan / Wheatish": "Светло-коричневый/пшеничный",
+ "Limited and controlled": "Ограниченное и контролируемое",
+ "Listen to Halal and permissible music": "Слушайте халяльную и разрешенную музыку",
+ "Living together": "Жить вместе",
+ "Living with either family okay": "Жить с любой семьей нормально",
+ "Living with family / parents": "Проживание с семьей/родителями",
+ "Loading match profile...": "Загрузка профиля совпадения...",
+ "Location not suitable": "Место не подходит",
+ "Logical": "Логический",
+ "London, Remote": "Лондон, Удаленный доступ",
+ "Make sure you are available and in a quiet place at least 10 minutes before the session.": "Убедитесь, что вы доступны и находитесь в тихом месте как минимум за 10 минут до сеанса.",
+ "Makeup in Public": "Макияж на публике",
+ "Mandatory submission of valid government-issued ID upon registration.": "Обязательное предоставление действительного удостоверения личности государственного образца при регистрации.",
+ "Marital Status, Marriage History, and Children": "Семейное положение, история брака и дети",
+ "Marja' al-Taqlid (Religious Authority)": "Марджа аль-Таклид (Религиозный орган)",
+ "Master's Degree": "Степень магистра",
+ "Maturity is more important than degree": "Зрелость важнее степени",
+ "May temporarily live with family at the start": "Вначале может временно жить с семьей",
+ "Mental Health Status": "Состояние психического здоровья",
+ "Minimum Bachelor's": "Минимальный уровень бакалавра",
+ "Minimum Education Level of Future Spouse": "Минимальный уровень образования будущего супруга",
+ "Minimum High School": "Минимальная средняя школа",
+ "Minimum Master's": "Минимальная степень магистра",
+ "Mixed ceremony with music and dancing": "Смешанная церемония с музыкой и танцами",
+ "Mixed with music and dancing": "В сочетании с музыкой и танцами",
+ "Moderate religious": "Умеренно религиозный",
+ "Modern style okay": "Современный стиль, окей",
+ "Modest clothing important, details negotiable": "Важна скромная одежда, детали обсуждаются.",
+ "Monthly Income": "Ежемесячный доход",
+ "More detail": "Подробнее",
+ "Mosque and Religious Gatherings": "Мечеть и религиозные собрания",
+ "Mother": "Мать",
+ "Mother Tongue": "Родной язык",
+ "Mother alive": "Мать жива",
+ "Mother has passed away": "Мать скончалась",
+ "Move to spouse's current country": "Переехать в текущую страну супруга",
+ "Move to the End": "Двигайтесь до конца",
+ "Movies and Cinema": "Кино и кино",
+ "Music": "Музыка",
+ "Muslim": "мусульманин",
+ "Must align with mine": "Должно совпадать с моим",
+ "Must be a homemaker": "Должно быть, домохозяйка",
+ "Must be employed": "Должен быть трудоустроен",
+ "Must have religious studies": "Обязательно иметь религиоведение",
+ "Must intend to continue": "Должен иметь намерение продолжать",
+ "Narcotics or Illegal Substances": "Наркотики или запрещенные вещества",
+ "Nationality": "Национальность",
+ "Nature and Outdoors": "Природа и отдых на открытом воздухе",
+ "Need future partner's financial participation": "Необходимо финансовое участие будущего партнера",
+ "Needs serious review": "Требует серьезного рассмотрения",
+ "Negotiable": "Возможен торг",
+ "Netherlands": "Нидерланды",
+ "Never married only; history is a red line": "Никогда не был женат только; история - красная линия",
+ "Never married preferred, but open to special cases": "Предпочтительно никогда не состоять в браке, но открыты для особых случаев",
+ "Never used": "Никогда не использовался",
+ "New Marriage Proposal": "Новое предложение руки и сердца",
+ "New Match": "Новый матч",
+ "Next": "Следующий",
+ "Next Page": "Следующая страница",
+ "No Active Subscription": "Нет активной подписки",
"No Contact Received": "Контакт не получен",
- "No contact has been made with you in any way or by any party.": "С вами не связывались никаким образом и ни с какой стороны.",
- "Thank you for your feedback. Our support team will investigate the matter and notify you of the result. Please wait patiently during the review; our support will contact you.": "Спасибо за ваш отзыв. Наша служба поддержки расследует этот вопрос и сообщит вам о результате. Пожалуйста, наберитесь терпения во время проверки; наша служба поддержки свяжется с вами.",
- "candidateContact": {
- "imageAlt": "Selected candidate contact status",
- "title": "The selected candidate will contact your family shortly.",
- "contacted": "Подтвердить контакт",
- "noContactYet": "Сообщить об отсутствии контакта",
- "afterTwoDays": "(after 2 days)",
- "contactWarning": "Чтобы процесс продвигался гладко, у другой стороны есть 48 часов (2 дня), чтобы установить первоначальный контакт с вами или вашей семьей. Если по истечении 2 дней контакт не установлен, у вас есть возможность отклонить его запрос или уведомить нас о том, что он не связался.",
- "thankYouFeedback": "Спасибо за ваш отзыв, мы будем очень рады, если вы также сообщите нам окончательный результат.",
- "marriageSuccess": "Мы пришли к согласию",
- "marriageFailure": "Мы не пришли к согласию",
- "outcomeTitle": "Каков был результат вашего контакта?"
- },
- "common": {
- "appName": "Habib Marriage",
- "submit": "Submit",
- "decline": "Decline",
- "continue": "Continue",
- "cancel": "Cancel",
- "confirm": "Confirm",
- "support": "Support",
- "back": "Back",
- "required": "Required",
- "estimateTime": "Estimate time",
- "rangeError": "The value entered seems incorrect. Please provide a realistic value.",
- "help": "Help",
- "gotIt": "Got it",
- "helpDescription": "Psychologically, this practice fosters a sense of empathy and contentment, which can reduce financial stress. Socially, lending strengthens neighborhood bonds and creates support networks that can lead to economic opportunities. This hadith encourages believers to lend dough, bread, and fire to increase their sustenance.",
- "finalMatchIntroduce": "Final Match Introduction",
- "confirmFinalMatch": "Confirm Final Match",
- "confirmFinalMatchQuestion": "Are you sure you want to officially introduce these two candidates to each other?",
- "page": "Page",
- "totalPages": "Total Pages",
- "nextPage": "Next Page",
- "previousPage": "Previous Page",
- "itemsPerPage": "Items Per Page",
- "other": "Другое",
- "consultation": "Consultation",
- "supportTitle": "Связаться с поддержкой",
- "supportDescription": "Если у вас возникли проблемы, свяжитесь с нашими специалистами поддержки в WhatsApp",
- "supportSwipeText": "Связаться"
- },
- "findingMatch": {
- "title": "ВАШ ПОИСК АКТИВЕН",
- "description": "Наша система активно ищет подходящих партнеров на основе ваших критериев. Этот процесс требует времени и терпения. Мы немедленно уведомим вас, как только профиль будет готов к вашему рассмотрению.",
- "advisorTitle": "Get an advisor",
- "advisorDescription": "Not sure what to do next? Our psychology section is here to guide you at every step.",
- "getAdvisor": "Get Advisor",
- "editProfile": "Edit Profile"
- },
- "intro": {
- "imageAlt": "heavenly marriage",
- "title": "A Path to Heavenly Marriage",
- "description": "We have come together with the goal of creating a secure and confidential path for \"permanent marriage\" among Muslims",
- "userProfile": "user profiles",
- "matches": "matches",
- "marriage": "marriages",
- "videoAlt": "video",
- "playAlt": "play"
- },
- "maleRejectionWarning": {
- "title": "Предупреждение об отклонении",
- "carefulReview": "Перед принятием окончательного решения, пожалуйста, еще раз полностью и внимательно изучите профиль кандидата.",
- "friendlyDelay": "Обратите внимание, что отклонение этого предложения может немного задержать подбор следующего кандидата, но вы абсолютно не обязаны соглашаться.",
- "noPenalty": "Подтверждение этого отклонения не влечет за собой никаких штрафов; оно просто переводит статус в 2-дневное окно принятия решений для его завершения.",
- "swipeText": "Проведите для подтверждения отклонения"
- },
- "match": {
- "title": "New Match",
- "goBack": "Go back",
- "acceptProfile": "Accept Profile",
- "requestProceedTitle": "Request to Proceed",
- "requestProceedDescription": "Upon your approval, your request will be sent to the lady, and we must await her response. This process may take between 2 to 4 days. Thank you for your patience.",
- "acceptDescription": "Are you sure you've fully reviewed the profile and are ready to proceed?",
- "fields": {
- "birthYear": "Year of birth",
- "nationality": "Nationality",
- "residence": "City and country of residence",
- "futureResidence": "City and country of future residence",
- "religion": "Religion",
- "countryCity": "Country / city",
- "currentlyLivingIn": "(currently living in)",
- "education": "Education",
- "occupation": "Occupation"
- },
- "values": {
- "iranian": "Iranian",
- "iran": "Iran",
- "tehran": "Tehran",
- "muslim": "Muslim",
- "education": "Bachelor's degree in architecture",
- "occupation": "Interior designer"
- },
- "loadingProfile": "Loading match profile...",
- "twoColumnComparison": "Two-Column Side-by-Side Match Comparison",
- "horizontalAlignment": "Strict Horizontal Field Alignment",
- "sourceCandidate": "Source Candidate (Right Column)",
- "targetCandidate": "Opposite Sex Candidate (Left Column)",
- "tabs": {
- "identity": "Identity & Demographics",
- "bio": "Bio & Expectations",
- "sections": "Form Sections Data",
- "tests": "Psychological Assessments"
- },
- "viewMoreDetails": "Показать больше деталей",
- "newMatchTitleFemale": "Новое предложение руки и сердца",
- "newMatchTitleMale": "У ВАС НОВЫЙ МАТЧ!",
- "newMatchDescriptionFemale": "Для вас найден подходящий вариант. В случае одобрения ваш профиль будет оценен для продолжения процесса внедрения.",
- "newMatchDescriptionMale": "Если вы продолжите, мы уведомим другую сторону, и после ее одобрения вы сможете просмотреть контактную информацию друг друга.",
- "femaleConsentTitle": "Final Consent",
- "femaleConsentDescription": "Approving this profile will **display your contact number** to the gentleman. Ensure **family consensus** before proceeding.",
- "femaleConsentCheckbox": "I certify that the lady and her family have thoroughly reviewed this profile and grant preliminary consent for further communication.",
- "femaleConsentCheckboxLabel": "I confirm the family has **reviewed this profile** and **consents to communicate**."
- },
- "onboarding": {
- "submitProcess": "Submit Process",
- "termsAndConditions": "terms & conditions",
- "welcomeWarning": "Dear user, while welcoming you to the Habib Marij application, please read the following rules and regulations carefully before using the services of this platform. Your registration and use of this application constitutes full acceptance of these rules.",
- "eligibilityTitle": "1. Eligibility and Membership Requirements",
- "legalAgeLabel": "Legal Age:",
- "legalAgeValue": "Users must meet the minimum legal age for independent registration.",
- "identityVerificationLabel": "Identity Verification:",
- "identityVerificationValue": "Mandatory submission of valid government-issued ID upon registration.",
- "singleStatusLabel": "Single Status Commitment:",
- "singleStatusValue": "Users must provide proof of being single, or documents confirming divorce or spouse's death upon request.",
- "intentLabel": "Intent:",
- "intentValue": "Commitment to monogamy and intention for permanent marriage only (no simultaneous or temporary relationships).",
- "healthLabel": "General Health:",
- "healthValue": "Self-declaration regarding mental health, absence of addiction, and no criminal record.",
- "privacyTitle": "2. Privacy and Data Management",
- "contentSecurityLabel": "Content Security:",
- "contentSecurityValue": "Technical prevention of screenshots from profiles and chat environments.",
- "progressiveDisclosureLabel": "Progressive Disclosure:",
- "progressiveDisclosureValue": "Sensitive information (face, contact details) revealed step-by-step only with mutual consent.",
- "watchVideo": "Watch Video",
- "videoSpeaker": "Dr. Hasti Masoudi",
- "videoDescription": "We have come together with the goal of creating a secure and confidential path for \"permanent marriage\" among Muslims",
- "selectGender": "Select Gender",
- "submitMan": "Submit Man",
- "submitWoman": "Submit Woman",
- "registrationType": "Registration Type",
- "readTermsNotice": "Read the terms and conditions carefully so that you don't run into any problems in the next process - reading this section is mandatory.",
- "registerForSelf": "Registering for myself",
- "registerForOther": "Registering for someone else",
- "finalNotice": "Final Notice",
- "finalNoticeDesc": "Your privacy and safety are our top priorities. We are committed to keeping your information secure and giving you full control throughout the process.",
- "noticeItem1": "Your information is kept strictly confidential.",
- "noticeItem2": "Your details are only used for the matching process.",
- "noticeItem3": "Nothing is shared without your consent.",
- "noticeItem4": "You are always in control of what happens next.",
- "noticeItem5": "Contact details are shared only after your approval.",
- "noticeItem6": "We provide a safe and respectful environment at every step.",
- "closeSlider": "Close slider",
- "finish": "Finish",
- "next": "Next",
- "back": "Back",
- "accept": "Accept"
- },
- "paymentModal": {
- "title": "Verification & Subscription Activation",
- "verificationText": "This payment acts as a verification process for your account and activates a 3-month subscription to receive new case introductions. The cost of this subscription is 50 Habib Coins.",
- "disclaimerText": "Please note that there is no guarantee for a specific number of cases, and the volume of incoming cases is solely subject to profile compatibility with other users.",
- "swipeToPay": "Swipe to pay 50 Habib Coins",
- "insufficientCoins": "Insufficient coin balance. Please recharge your account.",
- "activeFor3Months": "Valid for 3 months",
- "cost": "50 Coins",
- "close": "Exit",
- "payment": "Оплата",
- "pay": "Оплатить"
- },
- "questions": {
- "profileRegistration": "Profile registration",
- "closeQuestionsList": "Close questions list",
- "requiredSteps": "Required Steps",
- "requiredStepsDescription": "Please complete the required information so we can find suitable matches for you",
- "requiredStepsDescriptionCompleted": "You can now submit your request so we can start finding the right match for you",
- "requiredStepsProgress": "{completed} of {total} required steps completed",
- "findMatches": "Find Matches",
- "findingMatch": "Submit",
- "optionalInfoPromptTitle": "Important Note",
- "optionalInfoPromptDescription": "You've completed all required fields. However, filling in all sections will help us find better matches for you",
- "completeNecessaryForms": "(Complete Required Forms)",
- "openQuestion": "Open {title}",
- "answerAtYourOwnPace": "Answer at Your Own Pace",
- "answerAtYourOwnPaceDescription": "You can pause the survey anytime and resume later. Your progress is saved automatically.",
- "testIntroDisclaimer": "All provided information is held in strict confidence and will not be disclosed to third parties. This data is utilized exclusively to ensure optimal matchmaking accuracy. Consequently, it is imperative that this assessment be completed with the utmost diligence, precision, and integrity.",
- "testIntroStart": "Start",
- "testIntroEstimateLabel": "Estimate time",
- "testIntroBullets": {
- "personality": [
- "Do you struggle to understand the underlying psychological drivers that dictate your interpersonal connections and communication barriers?",
- "Taking this test is not mandatory, but it will help you better search for a spouse. The Personality test is a test for self-knowledge and better understanding of your spouse.",
- "Do you operate based on superficial behavioral adaptations, or are you aware of the deep \"source traits\" that fundamentally control your decision-making processes?"
- ],
- "glasser": [
- "Understanding your five basic needs helps you recognize what truly drives your behavior in relationships.",
- "Taking this test is not mandatory, but it will help you better understand your priorities and find a more compatible spouse.",
- "By identifying your strongest needs, you can better communicate your expectations and build healthier relationships."
- ]
- },
- "privateFieldNotice": "Private (Advisors Only)",
- "startMatchFailed": "Sending the match request failed. Please check your connection and try again.",
- "moveToEnd": "Move to the End",
- "guardianNoticeUnder27": "To preserve your peace of mind, security, and dignity, the acquaintance process on our platform follows authentic and respectful family traditions. Having a trusted person (preferably a father or mother) as a representative, in addition to reflecting your noble family background, encourages the other party to step forward with full seriousness, respect, and confidence.",
- "guardianNoticeOver27": "Our goal is to establish lasting bonds based on mutual trust. Although registering a representative is not mandatory for you, introducing a trusted person (such as a father, mother, or family elder) demonstrates your transparency and serious intent for marriage. Profiles that feature a trusted representative command significantly higher credibility and provide greater peace of mind to the other party's family.",
- "familyMaritalTitle": "Семейное положение, история брака и дети",
- "familyMaritalEstimate": "5 минут",
- "notAPriority": "Эта тема не является приоритетом для меня.",
- "writeOtherTraits": "Write other options...",
- "fromAge": "От",
- "toAge": "До",
- "familyResponsibilityTooltip": "Пожалуйста, кратко опишите тип ответственности, ее продолжительность, объем финансовой помощи или ухода, а также ее возможное влияние на место жительства, переезд или условия будущей совместной жизни.",
- "childCustodyExplanationTooltip": "Пожалуйста, кратко опишите статус опеки, график пребывания ребенка, возможные ограничения на переезд или эмиграцию, а также связанные с этим финансовые обязательства. Избегайте указания имени ребенка, имени другого родителя или ненужных личных данных.",
- "currentMaritalStatusTooltip": "Это приватное поле требует от пользователя точно указать свое текущее семейное положение и историю отношений из предложенных вариантов."
- },
- "rejectionNotice": {
- "title": "Your request was rejected",
- "message": "Your request was rejected by the lady. You will be introduced to other candidates in the future."
- },
- "requestAccepted": {
- "imageAlt": "Request accepted",
- "title": "Request Accepted",
- "description": "You can now view their family's contact details and arrange further steps.",
- "viewContact": "View Contact",
- "penalty": "Please note: Failure to contact within 2 days may result in a penalty",
- "profileLocked": "Profile is locked",
- "lockedDescription": "You can't edit your profile while we're searching for matches",
- "titleFemale": "Request Approved",
- "titleMalePaymentDone": "Contact info released",
- "titleMalePaymentPending": "Request approved!",
- "primaryFemale": "Report no contact",
- "primaryMale": "View profile",
- "secondaryFemale": "Record call result",
- "secondaryMalePaymentDone": "View contact number",
- "secondaryMalePaymentPending": "Pay and get contact",
- "titleContactReleased": "Contact Information Released",
- "titleMaleApproved": "Request Approved!",
- "actionReportNoContact": "Report No Contact",
- "actionViewProfile": "View Profile",
- "actionSubmitCallResult": "Submit Call Result",
- "actionViewContact": "View Contact Details",
- "actionPayAndGetContact": "Pay & Get Contact",
- "contactDetailTitle": "Контактная информация",
- "contactDetailDescription": "Пожалуйста, упомяните во время разговора, что вас познакомили через приложение Habib Marriage.",
- "contactNotAvailable": "Контактная информация пока недоступна.",
- "contactWarning": "Обратите внимание, что с момента этого представления у вас есть 48 часов (2 дня), чтобы связаться с человеком или его уважаемой семьей, чтобы заявить о своей готовности и начать процесс знакомства. На этом этапе достаточно простого первоначального звонка, чтобы объявить о своем присутствии, а планирование дальнейших шагов (например, личной встречи) полностью зависит от ваших последующих взаимных договоренностей.\n\nПоскольку отсутствие контакта в указанное время может быть сочтено социально неуважительным, если в течение этих 2 дней не будет предпринято никаких действий, представленное совпадение будет удалено в соответствии с правилами платформы. Мы также напоминаем вам, что эта проблема может привести к таким ограничениям, как задержки в будущих представлениях и финансовые штрафы."
- },
- "requestSent": {
- "title": "Request Sent",
- "description": "Your request has been sent. Once the lady reviews your request, you will be notified.",
- "matchProfile": "View More Details",
- "profileLocked": "Profile is locked"
- },
- "sheets": {
- "informationSheet": "Information sheet",
- "callResult": "Call result",
- "selectCallResult": "Select call result",
- "callOptions": [
- "Not a good personal fit",
- "No mutual interest",
- "Different expectations",
- "No connection felt",
- "Location not suitable",
- "Other reasons"
- ],
- "dismissReasons": "Dismiss reasons",
- "dismissDescription": "Please provide the full reason for rejecting the submitted item",
- "dismissPlaceholder": "Your explanatory text ..."
- },
- "spouseCriteriaConfidentialNotice": "⚠️ This section is completely confidential and is only used for matching and review by advisors.",
- "Thank you for your feedback. To complete the process, please submit the final outcome of this introduction/contact so that the final status can be determined. If the final status is not yet determined, you can stay in this state until it is finalized.": "Thank you for your feedback. To complete the process, please submit the final outcome of this introduction/contact so that the final status can be determined. If the final status is not yet determined, you can stay in this state until it is finalized.",
- "Share Result": "Share Result",
- "What was the outcome of your contact?": "What was the outcome of your contact?",
- "We hope the acquaintance process is going well. Please let us know if you want to continue the acquaintance process or if the match has been canceled.": "We hope the acquaintance process is going well. Please let us know if you want to continue the acquaintance process or if the match has been canceled.",
- "We are in the acquaintance/proposal process and nothing is finalized yet": "We are in the acquaintance/proposal process and nothing is finalized yet",
- "Please select the reason for cancellation:": "Please select the reason for cancellation:",
- "Swipe to continue": "Swipe to continue",
- "Swipe to confirm cancellation": "Swipe to confirm cancellation"
+ "No Hijab (Casual/Modern) - Modern styling and casual outfits.": "No Hijab (Casual/Modern) – современный стиль и повседневная одежда.",
+ "No Hijab (Modest styling) - Dignified modest attire without headscarf.": "No Hijab (Скромный стиль) – Достойная скромная одежда без платка.",
+ "No ceremony or very simple": "Никаких церемоний или очень просто",
+ "No children": "Нет детей",
+ "No connection felt": "Никакой связи не чувствуется",
+ "No contact has been made with you in any way or by any party.": "Никакого контакта с вами не было установлено каким-либо образом или какой-либо стороной.",
+ "No difference": "Нет разницы",
+ "No formal child support commitment (or child is independent / pending).": "Нет официальных обязательств по алиментам (или ребенок независим / находится на рассмотрении).",
+ "No independent income": "Нет самостоятельного дохода",
+ "No mutual interest": "Нет взаимного интереса",
+ "No problem": "Без проблем",
+ "No sensitivity": "Нет чувствительности",
+ "No specific boundaries - Fully comfortable with modern social interactions.": "Никаких конкретных границ. Полностью комфортно в современном социальном взаимодействии.",
+ "No specific sensitivity": "Нет специфической чувствительности",
+ "No specific sensitivity towards music types": "Нет особой чувствительности к типам музыки.",
+ "No specific stance; political differences are not significant for my marriage.": "Никакой конкретной позиции; политические разногласия не имеют значения для моего брака.",
+ "No, I do not have any ongoing responsibility.": "Нет, у меня нет никакой постоянной ответственности.",
+ "No, but they reside near my place of living.": "Нет, но они проживают недалеко от моего места жительства.",
+ "No, it has no significant impact on residence or relocation.": "Нет, это не оказывает существенного влияния на проживание или переезд.",
+ "No, they live in another city or country.": "Нет, они живут в другом городе или стране.",
+ "Non-political view of Shiasm, but it's not a red line if my spouse has political views.": "Я придерживаюсь неполитических взглядов на шиизм, но если у моего супруга политические взгляды, это не является красной линией.",
+ "Non-religious / Secular": "Нерелигиозный/светский",
+ "None are red lines": "Ни одна из них не является красной линией",
+ "Normal and respectful": "Нормально и уважительно",
+ "Norway": "Норвегия",
+ "Not a good personal fit": "Не очень подходит личному составу",
+ "Not committed": "Не совершено",
+ "Not important": "Не важно",
+ "Not sure what to do next? Our psychology section is here to guide you at every step.": "Не знаете, что делать дальше? Наш раздел психологии поможет вам на каждом этапе.",
+ "Nothing is shared without your consent.": "Ничто не передается без вашего согласия.",
+ "Number of Children": "Количество детей",
+ "Number of Siblings": "Количество братьев и сестер",
+ "Occasional / Recreational": "Время от времени / для отдыха",
+ "Occasional consumption": "Периодическое потребление",
+ "Occasional smoking okay in special cases": "Периодическое курение допустимо в особых случаях",
+ "Occasionally do not fast without a specific reason": "Иногда не поститесь без особой причины",
+ "Occupation": "Занятие",
+ "Ongoing financial commitment (paying child support or sharing expenses).": "Постоянные финансовые обязательства (выплата алиментов или участие в расходах).",
+ "Only if children don't live with them": "Только если дети с ними не живут",
+ "Only independent life": "Только независимая жизнь",
+ "Only listen to Nasheeds, Acapella, religious, or instrument-free music": "Слушайте только Нашиды, Акапеллу, религиозную музыку или музыку без инструментов.",
+ "Only my current city": "Только мой текущий город",
+ "Only religious/instrument-free okay": "Только религиозные/без инструментов, окей",
+ "Only very light makeup": "Только очень легкий макияж",
+ "Only willing to live in my current city; relocating is a red line.": "Желаю жить только в моем нынешнем городе; переезд - это красная линия.",
+ "Open {title}": "Открыть {название}",
+ "Opposed to the current government, but a difference in view is not a red line.": "Выступаю против нынешнего правительства, но разница во взглядах не является красной линией.",
+ "Opposed to the current government; serious support from my spouse is a red line.": "Оппонент действующему правительству; серьезная поддержка со стороны моего супруга – это красная линия.",
+ "Opposite Sex Candidate (Left Column)": "Кандидат противоположного пола (левая колонка)",
+ "Organizational housing": "Организационное жилье",
+ "Organized": "Организованный",
+ "Other": "Другой",
+ "Other Languages Fluent In": "Другие языки, на которых свободно владею",
+ "Other circumstances (dispute, pending, or other).": "Другие обстоятельства (спор, ожидание или другое).",
+ "Other reasons": "Другие причины",
+ "Our goal is to establish lasting bonds based on mutual trust. Although registering a representative is not mandatory for you, introducing a trusted person (such as a father, mother, or family elder) demonstrates your transparency and serious intent for marriage. Profiles that feature a trusted representative command significantly higher credibility and provide greater peace of mind to the other party's family.": "Наша цель – установить прочные связи, основанные на взаимном доверии. Хотя регистрация представителя не является для вас обязательной, представление доверенного лица (например, отца, матери или старейшины семьи) продемонстрирует вашу открытость и серьезное намерение вступить в брак. Профили, в которых фигурирует доверенный представитель, пользуются значительно большим доверием и обеспечивают большее спокойствие семье другой стороны.",
+ "Our system is actively looking for compatible partners based on your criteria. This process requires time and patience. We will notify you immediately once a profile is ready for your review.": "Наша система активно ищет совместимых партнеров по вашим критериям. Этот процесс требует времени и терпения. Мы немедленно уведомим вас, как только профиль будет готов к рассмотрению.",
+ "Overall Financial Status": "Общее финансовое состояние",
+ "Page": "Страница",
+ "Pakistan": "Пакистан",
+ "Parents not divorced": "Родители не разведены",
+ "Parents' Marital Status": "Семейное положение родителей",
+ "Parents' Survival Status": "Статус выживания родителей",
+ "Part-time Employed": "Частичная занятость",
+ "Partially supported by family": "Частично поддерживается семьей",
+ "Passport, National ID, or Driver's License": "Паспорт, национальное удостоверение личности или водительские права",
+ "Paternal / Maternal Aunt": "Тётя по отцовской/материнской линии",
+ "Paternal / Maternal Uncle": "Дядя по отцовской/материнской линии",
+ "Patient": "Пациент",
+ "Pay": "Платить",
+ "Pay & Get Contact": "Оплати и получи контакт",
+ "Pay and get contact": "Оплатите и получите контакт",
+ "Payment": "Оплата",
+ "Payment successful": "Платеж успешен",
+ "Payments are case-by-case, agreed, or irregular.": "Оплата бывает индивидуальной, согласованной или нерегулярной.",
+ "Permanent Residence": "Постоянное место жительства",
+ "Permanently or most days of the week with me.": "Постоянно или большую часть дней недели со мной.",
+ "Persian": "персидский",
+ "Personal Contact Number": "Личный контактный номер",
+ "Personal Email": "Личная электронная почта",
+ "Personal and identity details": "Личные и идентификационные данные",
+ "Personality Test": "Личностный тест",
+ "Physical Appearance, Health, and Physical Activity": "Внешний вид, здоровье и физическая активность",
+ "Physical Health Description": "Описание физического здоровья",
+ "Physical Health Status": "Состояние физического здоровья",
+ "Pilgrimage Trips": "Паломнические поездки",
+ "Planner": "Планировщик",
+ "Please be informed that from the time of this introduction, you have 48 hours (2 days) to contact the person or their respected family to declare your readiness and begin the acquaintance process. At this stage, merely an initial call to announce your presence is sufficient, and planning for further steps (such as an in-person meeting) depends entirely on your subsequent mutual agreements. Since failing to make contact within the specified time might be considered socially disrespectful, if no action is taken within these 2 days, the introduced match will be removed according to the platform's rules. We also remind you that this issue may lead to restrictions such as delays in future introductions and financial penalties.": "Обратите внимание, что с момента знакомства у вас есть 48 часов (2 дня), чтобы связаться с этим человеком или его уважаемой семьей, чтобы заявить о своей готовности и начать процесс знакомства. На этом этапе достаточно лишь первого звонка и оповещения о своем присутствии, а планирование дальнейших шагов (например, личной встречи) полностью зависит от ваших последующих взаимных договоренностей. Поскольку невыполнение контакта в течение указанного времени может считаться социально неуважительным, если в течение этих 2 дней не будет предпринято никаких действий, введенное совпадение будет удалено в соответствии с правилами платформы. Мы также напоминаем вам, что эта проблема может привести к таким ограничениям, как задержки в будущих внедрениях и финансовые санкции.",
+ "Please briefly explain the custody status, the child's visitation or presence schedule, potential restrictions on relocation or immigration, and related financial obligations. Avoid including the child's name, the other parent's name, or unnecessary personal details.": "Пожалуйста, кратко объясните статус опеки, график посещения или присутствия ребенка, потенциальные ограничения на переезд или иммиграцию, а также соответствующие финансовые обязательства. Не указывайте имя ребенка, имя другого родителя или ненужные личные данные.",
+ "Please briefly explain the type of responsibility, its duration, the extent of financial or caregiving support, and its potential impact on your place of residence, relocation, or future married life conditions.": "Пожалуйста, кратко объясните тип ответственности, ее продолжительность, степень финансовой поддержки или поддержки по уходу, а также ее потенциальное влияние на ваше место жительства, переезд или будущие условия семейной жизни.",
+ "Please complete the required information so we can find suitable matches for you": "Пожалуйста, заполните необходимую информацию, чтобы мы могли найти для вас подходящие варианты",
+ "Please mention during the call that you were introduced by the Habib Marriage app.": "Пожалуйста, укажите во время разговора, что вас познакомило приложение Habib Marriage.",
+ "Please note that rejecting this case might cause a delay in recommending the next match, but there is absolutely no obligation to accept and you are fully free to choose.": "Обратите внимание, что отклонение этого запроса может привести к задержке в рекомендации следующего совпадения, но нет никаких обязательств принимать предложение, и вы полностью свободны в выборе.",
+ "Please note that there is no guarantee for a specific number of cases, and the volume of incoming cases is solely subject to profile compatibility with other users.": "Обратите внимание, что нет никакой гарантии на конкретное количество обращений, а объем поступающих обращений зависит исключительно от совместимости профиля с другими пользователями.",
+ "Please note: Failure to contact within 2 days may result in a penalty": "Обратите внимание: отсутствие связи в течение 2 дней может повлечь за собой штраф.",
+ "Please provide the full reason for rejecting the submitted item": "Укажите полную причину отклонения отправленного товара.",
+ "Please report the final outcome of the proposal and communication to the system.": "Пожалуйста, сообщите об окончательном результате предложения и сообщите об этом в систему.",
+ "Please review the person’s full profile once more before making your final decision.": "Пожалуйста, просмотрите полный профиль человека еще раз, прежде чем принять окончательное решение.",
+ "Please select the option that best describes the general atmosphere and lifestyle of your family.": "Пожалуйста, выберите вариант, который лучше всего описывает общую атмосферу и образ жизни вашей семьи.",
+ "Please select the option that best describes your daily behavior when interacting with members of the opposite sex.": "Пожалуйста, выберите вариант, который лучше всего описывает ваше повседневное поведение при общении с представителями противоположного пола.",
+ "Please select the option that best describes your view on religion and your expectations of your future spouse.": "Пожалуйста, выберите вариант, который лучше всего описывает ваш взгляд на религию и ваши ожидания от будущего супруга.",
+ "Please select the option that most closely matches your daily attire in public. * **For Female Users:** This question asks you to specify your own **current status**, personal traits, and individual lifestyle preferences. * **For Male Users:** This question asks you to specify your **expectations**, desired criteria, and preferences regarding your future spouse.": "Пожалуйста, выберите вариант, который наиболее соответствует вашему повседневному наряду в общественных местах. * **Для пользователей женского пола:** В этом вопросе вам предлагается указать свой **текущий статус**, личные качества и индивидуальные предпочтения в отношении образа жизни. * **Для пользователей мужского пола:** В этом вопросе вас просят указать ваши **ожидания**, желаемые критерии и предпочтения в отношении вашего будущего супруга.",
+ "Please select the option that most closely matches your daily use of makeup in public. This question asks you to specify your own **current status**, personal traits, and individual lifestyle preferences.": "Пожалуйста, выберите вариант, который наиболее соответствует вашему ежедневному использованию макияжа в общественных местах. В этом вопросе вам предлагается указать свой **текущий статус**, личные качества и индивидуальные предпочтения в отношении образа жизни.",
+ "Positive but not mandatory": "Положительно, но не обязательно.",
+ "Post-Marriage Housing Plan": "План жилищного строительства после брака",
+ "Prefer non-political": "Предпочитаю неполитическую",
+ "Prefer not to continue after marriage": "Предпочитаю не продолжать после свадьбы",
+ "Preference for Living with Family": "Предпочтение жизни с семьей",
+ "Previous Marriage Duration": "Продолжительность предыдущего брака",
+ "Previous Page": "Предыдущая страница",
+ "Private (Advisors Only)": "Частное (только для консультантов)",
+ "Processing / Pending Residence Status": "Обработка/ожидание статуса проживания",
+ "Professional Certificate": "Профессиональный сертификат",
+ "Profile Picture": "Изображение профиля",
+ "Profile is locked": "Профиль заблокирован",
+ "Profile registration": "Регистрация профиля",
+ "Progressive Disclosure:": "Прогрессивное раскрытие:",
+ "Prosperous": "Процветающий",
+ "Provide more details if you have any health conditions or limitations.": "Предоставьте более подробную информацию, если у вас есть какие-либо проблемы со здоровьем или ограничения.",
+ "Psychological Assessments": "Психологические оценки",
+ "Psychologically, this practice fosters a sense of empathy and contentment, which can reduce financial stress. Socially, lending strengthens neighborhood bonds and creates support networks that can lead to economic opportunities. This hadith encourages believers to lend dough, bread, and fire to increase their sustenance.": "Психологически эта практика способствует чувству сочувствия и удовлетворенности, что может снизить финансовый стресс. В социальном плане кредитование укрепляет связи между соседями и создает сети поддержки, которые могут открыть экономические возможности. Этот хадис призывает верующих давать взаймы тесто, хлеб и огонь, чтобы увеличить свое пропитание.",
+ "Qatar": "Катар",
+ "Quitting": "Выход из дома",
+ "Quran Recitation and Religious Studies": "Чтение Корана и религиоведение",
+ "Read the terms and conditions carefully so that you don't run into any problems in the next process - reading this section is mandatory.": "Внимательно прочтите условия, чтобы не столкнуться с проблемами в следующем процессе – прочтение этого раздела обязательно.",
+ "Reading": "Чтение",
+ "Reason for Separation": "Причина разделения",
+ "Receiving child support regularly.": "Регулярно получаю алименты.",
+ "Record call result": "Записать результат звонка",
+ "Red Lines for Smoking, Alcohol, and Substances": "Красные линии для курения, алкоголя и психоактивных веществ",
+ "Red line": "Красная линия",
+ "Refugee / Humanitarian Protection": "Беженцы / Гуманитарная защита",
+ "Registering for myself": "Регистрируюсь для себя",
+ "Registering for someone else": "Регистрация для другого человека",
+ "Registration Type": "Тип регистрации",
+ "Regular and well-groomed": "Регулярный и ухоженный",
+ "Regular consumption": "Регулярное потребление",
+ "Regular hookah smoker": "Обычный курильщик кальяна",
+ "Regular smoker": "Заядлый курильщик",
+ "Regular user": "Обычный пользователь",
+ "Reject": "Отклонять",
+ "Reject Profile": "Отклонить профиль",
+ "Rejection Warning": "Предупреждение об отказе",
+ "Relationship to Representative": "Отношения с представителем",
+ "Religion": "Религия",
+ "Religion and politics are inseparable, but active engagement is not a requirement for my spouse.": "Религия и политика неразделимы, но активное участие не является обязательным требованием для моего супруга.",
+ "Religion and politics are inseparable; my spouse must share this outlook.": "Религия и политика неразделимы; мой супруг должен разделять эту точку зрения.",
+ "Religious (observant of obligations)": "Религиозный (соблюдающий обязательства)",
+ "Religious / Clerical Sponsor": "Религиозный / клерикальный спонсор",
+ "Religious / Clerical Studies": "Религиоведение / клерикальные исследования",
+ "Religious and Cultural Activities": "Религиозная и культурная деятельность",
+ "Religious and strictly observant": "Религиозный и строго соблюдающий",
+ "Religious family atmosphere": "Религиозная семейная атмосфера",
+ "Renew Subscription": "Продлить подписку",
+ "Renewing...": "Обновление...",
+ "Renting independently": "Аренда самостоятельно",
+ "Report No Contact": "Сообщить об отсутствии контакта",
+ "Report no contact": "Сообщить об отсутствии контакта",
+ "Representative's Contact Number": "Контактный номер представителя",
+ "Representative's Full Name": "Полное имя представителя",
+ "Request Accepted": "Запрос принят",
+ "Request Approved": "Запрос одобрен",
+ "Request Approved!": "Запрос одобрен!",
+ "Request Sent": "Запрос отправлен",
+ "Request accepted": "Запрос принят",
+ "Request approved!": "Запрос одобрен!",
+ "Request to Proceed": "Запрос на продолжение",
+ "Required": "Необходимый",
+ "Required Steps": "Необходимые шаги",
+ "Residence Preference after Marriage": "Предпочтение места жительства после брака",
+ "Residence Status": "Статус проживания",
+ "Respectful and conventional (No intimacy) - Polite interactions with clear personal boundaries.": "Уважительный и традиционный (без интимности). Вежливое общение с четкими личными границами.",
+ "Respectful but independent": "Уважительный, но независимый",
+ "Respectful family communication": "Уважительное семейное общение",
+ "Respectful mixed ceremony, no dancing/non-permissible music": "Уважительная смешанная церемония, без танцев и недопустимой музыки.",
+ "Respectful mixed without non-sharia elements": "Уважительная смесь без элементов нешариата",
+ "Responsible": "Ответственный",
+ "Retired": "Ушедший на пенсию",
+ "SEARCH IN PROGRESS": "ПОИСК В ПРОГРЕССЕ",
+ "Sarah Smith": "Сара Смит",
+ "Saudi Arabia": "Саудовская Аравия",
+ "Select Gender": "Выберите пол",
+ "Select call result": "Выберите результат звонка",
+ "Select country": "Выберите страну",
+ "Select one option": "Выберите один вариант",
+ "Select option(s)": "Выберите вариант(ы)",
+ "Select options": "Выберите параметры",
+ "Selected candidate contact status": "Контактный статус выбранного кандидата",
+ "Self-declaration regarding mental health, absence of addiction, and no criminal record.": "Самозаявление о психическом здоровье, отсутствии зависимости и отсутствии судимости.",
+ "Self-employed / Freelancer": "Самозанятый / Фрилансер",
+ "Sending the match request failed. Please check your connection and try again.": "Отправка запроса на совпадение не удалась. Пожалуйста, проверьте подключение и повторите попытку.",
+ "Sensitive and Precise": "Чувствительный и точный",
+ "Sensitive information (face, contact details) revealed step-by-step only with mutual consent.": "Конфиденциальная информация (лицо, контактные данные) раскрывается поэтапно только по обоюдному согласию.",
+ "Separated / Divorced": "Разделены/разведены",
+ "Serious": "Серьезный",
+ "Share Result": "Поделиться результатом",
+ "Sharia Hijab mandatory, type doesn't matter": "Шариатский хиджаб обязателен, тип не имеет значения.",
+ "Short Children/Guardianship Explanation": "Краткое объяснение детей и опеки",
+ "Short Family Description": "Краткое описание семьи",
+ "Short explanation about your lifestyle": "Краткое объяснение вашего образа жизни",
+ "Should not listen": "Не следует слушать",
+ "Simple or no ceremony": "Просто или без церемонии",
+ "Simple, neat, and modest": "Просто, аккуратно и скромно",
+ "Single Status Commitment:": "Обязательство по единому статусу:",
+ "Single; never married": "Одинокий; никогда не был женат",
+ "Sister": "Сестра",
+ "Skin Color": "Цвет кожи",
+ "Slim": "Стройный",
+ "Smoking": "Курение",
+ "Smoking is a red line": "Курение – это красная линия",
+ "Social and Charity Work": "Социальная и благотворительная работа",
+ "Social and Extroverted": "Социальный и экстравертный",
+ "Social and comfortable (Within religious limits) - Active in social circles within moral limits.": "Социальный и комфортный (В пределах религиозных ограничений). Активен в социальных кругах, в пределах моральных ограничений.",
+ "Social within religious/moral limits": "Социальное в религиозных/моральных рамках",
+ "Software Engineer": "Инженер-программист",
+ "Someone else is under my guardianship": "Кто-то еще находится под моей опекой",
+ "Sometimes": "Иногда",
+ "Source Candidate (Right Column)": "Кандидат-источник (правая колонка)",
+ "Spanish": "испанский",
+ "Sports / Exercise": "Спорт / Упражнения",
+ "Stable and reliable income": "Стабильный и надежный доход",
+ "Stance on Current Government/State": "Позиция в отношении нынешнего правительства/государства",
+ "Start": "Начинать",
+ "Stay in my current country": "Остаться в моей нынешней стране",
+ "Strict Horizontal Field Alignment": "Строгое горизонтальное выравнивание поля",
+ "Strictly religious and gender-segregated": "Строго религиозное и гендерное разделение",
+ "Strictly religious and segregated": "Строго религиозные и сегрегированные",
+ "Student": "Студент",
+ "Student Visa": "Студенческая виза",
+ "Student and Job Seeking": "Студент и поиск работы",
+ "Submit": "Представлять на рассмотрение",
+ "Submit Call Result": "Отправить результат звонка",
+ "Submit Final Outcome": "Отправить окончательный результат",
+ "Submit Man": "Отправить человека",
+ "Submit Process": "Отправить процесс",
+ "Submit Woman": "Отправить женщину",
+ "Subscription": "Подписка",
+ "Subscription Status": "Статус подписки",
+ "Support": "Поддерживать",
+ "Supporter of the current government, but a difference in view is not a red line.": "Сторонник нынешнего правительства, но разница во взглядах не является красной линией.",
+ "Supporter of the current government; serious opposition from my spouse is a red line.": "Сторонник действующего правительства; серьезное сопротивление со стороны моего супруга — это красная линия.",
+ "Sweden": "Швеция",
+ "Swipe to confirm": "Проведите пальцем, чтобы подтвердить",
+ "Swipe to confirm cancellation": "Проведите пальцем, чтобы подтвердить отмену",
+ "Swipe to confirm rejection": "Проведите пальцем, чтобы подтвердить отказ",
+ "Swipe to continue": "Проведите пальцем, чтобы продолжить",
+ "Swipe to pay 50 Habib Coins": "Проведите пальцем, чтобы заплатить 50 монет Хабиба.",
+ "Taking this test is not mandatory, but it will help you better search for a spouse. The Personality test is a test for self-knowledge and better understanding of your spouse.": "Прохождение этого теста не является обязательным, но оно поможет вам лучше искать супруга. Личностный тест – это тест на самопознание и лучшее понимание своего супруга.",
+ "Taking this test is not mandatory, but it will help you better understand your priorities and find a more compatible spouse.": "Прохождение этого теста не является обязательным, но оно поможет вам лучше понять свои приоритеты и найти более совместимого супруга.",
+ "Technical or Vocational Training": "Техническое или профессиональное обучение",
+ "Technical prevention of screenshots from profiles and chat environments.": "Техническая защита от скриншотов профилей и чатов.",
+ "Technology and Computers": "Технологии и компьютеры",
+ "Tehran": "Тегеран",
+ "Temporary Residence": "Временное проживание",
+ "Temporary conditions": "Временные условия",
+ "Temporary with family okay": "Временно с семьей, ок",
+ "Thank you for giving us feedback, we would be very happy if you also let us know the final result.": "Благодарим вас за отзыв, мы будем очень рады, если вы также сообщите нам конечный результат.",
+ "Thank you for your feedback. Our support team will investigate the matter and notify you of the result. Please wait patiently during the review; our support will contact you.": "Спасибо за ваш отзыв. Наша служба поддержки расследует вопрос и сообщит вам о результате. Пожалуйста, терпеливо ждите во время проверки; наша поддержка свяжется с вами.",
+ "Thank you for your feedback. To complete the process, please submit the final outcome of this introduction/contact so that the final status can be determined. If the final status is not yet determined, you can stay in this state until it is finalized.": "Спасибо за ваш отзыв. Чтобы завершить процесс, отправьте окончательный результат этого знакомства/контакта, чтобы можно было определить окончательный статус. Если окончательный статус еще не определен, вы можете оставаться в этом состоянии до его завершения.",
+ "The call may start 10-15 minutes earlier or later than scheduled.": "Звонок может начаться на 10-15 минут раньше или позже запланированного времени.",
+ "The selected candidate will contact your family shortly.": "Выбранный кандидат свяжется с вашей семьей в ближайшее время.",
+ "The value entered seems incorrect. Please provide a realistic value.": "Введенное значение кажется неверным. Пожалуйста, укажите реалистичную стоимость.",
+ "These concepts and categories are not a major concern for me.": "Эти понятия и категории не вызывают у меня большого беспокойства.",
+ "They do not live with me, or there is no fixed schedule.": "Они не живут со мной, или нет фиксированного графика.",
+ "Third country": "Третья страна",
+ "This field requires the user to declare all permanent medications currently being taken for any physical, psychological, medical, or non-medical condition.": "В этом поле пользователь должен указать все лекарства длительного действия, которые в настоящее время принимаются по поводу любого физического или психического состояния.",
+ "This field requires the user to upload a recent, clear facial photograph that will remain private and accessible exclusively to advisors.": "В этом поле пользователь должен загрузить недавнюю четкую фотографию лица, которая останется конфиденциальной и доступной исключительно консультантам.",
+ "This field specifies the full name of the designated intermediary whose contact information is provided to the other party to facilitate communication.": "В этом поле указывается полное имя назначенного посредника, контактная информация которого предоставляется другой стороне для облегчения связи.",
+ "This is not a priority for me": "Для меня это не приоритет",
+ "This payment acts as a verification process for your account and activates a 3-month subscription to receive new case introductions. The cost of this subscription is 50 Habib Coins.": "Этот платеж действует как процесс проверки вашей учетной записи и активирует трехмесячную подписку на получение новых сообщений о делах. Стоимость этой подписки составляет 50 монет Хабиба.",
+ "This private field requires the user to accurately declare their current marital status and relationship history from the specific options provided.": "Это личное поле требует от пользователя точно указать свое текущее семейное положение и историю отношений из конкретных предоставленных вариантов.",
+ "This section is designed to prevent serious ideological conflicts in married life.": "Этот раздел создан для предотвращения серьезных идеологических конфликтов в супружеской жизни.",
+ "To": "К",
+ "To keep the process moving smoothly, the other party has a 48-hour (2-day) window to make initial contact with you or your family. If no contact is established after 2 days, you have the option to decline his request or notify us that he hasn't reached out.": "Чтобы процесс проходил гладко, у другой стороны есть 48-часовое (2-дневное) окно для первоначального контакта с вами или вашей семьей. Если в течение 2 дней контакт не будет установлен, у вас есть возможность отклонить его запрос или уведомить нас о том, что он не связался с вами.",
+ "To preserve your peace of mind, security, and dignity, the acquaintance process on our platform follows authentic and respectful family traditions. Having a trusted person (preferably a father or mother) as a representative, in addition to reflecting your noble family background, encourages the other party to step forward with full seriousness, respect, and confidence.": "Чтобы сохранить ваше спокойствие, безопасность и достоинство, процесс знакомства на нашей платформе следует аутентичным и уважительным семейным традициям. Наличие доверенного лица (предпочтительно отца или матери) в качестве представителя, помимо отражения вашего благородного семейного происхождения, побуждает другую сторону выступить вперед с полной серьезностью, уважением и уверенностью.",
+ "Total Pages": "Всего страниц",
+ "Tourism and Travel": "Туризм и путешествия",
+ "Traditional (respectful of religious values)": "Традиционный (с уважением к религиозным ценностям)",
+ "Traditional and non-political view of Shiasm; cannot marry someone with a political view.": "Я придерживаюсь традиционных, аполитичных взглядов на шиизм и не могу выйти замуж за человека с политическими взглядами.",
+ "Trusted Family Friend": "Надежный друг семьи",
+ "Trusted Social Sponsor": "Надежный социальный спонсор",
+ "Turkey": "Турция",
+ "Turkish": "турецкий",
+ "Two-Column Side-by-Side Match Comparison": "Сравнение параллельных совпадений в двух столбцах",
+ "Type of Hijab and Public Appearance": "Тип хиджаба и внешний вид на публике",
+ "Unclear (pending dispute/agreement or depends on conditions).": "Неясно (ожидается спор/согласие или зависит от условий).",
+ "Undecided; depends on family agreement": "Не определился; зависит от семейного согласия",
+ "Under 160": "До 160",
+ "Understanding your five basic needs helps you recognize what truly drives your behavior in relationships.": "Понимание своих пяти основных потребностей поможет вам понять, что на самом деле движет вашим поведением в отношениях.",
+ "United Arab Emirates": "Объединенные Арабские Эмираты",
+ "United Kingdom": "Великобритания",
+ "United States": "Соединенные Штаты",
+ "Up to them": "До них",
+ "Upload document": "Загрузить документ",
+ "Upload identity documents.": "Загрузите документы, удостоверяющие личность.",
+ "Upload photo": "Загрузить фото",
+ "Upon your approval, your request will be sent to the lady, and we must await her response. This process may take between 2 to 4 days. Thank you for your patience.": "После вашего одобрения ваш запрос будет отправлен даме, и мы должны дождаться ее ответа. Этот процесс может занять от 2 до 4 дней. Спасибо за ваше терпение.",
+ "Urdu": "Урду",
+ "Use of Permanent Medications": "Использование постоянных лекарств",
+ "Used in the past, but not anymore": "Раньше использовался, но больше не используется",
+ "Users must meet the minimum legal age for independent registration.": "Пользователи должны достичь минимального установленного законом возраста для самостоятельной регистрации.",
+ "Users must provide proof of being single, or documents confirming divorce or spouse's death upon request.": "По запросу пользователи должны предоставить доказательства одиночества или документы, подтверждающие развод или смерть супруга.",
+ "Valid Identification Document": "Действительный документ, удостоверяющий личность",
+ "Valid for 3 months": "Действителен в течение 3 месяцев",
+ "Vape / E-cigarettes": "Вейп / Электронные сигареты",
+ "Vape is a red line": "Вейп – это красная линия",
+ "Verification & Subscription Activation": "Верификация и активация подписки",
+ "Very formal and limited": "Очень формальный и ограниченный",
+ "Very formal and limited (Only as necessary) - Avoid any unnecessary conversation or jokes.": "Очень формально и ограниченно (Только по мере необходимости). Избегайте ненужных разговоров и шуток.",
+ "Very religious and committed": "Очень религиозен и предан",
+ "View Contact": "Посмотреть контакт",
+ "View Contact Details": "Просмотр контактной информации",
+ "View More Details": "Посмотреть более подробную информацию",
+ "View Profile": "Посмотреть профиль",
+ "View contact number": "Посмотреть контактный номер",
+ "View more details": "Посмотреть более подробную информацию",
+ "View profile": "Посмотреть профиль",
+ "Watch Video": "Посмотреть видео",
+ "We are in the acquaintance/proposal process and nothing is finalized yet": "Мы находимся в процессе знакомства/предложения, и еще ничего не решено",
+ "We did not reach an agreement": "Мы не пришли к соглашению",
+ "We have come together with the goal of creating a secure and confidential path for \"permanent marriage\" among Muslims": "Мы объединились с целью создать безопасный и конфиденциальный путь к «постоянному браку» среди мусульман.",
+ "We hope the acquaintance process is going well. Please let us know if you want to continue the acquaintance process or if the match has been canceled.": "Надеемся, процесс знакомства проходит успешно. Пожалуйста, сообщите нам, если вы хотите продолжить процесс знакомства или матч отменен.",
+ "We provide a safe and respectful environment at every step.": "Мы обеспечиваем безопасную и уважительную среду на каждом этапе.",
+ "We reached an agreement": "Мы достигли соглашения",
+ "Weak": "Слабый",
+ "Weekends, holidays, or specific days only.": "Только выходные, праздники или определенные дни.",
+ "Weight in Kilograms": "Вес в килограммах",
+ "What is the custody status of your child(ren)?": "Каков статус опеки вашего ребенка (детей)?",
+ "What is the payment or receipt status of child support?": "Каков статус выплаты или получения алиментов?",
+ "What was the outcome of your contact?": "Каков был результат вашего контакта?",
+ "Widowed": "Вдовец",
+ "Will decide based on my future spouse's job, family, residence, and life circumstances.": "Приму решение, исходя из работы, семьи, места жительства и жизненных обстоятельств моего будущего супруга.",
+ "Will likely rent at the start": "Скорее всего, сдам в аренду в начале",
+ "Will not accept": "не приму",
+ "Willing to move to another city, but only within my current country.": "Готов переехать в другой город, но только в пределах моей нынешней страны.",
+ "Willingness to Relocate": "Готовность переехать",
+ "Wishing you a lifetime of love, joy, and happiness. Your profile has been successfully closed.": "Желаю вам жизни, полной любви, радости и счастья. Ваш профиль успешно закрыт.",
+ "Work Location": "Место работы",
+ "Work Visa": "Рабочая виза",
+ "Working Student": "Работающий студент",
+ "Write any important point that was not covered in the options above here.": "Напишите здесь любой важный момент, который не был описан в приведенных выше вариантах.",
+ "Write other options...": "Напишите другие варианты...",
+ "YOU HAVE A NEW MATCH!": "У ВАС НОВЫЙ МАТЧ!",
+ "YYYY-MM-DD": "ГГГГ-ММ-ДД",
+ "Year of birth": "Год рождения",
+ "Yes, I am restricted and must reside in the same city or region.": "Да, у меня есть ограничения, и я должен проживать в том же городе или регионе.",
+ "Yes, relocation or immigration requires coordination, agreement, or a legal permit.": "Да, переезд или иммиграция требуют согласования, соглашения или юридического разрешения.",
+ "Yes, they live with me permanently.": "Да, они живут со мной постоянно.",
+ "Yes, they live with me temporarily or periodically.": "Да, они живут у меня временно или периодически.",
+ "You are always in control of what happens next.": "Вы всегда контролируете то, что произойдет дальше.",
+ "You can now submit your request so we can start finding the right match for you": "Теперь вы можете отправить свой запрос, чтобы мы могли начать поиск подходящего для вас варианта.",
+ "You can now view their family's contact details and arrange further steps.": "Теперь вы можете просмотреть контактную информацию их семьи и договориться о дальнейших действиях.",
+ "You can pause the survey anytime and resume later. Your progress is saved automatically.": "Вы можете приостановить опрос в любое время и возобновить его позже. Ваш прогресс сохраняется автоматически.",
+ "You can't edit your profile while we're searching for matches": "Вы не можете редактировать свой профиль, пока мы ищем совпадения.",
+ "You currently do not have an active subscription. Activation of subscription is only possible when your first case is introduced to you.": "В настоящее время у вас нет активной подписки. Активация подписки возможна только тогда, когда вам будет представлен ваш первый случай.",
+ "You have active access to view candidates.": "У вас есть активный доступ для просмотра кандидатов.",
+ "You will be contacted by your consultant.": "С вами свяжется ваш консультант.",
+ "You've completed all required fields. However, filling in all sections will help us find better matches for you": "Вы заполнили все обязательные поля. Однако заполнение всех разделов поможет нам найти для вас более подходящие варианты.",
+ "Your Hobbies and Main Interests": "Ваши хобби и основные интересы",
+ "Your Personality Traits": "Ваши личностные качества",
+ "Your details are only used for the matching process.": "Ваши данные используются только для процесса сопоставления.",
+ "Your information is kept strictly confidential.": "Ваша информация хранится строго конфиденциально.",
+ "Your privacy and safety are our top priorities. We are committed to keeping your information secure and giving you full control throughout the process.": "Ваша конфиденциальность и безопасность являются нашими главными приоритетами. Мы стремимся обеспечить безопасность вашей информации и предоставить вам полный контроль на протяжении всего процесса.",
+ "Your request has been sent. Once the lady reviews your request, you will be notified.": "Ваш запрос отправлен. Как только женщина рассмотрит ваш запрос, вы получите уведомление.",
+ "Your request was rejected": "Ваш запрос отклонен",
+ "Your request was rejected by the lady. You will be introduced to other candidates in the future.": "Ваш запрос был отклонен дамой. В будущем вас познакомят с другими кандидатами.",
+ "Your subscription is active": "Ваша подписка активна",
+ "currentMaritalStatusTooltip": "текущий статус бракаПодсказка",
+ "familyResponsibilityTooltip": "семьяОтветственностьПодсказка",
+ "heavenly marriage": "небесный брак",
+ "marriages": "браки",
+ "matches": "спички",
+ "play": "играть",
+ "terms & conditions": "Условия использования",
+ "user profiles": "профили пользователей",
+ "user@example.com": "пользователь@example.com",
+ "video": "видео",
+ "{completed} of {total} required steps completed": "Выполнено {completed} из {total} требуемых шагов",
+ "{days} days remaining of your subscription.": "{days} дней до конца вашей подписки.",
+ "⚠️ This section is completely confidential and is only used for matching and review by advisors.": "⚠️ Этот раздел полностью конфиденциальен и используется только консультантами для сопоставления и проверки.",
+ "Please select the reason for cancellation:": "Пожалуйста, выберите причину отмены:"
}
diff --git a/src/translations/path_to_english.json b/src/translations/path_to_english.json
index 253b233..2c472a8 100644
--- a/src/translations/path_to_english.json
+++ b/src/translations/path_to_english.json
@@ -245,4 +245,4 @@
"onboarding.accept": "Accept",
"rejectionNotice.title": "Your request was rejected",
"rejectionNotice.message": "Your request was rejected by the lady. You will be introduced to other candidates in the future."
-}
\ No newline at end of file
+}