Browse Source

feat: implement comprehensive marriage profile viewing system with multi-language support and custom UI components

front-test-2
ghorbani 3 weeks ago
parent
commit
a386e3880a
  1. 2
      docker-compose.yml
  2. 10
      public/assets/images/female_avatar.svg
  3. 9
      public/assets/images/islamic_pattern_2_2892_3864.svg
  4. 2
      src/app/api/dev-reset-profile/route.ts
  5. 233
      src/app/candidate-contact/page.tsx
  6. 224
      src/app/new-match/page.tsx
  7. 162
      src/app/new-match/profile/page.tsx
  8. 65
      src/app/request-accepted/page.tsx
  9. 2
      src/app/request-sent/page.tsx
  10. 25
      src/components/Componentes/navigation-button.tsx
  11. 147
      src/components/Componentes/payment-swipe-modal.tsx
  12. 6
      src/components/Componentes/question-answer-storage.tsx
  13. 5
      src/components/Componentes/question-birthplace.tsx
  14. 267
      src/components/Componentes/question-phone.tsx
  15. 7
      src/components/Componentes/question-section-flow.tsx
  16. 2
      src/components/Componentes/subscription-required-sheet.tsx
  17. 81
      src/components/Componentes/token-switcher.tsx
  18. 9
      src/data/questions/en.json
  19. 9
      src/data/questions/fa.json
  20. 48
      src/translations/locales/ar.json
  21. 48
      src/translations/locales/az.json
  22. 48
      src/translations/locales/bn.json
  23. 48
      src/translations/locales/da.json
  24. 48
      src/translations/locales/de.json
  25. 48
      src/translations/locales/en.json
  26. 48
      src/translations/locales/es.json
  27. 46
      src/translations/locales/fa.json
  28. 48
      src/translations/locales/fr.json
  29. 48
      src/translations/locales/gu.json
  30. 48
      src/translations/locales/ha.json
  31. 48
      src/translations/locales/he.json
  32. 48
      src/translations/locales/hi.json
  33. 48
      src/translations/locales/id.json
  34. 48
      src/translations/locales/ks.json
  35. 48
      src/translations/locales/pt.json
  36. 48
      src/translations/locales/ru.json
  37. 48
      src/translations/locales/sw.json
  38. 48
      src/translations/locales/tg.json
  39. 48
      src/translations/locales/tr.json
  40. 48
      src/translations/locales/ul.json
  41. 48
      src/translations/locales/ur.json
  42. 48
      src/translations/locales/uz.json
  43. 48
      src/translations/locales/zh.json

2
docker-compose.yml

@ -10,7 +10,7 @@ services:
environment:
- NODE_ENV=production
- NEXT_PUBLIC_API_BASE_URL=https://habibapp.com
- NEXT_PUBLIC_SECURITY_KEY=t5yugymks5458fd4ghfg6h6
- NEXT_PUBLIC_SECURITY_KEY=t5yugymks5458fd4ghfg6h6fg
restart: unless-stopped
healthcheck:
test: ["CMD", "wget", "--no-verbose", "--tries=1", "--spider", "http://localhost:3000"]

10
public/assets/images/female_avatar.svg
File diff suppressed because it is too large
View File

9
public/assets/images/islamic_pattern_2_2892_3864.svg
File diff suppressed because it is too large
View File

2
src/app/api/dev-reset-profile/route.ts

@ -19,7 +19,7 @@ export async function POST(request: NextRequest) {
}
const scriptPath =
"C:\\Users\\User\\.gemini\\antigravity-ide\\brain\\5015ea2d-f1fc-4e3d-9372-4bb0670449cc\\scratch\\reset_user.py";
"c:\\Users\\User\\Downloads\\NWHCO\\Habib\\backend\\scripts\\reset_user.py";
// Construct the command safely with numeric userId
const command = `python "${scriptPath}" ${Number(userId)}`;
const { stdout, stderr } = await execAsync(command);

233
src/app/candidate-contact/page.tsx

@ -1,30 +1,233 @@
"use client";
import Image from "next/image";
import { useState } from "react";
import Button from "@/components/Componentes/button";
import { useRouter } from "next/navigation";
import { useEffect, useState } from "react";
import { DotsLoader } from "@/components/Componentes/button";
import CallResultSheet from "@/components/Componentes/call-result-sheet";
import DismissReasonSheet from "@/components/Componentes/dismiss-reason-sheet";
import NavigationButton from "@/components/Componentes/navigation-button";
import AdvisorActionsCard from "@/components/Componentes/advisor-actions-card";
import { PageBackground } from "@/components/Componentes/page-background";
import { useMarriageProfileQuery } from "@/hooks/marriage/use-profile-main";
import { useSubmitMarriageContactStatusMutation } from "@/hooks/marriage/use-contact-status";
import { getSubmitPath } from "@/lib/get-submit-path";
import { localizePath } from "@/translations/config";
import { useI18n } from "@/translations/provider";
const advisorAvatars = [
{ id: "advisor-primary", src: "/assets/images/Avatar Image.png" },
{ id: "advisor-secondary", src: "/assets/images/Ellipse 370.png" },
{ id: "advisor-tertiary", src: "/assets/images/Avatar Image.png" },
];
export default function CandidateContactPage() {
const { dictionary: t } = useI18n();
const { dictionary: t, locale } = useI18n();
const router = useRouter();
const [isCallResultSheetOpen, setIsCallResultSheetOpen] = useState(false);
const [isDismissReasonSheetOpen, setIsDismissReasonSheetOpen] =
useState(false);
const { data: profile, isLoading: isProfileLoading } = useMarriageProfileQuery({
refetchInterval: 3000,
});
useEffect(() => {
if (!profile) {
return;
}
const targetPath = getSubmitPath(profile);
if (targetPath !== "/candidate-contact") {
router.replace(localizePath(targetPath, locale));
}
}, [profile, router, locale]);
const caseId = profile?.active_case?.case_id;
const isFemale = profile?.gender === "female";
const contactStatusMutation = useSubmitMarriageContactStatusMutation(
caseId ?? "",
{
onSuccess: () => {
router.push(localizePath("/finding-match", locale));
},
},
);
const handleNoContactReport = async () => {
if (!caseId || contactStatusMutation.isPending) return;
await contactStatusMutation.mutateAsync({
action: "no_contact",
custom_note: "No contact reported by female candidate after decision window",
});
};
if (isProfileLoading) {
return (
<>
<PageBackground />
<main className="-mx-[17px] flex min-h-screen flex-col px-[23px] pt-[max(16px,calc(var(--safe-top)+8px))] items-center justify-center">
<DotsLoader />
</main>
</>
);
}
// If female, render the beautiful, customized layout matching the design
if (isFemale) {
return (
<>
<PageBackground />
{isCallResultSheetOpen ? (
<CallResultSheet
onClose={() => setIsCallResultSheetOpen(false)}
onOtherReasonsClick={() => setIsDismissReasonSheetOpen(true)}
onSubmit={async (value) => {
if (caseId) {
await contactStatusMutation.mutateAsync({
action: "contacted",
custom_note: value,
});
}
}}
/>
) : null}
{isDismissReasonSheetOpen ? (
<DismissReasonSheet
onClose={() => setIsDismissReasonSheetOpen(false)}
onSubmit={async (value) => {
if (caseId) {
await contactStatusMutation.mutateAsync({
action: "contacted",
custom_note: value,
});
}
}}
/>
) : null}
<main className="-mx-[17px] flex min-h-screen flex-col px-[23px] pt-[max(16px,calc(var(--safe-top)+8px))] pb-[calc(20px+var(--safe-bottom))]">
<header className="-mx-[6px] flex items-center justify-between pb-3">
<NavigationButton icon="back" className="rounded-full w-10 h-10 flex items-center justify-center p-0 shadow-xs" />
<h1 className="font-faminela text-[20px] font-bold text-[#111111]">{t.common.appName}</h1>
<NavigationButton icon="support" iconLabel={t.common.support} className="rounded-full w-10 h-10 flex items-center justify-center p-0 shadow-xs" />
</header>
<div className="flex flex-1 flex-col justify-between gap-6 pt-4">
<section className="flex flex-col items-center">
{/* Illustration section */}
<div className="relative mt-4 flex items-center justify-center">
<Image
src="/assets/images/Group 159788fd0467.svg"
alt={t.candidateContact.imageAlt}
width={160}
height={152}
priority
/>
</div>
{/* Title / Status message */}
<h1 className="mt-8 text-center text-[20px] leading-[1.25] font-bold text-[#1A1A1A] max-w-[280px]">
{t.candidateContact.title}
</h1>
{/* Action Buttons Row */}
<div className="flex mt-8 w-full gap-3">
<button
type="button"
onClick={handleNoContactReport}
disabled={contactStatusMutation.isPending}
className="flex-1 h-[52px] rounded-[15px] bg-[#F5F5F7] text-[#8E8E93] font-semibold group-14 flex items-center justify-center transition-transform active:scale-[0.98] cursor-pointer hover:bg-[#EAEAEF] disabled:opacity-50"
>
{contactStatusMutation.isPending ? (
<DotsLoader className="text-[#8E8E93]" />
) : (
t.candidateContact.noContactYet
)}
</button>
<button
type="button"
onClick={() => setIsCallResultSheetOpen(true)}
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"
>
{t.candidateContact.contacted}
</button>
</div>
{/* Red warning box */}
<div className="w-full border border-[#F0445B] bg-[#FFF5F6] rounded-[15px] mt-4 px-4 py-3 text-center">
<p className="text-[#F0445B] group-12 font-semibold leading-normal">
{t.candidateContact.contactWarning}
</p>
</div>
</section>
<div className="space-y-4">
{/* Advisor section */}
<AdvisorActionsCard
title={t.findingMatch.advisorTitle}
description={t.findingMatch.advisorDescription}
avatars={advisorAvatars}
extraCount={7}
getAdvisorLabel={t.findingMatch.getAdvisor}
getAdvisorHref="/questions-list"
/>
{/* Profile Locked banner */}
<section className="flex flex-col items-center text-center">
<div className="flex items-center justify-center py-[17px] rounded-[15px] gap-2 w-full bg-[#E0E0E0]">
<Image
src="/assets/images/material-symbols_lock.svg"
width={16}
height={16}
alt="lock"
/>
<h2 className="group-14 leading-none font-semibold text-[#747474]">
{t.requestSent.profileLocked}
</h2>
</div>
</section>
</div>
</div>
</main>
</>
);
}
// Fallback UI for male/other users
return (
<>
<PageBackground />
{isCallResultSheetOpen ? (
<CallResultSheet
onClose={() => setIsCallResultSheetOpen(false)}
onOtherReasonsClick={() => setIsDismissReasonSheetOpen(true)}
onSubmit={async (value) => {
if (caseId) {
await contactStatusMutation.mutateAsync({
action: "contacted",
custom_note: value,
});
}
}}
/>
) : null}
{isDismissReasonSheetOpen ? (
<DismissReasonSheet
onClose={() => setIsDismissReasonSheetOpen(false)}
onSubmit={async (value) => {
if (caseId) {
await contactStatusMutation.mutateAsync({
action: "contacted",
custom_note: value,
});
}
}}
/>
) : null}
@ -54,14 +257,28 @@ export default function CandidateContactPage() {
style={{ paddingBottom: `calc(2rem + var(--safe-bottom))` }}
className="fixed right-0 bottom-0 left-0 z-20 mx-auto flex w-full sm:max-w-[375px] gap-3 rounded-t-[30px] bg-white px-[17px] pt-6 shadow-[0_-18px_50px_rgba(15,23,42,0.08)]"
>
<Button className="" onClick={() => setIsCallResultSheetOpen(true)}>
<button
type="button"
onClick={() => setIsCallResultSheetOpen(true)}
className="flex-1 h-[52px] rounded-[11px] bg-gradient-to-tl from-[#FE6F82] to-[#E03950] text-white font-semibold flex items-center justify-center cursor-pointer transition-opacity active:opacity-90"
>
{t.candidateContact.contacted}
</Button>
<Button className="" description={t.candidateContact.afterTwoDays}>
{t.candidateContact.noContactYet}
</Button>
</button>
<button
type="button"
onClick={handleNoContactReport}
disabled={contactStatusMutation.isPending}
className="flex-1 h-[52px] rounded-[11px] border border-[#8B8B8B] bg-transparent text-[#8B8B8B] font-semibold flex items-center justify-center cursor-pointer transition-opacity active:opacity-90 disabled:opacity-50"
>
{contactStatusMutation.isPending ? (
<DotsLoader className="text-[#8B8B8B]" />
) : (
t.candidateContact.noContactYet
)}
</button>
</section>
</main>
</>
);
}

224
src/app/new-match/page.tsx

@ -9,14 +9,15 @@ import AdvisorActionsCard from "@/components/Componentes/advisor-actions-card";
import { DotsLoader } from "@/components/Componentes/button";
import NavigationButton from "@/components/Componentes/navigation-button";
import { PageBackground } from "@/components/Componentes/page-background";
import PaymentSwipeModal from "@/components/Componentes/payment-swipe-modal";
import { IoClose } from "react-icons/io5";
import { useHabcoinPaymentMutation } from "@/hooks/marriage/use-habcoin-payment";
import { useRespondToMarriageCaseMutation } from "@/hooks/marriage/use-case-respond";
import type {
MarriageField,
MarriageFieldValue,
MarriageMatchSummary,
MarriagePhoneFieldValue,
} from "@/hooks/marriage/types";
import { useHabcoinPaymentMutation } from "@/hooks/marriage/use-habcoin-payment";
import { useMarriageProfileQuery } from "@/hooks/marriage/use-profile-main";
import { useViewPaddings } from "@/hooks/use-view-paddings";
import { getSubmitPath } from "@/lib/get-submit-path";
@ -214,8 +215,51 @@ export default function NewMatchPage() {
const { dictionary: t, locale } = useI18n();
const { top, bottom } = useViewPaddings();
const { data: profile, isError, isLoading } = useMarriageProfileQuery();
const [isPaymentSheetOpen, setIsPaymentSheetOpen] = useState(false);
const [paymentError, setPaymentError] = useState<string | null>(null);
const paymentMutation = useHabcoinPaymentMutation();
const caseId = profile?.active_case?.case_id;
const respondMutation = useRespondToMarriageCaseMutation(caseId ?? "", {
onSuccess: () => {
router.replace(localizePath("/finding-match", locale));
},
});
const handlePayment = async () => {
const recommendedPlanId = profile?.recommended_plan?.id;
if (!recommendedPlanId) return;
try {
setPaymentError(null);
await paymentMutation.mutateAsync(recommendedPlanId);
setIsPaymentSheetOpen(false);
router.push(localizePath("/new-match/profile", locale));
} catch (err: any) {
console.error("Payment failed", err);
const msg =
err?.response?.data?.error || err?.message || "Payment failed";
const modalT = (t as any).paymentModal || {};
if (msg === "Not enough coins") {
setPaymentError(
modalT.insufficientCoins ||
"Insufficient coin balance. Please recharge your account.",
);
} else {
setPaymentError(msg);
}
}
};
const handleDecline = async () => {
if (!caseId) return;
try {
await respondMutation.mutateAsync({ action: "reject" });
} catch (err) {
console.error("Decline failed", err);
}
};
useEffect(() => {
if (!profile) {
@ -235,54 +279,23 @@ export default function NewMatchPage() {
const isFemaleProfile = profile?.gender === "female";
const matchHeadingTitle = isFemaleProfile
? "پیشنهاد ازدواج جدید"
: "YOU HAVE A NEW MATCH!";
? t.match.newMatchTitleFemale
: t.match.newMatchTitleMale;
const matchHeadingDescription = isFemaleProfile
? "یک گزینه‌ی مناسب برای شما پیدا شده است. در صورت تایید، مشخصات شما جهت ادامه فرآیند معرفی ارزیابی خواهد شد."
: "A matching profile has been found. Information is provided by the candidate's family or introducers. If you approve, we'll share your profile with her family.";
? t.match.newMatchDescriptionFemale
: t.match.newMatchDescriptionMale;
const isMale = profile?.gender === "male";
const hasActiveSub = !!profile?.active_subscription;
const isMatchAvailable = !!profile?.match_summary;
const showPaymentModal = isMale && !hasActiveSub && isMatchAvailable;
const handlePayment = async () => {
const recommendedPlanId = profile?.recommended_plan?.id;
if (!recommendedPlanId) return;
try {
setPaymentError(null);
await paymentMutation.mutateAsync(recommendedPlanId);
} catch (err: any) {
console.error("Payment failed", err);
const msg =
err?.response?.data?.error || err?.message || "Payment failed";
const modalT = (t as any).paymentModal || {};
if (msg === "Not enough coins") {
setPaymentError(
modalT.insufficientCoins ||
"Insufficient coin balance. Please recharge your account.",
);
} else {
setPaymentError(msg);
}
}
};
return (
<>
<PageBackground />
{showPaymentModal && (
<PaymentSwipeModal
onSuccess={handlePayment}
isPaymentPending={paymentMutation.isPending}
errorMessage={paymentError}
/>
)}
<main
style={{
paddingBottom: `${20 + bottom}px`,
paddingBottom: `${profile?.can_edit_profile === false ? 100 + bottom : 20 + bottom}px`,
paddingTop: `${Math.max(12, top + 4)}px`,
}}
className="-mx-[17px] min-h-screen h-full text-center px-4"
@ -356,12 +369,19 @@ export default function NewMatchPage() {
) : null}
</div>
<Link
href={localizePath("/new-match/profile", locale)}
className="mt-[15px] inline-flex w-full items-center justify-center rounded-[10px] border-none bg-white py-[12px] text-[16px] font-semibold text-[#F0445B] no-underline shadow-none hover:bg-white/95 transition-colors"
<button
type="button"
onClick={() => {
if (isMale && !hasActiveSub) {
setIsPaymentSheetOpen(true);
} else {
router.push(localizePath("/new-match/profile", locale));
}
}}
className="mt-[15px] inline-flex w-full items-center justify-center rounded-[10px] border-none bg-white py-[12px] text-[16px] font-semibold text-[#F0445B] no-underline shadow-none hover:bg-white/95 transition-colors cursor-pointer"
>
View Profile
</Link>
{t.match.viewMoreDetails}
</button>
</>
) : (
<p className="py-8 text-[13px] font-semibold">
@ -380,18 +400,122 @@ export default function NewMatchPage() {
getAdvisorHref="/questions-list"
/>
<div className="flex cursor-not-allowed w-full items-center justify-center rounded-[11px] border-none bg-[#DBDBDB] px-6 py-3.5 text-[#747474] no-underline shadow-none">
<span className="flex items-center gap-1">
<FaLock className="size-6 shrink-0 text-[#747474]" />
<span className="leading-none font-semibold tracking-[-0.03em]">
Profile locked
</span>
</div>
</div>
</div>
</main>
{profile?.can_edit_profile === false && (
<div
style={{ paddingBottom: `${16 + bottom}px` }}
className="fixed inset-x-0 bottom-0 z-20 mx-auto w-full max-w-[375px] bg-background/95 px-[17px] pt-3 pb-[16px] backdrop-blur-md"
>
<div
className="inline-flex w-full items-center justify-center gap-2 rounded-[9px] border-none bg-[#D1D1D6] px-4 py-[17px] text-center text-[#747474] shadow-none"
role="status"
>
<FaLock aria-hidden="true" className="h-3.5 w-3.5 shrink-0" />
<span className="group-16 leading-none font-semibold">
{t.requestSent.profileLocked}
</span>
</div>
</div>
)}
{isPaymentSheetOpen && (
<div className="fixed inset-0 z-50 flex items-end justify-center bg-black/50 backdrop-blur-xs p-4 animate-in fade-in duration-200">
<div
style={{ paddingBottom: `calc(20px + ${bottom}px)` }}
className="relative w-full max-w-[375px] rounded-[24px] bg-white px-5 pt-6 shadow-[0_-8px_30px_rgba(0,0,0,0.12)] border border-slate-100 animate-in slide-in-from-bottom duration-300 text-center"
>
<button
type="button"
className="absolute top-4 right-4 text-[#8F8F8F] hover:text-[#5F5F5F] transition-colors"
onClick={() => {
setIsPaymentSheetOpen(false);
setPaymentError(null);
}}
>
<IoClose className="text-[22px]" />
</button>
<div className="flex flex-col items-center">
<div className="flex h-12 w-12 items-center justify-center rounded-full bg-[#F0445B] text-white mb-4">
<Image
src="/assets/images/noun-wedding-rings-6540466 1.svg"
alt=""
width={28}
height={28}
className="text-white"
/>
</div>
<h3 className="group-16 font-bold text-gray-900 mb-2">
{t.paymentModal?.title || "Verification & Subscription Activation"}
</h3>
<p className="text-xs text-gray-500 leading-relaxed mb-4 text-center">
{t.paymentModal?.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."}
</p>
<div className="w-full bg-gray-50 rounded-xl p-3 mb-4 text-center">
<span className="text-[10px] text-gray-400 block mb-0.5">
{t.paymentModal?.activeFor3Months || "Valid for 3 months"}
</span>
<span className="text-base font-bold text-[#FF4E67]">
{t.paymentModal?.cost || "50 Habib Coins"}
</span>
</div>
<p className="text-[10px] text-gray-400 leading-normal mb-6 text-center">
{t.paymentModal?.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."}
</p>
{paymentError && (
<div className="w-full bg-[#FEF2F2] text-[#B91C1C] text-xs p-3 rounded-xl mb-4 text-center font-medium">
{paymentError}
</div>
)}
<div className="grid w-full grid-cols-[1fr_2fr] gap-3">
<button
type="button"
disabled={paymentMutation.isPending || respondMutation.isPending}
className="appearance-none border-0 bg-transparent p-0 text-left disabled:cursor-not-allowed disabled:opacity-70 min-w-0"
onClick={handleDecline}
>
<div className="inline-flex w-full items-center justify-center rounded-[18px] border border-[#9A9A9A] bg-[#F7F7F7] px-4 py-[18px] text-[16px] font-bold text-[#8B8B8B] shadow-[inset_0_1px_0_rgba(255,255,255,0.8)] transition-opacity active:opacity-90 min-w-0">
<span className="truncate">{t.common?.decline || "Decline"}</span>
</div>
</button>
<button
type="button"
disabled={paymentMutation.isPending || respondMutation.isPending}
className="appearance-none border-0 bg-transparent p-0 text-left disabled:cursor-not-allowed disabled:opacity-70 min-w-0"
onClick={handlePayment}
>
<div className="inline-flex w-full items-center justify-center gap-3 rounded-[18px] bg-[#F0445B] px-4 py-[16px] text-[16px] font-semibold text-white shadow-[0_10px_18px_rgba(240,68,91,0.28)] transition-opacity active:opacity-90 min-w-0">
<span className="truncate min-w-0">{t.paymentModal?.pay || "Pay"}</span>
<span className="inline-flex items-center gap-1 rounded-full bg-[#E43B51] p-1.5 text-xs font-semibold leading-none text-white shadow-[inset_0_1px_0_rgba(255,255,255,0.12)] shrink-0 min-w-0 max-w-[120px]">
<Image
src="/assets/images/Inner Plugdsain Iframe.svg"
alt=""
aria-hidden="true"
width={18}
height={18}
className="shrink-0"
/>
<span className="truncate">{t.paymentModal?.cost || "50 Coins"}</span>
</span>
</div>
</button>
</div>
</div>
</div>
</div>
</main>
)}
</>
);
}

162
src/app/new-match/profile/page.tsx

@ -85,7 +85,7 @@ function canAcceptProfile(
return status === "introduced";
}
function MatchField({ field }: { field: MarriageField }) {
function MatchField({ field, isCandidateFemale }: { field: MarriageField; isCandidateFemale: boolean }) {
const value = formatFieldValue(field.value);
if (!value || isImageField(field)) {
@ -94,6 +94,25 @@ function MatchField({ field }: { field: MarriageField }) {
const label = field.label || titleFromKey(field.key);
if (isCandidateFemale) {
return (
<div className="flex flex-col items-start w-full border-b border-black/10 pb-[14px] mt-[14px]">
<p
className="text-[12px] font-semibold leading-[17px] text-[#978787]"
style={{ fontFamily: "'Segoe UI', sans-serif" }}
>
{label}
</p>
<p
className="text-[16px] font-bold leading-[20px] text-[#111111] mt-[7px] text-left"
style={{ fontFamily: "'Segoe UI', sans-serif" }}
>
{value}
</p>
</div>
);
}
return (
<div className="mb-3 space-y-1 border-b border-[#000000]/08 pb-2.5 text-left">
<p className="text-[11px] font-semibold text-[#8E8E93]">{label}</p>
@ -104,8 +123,10 @@ function MatchField({ field }: { field: MarriageField }) {
function MatchPublicProfileFields({
publicInfo,
isCandidateFemale,
}: {
publicInfo: MarriageField[] | null | undefined;
isCandidateFemale: boolean;
}) {
const visibleFields = useMemo(() => {
if (!publicInfo) return [];
@ -130,6 +151,16 @@ function MatchPublicProfileFields({
);
}
if (isCandidateFemale) {
return (
<div className="flex flex-col w-full mt-6" style={{ gap: '14px' }}>
{visibleFields.map((field) => (
<MatchField key={field.key} field={field} isCandidateFemale={true} />
))}
</div>
);
}
return (
<div className="mt-6 space-y-3 rounded-[18px] bg-white/80 p-4 shadow-xs">
<h3 className="border-b border-[#F0445B]/15 pb-2 text-right group-12 font-bold text-[#F0445B]">
@ -137,7 +168,7 @@ function MatchPublicProfileFields({
</h3>
<div className="space-y-2.5">
{visibleFields.map((field) => (
<MatchField key={field.key} field={field} />
<MatchField key={field.key} field={field} isCandidateFemale={false} />
))}
</div>
</div>
@ -214,6 +245,17 @@ function NewMatchProfileSkeleton() {
);
}
function formatBoldText(text: string) {
if (!text) return "";
const parts = text.split(/\*\*([^*]+)\*\*/g);
return parts.map((part, index) => {
if (index % 2 === 1) {
return <strong key={index} className="font-bold text-[#111111]">{part}</strong>;
}
return part;
});
}
export default function NewMatchProfilePage() {
const { dictionary: t, locale } = useI18n();
const router = useRouter();
@ -234,7 +276,7 @@ export default function NewMatchProfilePage() {
return;
}
const targetPath = getSubmitPath(profile);
if (targetPath !== "/new-match") {
if (targetPath !== "/new-match" && targetPath !== "/request-sent") {
router.replace(localizePath(targetPath, locale));
}
}, [profile, locale, router]);
@ -271,15 +313,38 @@ export default function NewMatchProfilePage() {
return formatFieldValue(firstVal) || "نامشخص";
}, [profile?.match_summary?.public_info]);
const isCandidateFemale =
profile?.match_summary?.gender === "female" ||
profile?.gender === "male";
const avatarSrc = isCandidateFemale
? "/assets/images/female_avatar.svg"
: "/assets/images/Group 1597880481.png";
if (isLoading || !profile) {
return <NewMatchProfileSkeleton />;
}
const isSubmitting = respondMutation.isPending;
const isAcceptProfileEnabled =
Boolean(caseId) &&
!isSubmitting &&
canAcceptProfile(profile?.gender, caseStatus);
const isAcceptProfileEnabled = isFemaleProfile
? !isSubmitting
: (
Boolean(caseId) &&
!isSubmitting &&
canAcceptProfile(profile?.gender, caseStatus)
);
const nameParts = candidateName.trim().split(/\s+/);
const firstName = nameParts[0] || "";
const lastName = nameParts.slice(1).join(" ") || "";
const mainClass = "-mx-[17px] flex min-h-screen flex-col pb-10";
const mainStyle = {
backgroundImage: `url("/assets/images/islamic_pattern_2_2892_3864.svg"), linear-gradient(178.25deg, rgba(255, 197, 196, 0.2) 1.48%, rgba(251, 237, 237, 0.2) 20.64%)`,
backgroundColor: '#F5F5F5',
backgroundRepeat: 'repeat-y',
backgroundSize: '100% auto, 100% 100%'
};
return (
<>
@ -287,8 +352,8 @@ export default function NewMatchProfilePage() {
{isRequestSheetOpen ? (
isFemaleProfile ? (
<FemaleConsentSheet
title="Final Confirmation & Consent"
description="By approving this profile, the male candidate will be notified to proceed with acquiring your contact information for further communication. Please ensure full family alignment before proceeding"
title={t.match.femaleConsentTitle}
description={formatBoldText(t.match.femaleConsentDescription)}
buttons={({ close }) => (
<div className="space-y-5">
<button
@ -310,9 +375,7 @@ export default function NewMatchProfilePage() {
) : null}
</span>
<span className="text-xs leading-[1.35] text-[#3F3F3F]">
I confirm that the female candidate and her family have
reviewed this profile and tentatively agree to further
communication
{formatBoldText(t.match.femaleConsentCheckboxLabel)}
</span>
</button>
@ -354,8 +417,8 @@ export default function NewMatchProfilePage() {
) : (
<InformationSheet
icon="check"
title="Request to Proceed"
description="With your approval, we will approach their family on your behalf to propose marriage. After their family agrees, you will be introduced to each other for further acquaintance."
title={t.match.requestProceedTitle}
description={t.match.requestProceedDescription}
buttons={({ close }) => (
<div className="grid w-full grid-cols-2 gap-3">
<Button
@ -483,7 +546,7 @@ export default function NewMatchProfilePage() {
/>
) : null}
<main className="-mx-[17px] flex min-h-screen flex-col bg-[linear-gradient(180deg,rgba(255,197,196,0.2)_0%,rgba(251,237,237,0.7)_100%)] pb-10">
<main className={mainClass} style={mainStyle}>
<StickyHeader>
<div className="flex items-center justify-between gap-3">
<NavigationButton
@ -491,7 +554,10 @@ export default function NewMatchProfilePage() {
icon="close"
iconLabel={t.match.goBack}
/>
<h1 className="min-w-0 flex-1 text-center group-16 font-bold text-white">
<h1
className="min-w-0 flex-1 text-center font-semibold text-[14px] leading-[16px] text-white"
style={{ fontFamily: "'Segoe UI', sans-serif" }}
>
{t.match.title}
</h1>
<div className="size-10 shrink-0" />
@ -499,29 +565,59 @@ export default function NewMatchProfilePage() {
</StickyHeader>
<section className="px-[17px] pb-32 pt-5">
<div>
<Image
src={"/assets/images/Group 1597880481.png"}
alt=""
width={90}
height={90}
className="rounded-full"
/>
<div className="relative inline-block mt-2">
<p
className="text-[25px] leading-none text-white/80"
style={{ letterSpacing: "-2.3px", fontWeight: "1000" }}
<div
className="mx-auto flex flex-col items-center justify-center"
style={{
width: "343px",
height: isCandidateFemale ? "124px" : "125px",
gap: "10px",
}}
>
{/* Frame 2095586585 - Avatar Section */}
<div
className="flex flex-col items-center justify-center w-full"
style={{
height: "125px",
gap: "8px",
}}
>
{/* Avatar Group */}
<div
className="relative overflow-hidden rounded-full w-[90px] h-[90px]"
>
{candidateName}
</p>
<p className="absolute inset-0 whitespace-nowrap text-[22px] font-bold leading-none text-[#F0445B]">
{candidateName}
</p>
<Image
src={avatarSrc}
alt=""
width={90}
height={90}
className="w-full h-full object-cover"
/>
</div>
{/* Frame 2095586663 - Names Section */}
<div
className="flex flex-row items-center justify-center w-full animate-fade-in"
style={{
height: "26px",
}}
>
<span
className="font-bold text-[22px] leading-[26px] text-[#F0445B] text-center"
style={{
fontFamily: "'Segoe UI', sans-serif",
WebkitTextStroke: '2px rgba(255, 255, 255, 0.5)',
paintOrder: 'stroke fill'
}}
>
{candidateName}
</span>
</div>
</div>
</div>
<MatchPublicProfileFields
publicInfo={profile?.match_summary?.public_info}
isCandidateFemale={true}
/>
</section>

65
src/app/request-accepted/page.tsx

@ -4,13 +4,13 @@ import Image from "next/image";
import Link from "next/link";
import { useRouter } from "next/navigation";
import { useEffect, useState } from "react";
import { FiCopy, FiPhone } from "react-icons/fi";
import { DotsLoader } from "@/components/Componentes/button";
import CallResultSheet from "@/components/Componentes/call-result-sheet";
import DismissReasonSheet from "@/components/Componentes/dismiss-reason-sheet";
import FemaleConsentSheet from "@/components/Componentes/female-consent-sheet";
import NavigationButton from "@/components/Componentes/navigation-button";
import SubscriptionRequiredSheet from "@/components/Componentes/subscription-required-sheet";
import { PageBackground } from "@/components/Componentes/page-background";
import SubscriptionRequiredSheet from "@/components/Componentes/subscription-required-sheet";
import type {
MarriageField,
MarriagePhoneFieldValue,
@ -140,9 +140,11 @@ function ContactInfoPhoneCard({ item }: { item: ContactInfoPhoneItem }) {
}
export default function RequestAcceptedPage() {
const { locale } = useI18n();
const { dictionary: t, locale } = useI18n();
const router = useRouter();
const [isCallResultSheetOpen, setIsCallResultSheetOpen] = useState(false);
const [isDismissReasonSheetOpen, setIsDismissReasonSheetOpen] =
useState(false);
const [isContactInfoSheetOpen, setIsContactInfoSheetOpen] = useState(false);
const [isSubscriptionSheetOpen, setIsSubscriptionSheetOpen] = useState(false);
const profileHref = localizePath("/new-match/profile", locale);
@ -177,18 +179,18 @@ export default function RequestAcceptedPage() {
enabled: false,
});
const titleText = isFemaleProfile
? "درخواست تایید شد"
? t.requestAccepted.titleFemale
: caseStatus === "payment_done"
? "اطلاعات تماس آزاد شد"
: "درخواست توسط خانم تایید شد!";
? t.requestAccepted.titleMalePaymentDone
: t.requestAccepted.titleMalePaymentPending;
const primaryActionText = isFemaleProfile
? "اطلاع‌رسانی عدم تماس"
: "مشاهده پروفایل";
? t.requestAccepted.primaryFemale
: t.requestAccepted.primaryMale;
const secondaryActionText = isFemaleProfile
? "ثبت نتیجه تماس"
? t.requestAccepted.secondaryFemale
: caseStatus === "payment_done"
? "مشاهده شماره تماس"
: "پرداخت و دریافت تماس";
? t.requestAccepted.secondaryMalePaymentDone
: t.requestAccepted.secondaryMalePaymentPending;
const contactInfoPhoneItems = getContactInfoPhoneItems(
contactInfoQuery.data?.contact_info,
);
@ -259,6 +261,21 @@ export default function RequestAcceptedPage() {
{isCallResultSheetOpen ? (
<CallResultSheet
onClose={() => setIsCallResultSheetOpen(false)}
onOtherReasonsClick={() => setIsDismissReasonSheetOpen(true)}
onSubmit={async (value) => {
if (caseId) {
await contactStatusMutation.mutateAsync({
action: "contacted",
custom_note: value,
});
}
}}
/>
) : null}
{isDismissReasonSheetOpen ? (
<DismissReasonSheet
onClose={() => setIsDismissReasonSheetOpen(false)}
onSubmit={async (value) => {
if (caseId) {
await contactStatusMutation.mutateAsync({
@ -272,8 +289,8 @@ export default function RequestAcceptedPage() {
{isContactInfoSheetOpen ? (
<FemaleConsentSheet
title="Contact Detail"
description="Please mention during the call that you were introduced by the Habib Marriage app."
title={t.requestAccepted.contactDetailTitle}
description={t.requestAccepted.contactDetailDescription}
buttons={
contactInfoPhoneItems.length ? (
<div className="space-y-4">
@ -283,7 +300,7 @@ export default function RequestAcceptedPage() {
</div>
) : (
<div className="rounded-[12px] bg-[#ECECEC] px-4 py-3 group-12 font-semibold text-[#555]">
Contact information is not available yet.
{t.requestAccepted.contactNotAvailable}
</div>
)
}
@ -299,22 +316,19 @@ export default function RequestAcceptedPage() {
/>
) : null}
<main
style={{ paddingBottom: "calc(40px + var(--safe-bottom))" }}
className="-mx-[17px] flex min-h-screen flex-col px-[23px] pt-[max(16px,calc(var(--safe-top)+8px))] text-center"
>
<main className="-mx-[17px] flex min-h-screen flex-col px-[23px] pt-[max(16px,calc(var(--safe-top)+8px))] pb-[calc(20px+var(--safe-bottom))] text-center">
<header className="-mx-[6px] flex items-center justify-between pb-3">
<NavigationButton icon="back" />
<h1 className="font-faminela group-16">Habib Marriage</h1>
<NavigationButton icon="support" iconLabel="Support" />
<h1 className="font-faminela group-16">{t.common.appName}</h1>
<NavigationButton icon="support" iconLabel={t.common.support} />
</header>
<div className="flex flex-1 flex-col justify-between gap-20 pt-[109px]">
<div className="flex flex-1 flex-col justify-between gap-6 pt-4">
<section className="flex flex-col items-center">
<div className="relative isolate flex items-center justify-center">
<Image
src="/assets/images/Group 15978804fdasf68.svg"
alt="Request sent"
alt={t.requestAccepted.imageAlt}
width={131}
height={125}
priority
@ -327,8 +341,7 @@ export default function RequestAcceptedPage() {
</h1>
<p className="mt-4 max-w-[315px] group-12 leading-[1.45] font-semibold text-[#777777]">
You can now view their family&apos;s contact details and arrange
further steps.
{t.requestAccepted.description}
</p>
<div className="flex mt-9 w-full justify-center gap-4">
@ -375,7 +388,7 @@ export default function RequestAcceptedPage() {
<div className="border border-[#F0445B] bg-[#F0445B]/10 rounded-xl mt-4">
<p className="text-[#F0445B] group-12 font-semibold py-2.5 px-3.5">
If they dont contact you within 2 days, please inform us.
{t.candidateContact.contactWarning}
</p>
</div>
</section>
@ -391,7 +404,7 @@ export default function RequestAcceptedPage() {
/>
<h2 className="group-14 leading-none font-semibold text-[#747474]">
Profile is locked
{t.requestAccepted.profileLocked}
</h2>
</div>
</section>

2
src/app/request-sent/page.tsx

@ -80,7 +80,7 @@ export default function RequestSentPage() {
</p>
<Link
href={"/new-match/profile"}
href={localizePath("/new-match/profile", locale)}
className="mt-9 w-full max-w-[212px]"
>
<div className="bg-[#F5F5F5] px-4 py-2 rounded-[15px] shadow group-14 text-center font-semibold text-[#36363C]">

25
src/components/Componentes/navigation-button.tsx

@ -50,12 +50,28 @@ export function NavigationButton({
const { data: profile } = useMarriageProfileQuery();
const isFemale = profile?.gender === "female";
const isMale = profile?.gender === "male";
const hasActiveSubscription = !!profile?.active_subscription;
// خانم‌ها: باید وضعیت پرونده Waiting یا بعد از آن باشد (کامل کردن مشخصات اولیه)
const hasFemaleSupportAccess =
isFemale &&
profile?.status !== "pending_onboarding" &&
profile?.status !== "pending_info";
// آقایان: باید حسابشان Pro باشد (دارای اشتراک فعال)
const hasMaleSupportAccess = isMale && hasActiveSubscription;
const hasSupportAccess = hasFemaleSupportAccess || hasMaleSupportAccess;
if (icon === "subscription" && isFemale) {
return <div className="size-10" />;
}
if (icon === "support" && !hasSupportAccess) {
return <div className="size-10" />;
}
const iconNode = (() => {
switch (icon) {
case "back":
@ -162,6 +178,15 @@ export function NavigationButton({
}
} else if (icon === "close") {
router.back();
} else if (icon === "support") {
if (typeof window !== "undefined" && (window as any).HabibApp) {
(window as any).HabibApp.postMessage(
JSON.stringify({
action: "open_consultant_page",
data: { consultant: "habib@gmail.com" },
}),
);
}
}
}
}

147
src/components/Componentes/payment-swipe-modal.tsx

@ -1,147 +0,0 @@
"use client";
import Image from "next/image";
import { authBridge } from "@/lib/auth-bridge";
import { useI18n } from "@/translations/provider";
import { DotsLoader } from "./button";
import SwipeButton from "./swipe-button";
type PaymentSwipeModalProps = {
onSuccess: () => void;
isPaymentPending: boolean;
errorMessage: string | null;
};
export function PaymentSwipeModal({
onSuccess,
isPaymentPending,
errorMessage,
}: PaymentSwipeModalProps) {
const { dictionary: t } = useI18n();
const modalT = (t as any).paymentModal || {};
const currentCoins = authBridge.getCoins();
const handleCloseService = () => {
if (
typeof window !== "undefined" &&
(window as any).HabibApp?.postMessage
) {
(window as any).HabibApp.postMessage(
JSON.stringify({ action: "close_service" }),
);
} else {
window.history.back();
}
};
return (
<div
className="fixed inset-0 z-50 flex items-end justify-center bg-[#171717]/55 backdrop-blur-xs transition-opacity duration-300"
role="dialog"
aria-modal="true"
>
<section className="w-full sm:max-w-[375px] rounded-t-[24px] bg-[#FAF9F9] px-5 pt-6 pb-8 text-center shadow-[0_-8px_30px_rgb(0,0,0,0.12)] animate-slide-up">
{/* Diamond Icon Indicator */}
<div className="mx-auto flex h-[64px] w-[64px] items-center justify-center rounded-full bg-[#FFECEF] shadow-sm mb-3">
<Image
src="/assets/images/icon-park-outline_diamond.svg"
alt="Diamond"
width={36}
height={36}
className="shrink-0"
/>
</div>
{/* Modal Title */}
<h2 className="text-[18px] font-bold text-[#1C1C1E] leading-tight">
{modalT.title || "Verification & Subscription"}
</h2>
{/* Verification Info Panel */}
<div className="mt-4 rounded-[16px] bg-white border border-[#E5E5EA] p-4 text-right">
<p className="text-[13px] leading-[1.6] font-medium text-[#3A3A3C]">
{modalT.verificationText ||
"This payment acts as a verification process for your account and activates a 3-month subscription to receive new case introductions. The cost is 50 Habib Coins."}
</p>
<div className="mt-3 flex items-center justify-between border-t border-[#F2F2F7] pt-2.5">
<span className="text-[12px] font-semibold text-[#8E8E93]">
{modalT.activeFor3Months || "Validity duration"}
</span>
<span className="text-[13px] font-bold text-[#F0445B]">
3 {(t.common as any)?.months || "Months"}
</span>
</div>
<div className="mt-1.5 flex items-center justify-between">
<span className="text-[12px] font-semibold text-[#8E8E93]">
{modalT.cost || "Subscription fee"}
</span>
<span className="inline-flex items-center gap-1 text-[13px] font-bold text-[#F0445B]">
<span>50</span>
<span className="text-[11px] font-medium text-[#8E8E93]">
{(t.common as any)?.coins || "Coins"}
</span>
</span>
</div>
</div>
{/* Quantitative Disclaimer Box */}
<div className="mt-3 rounded-[16px] bg-[#FFF2F4] border border-[#FFCCD4] p-3 text-right">
<p className="text-[11px] leading-[1.5] font-semibold text-[#FF4F67]">
{modalT.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."}
</p>
</div>
{/* User Balance Status */}
<div className="mt-4 flex items-center justify-between px-1.5 text-sm">
<span className="font-semibold text-[#8E8E93]">
{(t.common as any)?.balance || "Your balance"}:
</span>
<span
className={`font-bold ${currentCoins < 50 ? "text-[#FF4F67]" : "text-[#1C1C1E]"}`}
>
{currentCoins} {(t.common as any)?.coins || "Coins"}
</span>
</div>
{/* Error Message Box */}
{errorMessage && (
<div className="mt-3 rounded-[12px] border border-[#FF3B30]/30 bg-[#FF3B30]/10 p-3 text-right">
<p className="text-[12px] font-semibold text-[#FF3B30]">
{errorMessage}
</p>
</div>
)}
{/* Swipe Button / Pending Indicator */}
<div className="mt-5">
{isPaymentPending ? (
<div className="flex h-[56px] w-full items-center justify-center rounded-full bg-[#FFECEF]">
<DotsLoader />
</div>
) : (
<SwipeButton
onSuccess={onSuccess}
text={modalT.swipeToPay || "Swipe to pay 50 Habib Coins"}
disabled={currentCoins < 50}
/>
)}
</div>
{/* Close/Exit link */}
<button
type="button"
onClick={handleCloseService}
className="mt-4 inline-block text-[14px] font-bold text-[#8E8E93] hover:text-[#48484A] transition-colors"
>
{modalT.close || "Exit"}
</button>
</section>
</div>
);
}
export default PaymentSwipeModal;

6
src/components/Componentes/question-answer-storage.tsx

@ -53,6 +53,7 @@ type QuestionAnswersContextValue = {
) => MarriageFieldValue | undefined;
hasPendingSync: boolean;
isSaving: boolean;
isLoading: boolean;
setAnswerValue: (
question: QuestionField,
questionIndex: number,
@ -319,7 +320,7 @@ export function QuestionAnswersProvider({
const canEdit = profile?.can_edit_profile !== false;
const backendSlug = useMemo(() => toBackendSlug(slug), [slug]);
const { data: serverSectionData } = useMarriageSectionDataQuery(backendSlug);
const { data: serverSectionData, isLoading: isLoadingData } = useMarriageSectionDataQuery(backendSlug);
useEffect(() => {
questionsRef.current = questions;
@ -534,9 +535,10 @@ export function QuestionAnswersProvider({
getAnswerValue,
hasPendingSync,
isSaving,
isLoading: isLoadingData,
setAnswerValue,
}),
[flushAnswers, getAnswerValue, hasPendingSync, isSaving, setAnswerValue],
[flushAnswers, getAnswerValue, hasPendingSync, isSaving, isLoadingData, setAnswerValue],
);
return (

5
src/components/Componentes/question-birthplace.tsx

@ -81,7 +81,7 @@ export function QuestionBirthplace({
disabled,
}: QuestionBirthplaceProps) {
const { dictionary: t, locale } = useI18n();
const { getAnswerValue, setAnswerValue } = useQuestionAnswers();
const { getAnswerValue, setAnswerValue, isLoading } = useQuestionAnswers();
const rawValue = getAnswerValue(question, questionIndex);
const initial = parseValue(rawValue);
@ -186,10 +186,11 @@ export function QuestionBirthplace({
};
useEffect(() => {
if (isLoading) return;
if (isResidence) {
detectLocation();
}
}, [isResidence]);
}, [isResidence, isLoading]);
const handleAutoClick = () => {
setMode("auto");

267
src/components/Componentes/question-phone.tsx

@ -224,18 +224,35 @@ function getNormalizedPhoneValue(codeValue: string, phoneValue: string) {
export function QuestionPhone({
question,
questionIndex,
countryCode = "+98",
countryCode = "+44",
disabled,
}: QuestionPhoneProps) {
const { locale } = useI18n();
const { getAnswerValue, setAnswerValue } = useQuestionAnswers();
const { getAnswerValue, setAnswerValue, isLoading } = useQuestionAnswers();
const value = getAnswerValue(question, questionIndex);
const defaultCodeValue = countryCode.trim() || "+98";
const defaultCodeValue = countryCode.trim() || "+44";
const initialValue = readPhoneValue(value, defaultCodeValue);
const [codeValue, setCodeValue] = useState(initialValue.codeValue);
const [phoneValue, setPhoneValue] = useState(initialValue.phoneValue);
const lastCommittedValueRef = useRef(value);
const hasFetchedIpRef = useRef(false);
const userInteractedRef = useRef(false);
// Determine if we need to resolve country code (loading from backend or fetching IP)
const needsIpFetch = () => {
if (typeof window === "undefined") return false;
// If there's a cached code or we already checked, no need to fetch
if (localStorage.getItem("geoIPPhoneCode")) return false;
if (localStorage.getItem("hasCheckedGeoIPPhone")) return false;
return true;
};
const [isResolvingCode, setIsResolvingCode] = useState(() => {
// On first render: if backend is loading or we need an IP fetch, show loading
if (isLoading) return true;
// If there's already a saved value in the initial render, no loading needed
if (initialValue.phoneValue || (initialValue.codeValue && initialValue.codeValue !== defaultCodeValue)) return false;
return needsIpFetch();
});
const [isOpen, setIsOpen] = useState(false);
const [searchQuery, setSearchQuery] = useState("");
@ -371,45 +388,97 @@ export function QuestionPhone({
}, [defaultCodeValue, value]);
useEffect(() => {
// Wait until backend data is loaded before deciding
if (isLoading) return;
if (hasFetchedIpRef.current) return;
const alreadyChecked =
typeof window !== "undefined"
? localStorage.getItem("hasCheckedGeoIPPhone")
: "true";
if (alreadyChecked) return;
if (userInteractedRef.current) {
setIsResolvingCode(false);
return;
}
if (!value) {
// If user already has a saved value from backend, use it — no IP check needed
const hasSavedValue = value && (
(isMarriagePhoneFieldValue(value) && (value.countryCode || value.phoneNumber)) ||
(typeof value === "string" && value.trim().length > 0)
);
if (hasSavedValue) {
hasFetchedIpRef.current = true;
setIsResolvingCode(false);
if (typeof window !== "undefined") {
localStorage.setItem("hasCheckedGeoIPPhone", "true");
}
fetch("https://ipapi.co/json/")
.then((res) => res.json())
.then((data) => {
if (data && data.country_calling_code) {
const ipCode = data.country_calling_code.startsWith("+")
? data.country_calling_code
: `+${data.country_calling_code}`;
setCodeValue(ipCode);
updateStoredValue(ipCode, phoneValue);
}
})
.catch(() => {
fetch("https://ipwho.is/")
.then((res) => res.json())
.then((data) => {
if (data && data.calling_code) {
const ipCode = data.calling_code.startsWith("+")
? data.calling_code
: `+${data.calling_code}`;
setCodeValue(ipCode);
updateStoredValue(ipCode, phoneValue);
}
})
.catch(() => {});
});
return;
}
}, []);
// Check if we already fetched IP in a previous session and cached the result
if (typeof window !== "undefined") {
const cachedCode = localStorage.getItem("geoIPPhoneCode");
if (cachedCode) {
hasFetchedIpRef.current = true;
setCodeValue(cachedCode);
setIsResolvingCode(false);
return;
}
// If we already checked and got nothing useful, don't check again
const alreadyChecked = localStorage.getItem("hasCheckedGeoIPPhone");
if (alreadyChecked) {
hasFetchedIpRef.current = true;
setIsResolvingCode(false);
return;
}
}
// First time ever — fetch country code from IP
hasFetchedIpRef.current = true;
setIsResolvingCode(true);
const applyCode = (code: string) => {
if (userInteractedRef.current) return;
const ipCode = code.startsWith("+") ? code : `+${code}`;
setCodeValue(ipCode);
setIsResolvingCode(false);
if (typeof window !== "undefined") {
localStorage.setItem("geoIPPhoneCode", ipCode);
localStorage.setItem("hasCheckedGeoIPPhone", "true");
}
};
const applyFallback = () => {
if (userInteractedRef.current) return;
// Default to UK (+44) if IP lookup fails
setCodeValue("+44");
setIsResolvingCode(false);
if (typeof window !== "undefined") {
localStorage.setItem("hasCheckedGeoIPPhone", "true");
}
};
fetch("https://ipapi.co/json/")
.then((res) => res.json())
.then((data) => {
if (data && data.country_calling_code) {
applyCode(data.country_calling_code);
} else {
throw new Error("No calling code in response");
}
})
.catch(() => {
fetch("https://ipwho.is/")
.then((res) => res.json())
.then((data) => {
if (data && data.calling_code) {
applyCode(data.calling_code);
} else {
applyFallback();
}
})
.catch(() => {
applyFallback();
});
});
}, [isLoading, value]);
const updateStoredValue = (nextCodeValue: string, nextPhoneValue: string) => {
const draftValue = writePhoneValue(nextCodeValue, nextPhoneValue);
@ -429,6 +498,7 @@ export function QuestionPhone({
};
const handleSelectCountryCode = (selectedCode: string) => {
userInteractedRef.current = true;
if (typeof window !== "undefined") {
localStorage.setItem("hasCheckedGeoIPPhone", "true");
}
@ -457,66 +527,81 @@ export function QuestionPhone({
dir="ltr"
className={[
"flex h-[54px] w-full items-center rounded-[16px] border bg-white text-[#181818] focus-within:border-[#6F6F6F] focus-within:ring-1 focus-within:ring-[#6F6F6F] transition-all",
showInvalidState
? "border-[#F2465F] ring-1 ring-[#F2465F]"
: "border-[#D0D5DD] hover:border-[#98A2B3]",
isResolvingCode
? "border-[#D0D5DD]"
: showInvalidState
? "border-[#F2465F] ring-1 ring-[#F2465F]"
: "border-[#D0D5DD] hover:border-[#98A2B3]",
].join(" ")}
>
<div className="flex shrink-0 items-center pl-2.5 pr-2">
<button
type="button"
disabled={disabled}
onClick={() => setIsOpen(!isOpen)}
className="flex items-center gap-1.5 h-full px-2 rounded-lg hover:bg-gray-50 active:bg-gray-100 transition-colors cursor-pointer outline-none border-0 text-[15px] font-medium leading-none text-[#181818] tabular-nums"
>
<span>{activeFlag}</span>
<span>{codeValue || defaultCodeValue}</span>
<svg
width="10"
height="6"
viewBox="0 0 10 6"
fill="none"
className={[
"shrink-0 transition-transform duration-200 text-[#344054]",
isOpen ? "rotate-180" : "",
].join(" ")}
>
<path
d="M1 1L5 5L9 1"
stroke="currentColor"
strokeWidth="1.5"
strokeLinecap="round"
strokeLinejoin="round"
{isResolvingCode ? (
/* Loading skeleton while determining country code */
<div className="flex w-full items-center gap-3 px-4">
<div className="h-5 w-5 rounded-full bg-[#E5E7EB] animate-pulse" />
<div className="h-4 w-12 rounded bg-[#E5E7EB] animate-pulse" />
<span aria-hidden="true" className="h-5 w-px bg-[#181818]/15" />
<div className="h-4 flex-1 rounded bg-[#E5E7EB] animate-pulse" />
</div>
) : (
<>
<div className="flex shrink-0 items-center pl-2.5 pr-2">
<button
type="button"
disabled={disabled}
onClick={() => setIsOpen(!isOpen)}
className="flex items-center gap-1.5 h-full px-2 rounded-lg hover:bg-gray-50 active:bg-gray-100 transition-colors cursor-pointer outline-none border-0 text-[15px] font-medium leading-none text-[#181818] tabular-nums"
>
<span>{activeFlag}</span>
<span>{codeValue || defaultCodeValue}</span>
<svg
width="10"
height="6"
viewBox="0 0 10 6"
fill="none"
className={[
"shrink-0 transition-transform duration-200 text-[#344054]",
isOpen ? "rotate-180" : "",
].join(" ")}
>
<path
d="M1 1L5 5L9 1"
stroke="currentColor"
strokeWidth="1.5"
strokeLinecap="round"
strokeLinejoin="round"
/>
</svg>
</button>
<span aria-hidden="true" className="h-5 w-px bg-[#181818]/35 ml-1" />
</div>
<span className="flex min-w-0 flex-1 items-center pr-4">
<input
type="tel"
inputMode="tel"
disabled={disabled}
placeholder={question.extras.placeHolder?.replace(/^\+\d+\s*/, "")}
value={phoneValue}
maxLength={getMaxLengthForCountry(codeValue)}
onChange={(event) => {
userInteractedRef.current = true;
if (typeof window !== "undefined") {
localStorage.setItem("hasCheckedGeoIPPhone", "true");
}
const nextPhoneValue = sanitizePhoneNumber(event.target.value);
const maxLen = getMaxLengthForCountry(codeValue);
const truncatedPhone = nextPhoneValue.slice(0, maxLen);
setPhoneValue(truncatedPhone);
updateStoredValue(codeValue, truncatedPhone);
}}
dir="ltr"
className="h-full w-full border-0 bg-transparent p-0 text-left text-[15px] font-medium leading-none text-[#181818] tabular-nums outline-none placeholder:text-[#98A2B3]"
/>
</svg>
</button>
<span aria-hidden="true" className="h-5 w-px bg-[#181818]/35 ml-1" />
</div>
<span className="flex min-w-0 flex-1 items-center pr-4">
<input
type="tel"
inputMode="tel"
disabled={disabled}
placeholder={question.extras.placeHolder?.replace(/^\+\d+\s*/, "")}
value={phoneValue}
maxLength={getMaxLengthForCountry(codeValue)}
onChange={(event) => {
if (typeof window !== "undefined") {
localStorage.setItem("hasCheckedGeoIPPhone", "true");
}
const nextPhoneValue = sanitizePhoneNumber(event.target.value);
const maxLen = getMaxLengthForCountry(codeValue);
const truncatedPhone = nextPhoneValue.slice(0, maxLen);
setPhoneValue(truncatedPhone);
updateStoredValue(codeValue, truncatedPhone);
}}
dir="ltr"
className="h-full w-full border-0 bg-transparent p-0 text-left text-[15px] font-medium leading-none text-[#181818] tabular-nums outline-none placeholder:text-[#98A2B3]"
/>
</span>
</span>
</>
)}
</div>
{showInvalidState ? (
{!isResolvingCode && showInvalidState ? (
<span className="block group-10 font-semibold text-[#F2465F]">
Enter a valid phone number with country code.
</span>

7
src/components/Componentes/question-section-flow.tsx

@ -14,6 +14,7 @@ import QuestionSnapList from "./question-snap-list";
import type { QuestionField } from "@/data/question-data";
import NoticeBox from "./notice-box";
import { getStoredAge } from "./progress-helper";
import { useMarriageProfileQuery } from "@/hooks/marriage/use-profile-main";
type QuestionSectionFlowProps = {
children: ReactNode;
@ -157,11 +158,15 @@ function SectionFlowContent({
handleContinue,
]);
const { data: profile } = useMarriageProfileQuery();
const isFemale = profile?.gender === "female";
const age = getStoredAge();
const activeQuestion = questions?.[activeQuestionIndex];
const showNotice = activeQuestion?.showGuardianNotice;
const isUnder27 =
age !== null ? age < 27 : (activeQuestion?.required ?? false);
age !== null
? isFemale && age < 27
: (activeQuestion?.required ?? false);
return (
<>

2
src/components/Componentes/subscription-required-sheet.tsx

@ -68,7 +68,7 @@ export function SubscriptionRequiredSheet({
height={18}
className="shrink-0"
/>
<span>50 Habib Coin</span>
<span>50 Coins</span>
</span>
</div>
</button>

81
src/components/Componentes/token-switcher.tsx

@ -6,9 +6,11 @@ import { getClientCookie, setClientCookie } from "@/lib/cookies";
export const FEMALE_TOKEN = "545f61bb3e061ccb9b19f84715eb1b1ed4740331";
export const MALE_TOKEN = "f3a7543b44ef0a713d1ee0d4f7866b3825cf1308";
export const MALE_2_TOKEN = "56cd0fceb93f7cecf7ffa84c590135026cf54a1d";
export const FEMALE_EMAIL = "m.a.ghorbani01@gmail.com";
export const MALE_EMAIL = "muhammadamin.ghorbani@gmail.com";
export const MALE_2_EMAIL = "habibwabackup@gmail.com";
const TOKEN_COOKIE_NAME = "HABIB_TOKEN";
@ -38,6 +40,7 @@ export function TokenSwitcher({
}, []);
const isMale = currentToken === MALE_TOKEN;
const isMale2 = currentToken === MALE_2_TOKEN;
const isFemale = currentToken === FEMALE_TOKEN;
const isNoToken = currentToken === "NO_TOKEN" || !currentToken;
@ -103,7 +106,9 @@ export function TokenSwitcher({
? MALE_TOKEN
: userId === 147714
? FEMALE_TOKEN
: "NO_TOKEN";
: userId === 146024
? MALE_2_TOKEN
: "NO_TOKEN";
setClientCookie(TOKEN_COOKIE_NAME, targetToken);
setClientCookie("habib_token", targetToken);
@ -142,11 +147,13 @@ export function TokenSwitcher({
<span>
{isMale
? "آقا 👨"
: isFemale
? "خانم 👩"
: isNoToken
? "بدون توکن 👤"
: "توکن 🔑"}
: isMale2
? "آقا ۲ 👨"
: isFemale
? "خانم 👩"
: isNoToken
? "بدون توکن 👤"
: "توکن 🔑"}
</span>
</button>
@ -183,15 +190,15 @@ export function TokenSwitcher({
<button
type="button"
onClick={() => handleSelectToken(MALE_TOKEN)}
className="flex-1 flex items-center gap-3 p-3.5 text-right"
className="flex-1 flex items-center gap-3 p-3.5 text-right min-w-0"
>
<span className="text-2xl">👨</span>
<div>
<span className="text-2xl shrink-0">👨</span>
<div className="min-w-0 flex-1">
<div className="text-sm font-bold">حساب آقا</div>
<div className="text-xs text-slate-500 dark:text-slate-400 font-medium">
<div className="text-xs text-slate-500 dark:text-slate-400 font-medium truncate">
{MALE_EMAIL}
</div>
<div className="text-[11px] font-mono text-slate-400 dark:text-slate-500 dir-ltr text-left mt-0.5 select-all">
<div className="text-[11px] font-mono text-slate-400 dark:text-slate-500 dir-ltr text-left mt-0.5 select-all truncate">
{MALE_TOKEN}
</div>
</div>
@ -213,6 +220,48 @@ export function TokenSwitcher({
</div>
</div>
{/* Male 2 option card */}
<div
className={[
"flex items-center justify-between rounded-xl border transition-all dir-rtl overflow-hidden",
isMale2
? "border-rose-500 bg-rose-50/60 dark:bg-rose-950/30 text-rose-900 dark:text-rose-100 font-semibold shadow-xs"
: "border-slate-200 dark:border-slate-800 hover:border-slate-300 dark:hover:border-slate-700 bg-white dark:bg-slate-800 text-slate-700 dark:text-slate-200",
].join(" ")}
>
<button
type="button"
onClick={() => handleSelectToken(MALE_2_TOKEN)}
className="flex-1 flex items-center gap-3 p-3.5 text-right min-w-0"
>
<span className="text-2xl shrink-0">👨</span>
<div className="min-w-0 flex-1">
<div className="text-sm font-bold">حساب آقا ۲</div>
<div className="text-xs text-slate-500 dark:text-slate-400 font-medium truncate">
{MALE_2_EMAIL}
</div>
<div className="text-[11px] font-mono text-slate-400 dark:text-slate-500 dir-ltr text-left mt-0.5 select-all truncate">
{MALE_2_TOKEN}
</div>
</div>
</button>
<div className="flex items-center gap-1.5 pl-3">
{isMale2 && (
<span className="text-[10px] px-2 py-0.5 rounded-full bg-rose-500 text-white font-medium">
فعال
</span>
)}
<button
type="button"
onClick={() => handleResetUser(146024, "حساب آقا ۲")}
title="پاک کردن اطلاعات و شروع مجدد"
className="p-2 text-slate-400 hover:text-rose-500 hover:bg-rose-50 dark:hover:bg-rose-950/20 rounded-lg transition-colors"
>
🗑
</button>
</div>
</div>
{/* Female option card */}
<div
className={[
@ -225,15 +274,15 @@ export function TokenSwitcher({
<button
type="button"
onClick={() => handleSelectToken(FEMALE_TOKEN)}
className="flex-1 flex items-center gap-3 p-3.5 text-right"
className="flex-1 flex items-center gap-3 p-3.5 text-right min-w-0"
>
<span className="text-2xl">👩</span>
<div>
<span className="text-2xl shrink-0">👩</span>
<div className="min-w-0 flex-1">
<div className="text-sm font-bold">حساب خانم</div>
<div className="text-xs text-slate-500 dark:text-slate-400 font-medium">
<div className="text-xs text-slate-500 dark:text-slate-400 font-medium truncate">
{FEMALE_EMAIL}
</div>
<div className="text-[11px] font-mono text-slate-400 dark:text-slate-500 dir-ltr text-left mt-0.5 select-all">
<div className="text-[11px] font-mono text-slate-400 dark:text-slate-500 dir-ltr text-left mt-0.5 select-all truncate">
{FEMALE_TOKEN}
</div>
</div>

9
src/data/questions/en.json

@ -260,9 +260,6 @@
"genders": ["female"],
"maxAge": 26
},
"audience": {
"genders": ["female"]
},
"showGuardianNotice": true,
"tooltip": "This field specifies the full name of the designated intermediary whose contact information is provided to the other party to facilitate communication.",
"extras": {
@ -280,9 +277,6 @@
"genders": ["female"],
"maxAge": 26
},
"audience": {
"genders": ["female"]
},
"extras": {
"placeHolder": "Select one option",
"range": [0, 0],
@ -309,9 +303,6 @@
"genders": ["female"],
"maxAge": 26
},
"audience": {
"genders": ["female"]
},
"extras": {
"placeHolder": "+44 7911 123456",
"range": [0, 0],

9
src/data/questions/fa.json

@ -260,9 +260,6 @@
"genders": ["female"],
"maxAge": 26
},
"audience": {
"genders": ["female"]
},
"showGuardianNotice": true,
"tooltip": "این فیلد نام و نام خانوادگی رابط مشخص‌شده را تعیین می‌کند که اطلاعات تماس او جهت تسهیل ارتباط در اختیار طرف مقابل قرار می‌گیرد.",
"extras": {
@ -280,9 +277,6 @@
"genders": ["female"],
"maxAge": 26
},
"audience": {
"genders": ["female"]
},
"extras": {
"placeHolder": "انتخاب کنید",
"range": [0, 0],
@ -309,9 +303,6 @@
"genders": ["female"],
"maxAge": 26
},
"audience": {
"genders": ["female"]
},
"extras": {
"placeHolder": "+44 7911 123456",
"range": [0, 0],

48
src/translations/locales/ar.json

@ -85,7 +85,7 @@
"goBack": "Go back",
"acceptProfile": "Accept Profile",
"requestProceedTitle": "Request to Proceed",
"requestProceedDescription": "With your approval, we will approach their family on your behalf to propose marriage. After their family agrees, you will be introduced to each other for further acquaintance.",
"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",
@ -116,7 +116,16 @@
"bio": "السيرة الذاتية والتوقعات",
"sections": "بيانات أقسام النموذج",
"tests": "التقييمات النفسية"
}
},
"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**."
},
"requestAccepted": {
"imageAlt": "Request accepted",
@ -125,7 +134,25 @@
"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"
"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": "يُرجى الإشارة أثناء المكالمة إلى أنه تم تعريفكم عبر تطبيق حبيب للزواج.",
"contactNotAvailable": "معلومات الاتصال ليست متاحة بعد."
},
"findingMatch": {
"title": "البحث الخاص بك نشط",
@ -137,10 +164,11 @@
},
"candidateContact": {
"imageAlt": "Selected candidate contact status",
"title": "The selected candidate will be in touch with your family shortly.",
"title": "The selected candidate will contact your family shortly.",
"contacted": "contacted",
"noContactYet": "no contact yet ?",
"afterTwoDays": "(after 2 days)"
"afterTwoDays": "(after 2 days)",
"contactWarning": "If they don't contact you within 2 days, please inform us."
},
"sheets": {
"informationSheet": "Information sheet",
@ -160,8 +188,8 @@
},
"requestSent": {
"title": "Request Sent",
"description": "We will propose marriage on your behalf. If they accept, their contact details will be shared with you.",
"matchProfile": "Match Profile",
"description": "Your request has been sent. Once the lady reviews your request, you will be notified.",
"matchProfile": "View More Details",
"profileLocked": "Profile is locked"
},
"spouseCriteriaConfidentialNotice": "⚠️ This section is completely confidential and is only used for matching and review by advisors.",
@ -172,8 +200,10 @@
"swipeToPay": "Swipe to pay 50 Habib Coins",
"insufficientCoins": "Insufficient coin balance. Please recharge your account.",
"activeFor3Months": "Valid for 3 months",
"cost": "50 Habib Coins",
"close": "Exit"
"cost": "50 Coins",
"close": "Exit",
"payment": "الدفع",
"pay": "ادفع"
},
"maleRejectionWarning": {
"title": "تحذير رفض الاقتراح",

48
src/translations/locales/az.json

@ -85,7 +85,7 @@
"goBack": "Go back",
"acceptProfile": "Accept Profile",
"requestProceedTitle": "Request to Proceed",
"requestProceedDescription": "With your approval, we will approach their family on your behalf to propose marriage. After their family agrees, you will be introduced to each other for further acquaintance.",
"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",
@ -116,7 +116,16 @@
"bio": "Bio & Expectations",
"sections": "Form Sections Data",
"tests": "Psychological Assessments"
}
},
"viewMoreDetails": "Daha ətraflı baxın",
"newMatchTitleFemale": "Yeni Evlilik Təklifi",
"newMatchTitleMale": "YENİ MATINIZ VAR!",
"newMatchDescriptionFemale": "Sizin üçün uyğun uyğunluq tapıldı. Təsdiq edilərsə, təqdimat prosesinə davam etmək üçün profiliniz qiymətləndiriləcək.",
"newMatchDescriptionMale": "Davam etsəniz, qarşı tərəfi xəbərdar edəcəyik və onların təsdiqindən sonra siz bir-birinizin əlaqə məlumatlarına baxa bilərsiniz.",
"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**."
},
"requestAccepted": {
"imageAlt": "Request accepted",
@ -125,7 +134,25 @@
"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"
"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": "Əlaqə məlumatı",
"contactDetailDescription": "Zəng zamanı Habib Marriage tətbiqi vasitəsilə tanış olduğunuzu qeyd edin.",
"contactNotAvailable": "Əlaqə məlumatı hələ mövcud deyil."
},
"findingMatch": {
"title": "AXTARIŞINIZ AKTİVDİR",
@ -137,10 +164,11 @@
},
"candidateContact": {
"imageAlt": "Selected candidate contact status",
"title": "The selected candidate will be in touch with your family shortly.",
"title": "The selected candidate will contact your family shortly.",
"contacted": "contacted",
"noContactYet": "no contact yet ?",
"afterTwoDays": "(after 2 days)"
"afterTwoDays": "(after 2 days)",
"contactWarning": "If they don't contact you within 2 days, please inform us."
},
"sheets": {
"informationSheet": "Information sheet",
@ -160,8 +188,8 @@
},
"requestSent": {
"title": "Request Sent",
"description": "We will propose marriage on your behalf. If they accept, their contact details will be shared with you.",
"matchProfile": "Match Profile",
"description": "Your request has been sent. Once the lady reviews your request, you will be notified.",
"matchProfile": "View More Details",
"profileLocked": "Profile is locked"
},
"spouseCriteriaConfidentialNotice": "⚠️ This section is completely confidential and is only used for matching and review by advisors.",
@ -172,8 +200,10 @@
"swipeToPay": "Swipe to pay 50 Habib Coins",
"insufficientCoins": "Insufficient coin balance. Please recharge your account.",
"activeFor3Months": "Valid for 3 months",
"cost": "50 Habib Coins",
"close": "Exit"
"cost": "50 Coins",
"close": "Exit",
"payment": "Ödəniş",
"pay": "Ödə"
},
"maleRejectionWarning": {
"title": "İmtina Xəbərdarlığı",

48
src/translations/locales/bn.json

@ -85,7 +85,7 @@
"goBack": "Go back",
"acceptProfile": "Accept Profile",
"requestProceedTitle": "Request to Proceed",
"requestProceedDescription": "With your approval, we will approach their family on your behalf to propose marriage. After their family agrees, you will be introduced to each other for further acquaintance.",
"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",
@ -116,7 +116,16 @@
"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**."
},
"requestAccepted": {
"imageAlt": "Request accepted",
@ -125,7 +134,25 @@
"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"
"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": "অনুগ্রহ করে কল করার সময় উল্লেখ করবেন যে হাবিব ম্যারেজ অ্যাপের মাধ্যমে আপনাদের পরিচয় হয়েছে।",
"contactNotAvailable": "যোগাযোগের তথ্য এখনও উপলব্ধ নয়।"
},
"findingMatch": {
"title": "আপনার অনুসন্ধান সক্রিয় আছে",
@ -137,10 +164,11 @@
},
"candidateContact": {
"imageAlt": "Selected candidate contact status",
"title": "The selected candidate will be in touch with your family shortly.",
"title": "The selected candidate will contact your family shortly.",
"contacted": "contacted",
"noContactYet": "no contact yet ?",
"afterTwoDays": "(after 2 days)"
"afterTwoDays": "(after 2 days)",
"contactWarning": "If they don't contact you within 2 days, please inform us."
},
"sheets": {
"informationSheet": "Information sheet",
@ -160,8 +188,8 @@
},
"requestSent": {
"title": "Request Sent",
"description": "We will propose marriage on your behalf. If they accept, their contact details will be shared with you.",
"matchProfile": "Match Profile",
"description": "Your request has been sent. Once the lady reviews your request, you will be notified.",
"matchProfile": "View More Details",
"profileLocked": "Profile is locked"
},
"spouseCriteriaConfidentialNotice": "⚠️ This section is completely confidential and is only used for matching and review by advisors.",
@ -172,8 +200,10 @@
"swipeToPay": "Swipe to pay 50 Habib Coins",
"insufficientCoins": "Insufficient coin balance. Please recharge your account.",
"activeFor3Months": "Valid for 3 months",
"cost": "50 Habib Coins",
"close": "Exit"
"cost": "50 Coins",
"close": "Exit",
"payment": "পেমেন্ট",
"pay": "পরিশোধ করুন"
},
"maleRejectionWarning": {
"title": "প্রত্যাখ্যানের সতর্কতা",

48
src/translations/locales/da.json

@ -85,7 +85,7 @@
"goBack": "Go back",
"acceptProfile": "Accept Profile",
"requestProceedTitle": "Request to Proceed",
"requestProceedDescription": "With your approval, we will approach their family on your behalf to propose marriage. After their family agrees, you will be introduced to each other for further acquaintance.",
"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",
@ -116,7 +116,16 @@
"bio": "Bio & Expectations",
"sections": "Form Sections Data",
"tests": "Psychological Assessments"
}
},
"viewMoreDetails": "Se flere detaljer",
"newMatchTitleFemale": "Nyt Ægteskabsforslag",
"newMatchTitleMale": "DU HAR EN NY KAMP!",
"newMatchDescriptionFemale": "Der er fundet et passende match til dig. Hvis den bliver godkendt, vil din profil blive evalueret for at fortsætte med introduktionsprocessen.",
"newMatchDescriptionMale": "Hvis du fortsætter, giver vi den anden part besked, og efter deres godkendelse kan I se hinandens kontaktoplysninger.",
"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**."
},
"requestAccepted": {
"imageAlt": "Request accepted",
@ -125,7 +134,25 @@
"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"
"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": "Kontaktoplysninger",
"contactDetailDescription": "Nævn venligst under opkaldet, at I blev introduceret via Habib Marriage-appen.",
"contactNotAvailable": "Kontaktoplysninger er ikke tilgængelige endnu."
},
"findingMatch": {
"title": "DIN SØGNING ER AKTIV",
@ -137,10 +164,11 @@
},
"candidateContact": {
"imageAlt": "Selected candidate contact status",
"title": "The selected candidate will be in touch with your family shortly.",
"title": "The selected candidate will contact your family shortly.",
"contacted": "contacted",
"noContactYet": "no contact yet ?",
"afterTwoDays": "(after 2 days)"
"afterTwoDays": "(after 2 days)",
"contactWarning": "If they don't contact you within 2 days, please inform us."
},
"sheets": {
"informationSheet": "Information sheet",
@ -160,8 +188,8 @@
},
"requestSent": {
"title": "Request Sent",
"description": "We will propose marriage on your behalf. If they accept, their contact details will be shared with you.",
"matchProfile": "Match Profile",
"description": "Your request has been sent. Once the lady reviews your request, you will be notified.",
"matchProfile": "View More Details",
"profileLocked": "Profile is locked"
},
"spouseCriteriaConfidentialNotice": "⚠️ This section is completely confidential and is only used for matching and review by advisors.",
@ -172,8 +200,10 @@
"swipeToPay": "Swipe to pay 50 Habib Coins",
"insufficientCoins": "Insufficient coin balance. Please recharge your account.",
"activeFor3Months": "Valid for 3 months",
"cost": "50 Habib Coins",
"close": "Exit"
"cost": "50 Coins",
"close": "Exit",
"payment": "Betaling",
"pay": "Betal"
},
"maleRejectionWarning": {
"title": "Advarsel om afvisning",

48
src/translations/locales/de.json

@ -85,7 +85,7 @@
"goBack": "Go back",
"acceptProfile": "Accept Profile",
"requestProceedTitle": "Request to Proceed",
"requestProceedDescription": "With your approval, we will approach their family on your behalf to propose marriage. After their family agrees, you will be introduced to each other for further acquaintance.",
"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",
@ -116,7 +116,16 @@
"bio": "Bio & Expectations",
"sections": "Form Sections Data",
"tests": "Psychological Assessments"
}
},
"viewMoreDetails": "Mehr Details anzeigen",
"newMatchTitleFemale": "Neuer Heiratsantrag",
"newMatchTitleMale": "SIE HABEN EIN NEUES SPIEL!",
"newMatchDescriptionFemale": "Es wurde eine passende Übereinstimmung für Sie gefunden. Bei Genehmigung wird Ihr Profil bewertet, um mit dem Einführungsprozess fortzufahren.",
"newMatchDescriptionMale": "Wenn Sie fortfahren, benachrichtigen wir die andere Partei und nach deren Genehmigung können Sie die Kontaktinformationen der anderen Partei einsehen.",
"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**."
},
"requestAccepted": {
"imageAlt": "Request accepted",
@ -125,7 +134,25 @@
"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"
"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": "Kontaktdetails",
"contactDetailDescription": "Bitte erwähnen Sie während des Telefonats, dass Sie über die Habib Marriage-App vermittelt wurden.",
"contactNotAvailable": "Kontaktinformationen sind noch nicht verfügbar."
},
"findingMatch": {
"title": "IHRE SUCHE IST AKTIV",
@ -137,10 +164,11 @@
},
"candidateContact": {
"imageAlt": "Selected candidate contact status",
"title": "The selected candidate will be in touch with your family shortly.",
"title": "The selected candidate will contact your family shortly.",
"contacted": "contacted",
"noContactYet": "no contact yet ?",
"afterTwoDays": "(after 2 days)"
"afterTwoDays": "(after 2 days)",
"contactWarning": "If they don't contact you within 2 days, please inform us."
},
"sheets": {
"informationSheet": "Information sheet",
@ -160,8 +188,8 @@
},
"requestSent": {
"title": "Request Sent",
"description": "We will propose marriage on your behalf. If they accept, their contact details will be shared with you.",
"matchProfile": "Match Profile",
"description": "Your request has been sent. Once the lady reviews your request, you will be notified.",
"matchProfile": "View More Details",
"profileLocked": "Profile is locked"
},
"spouseCriteriaConfidentialNotice": "⚠️ This section is completely confidential and is only used for matching and review by advisors.",
@ -172,8 +200,10 @@
"swipeToPay": "Swipe to pay 50 Habib Coins",
"insufficientCoins": "Insufficient coin balance. Please recharge your account.",
"activeFor3Months": "Valid for 3 months",
"cost": "50 Habib Coins",
"close": "Exit"
"cost": "50 Coins",
"close": "Exit",
"payment": "Zahlung",
"pay": "Bezahlen"
},
"maleRejectionWarning": {
"title": "Ablehnungswarnung",

48
src/translations/locales/en.json

@ -86,7 +86,7 @@
"loadingProfile": "Loading match profile...",
"acceptProfile": "Accept Profile",
"requestProceedTitle": "Request to Proceed",
"requestProceedDescription": "With your approval, we will approach their family on your behalf to propose marriage. After their family agrees, you will be introduced to each other for further acquaintance.",
"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?",
"twoColumnComparison": "Two-Column Side-by-Side Match Comparison",
"horizontalAlignment": "Strict Horizontal Field Alignment",
@ -116,7 +116,16 @@
"muslim": "Muslim",
"education": "Bachelor's degree in architecture",
"occupation": "Interior designer"
}
},
"viewMoreDetails": "View more details",
"newMatchTitleFemale": "New Marriage Proposal",
"newMatchTitleMale": "YOU HAVE A NEW MATCH!",
"newMatchDescriptionFemale": "A suitable match has been found for you. If approved, your profile will be evaluated to proceed with the introduction process.",
"newMatchDescriptionMale": "If you proceed, we will notify the other party, and upon their approval, you can view each other's contact information.",
"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**."
},
"requestAccepted": {
"imageAlt": "Request accepted",
@ -125,7 +134,25 @@
"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"
"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": "Contact Detail",
"contactDetailDescription": "Please mention during the call that you were introduced by the Habib Marriage app.",
"contactNotAvailable": "Contact information is not available yet."
},
"findingMatch": {
"title": "SEARCH IN PROGRESS",
@ -137,10 +164,11 @@
},
"candidateContact": {
"imageAlt": "Selected candidate contact status",
"title": "The selected candidate will be in touch with your family shortly.",
"title": "The selected candidate will contact your family shortly.",
"contacted": "contacted",
"noContactYet": "no contact yet ?",
"afterTwoDays": "(after 2 days)"
"afterTwoDays": "(after 2 days)",
"contactWarning": "If they don't contact you within 2 days, please inform us."
},
"sheets": {
"informationSheet": "Information sheet",
@ -160,8 +188,8 @@
},
"requestSent": {
"title": "Request Sent",
"description": "We will propose marriage on your behalf. If they accept, their contact details will be shared with you.",
"matchProfile": "Match Profile",
"description": "Your request has been sent. Once the lady reviews your request, you will be notified.",
"matchProfile": "View More Details",
"profileLocked": "Profile is locked"
},
"spouseCriteriaConfidentialNotice": "⚠️ This section is completely confidential and is only used for matching and review by advisors.",
@ -172,8 +200,10 @@
"swipeToPay": "Swipe to pay 50 Habib Coins",
"insufficientCoins": "Insufficient coin balance. Please recharge your account.",
"activeFor3Months": "Valid for 3 months",
"cost": "50 Habib Coins",
"close": "Exit"
"cost": "50 Coins",
"close": "Exit",
"payment": "Payment",
"pay": "Pay"
},
"maleRejectionWarning": {
"title": "Rejection Warning",

48
src/translations/locales/es.json

@ -85,7 +85,7 @@
"goBack": "Go back",
"acceptProfile": "Accept Profile",
"requestProceedTitle": "Request to Proceed",
"requestProceedDescription": "With your approval, we will approach their family on your behalf to propose marriage. After their family agrees, you will be introduced to each other for further acquaintance.",
"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",
@ -116,7 +116,16 @@
"bio": "Bio & Expectations",
"sections": "Form Sections Data",
"tests": "Psychological Assessments"
}
},
"viewMoreDetails": "Ver más detalles",
"newMatchTitleFemale": "Nueva propuesta de matrimonio",
"newMatchTitleMale": "¡TIENES UN NUEVO PARTIDO!",
"newMatchDescriptionFemale": "Se ha encontrado una combinación adecuada para usted. Si se aprueba, su perfil será evaluado para continuar con el proceso de introducción.",
"newMatchDescriptionMale": "Si continúa, notificaremos a la otra parte y, tras su aprobación, podrán ver la información de contacto de cada uno.",
"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**."
},
"requestAccepted": {
"imageAlt": "Request accepted",
@ -125,7 +134,25 @@
"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"
"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": "Detalles de contacto",
"contactDetailDescription": "Por favor, mencione durante la llamada que fue presentado a través de la aplicación Habib Marriage.",
"contactNotAvailable": "La información de contacto aún no está disponible."
},
"findingMatch": {
"title": "SU BÚSQUEDA ESTÁ ACTIVA",
@ -137,10 +164,11 @@
},
"candidateContact": {
"imageAlt": "Selected candidate contact status",
"title": "The selected candidate will be in touch with your family shortly.",
"title": "The selected candidate will contact your family shortly.",
"contacted": "contacted",
"noContactYet": "no contact yet ?",
"afterTwoDays": "(after 2 days)"
"afterTwoDays": "(after 2 days)",
"contactWarning": "If they don't contact you within 2 days, please inform us."
},
"sheets": {
"informationSheet": "Information sheet",
@ -160,8 +188,8 @@
},
"requestSent": {
"title": "Request Sent",
"description": "We will propose marriage on your behalf. If they accept, their contact details will be shared with you.",
"matchProfile": "Match Profile",
"description": "Your request has been sent. Once the lady reviews your request, you will be notified.",
"matchProfile": "View More Details",
"profileLocked": "Profile is locked"
},
"spouseCriteriaConfidentialNotice": "⚠️ This section is completely confidential and is only used for matching and review by advisors.",
@ -172,8 +200,10 @@
"swipeToPay": "Swipe to pay 50 Habib Coins",
"insufficientCoins": "Insufficient coin balance. Please recharge your account.",
"activeFor3Months": "Valid for 3 months",
"cost": "50 Habib Coins",
"close": "Exit"
"cost": "50 Coins",
"close": "Exit",
"payment": "Pago",
"pay": "Pagar"
},
"maleRejectionWarning": {
"title": "Advertencia de Rechazo",

46
src/translations/locales/fa.json

@ -85,7 +85,7 @@
"goBack": "بازگشت",
"acceptProfile": "پذیرش پروفایل",
"requestProceedTitle": "درخواست اقدام",
"requestProceedDescription": "با تایید شما، از طرف شما با خانواده ایشان جهت خواستگاری تماس می‌گیریم. پس از موافقت خانواده ایشان، برای آشنایی بیشتر معرفی خواهید شد.",
"requestProceedDescription": "با تایید شما، درخواست شما برای این خانم ارسال می‌شود و ما باید منتظر پاسخ ایشان باشیم. این فرآیند ممکن است بین ۲ تا ۴ روز طول بکشد. از صبوری شما سپاسگزاریم.",
"acceptDescription": "آیا مطمئن هستید پروفایل را کامل بررسی کرده‌اید و آماده ادامه هستید؟",
"fields": {
"birthYear": "سال تولد",
@ -116,7 +116,16 @@
"bio": "بیوگرافی و انتظارات",
"sections": "داده‌های بخش‌های فرم",
"tests": "ارزیابی‌های روان‌شناختی"
}
},
"viewMoreDetails": "مشاهده جزئیات بیشتر",
"newMatchTitleFemale": "پیشنهاد ازدواج جدید",
"newMatchTitleMale": "یک گزینه جدید برای شما پیدا شد!",
"newMatchDescriptionFemale": "یک گزینه‌ی مناسب برای شما پیدا شده است. در صورت تایید، مشخصات شما جهت ادامه فرآیند معرفی ارزیابی خواهد شد.",
"newMatchDescriptionMale": "اگر فرآیند را ادامه دهید ما به طرف مقابل اعلام می‌کنیم و پس از تأیید ایشان، می‌توانید اطلاعات ارتباطی یکدیگر را مشاهده کنید.",
"femaleConsentTitle": "رضایت نهایی",
"femaleConsentDescription": "با تایید این پروفایل **شماره تماس شما** به آقا نمایش داده خواهد شد. قبل از اقدام، از **رضایت خانواده** اطمینان حاصل کنید.",
"femaleConsentCheckbox": "من گواهی می‌دهم که این خانم و خانواده‌شان این پروفایل را به طور کامل بررسی کرده‌اند و رضایت اولیه خود را برای ارتباط بیشتر اعلام می‌نمایند.",
"femaleConsentCheckboxLabel": "تایید می‌کنم که خانواده این **پروفایل را بررسی کرده** و با **ارتباط موافق است**."
},
"requestAccepted": {
"imageAlt": "درخواست پذیرفته شد",
@ -125,7 +134,25 @@
"viewContact": "مشاهده تماس",
"penalty": "توجه: اگر تا ۲ روز تماس برقرار نکنید، ممکن است جریمه اعمال شود",
"profileLocked": "پروفایل قفل است",
"lockedDescription": "تا زمانی که در حال یافتن گزینه هستیم، امکان ویرایش پروفایل وجود ندارد"
"lockedDescription": "تا زمانی که در حال یافتن گزینه هستیم، امکان ویرایش پروفایل وجود ندارد",
"titleFemale": "درخواست تایید شد",
"titleMalePaymentDone": "اطلاعات تماس آزاد شد",
"titleMalePaymentPending": "درخواست تایید شد!",
"primaryFemale": "اطلاع‌رسانی عدم تماس",
"primaryMale": "مشاهده پروفایل",
"secondaryFemale": "ثبت نتیجه تماس",
"secondaryMalePaymentDone": "مشاهده شماره تماس",
"secondaryMalePaymentPending": "پرداخت و دریافت تماس",
"titleContactReleased": "اطلاعات تماس آزاد شد",
"titleMaleApproved": "درخواست تایید شد!",
"actionReportNoContact": "اطلاع‌رسانی عدم تماس",
"actionViewProfile": "مشاهده پروفایل",
"actionSubmitCallResult": "ثبت نتیجه تماس",
"actionViewContact": "مشاهده شماره تماس",
"actionPayAndGetContact": "پرداخت و دریافت تماس",
"contactDetailTitle": "جزئیات تماس",
"contactDetailDescription": "لطفاً در طول تماس اشاره کنید که از طریق برنامه همسریابی حبیب معرفی شده‌اید.",
"contactNotAvailable": "اطلاعات تماس هنوز در دسترس نیست."
},
"findingMatch": {
"title": "جستجوی شما فعال است",
@ -140,7 +167,8 @@
"title": "گزینه انتخاب‌شده به‌زودی با خانواده شما تماس می‌گیرد.",
"contacted": "تماس گرفته شد",
"noContactYet": "هنوز تماس نگرفته؟",
"afterTwoDays": "(بعد از ۲ روز)"
"afterTwoDays": "(بعد از ۲ روز)",
"contactWarning": "اگر ظرف ۲ روز با شما تماس نگرفتند، لطفاً به ما اطلاع دهید."
},
"sheets": {
"informationSheet": "پنل اطلاعات",
@ -160,8 +188,8 @@
},
"requestSent": {
"title": "درخواست ارسال شد",
"description": "درخواست معرفی شما از طرف ما به خانواده طرف مقابل ارسال شد. در صورت تایید ایشان، اطلاعات تماس به اطلاع شما خواهد رسید.",
"matchProfile": "مشاهده پروفایل گزینه",
"description": "درخواست شما ارسال شد. پس از بررسی درخواست شما توسط خانم، به شما اطلاع‌رسانی خواهد شد.",
"matchProfile": "مشاهده جزئیات بیشتر",
"profileLocked": "پروفایل قفل است"
},
"spouseCriteriaConfidentialNotice": "⚠️ این بخش کاملاً محرمانه است و فقط برای مچینگ و بررسی کارشناسان استفاده میشود.",
@ -172,8 +200,10 @@
"swipeToPay": "برای پرداخت ۵۰ حبیب‌کوین بکشید",
"insufficientCoins": "موجودی سکه شما کافی نیست. لطفا حساب خود را شارژ کنید.",
"activeFor3Months": "معتبر تا ۳ ماه",
"cost": "۵۰ حبیب کوین",
"close": "خروج"
"cost": "۵۰ سکه",
"close": "خروج",
"payment": "پرداخت",
"pay": "پرداخت"
},
"maleRejectionWarning": {
"title": "هشدار رد کردن پیشنهاد",

48
src/translations/locales/fr.json

@ -85,7 +85,7 @@
"goBack": "Go back",
"acceptProfile": "Accept Profile",
"requestProceedTitle": "Request to Proceed",
"requestProceedDescription": "With your approval, we will approach their family on your behalf to propose marriage. After their family agrees, you will be introduced to each other for further acquaintance.",
"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",
@ -116,7 +116,16 @@
"bio": "Bio & Expectations",
"sections": "Form Sections Data",
"tests": "Psychological Assessments"
}
},
"viewMoreDetails": "Voir plus de détails",
"newMatchTitleFemale": "Nouvelle demande en mariage",
"newMatchTitleMale": "VOUS AVEZ UN NOUVEAU MATCH !",
"newMatchDescriptionFemale": "Une personne qui vous convient a été trouvée. S'il est approuvé, votre profil sera évalué pour procéder au processus d'introduction.",
"newMatchDescriptionMale": "Si vous continuez, nous en informerons l'autre partie et, après son approbation, vous pourrez consulter les coordonnées de chacun.",
"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**."
},
"requestAccepted": {
"imageAlt": "Request accepted",
@ -125,7 +134,25 @@
"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"
"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": "Détails de contact",
"contactDetailDescription": "Veuillez mentionner lors de l'appel que vous avez été présenté par l'application Habib Marriage.",
"contactNotAvailable": "Les coordonnées ne sont pas encore disponibles."
},
"findingMatch": {
"title": "VOTRE RECHERCHE EST ACTIVE",
@ -137,10 +164,11 @@
},
"candidateContact": {
"imageAlt": "Selected candidate contact status",
"title": "The selected candidate will be in touch with your family shortly.",
"title": "The selected candidate will contact your family shortly.",
"contacted": "contacted",
"noContactYet": "no contact yet ?",
"afterTwoDays": "(after 2 days)"
"afterTwoDays": "(after 2 days)",
"contactWarning": "If they don't contact you within 2 days, please inform us."
},
"sheets": {
"informationSheet": "Information sheet",
@ -160,8 +188,8 @@
},
"requestSent": {
"title": "Request Sent",
"description": "We will propose marriage on your behalf. If they accept, their contact details will be shared with you.",
"matchProfile": "Match Profile",
"description": "Your request has been sent. Once the lady reviews your request, you will be notified.",
"matchProfile": "View More Details",
"profileLocked": "Profile is locked"
},
"spouseCriteriaConfidentialNotice": "⚠️ This section is completely confidential and is only used for matching and review by advisors.",
@ -172,8 +200,10 @@
"swipeToPay": "Swipe to pay 50 Habib Coins",
"insufficientCoins": "Insufficient coin balance. Please recharge your account.",
"activeFor3Months": "Valid for 3 months",
"cost": "50 Habib Coins",
"close": "Exit"
"cost": "50 Coins",
"close": "Exit",
"payment": "Paiement",
"pay": "Payer"
},
"maleRejectionWarning": {
"title": "Avertissement de rejet",

48
src/translations/locales/gu.json

@ -85,7 +85,7 @@
"goBack": "Go back",
"acceptProfile": "Accept Profile",
"requestProceedTitle": "Request to Proceed",
"requestProceedDescription": "With your approval, we will approach their family on your behalf to propose marriage. After their family agrees, you will be introduced to each other for further acquaintance.",
"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",
@ -116,7 +116,16 @@
"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**."
},
"requestAccepted": {
"imageAlt": "Request accepted",
@ -125,7 +134,25 @@
"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"
"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": "કૃપા કરીને કૉલ દરમિયાન ઉલ્લેખ કરો કે તમને હબીબ મેરેજ એપ્લિકેશન દ્વારા પરિચય કરાવવામાં આવ્યો હતો.",
"contactNotAvailable": "સંપર્ક માહિતી હજી ઉપલબ્ધ નથી."
},
"findingMatch": {
"title": "તમારી શોધ સક્રિય છે",
@ -137,10 +164,11 @@
},
"candidateContact": {
"imageAlt": "Selected candidate contact status",
"title": "The selected candidate will be in touch with your family shortly.",
"title": "The selected candidate will contact your family shortly.",
"contacted": "contacted",
"noContactYet": "no contact yet ?",
"afterTwoDays": "(after 2 days)"
"afterTwoDays": "(after 2 days)",
"contactWarning": "If they don't contact you within 2 days, please inform us."
},
"sheets": {
"informationSheet": "Information sheet",
@ -160,8 +188,8 @@
},
"requestSent": {
"title": "Request Sent",
"description": "We will propose marriage on your behalf. If they accept, their contact details will be shared with you.",
"matchProfile": "Match Profile",
"description": "Your request has been sent. Once the lady reviews your request, you will be notified.",
"matchProfile": "View More Details",
"profileLocked": "Profile is locked"
},
"spouseCriteriaConfidentialNotice": "⚠️ This section is completely confidential and is only used for matching and review by advisors.",
@ -172,8 +200,10 @@
"swipeToPay": "Swipe to pay 50 Habib Coins",
"insufficientCoins": "Insufficient coin balance. Please recharge your account.",
"activeFor3Months": "Valid for 3 months",
"cost": "50 Habib Coins",
"close": "Exit"
"cost": "50 Coins",
"close": "Exit",
"payment": "ચુકવણી",
"pay": "ચુકવણી કરો"
},
"maleRejectionWarning": {
"title": "અસ્વીકાર ચેતવણી",

48
src/translations/locales/ha.json

@ -85,7 +85,7 @@
"goBack": "Go back",
"acceptProfile": "Accept Profile",
"requestProceedTitle": "Request to Proceed",
"requestProceedDescription": "With your approval, we will approach their family on your behalf to propose marriage. After their family agrees, you will be introduced to each other for further acquaintance.",
"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",
@ -116,7 +116,16 @@
"bio": "Bio & Expectations",
"sections": "Form Sections Data",
"tests": "Psychological Assessments"
}
},
"viewMoreDetails": "Duba ƙarin cikakkun bayanai",
"newMatchTitleFemale": "Sabuwar Shawarar Aure",
"newMatchTitleMale": "KANA DA SABON WASA!",
"newMatchDescriptionFemale": "An samo muku ashana mai dacewa. Idan an amince, za a tantance bayanan martaba don ci gaba da tsarin gabatarwa.",
"newMatchDescriptionMale": "Idan kun ci gaba, za mu sanar da ɗayan, kuma bayan amincewarsu, kuna iya duba bayanan tuntuɓar juna.",
"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**."
},
"requestAccepted": {
"imageAlt": "Request accepted",
@ -125,7 +134,25 @@
"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"
"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": "Cikakken Bayani na Tuntuɓa",
"contactDetailDescription": "Da fatan za a ambata lokacin kiran cewa an gabatar da ku ta hanyar aikace-aikacen Habib Marriage.",
"contactNotAvailable": "Bayanin tuntuɓa bai kasance ba tukuna."
},
"findingMatch": {
"title": "BINCICKEN KU YANA AIKI",
@ -137,10 +164,11 @@
},
"candidateContact": {
"imageAlt": "Selected candidate contact status",
"title": "The selected candidate will be in touch with your family shortly.",
"title": "The selected candidate will contact your family shortly.",
"contacted": "contacted",
"noContactYet": "no contact yet ?",
"afterTwoDays": "(after 2 days)"
"afterTwoDays": "(after 2 days)",
"contactWarning": "If they don't contact you within 2 days, please inform us."
},
"sheets": {
"informationSheet": "Information sheet",
@ -160,8 +188,8 @@
},
"requestSent": {
"title": "Request Sent",
"description": "We will propose marriage on your behalf. If they accept, their contact details will be shared with you.",
"matchProfile": "Match Profile",
"description": "Your request has been sent. Once the lady reviews your request, you will be notified.",
"matchProfile": "View More Details",
"profileLocked": "Profile is locked"
},
"spouseCriteriaConfidentialNotice": "⚠️ This section is completely confidential and is only used for matching and review by advisors.",
@ -172,8 +200,10 @@
"swipeToPay": "Swipe to pay 50 Habib Coins",
"insufficientCoins": "Insufficient coin balance. Please recharge your account.",
"activeFor3Months": "Valid for 3 months",
"cost": "50 Habib Coins",
"close": "Exit"
"cost": "50 Coins",
"close": "Exit",
"payment": "Biyan kuɗi",
"pay": "Biya"
},
"maleRejectionWarning": {
"title": "Gargaɗi Kan Kin Karɓa",

48
src/translations/locales/he.json

@ -85,7 +85,7 @@
"goBack": "Go back",
"acceptProfile": "Accept Profile",
"requestProceedTitle": "Request to Proceed",
"requestProceedDescription": "With your approval, we will approach their family on your behalf to propose marriage. After their family agrees, you will be introduced to each other for further acquaintance.",
"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",
@ -116,7 +116,16 @@
"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**."
},
"requestAccepted": {
"imageAlt": "Request accepted",
@ -125,7 +134,25 @@
"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"
"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": "פרטי הקשר אינם זמינים עדיין."
},
"findingMatch": {
"title": "החיפוש שלך פעיל",
@ -137,10 +164,11 @@
},
"candidateContact": {
"imageAlt": "Selected candidate contact status",
"title": "The selected candidate will be in touch with your family shortly.",
"title": "The selected candidate will contact your family shortly.",
"contacted": "contacted",
"noContactYet": "no contact yet ?",
"afterTwoDays": "(after 2 days)"
"afterTwoDays": "(after 2 days)",
"contactWarning": "If they don't contact you within 2 days, please inform us."
},
"sheets": {
"informationSheet": "Information sheet",
@ -160,8 +188,8 @@
},
"requestSent": {
"title": "Request Sent",
"description": "We will propose marriage on your behalf. If they accept, their contact details will be shared with you.",
"matchProfile": "Match Profile",
"description": "Your request has been sent. Once the lady reviews your request, you will be notified.",
"matchProfile": "View More Details",
"profileLocked": "Profile is locked"
},
"spouseCriteriaConfidentialNotice": "⚠️ This section is completely confidential and is only used for matching and review by advisors.",
@ -172,8 +200,10 @@
"swipeToPay": "Swipe to pay 50 Habib Coins",
"insufficientCoins": "Insufficient coin balance. Please recharge your account.",
"activeFor3Months": "Valid for 3 months",
"cost": "50 Habib Coins",
"close": "Exit"
"cost": "50 Coins",
"close": "Exit",
"payment": "תשלום",
"pay": "שלם"
},
"maleRejectionWarning": {
"title": "אזהרת דחיית הצעה",

48
src/translations/locales/hi.json

@ -85,7 +85,7 @@
"goBack": "Go back",
"acceptProfile": "Accept Profile",
"requestProceedTitle": "Request to Proceed",
"requestProceedDescription": "With your approval, we will approach their family on your behalf to propose marriage. After their family agrees, you will be introduced to each other for further acquaintance.",
"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",
@ -116,7 +116,16 @@
"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**."
},
"requestAccepted": {
"imageAlt": "Request accepted",
@ -125,7 +134,25 @@
"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"
"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": "कृपया कॉल के दौरान उल्लेख करें कि आपका परिचय हबीब मैरिज ऐप के माध्यम से कराया गया था।",
"contactNotAvailable": "संपर्क जानकारी अभी उपलब्ध नहीं है।"
},
"findingMatch": {
"title": "आपकी खोज सक्रिय है",
@ -137,10 +164,11 @@
},
"candidateContact": {
"imageAlt": "Selected candidate contact status",
"title": "The selected candidate will be in touch with your family shortly.",
"title": "The selected candidate will contact your family shortly.",
"contacted": "contacted",
"noContactYet": "no contact yet ?",
"afterTwoDays": "(after 2 days)"
"afterTwoDays": "(after 2 days)",
"contactWarning": "If they don't contact you within 2 days, please inform us."
},
"sheets": {
"informationSheet": "Information sheet",
@ -160,8 +188,8 @@
},
"requestSent": {
"title": "Request Sent",
"description": "We will propose marriage on your behalf. If they accept, their contact details will be shared with you.",
"matchProfile": "Match Profile",
"description": "Your request has been sent. Once the lady reviews your request, you will be notified.",
"matchProfile": "View More Details",
"profileLocked": "Profile is locked"
},
"spouseCriteriaConfidentialNotice": "⚠️ This section is completely confidential and is only used for matching and review by advisors.",
@ -172,8 +200,10 @@
"swipeToPay": "Swipe to pay 50 Habib Coins",
"insufficientCoins": "Insufficient coin balance. Please recharge your account.",
"activeFor3Months": "Valid for 3 months",
"cost": "50 Habib Coins",
"close": "Exit"
"cost": "50 Coins",
"close": "Exit",
"payment": "भुगतान",
"pay": "भुगतान करें"
},
"maleRejectionWarning": {
"title": "अस्वीकृति चेतावनी",

48
src/translations/locales/id.json

@ -85,7 +85,7 @@
"goBack": "Go back",
"acceptProfile": "Accept Profile",
"requestProceedTitle": "Request to Proceed",
"requestProceedDescription": "With your approval, we will approach their family on your behalf to propose marriage. After their family agrees, you will be introduced to each other for further acquaintance.",
"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",
@ -116,7 +116,16 @@
"bio": "Bio & Expectations",
"sections": "Form Sections Data",
"tests": "Psychological Assessments"
}
},
"viewMoreDetails": "Lihat detail selengkapnya",
"newMatchTitleFemale": "Lamaran Pernikahan Baru",
"newMatchTitleMale": "ANDA MEMILIKI PERTANDINGAN BARU!",
"newMatchDescriptionFemale": "Pasangan yang cocok telah ditemukan untuk Anda. Jika disetujui, profil Anda akan dievaluasi untuk melanjutkan proses pengenalan.",
"newMatchDescriptionMale": "Jika Anda melanjutkan, kami akan memberi tahu pihak lain, dan setelah mereka menyetujuinya, Anda dapat melihat informasi kontak masing-masing.",
"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**."
},
"requestAccepted": {
"imageAlt": "Request accepted",
@ -125,7 +134,25 @@
"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"
"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": "Detail Kontak",
"contactDetailDescription": "Harap sebutkan selama panggilan bahwa Anda diperkenalkan melalui aplikasi Habib Marriage.",
"contactNotAvailable": "Informasi kontak belum tersedia."
},
"findingMatch": {
"title": "YOUR SEARCH IS ACTIVE",
@ -137,10 +164,11 @@
},
"candidateContact": {
"imageAlt": "Selected candidate contact status",
"title": "The selected candidate will be in touch with your family shortly.",
"title": "The selected candidate will contact your family shortly.",
"contacted": "contacted",
"noContactYet": "no contact yet ?",
"afterTwoDays": "(after 2 days)"
"afterTwoDays": "(after 2 days)",
"contactWarning": "If they don't contact you within 2 days, please inform us."
},
"sheets": {
"informationSheet": "Information sheet",
@ -160,8 +188,8 @@
},
"requestSent": {
"title": "Request Sent",
"description": "We will propose marriage on your behalf. If they accept, their contact details will be shared with you.",
"matchProfile": "Match Profile",
"description": "Your request has been sent. Once the lady reviews your request, you will be notified.",
"matchProfile": "View More Details",
"profileLocked": "Profile is locked"
},
"spouseCriteriaConfidentialNotice": "⚠️ This section is completely confidential and is only used for matching and review by advisors.",
@ -172,8 +200,10 @@
"swipeToPay": "Swipe to pay 50 Habib Coins",
"insufficientCoins": "Insufficient coin balance. Please recharge your account.",
"activeFor3Months": "Valid for 3 months",
"cost": "50 Habib Coins",
"close": "Exit"
"cost": "50 Coins",
"close": "Exit",
"payment": "Pembayaran",
"pay": "Bayar"
},
"maleRejectionWarning": {
"title": "Rejection Warning",

48
src/translations/locales/ks.json

@ -85,7 +85,7 @@
"goBack": "Go back",
"acceptProfile": "Accept Profile",
"requestProceedTitle": "Request to Proceed",
"requestProceedDescription": "With your approval, we will approach their family on your behalf to propose marriage. After their family agrees, you will be introduced to each other for further acquaintance.",
"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",
@ -116,7 +116,16 @@
"bio": "Bio & Expectations",
"sections": "Form Sections Data",
"tests": "Psychological Assessments"
}
},
"viewMoreDetails": "مزید تفصیلات وُچھِو",
"newMatchTitleFemale": "New Marriage Proposal",
"newMatchTitleMale": "YOU HAVE A NEW MATCH!",
"newMatchDescriptionFemale": "A suitable match has been found for you. If approved, your profile will be evaluated to proceed with the introduction process.",
"newMatchDescriptionMale": "If you proceed, we will notify the other party, and upon their approval, you can view each other's contact information.",
"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**."
},
"requestAccepted": {
"imageAlt": "Request accepted",
@ -125,7 +134,25 @@
"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"
"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": "مہربانی کٔرتھ فون کَرنہ وِزِ کٔرِو زِکِر زِ تُہیہ آیو متعارف کَرنہ حبیب میرج ایپ ذٔریعہ۔",
"contactNotAvailable": "رابطہ معلومات چھنہ ونی دستیاب۔"
},
"findingMatch": {
"title": "تہنزر تلاش چھی سرگرم",
@ -137,10 +164,11 @@
},
"candidateContact": {
"imageAlt": "Selected candidate contact status",
"title": "The selected candidate will be in touch with your family shortly.",
"title": "The selected candidate will contact your family shortly.",
"contacted": "contacted",
"noContactYet": "no contact yet ?",
"afterTwoDays": "(after 2 days)"
"afterTwoDays": "(after 2 days)",
"contactWarning": "If they don't contact you within 2 days, please inform us."
},
"sheets": {
"informationSheet": "Information sheet",
@ -160,8 +188,8 @@
},
"requestSent": {
"title": "Request Sent",
"description": "We will propose marriage on your behalf. If they accept, their contact details will be shared with you.",
"matchProfile": "Match Profile",
"description": "Your request has been sent. Once the lady reviews your request, you will be notified.",
"matchProfile": "View More Details",
"profileLocked": "Profile is locked"
},
"spouseCriteriaConfidentialNotice": "⚠️ This section is completely confidential and is only used for matching and review by advisors.",
@ -172,8 +200,10 @@
"swipeToPay": "Swipe to pay 50 Habib Coins",
"insufficientCoins": "Insufficient coin balance. Please recharge your account.",
"activeFor3Months": "Valid for 3 months",
"cost": "50 Habib Coins",
"close": "Exit"
"cost": "50 Coins",
"close": "Exit",
"payment": "ادائیگی",
"pay": "ادائیگی کریں"
},
"maleRejectionWarning": {
"title": "مسترد کرنک انتباہ",

48
src/translations/locales/pt.json

@ -85,7 +85,7 @@
"goBack": "Go back",
"acceptProfile": "Accept Profile",
"requestProceedTitle": "Request to Proceed",
"requestProceedDescription": "With your approval, we will approach their family on your behalf to propose marriage. After their family agrees, you will be introduced to each other for further acquaintance.",
"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",
@ -116,7 +116,16 @@
"bio": "Bio & Expectations",
"sections": "Form Sections Data",
"tests": "Psychological Assessments"
}
},
"viewMoreDetails": "Ver mais detalhes",
"newMatchTitleFemale": "Nova proposta de casamento",
"newMatchTitleMale": "VOCÊ TEM UM NOVO JOGO!",
"newMatchDescriptionFemale": "Uma correspondência adequada foi encontrada para você. Se aprovado, seu perfil será avaliado para prosseguir com o processo de introdução.",
"newMatchDescriptionMale": "Se você prosseguir, notificaremos a outra parte e, após a aprovação dela, vocês poderão ver as informações de contato um do outro.",
"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**."
},
"requestAccepted": {
"imageAlt": "Request accepted",
@ -125,7 +134,25 @@
"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"
"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": "Detalhes de contato",
"contactDetailDescription": "Por favor, mencione durante a chamada que você foi apresentado através do aplicativo Habib Marriage.",
"contactNotAvailable": "As informações de contato ainda não estão disponíveis."
},
"findingMatch": {
"title": "SUA BUSCA ESTÁ ATIVA",
@ -137,10 +164,11 @@
},
"candidateContact": {
"imageAlt": "Selected candidate contact status",
"title": "The selected candidate will be in touch with your family shortly.",
"title": "The selected candidate will contact your family shortly.",
"contacted": "contacted",
"noContactYet": "no contact yet ?",
"afterTwoDays": "(after 2 days)"
"afterTwoDays": "(after 2 days)",
"contactWarning": "If they don't contact you within 2 days, please inform us."
},
"sheets": {
"informationSheet": "Information sheet",
@ -160,8 +188,8 @@
},
"requestSent": {
"title": "Request Sent",
"description": "We will propose marriage on your behalf. If they accept, their contact details will be shared with you.",
"matchProfile": "Match Profile",
"description": "Your request has been sent. Once the lady reviews your request, you will be notified.",
"matchProfile": "View More Details",
"profileLocked": "Profile is locked"
},
"spouseCriteriaConfidentialNotice": "⚠️ This section is completely confidential and is only used for matching and review by advisors.",
@ -172,8 +200,10 @@
"swipeToPay": "Swipe to pay 50 Habib Coins",
"insufficientCoins": "Insufficient coin balance. Please recharge your account.",
"activeFor3Months": "Valid for 3 months",
"cost": "50 Habib Coins",
"close": "Exit"
"cost": "50 Coins",
"close": "Exit",
"payment": "Pagamento",
"pay": "Pagar"
},
"maleRejectionWarning": {
"title": "Aviso de Rejeição",

48
src/translations/locales/ru.json

@ -85,7 +85,7 @@
"goBack": "Go back",
"acceptProfile": "Accept Profile",
"requestProceedTitle": "Request to Proceed",
"requestProceedDescription": "With your approval, we will approach their family on your behalf to propose marriage. After their family agrees, you will be introduced to each other for further acquaintance.",
"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",
@ -116,7 +116,16 @@
"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**."
},
"requestAccepted": {
"imageAlt": "Request accepted",
@ -125,7 +134,25 @@
"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"
"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": "Контактная информация пока недоступна."
},
"findingMatch": {
"title": "ВАШ ПОИСК АКТИВЕН",
@ -137,10 +164,11 @@
},
"candidateContact": {
"imageAlt": "Selected candidate contact status",
"title": "The selected candidate will be in touch with your family shortly.",
"title": "The selected candidate will contact your family shortly.",
"contacted": "contacted",
"noContactYet": "no contact yet ?",
"afterTwoDays": "(after 2 days)"
"afterTwoDays": "(after 2 days)",
"contactWarning": "If they don't contact you within 2 days, please inform us."
},
"sheets": {
"informationSheet": "Information sheet",
@ -160,8 +188,8 @@
},
"requestSent": {
"title": "Request Sent",
"description": "We will propose marriage on your behalf. If they accept, their contact details will be shared with you.",
"matchProfile": "Match Profile",
"description": "Your request has been sent. Once the lady reviews your request, you will be notified.",
"matchProfile": "View More Details",
"profileLocked": "Profile is locked"
},
"spouseCriteriaConfidentialNotice": "⚠️ This section is completely confidential and is only used for matching and review by advisors.",
@ -172,8 +200,10 @@
"swipeToPay": "Swipe to pay 50 Habib Coins",
"insufficientCoins": "Insufficient coin balance. Please recharge your account.",
"activeFor3Months": "Valid for 3 months",
"cost": "50 Habib Coins",
"close": "Exit"
"cost": "50 Coins",
"close": "Exit",
"payment": "Оплата",
"pay": "Оплатить"
},
"maleRejectionWarning": {
"title": "Предупреждение об отклонении",

48
src/translations/locales/sw.json

@ -85,7 +85,7 @@
"goBack": "Go back",
"acceptProfile": "Accept Profile",
"requestProceedTitle": "Request to Proceed",
"requestProceedDescription": "With your approval, we will approach their family on your behalf to propose marriage. After their family agrees, you will be introduced to each other for further acquaintance.",
"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",
@ -116,7 +116,16 @@
"bio": "Bio & Expectations",
"sections": "Form Sections Data",
"tests": "Psychological Assessments"
}
},
"viewMoreDetails": "Angalia maelezo zaidi",
"newMatchTitleFemale": "Pendekezo Jipya la Ndoa",
"newMatchTitleMale": "UNA MECHI MPYA!",
"newMatchDescriptionFemale": "Mechi inayofaa imepatikana kwa ajili yako. Ikiidhinishwa, wasifu wako utatathminiwa ili kuendelea na mchakato wa utangulizi.",
"newMatchDescriptionMale": "Ukiendelea, tutamjulisha mhusika mwingine, na baada ya idhini yake, unaweza kutazama maelezo ya mawasiliano ya kila mmoja.",
"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**."
},
"requestAccepted": {
"imageAlt": "Request accepted",
@ -125,7 +134,25 @@
"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"
"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": "Maelezo ya Mawasiliano",
"contactDetailDescription": "Tafadhali taja wakati wa simu kwamba ulitambulishwa kupitia programu ya Habib Marriage.",
"contactNotAvailable": "Maelezo ya mawasiliano bado hayapatikani."
},
"findingMatch": {
"title": "UTAFUTAJI WAKO UNAENDELEA",
@ -137,10 +164,11 @@
},
"candidateContact": {
"imageAlt": "Selected candidate contact status",
"title": "The selected candidate will be in touch with your family shortly.",
"title": "The selected candidate will contact your family shortly.",
"contacted": "contacted",
"noContactYet": "no contact yet ?",
"afterTwoDays": "(after 2 days)"
"afterTwoDays": "(after 2 days)",
"contactWarning": "If they don't contact you within 2 days, please inform us."
},
"sheets": {
"informationSheet": "Information sheet",
@ -160,8 +188,8 @@
},
"requestSent": {
"title": "Request Sent",
"description": "We will propose marriage on your behalf. If they accept, their contact details will be shared with you.",
"matchProfile": "Match Profile",
"description": "Your request has been sent. Once the lady reviews your request, you will be notified.",
"matchProfile": "View More Details",
"profileLocked": "Profile is locked"
},
"spouseCriteriaConfidentialNotice": "⚠️ This section is completely confidential and is only used for matching and review by advisors.",
@ -172,8 +200,10 @@
"swipeToPay": "Swipe to pay 50 Habib Coins",
"insufficientCoins": "Insufficient coin balance. Please recharge your account.",
"activeFor3Months": "Valid for 3 months",
"cost": "50 Habib Coins",
"close": "Exit"
"cost": "50 Coins",
"close": "Exit",
"payment": "Malipo",
"pay": "Lipa"
},
"maleRejectionWarning": {
"title": "Onyo la Kukataa",

48
src/translations/locales/tg.json

@ -85,7 +85,7 @@
"goBack": "Go back",
"acceptProfile": "Accept Profile",
"requestProceedTitle": "Request to Proceed",
"requestProceedDescription": "With your approval, we will approach their family on your behalf to propose marriage. After their family agrees, you will be introduced to each other for further acquaintance.",
"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",
@ -116,7 +116,16 @@
"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**."
},
"requestAccepted": {
"imageAlt": "Request accepted",
@ -125,7 +134,25 @@
"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"
"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": "Маъلوмоти тамос ҳанӯз дастрас нест."
},
"findingMatch": {
"title": "ҶУСТУҶӮИ ШУМО ФАЪОЛ АСТ",
@ -137,10 +164,11 @@
},
"candidateContact": {
"imageAlt": "Selected candidate contact status",
"title": "The selected candidate will be in touch with your family shortly.",
"title": "The selected candidate will contact your family shortly.",
"contacted": "contacted",
"noContactYet": "no contact yet ?",
"afterTwoDays": "(after 2 days)"
"afterTwoDays": "(after 2 days)",
"contactWarning": "If they don't contact you within 2 days, please inform us."
},
"sheets": {
"informationSheet": "Information sheet",
@ -160,8 +188,8 @@
},
"requestSent": {
"title": "Request Sent",
"description": "We will propose marriage on your behalf. If they accept, their contact details will be shared with you.",
"matchProfile": "Match Profile",
"description": "Your request has been sent. Once the lady reviews your request, you will be notified.",
"matchProfile": "View More Details",
"profileLocked": "Profile is locked"
},
"spouseCriteriaConfidentialNotice": "⚠️ This section is completely confidential and is only used for matching and review by advisors.",
@ -172,8 +200,10 @@
"swipeToPay": "Swipe to pay 50 Habib Coins",
"insufficientCoins": "Insufficient coin balance. Please recharge your account.",
"activeFor3Months": "Valid for 3 months",
"cost": "50 Habib Coins",
"close": "Exit"
"cost": "50 Coins",
"close": "Exit",
"payment": "Пардохт",
"pay": "Пардохт кардан"
},
"maleRejectionWarning": {
"title": "Огоҳӣ аз радди пешниҳод",

48
src/translations/locales/tr.json

@ -85,7 +85,7 @@
"goBack": "Go back",
"acceptProfile": "Accept Profile",
"requestProceedTitle": "Request to Proceed",
"requestProceedDescription": "With your approval, we will approach their family on your behalf to propose marriage. After their family agrees, you will be introduced to each other for further acquaintance.",
"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",
@ -116,7 +116,16 @@
"bio": "Biyografi ve Beklentiler",
"sections": "Form Bölümleri Verileri",
"tests": "Psikolojik Değerlendirmeler"
}
},
"viewMoreDetails": "Daha fazla detay görüntüle",
"newMatchTitleFemale": "Yeni Evlenme Teklifi",
"newMatchTitleMale": "YENİ BİR MAÇINIZ VAR!",
"newMatchDescriptionFemale": "Size uygun bir eşleşme bulundu. Onaylanması halinde profiliniz değerlendirmeye alınarak tanıtım sürecine geçilecektir.",
"newMatchDescriptionMale": "Devam etmeniz durumunda karşı tarafa bildirimde bulunacağız ve onların onayı ile birbirinizin iletişim bilgilerini görüntüleyebileceksiniz.",
"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**."
},
"requestAccepted": {
"imageAlt": "Request accepted",
@ -125,7 +134,25 @@
"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"
"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": "İletişim Detayları",
"contactDetailDescription": "Lütfen arama sırasında Habib Marriage uygulaması aracılığıyla tanıştırıldığınızı belirtin.",
"contactNotAvailable": "İletişim bilgileri henüz mevcut değil."
},
"findingMatch": {
"title": "ARAMANIZ AKTİF",
@ -137,10 +164,11 @@
},
"candidateContact": {
"imageAlt": "Selected candidate contact status",
"title": "The selected candidate will be in touch with your family shortly.",
"title": "The selected candidate will contact your family shortly.",
"contacted": "contacted",
"noContactYet": "no contact yet ?",
"afterTwoDays": "(after 2 days)"
"afterTwoDays": "(after 2 days)",
"contactWarning": "If they don't contact you within 2 days, please inform us."
},
"sheets": {
"informationSheet": "Information sheet",
@ -160,8 +188,8 @@
},
"requestSent": {
"title": "Request Sent",
"description": "We will propose marriage on your behalf. If they accept, their contact details will be shared with you.",
"matchProfile": "Match Profile",
"description": "Your request has been sent. Once the lady reviews your request, you will be notified.",
"matchProfile": "View More Details",
"profileLocked": "Profile is locked"
},
"spouseCriteriaConfidentialNotice": "⚠️ This section is completely confidential and is only used for matching and review by advisors.",
@ -172,8 +200,10 @@
"swipeToPay": "Swipe to pay 50 Habib Coins",
"insufficientCoins": "Insufficient coin balance. Please recharge your account.",
"activeFor3Months": "Valid for 3 months",
"cost": "50 Habib Coins",
"close": "Exit"
"cost": "50 Coins",
"close": "Exit",
"payment": "Ödeme",
"pay": "Öde"
},
"maleRejectionWarning": {
"title": "Reddetme Uyarısı",

48
src/translations/locales/ul.json

@ -85,7 +85,7 @@
"goBack": "Go back",
"acceptProfile": "Accept Profile",
"requestProceedTitle": "Request to Proceed",
"requestProceedDescription": "With your approval, we will approach their family on your behalf to propose marriage. After their family agrees, you will be introduced to each other for further acquaintance.",
"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",
@ -116,7 +116,16 @@
"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**."
},
"requestAccepted": {
"imageAlt": "Request accepted",
@ -125,7 +134,25 @@
"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"
"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": "تېلېفوندا ھەبىب نىكاھ ئەپى ئارقىلىق تونۇشتۇرۇلغانلىقىڭىزنى تىلغا ئېلىڭ.",
"contactNotAvailable": "ئالاقىلىشىش ئۇچۇرى تېخى يوق."
},
"findingMatch": {
"title": "YOUR SEARCH IS ACTIVE",
@ -137,10 +164,11 @@
},
"candidateContact": {
"imageAlt": "Selected candidate contact status",
"title": "The selected candidate will be in touch with your family shortly.",
"title": "The selected candidate will contact your family shortly.",
"contacted": "contacted",
"noContactYet": "no contact yet ?",
"afterTwoDays": "(after 2 days)"
"afterTwoDays": "(after 2 days)",
"contactWarning": "If they don't contact you within 2 days, please inform us."
},
"sheets": {
"informationSheet": "Information sheet",
@ -160,8 +188,8 @@
},
"requestSent": {
"title": "Request Sent",
"description": "We will propose marriage on your behalf. If they accept, their contact details will be shared with you.",
"matchProfile": "Match Profile",
"description": "Your request has been sent. Once the lady reviews your request, you will be notified.",
"matchProfile": "View More Details",
"profileLocked": "Profile is locked"
},
"spouseCriteriaConfidentialNotice": "⚠️ This section is completely confidential and is only used for matching and review by advisors.",
@ -172,8 +200,10 @@
"swipeToPay": "Swipe to pay 50 Habib Coins",
"insufficientCoins": "Insufficient coin balance. Please recharge your account.",
"activeFor3Months": "Valid for 3 months",
"cost": "50 Habib Coins",
"close": "Exit"
"cost": "50 Coins",
"close": "Exit",
"payment": "تۆلەش",
"pay": "تۆلەش"
},
"maleRejectionWarning": {
"title": "Rejection Warning",

48
src/translations/locales/ur.json

@ -85,7 +85,7 @@
"goBack": "Go back",
"acceptProfile": "Accept Profile",
"requestProceedTitle": "Request to Proceed",
"requestProceedDescription": "With your approval, we will approach their family on your behalf to propose marriage. After their family agrees, you will be introduced to each other for further acquaintance.",
"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",
@ -116,7 +116,16 @@
"bio": "بائیو اور توقعات",
"sections": "فارم کے شعبوں کا ڈیٹا",
"tests": "نفسیاتی جائزے۔"
}
},
"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**."
},
"requestAccepted": {
"imageAlt": "Request accepted",
@ -125,7 +134,25 @@
"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"
"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": "براہ کرم کال کے دوران ذکر کریں کہ آپ کا تعارف حبیب میرج ایپ کے ذریعے کرایا گیا تھا۔",
"contactNotAvailable": "رابطے کی معلومات ابھی دستیاب نہیں ہیں۔"
},
"findingMatch": {
"title": "آپ کی تلاش فعال ہے",
@ -137,10 +164,11 @@
},
"candidateContact": {
"imageAlt": "Selected candidate contact status",
"title": "The selected candidate will be in touch with your family shortly.",
"title": "The selected candidate will contact your family shortly.",
"contacted": "contacted",
"noContactYet": "no contact yet ?",
"afterTwoDays": "(after 2 days)"
"afterTwoDays": "(after 2 days)",
"contactWarning": "If they don't contact you within 2 days, please inform us."
},
"sheets": {
"informationSheet": "Information sheet",
@ -160,8 +188,8 @@
},
"requestSent": {
"title": "Request Sent",
"description": "We will propose marriage on your behalf. If they accept, their contact details will be shared with you.",
"matchProfile": "Match Profile",
"description": "Your request has been sent. Once the lady reviews your request, you will be notified.",
"matchProfile": "View More Details",
"profileLocked": "Profile is locked"
},
"spouseCriteriaConfidentialNotice": "⚠️ This section is completely confidential and is only used for matching and review by advisors.",
@ -172,8 +200,10 @@
"swipeToPay": "Swipe to pay 50 Habib Coins",
"insufficientCoins": "Insufficient coin balance. Please recharge your account.",
"activeFor3Months": "Valid for 3 months",
"cost": "50 Habib Coins",
"close": "Exit"
"cost": "50 Coins",
"close": "Exit",
"payment": "ادائیگی",
"pay": "ادائیگی کریں"
},
"maleRejectionWarning": {
"title": "پیشکش مسترد کرنے کی وارننگ",

48
src/translations/locales/uz.json

@ -85,7 +85,7 @@
"goBack": "Go back",
"acceptProfile": "Accept Profile",
"requestProceedTitle": "Request to Proceed",
"requestProceedDescription": "With your approval, we will approach their family on your behalf to propose marriage. After their family agrees, you will be introduced to each other for further acquaintance.",
"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",
@ -116,7 +116,16 @@
"bio": "Bio & Expectations",
"sections": "Form Sections Data",
"tests": "Psychological Assessments"
}
},
"viewMoreDetails": "Batafsil ma'lumotni ko'rish",
"newMatchTitleFemale": "Yangi turmush qurish taklifi",
"newMatchTitleMale": "SIZDA YANGI O'YIN BO'LDI!",
"newMatchDescriptionFemale": "Sizga mos keladigan moslik topildi. Agar ma'qullansa, kirish jarayonini davom ettirish uchun profilingiz baholanadi.",
"newMatchDescriptionMale": "Davom etsangiz, biz boshqa tomonni xabardor qilamiz va ular ma'qullaganidan keyin siz bir-biringizning aloqa ma'lumotlarini ko'rishingiz mumkin.",
"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**."
},
"requestAccepted": {
"imageAlt": "Request accepted",
@ -125,7 +134,25 @@
"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"
"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": "Aloqa ma'lumotlari",
"contactDetailDescription": "Iltimos, qo'ng'iroq paytida sizni Habib Marriage ilovasi orqali tanishtirishganini aytib o'ting.",
"contactNotAvailable": "Aloqa ma'lumotlari hali mavjud emas."
},
"findingMatch": {
"title": "QIDIRUVINGIZ FAOLLASHTIRILDI",
@ -137,10 +164,11 @@
},
"candidateContact": {
"imageAlt": "Selected candidate contact status",
"title": "The selected candidate will be in touch with your family shortly.",
"title": "The selected candidate will contact your family shortly.",
"contacted": "contacted",
"noContactYet": "no contact yet ?",
"afterTwoDays": "(after 2 days)"
"afterTwoDays": "(after 2 days)",
"contactWarning": "If they don't contact you within 2 days, please inform us."
},
"sheets": {
"informationSheet": "Information sheet",
@ -160,8 +188,8 @@
},
"requestSent": {
"title": "Request Sent",
"description": "We will propose marriage on your behalf. If they accept, their contact details will be shared with you.",
"matchProfile": "Match Profile",
"description": "Your request has been sent. Once the lady reviews your request, you will be notified.",
"matchProfile": "View More Details",
"profileLocked": "Profile is locked"
},
"spouseCriteriaConfidentialNotice": "⚠️ This section is completely confidential and is only used for matching and review by advisors.",
@ -172,8 +200,10 @@
"swipeToPay": "Swipe to pay 50 Habib Coins",
"insufficientCoins": "Insufficient coin balance. Please recharge your account.",
"activeFor3Months": "Valid for 3 months",
"cost": "50 Habib Coins",
"close": "Exit"
"cost": "50 Coins",
"close": "Exit",
"payment": "To'lov",
"pay": "To'lash"
},
"maleRejectionWarning": {
"title": "Rad etish ogohlantirishi",

48
src/translations/locales/zh.json

@ -85,7 +85,7 @@
"goBack": "Go back",
"acceptProfile": "Accept Profile",
"requestProceedTitle": "Request to Proceed",
"requestProceedDescription": "With your approval, we will approach their family on your behalf to propose marriage. After their family agrees, you will be introduced to each other for further acquaintance.",
"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",
@ -116,7 +116,16 @@
"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**."
},
"requestAccepted": {
"imageAlt": "Request accepted",
@ -125,7 +134,25 @@
"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"
"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": "联系信息暂不可用。"
},
"findingMatch": {
"title": "您的搜寻正在进行中",
@ -137,10 +164,11 @@
},
"candidateContact": {
"imageAlt": "Selected candidate contact status",
"title": "The selected candidate will be in touch with your family shortly.",
"title": "The selected candidate will contact your family shortly.",
"contacted": "contacted",
"noContactYet": "no contact yet ?",
"afterTwoDays": "(after 2 days)"
"afterTwoDays": "(after 2 days)",
"contactWarning": "If they don't contact you within 2 days, please inform us."
},
"sheets": {
"informationSheet": "Information sheet",
@ -160,8 +188,8 @@
},
"requestSent": {
"title": "Request Sent",
"description": "We will propose marriage on your behalf. If they accept, their contact details will be shared with you.",
"matchProfile": "Match Profile",
"description": "Your request has been sent. Once the lady reviews your request, you will be notified.",
"matchProfile": "View More Details",
"profileLocked": "Profile is locked"
},
"spouseCriteriaConfidentialNotice": "⚠️ This section is completely confidential and is only used for matching and review by advisors.",
@ -172,8 +200,10 @@
"swipeToPay": "Swipe to pay 50 Habib Coins",
"insufficientCoins": "Insufficient coin balance. Please recharge your account.",
"activeFor3Months": "Valid for 3 months",
"cost": "50 Habib Coins",
"close": "Exit"
"cost": "50 Coins",
"close": "Exit",
"payment": "支付",
"pay": "支付"
},
"maleRejectionWarning": {
"title": "拒绝警告",

Loading…
Cancel
Save