From 3259a3ac946c1b1debdf69c5c55a67bb1b0635ef Mon Sep 17 00:00:00 2001 From: mortezaei Date: Mon, 17 Aug 2026 13:42:16 +0330 Subject: [PATCH] feat(marriage): implement dynamic marriage advisors loading Replace static advisor data with a dynamic fetch from the API using React Query. This includes adding a new custom hook for marriage advisors, updating query keys, and integrating with the Flutter webview to allow opening consultant pages natively. - Add `useMarriageAdvisorsQuery` hook - Implement `getMarriageConsultants` API call - Update `MarriageAdvisorsPage` to use fetched data - Add error and empty state translations across all locales - Integrate `postActionToFlutter` for native navigation --- src/app/marriage-advisors/page.tsx | 423 ++++++++++++-------- src/hooks/marriage/query-keys.ts | 1 + src/hooks/marriage/use-marriage-advisors.ts | 58 +++ src/translations/locales/ar.json | 5 +- src/translations/locales/az.json | 5 +- src/translations/locales/bn.json | 5 +- src/translations/locales/da.json | 5 +- src/translations/locales/de.json | 5 +- src/translations/locales/en.json | 5 +- src/translations/locales/es.json | 5 +- src/translations/locales/fa.json | 5 +- src/translations/locales/fr.json | 5 +- src/translations/locales/gu.json | 5 +- src/translations/locales/ha.json | 5 +- src/translations/locales/he.json | 5 +- src/translations/locales/hi.json | 5 +- src/translations/locales/id.json | 5 +- src/translations/locales/ks.json | 5 +- src/translations/locales/pt.json | 5 +- src/translations/locales/ru.json | 5 +- src/translations/locales/sw.json | 5 +- src/translations/locales/tg.json | 5 +- src/translations/locales/tr.json | 5 +- src/translations/locales/ul.json | 5 +- src/translations/locales/ur.json | 5 +- src/translations/locales/uz.json | 5 +- src/translations/locales/zh.json | 5 +- 27 files changed, 407 insertions(+), 195 deletions(-) create mode 100644 src/hooks/marriage/use-marriage-advisors.ts diff --git a/src/app/marriage-advisors/page.tsx b/src/app/marriage-advisors/page.tsx index 46c42dc..3ae339a 100644 --- a/src/app/marriage-advisors/page.tsx +++ b/src/app/marriage-advisors/page.tsx @@ -9,11 +9,21 @@ import NavigationButton from "@/components/Componentes/navigation-button"; import { PageBackground } from "@/components/Componentes/page-background"; import SupportSheet from "@/components/Componentes/support-sheet"; import { useI18n } from "@/translations/provider"; +import { + useMarriageAdvisorsQuery, + type MarriageConsultant, +} from "@/hooks/marriage/use-marriage-advisors"; +import { postActionToFlutter } from "@/lib/webview-actions"; + +const FALLBACK_AVATAR = "/assets/images/Avatar Image.png"; export default function MarriageAdvisorsPage() { const { dictionary: t } = useI18n(); const [isSupportOpen, setIsSupportOpen] = useState(false); + const { data, isLoading, isError, refetch } = useMarriageAdvisorsQuery(); + const advisors = data?.results ?? []; + const mainStyle = { backgroundImage: `url("/assets/images/islamic_pattern_2_2892_3864.svg")`, backgroundColor: "#F5F5F5", @@ -21,62 +31,12 @@ export default function MarriageAdvisorsPage() { backgroundSize: "100% auto", }; - const advisors = [ - { - id: "hasti-masoudi", - name: t["Dr. Hasti Masoudi"] || "Dr. Hasti Masoudi", - specialty: - t["Specialist in clinical psychology"] || - "Specialist in clinical psychology", - avatar: "/assets/images/female_avatar.svg", - rating: "3.2", - tagsRow1: [ - t["Personal Development"] || "Personal Development", - t["Team Manager"] || "Team Manager", - t["Science"] || "Science", - ], - tagsRow2: [ - t["Manager"] || "Manager", - t["Team Manager"] || "Team Manager", - t["Science"] || "Science", - ], - online: true, - }, - { - id: "ali-rezaei", - name: t["Dr. Ali Rezaei"] || "Dr. Ali Rezaei", - specialty: - t["Family & marriage counselor"] || "Family & marriage counselor", - avatar: "/assets/images/Avatar Image.png", - rating: "4.9", - tagsRow1: [ - t["Premarital Counselling"] || "Premarital Counselling", - t["Conflict Resolution"] || "Conflict Resolution", - ], - tagsRow2: [ - t["Behavioral Therapy"] || "Behavioral Therapy", - t["Self-Awareness"] || "Self-Awareness", - ], - online: true, - }, - { - id: "sara-alavi", - name: t["Dr. Sara Alavi"] || "Dr. Sara Alavi", - specialty: - t["Relationship & intimacy coach"] || "Relationship & intimacy coach", - avatar: "/assets/images/Ellipse 370.png", - rating: "4.7", - tagsRow1: [ - t["Emotional Health"] || "Emotional Health", - t["Communication Skills"] || "Communication Skills", - ], - tagsRow2: [ - t["Relationship Coach"] || "Relationship Coach", - t["Personal Development"] || "Personal Development", - ], - online: false, - }, - ]; + // Opens the native Talk consultant page; the Flutter side fetches the + // consultant by username, so only the bare username is needed. Outside the + // WebView (plain browser) postActionToFlutter is a no-op returning false. + const openConsultantPage = (username: string) => { + postActionToFlutter("open_consultant_page", { consultant: username }); + }; return ( <> @@ -103,124 +63,49 @@ export default function MarriageAdvisorsPage() {
- {advisors.map((advisor) => ( -
- {/* Top Frame containing Left (Avatar + Info) and Right (Rating) and Actions */} -
- {/* Header Row */} -
- {/* Left part: Avatar + Info */} -
- {/* Avatar Container */} -
- {advisor.name} - {/* Status indicator dot */} - {advisor.online && ( -
- - -
- )} -
- - {/* Name + Title Info */} -
-

- {advisor.name} -

-

- {advisor.specialty} -

-
-
- - {/* Right part: Rating */} -
- - - {advisor.rating} - -
-
+ {isLoading && } - {/* Actions Row */} -
- {/* Text Contact Button */} - - - {/* Voice Call Contact Button */} - -
-
- - {/* Divider */} -
- - {/* Tags Section */} -
- {/* Row 1 tags */} -
- {advisor.tagsRow1.map((tag, index) => ( - - {tag} - - ))} -
+ {isError && ( +
+

+ {t["Failed to load advisors."]} +

+ +
+ )} - {/* Row 2 tags */} -
- {advisor.tagsRow2.map((tag, index) => ( - - {tag} - - ))} -
-
+ {!isLoading && !isError && advisors.length === 0 && ( +
+

+ {t["No advisors are currently available."]} +

+ )} + + {advisors.map((advisor) => ( + openConsultantPage(advisor.username)} + onContact={() => setIsSupportOpen(true)} + contactLabels={{ + text: t["Text"] || "Text", + voice: t["Voice Call"] || "Voice Call", + }} + /> ))}
@@ -232,3 +117,199 @@ export default function MarriageAdvisorsPage() { ); } + +function AdvisorCard({ + advisor, + onOpen, + onContact, + contactLabels, +}: { + advisor: MarriageConsultant; + onOpen: () => void; + onContact: () => void; + contactLabels: { text: string; voice: string }; +}) { + const topics = advisor.topics.filter(Boolean); + const rating = Number(advisor.avg_rate ?? 0).toFixed(1); + const isOnline = advisor.status === "online"; + + return ( +
{ + if (event.key === "Enter" || event.key === " ") { + event.preventDefault(); + onOpen(); + } + }} + className="flex w-[343px] cursor-pointer flex-col items-center gap-[13px] rounded-[15px] border border-[#EBEBEB] bg-white py-[13px] shadow-[0px_4px_12px_rgba(0,0,0,0.05)] transition-transform active:scale-[0.98]" + > + {/* Top Frame containing Left (Avatar + Info) and Right (Rating) and Actions */} +
+ {/* Header Row */} +
+ {/* Left part: Avatar + Info */} +
+ {/* Avatar Container */} +
+ {advisor.avatar_url ? ( + // Consultant avatars come from arbitrary media hosts, which + // are not all listed in next.config remotePatterns — a plain + // img with an onError fallback keeps them rendering. + // eslint-disable-next-line @next/next/no-img-element + {advisor.fullname { + event.currentTarget.src = FALLBACK_AVATAR; + }} + /> + ) : ( + {advisor.fullname + )} + {/* Status indicator dot */} + {isOnline && ( +
+ + +
+ )} +
+ + {/* Name + Title Info */} +
+

+ {advisor.fullname ?? advisor.username} +

+

+ {advisor.slogan ?? ""} +

+
+
+ + {/* Right part: Rating */} +
+ + + {rating} + +
+
+ + {/* Actions Row */} +
+ {/* Text Contact Button */} + + + {/* Voice Call Contact Button */} + +
+
+ + {/* Divider */} +
+ + {/* Tags Section */} + {topics.length > 0 && ( +
+
+ {topics.map((tag) => ( + + {tag} + + ))} +
+
+ )} +
+ ); +} + +function AdvisorsSkeleton() { + return ( + <> + {[0, 1, 2].map((index) => ( +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ))} + + ); +} diff --git a/src/hooks/marriage/query-keys.ts b/src/hooks/marriage/query-keys.ts index dcdf06b..144e1e0 100644 --- a/src/hooks/marriage/query-keys.ts +++ b/src/hooks/marriage/query-keys.ts @@ -10,6 +10,7 @@ export const marriageQueryKeys = { "contact-info", ] as const, profile: () => [...marriageQueryKeys.all, "profile"] as const, + advisors: () => [...marriageQueryKeys.all, "advisors"] as const, formOverview: (formId: string, locale: string) => [...marriageQueryKeys.all, "form-overview", formId, locale] as const, formSection: (formId: string, slug: string, locale: string) => diff --git a/src/hooks/marriage/use-marriage-advisors.ts b/src/hooks/marriage/use-marriage-advisors.ts new file mode 100644 index 0000000..65cda24 --- /dev/null +++ b/src/hooks/marriage/use-marriage-advisors.ts @@ -0,0 +1,58 @@ +"use client"; + +import { useQuery } from "@tanstack/react-query"; +import { http } from "@/lib/http"; +import { marriageQueryKeys } from "./query-keys"; +import type { QueryOptions } from "./options"; + +/** + * Consultant object served by GET /api/talk/marriage-consultants/ — the exact + * shape the Flutter Talk app's Consultant.fromJson consumes, so the same + * object can be handed back when opening the native consultant page. + */ +export interface MarriageConsultant { + username: string; + fullname: string | null; + avatar_url: string | null; + slogan: string | null; + bio: string | null; + description: string | null; + topics: string[]; + languages: string[]; + call_languages: string[]; + contact_type: string[]; + scheduling: Record | null; + status: string; + unread_count: number; + avg_rate: number; + categories: string[]; + session_duration: number | null; + video_call_cost: number | null; + voice_call_cost: number | null; + first_message: string | null; + is_ai: boolean; + is_supporter: boolean; + order: number; +} + +export interface MarriageConsultantsResponse { + results: MarriageConsultant[]; +} + +export async function getMarriageConsultants() { + const { data } = await http.get( + "/api/talk/marriage-consultants/", + ); + + return data; +} + +export function useMarriageAdvisorsQuery( + options?: QueryOptions, +) { + return useQuery({ + ...options, + queryKey: marriageQueryKeys.advisors(), + queryFn: getMarriageConsultants, + }); +} diff --git a/src/translations/locales/ar.json b/src/translations/locales/ar.json index a7bcaec..28f3bb9 100644 --- a/src/translations/locales/ar.json +++ b/src/translations/locales/ar.json @@ -758,5 +758,8 @@ "Select date": "اختر التاريخ", "Day": "اليوم", "Month": "الشهر", - "Year": "السنة" + "Year": "السنة", + "Failed to load advisors.": "تعذّر تحميل المستشارين.", + "Try again": "حاول مرة أخرى", + "No advisors are currently available.": "لا يوجد مستشارون متاحون حاليًا." } diff --git a/src/translations/locales/az.json b/src/translations/locales/az.json index 8411e3a..ff428d4 100644 --- a/src/translations/locales/az.json +++ b/src/translations/locales/az.json @@ -758,5 +758,8 @@ "Select date": "Tarix seçin", "Day": "Gün", "Month": "Ay", - "Year": "İl" + "Year": "İl", + "Failed to load advisors.": "Məsləhətçiləri yükləmək alınmadı.", + "Try again": "Yenidən cəhd edin", + "No advisors are currently available.": "Hazırda mövcud məsləhətçi yoxdur." } diff --git a/src/translations/locales/bn.json b/src/translations/locales/bn.json index b469d3a..019e5fe 100644 --- a/src/translations/locales/bn.json +++ b/src/translations/locales/bn.json @@ -758,5 +758,8 @@ "Select date": "তারিখ নির্বাচন করুন", "Day": "দিন", "Month": "মাস", - "Year": "বছর" + "Year": "বছর", + "Failed to load advisors.": "উপদেষ্টাদের লোড করা যায়নি।", + "Try again": "আবার চেষ্টা করুন", + "No advisors are currently available.": "বর্তমানে কোনো উপদেষ্টা নেই।" } diff --git a/src/translations/locales/da.json b/src/translations/locales/da.json index 016bddf..6223141 100644 --- a/src/translations/locales/da.json +++ b/src/translations/locales/da.json @@ -758,5 +758,8 @@ "Select date": "Vælg dato", "Day": "Dag", "Month": "Måned", - "Year": "År" + "Year": "År", + "Failed to load advisors.": "Kunne ikke indlæse rådgivere.", + "Try again": "Prøv igen", + "No advisors are currently available.": "Der er i øjeblikket ingen tilgængelige rådgivere." } diff --git a/src/translations/locales/de.json b/src/translations/locales/de.json index 55c43db..2938c80 100644 --- a/src/translations/locales/de.json +++ b/src/translations/locales/de.json @@ -758,5 +758,8 @@ "Select date": "Datum auswählen", "Day": "Tag", "Month": "Monat", - "Year": "Jahr" + "Year": "Jahr", + "Failed to load advisors.": "Berater konnten nicht geladen werden.", + "Try again": "Erneut versuchen", + "No advisors are currently available.": "Derzeit sind keine Berater verfügbar." } diff --git a/src/translations/locales/en.json b/src/translations/locales/en.json index 16cad27..4d276fa 100644 --- a/src/translations/locales/en.json +++ b/src/translations/locales/en.json @@ -808,5 +808,8 @@ "Select date": "Select date", "Day": "Day", "Month": "Month", - "Year": "Year" + "Year": "Year", + "Failed to load advisors.": "Failed to load advisors.", + "Try again": "Try again", + "No advisors are currently available.": "No advisors are currently available." } diff --git a/src/translations/locales/es.json b/src/translations/locales/es.json index 2f4b860..1a2d1fd 100644 --- a/src/translations/locales/es.json +++ b/src/translations/locales/es.json @@ -758,5 +758,8 @@ "Select date": "Seleccionar fecha", "Day": "Día", "Month": "Mes", - "Year": "Año" + "Year": "Año", + "Failed to load advisors.": "No se pudieron cargar los asesores.", + "Try again": "Intentar de nuevo", + "No advisors are currently available.": "Actualmente no hay asesores disponibles." } diff --git a/src/translations/locales/fa.json b/src/translations/locales/fa.json index 9f44ca9..93b9a91 100644 --- a/src/translations/locales/fa.json +++ b/src/translations/locales/fa.json @@ -808,5 +808,8 @@ "Select date": "انتخاب تاریخ", "Day": "روز", "Month": "ماه", - "Year": "سال" + "Year": "سال", + "Failed to load advisors.": "بارگیری مشاوران ناموفق بود.", + "Try again": "تلاش مجدد", + "No advisors are currently available.": "در حال حاضر مشاوری در دسترس نیست." } diff --git a/src/translations/locales/fr.json b/src/translations/locales/fr.json index 07d0c85..21a6980 100644 --- a/src/translations/locales/fr.json +++ b/src/translations/locales/fr.json @@ -758,5 +758,8 @@ "Select date": "Sélectionner la date", "Day": "Jour", "Month": "Mois", - "Year": "Année" + "Year": "Année", + "Failed to load advisors.": "Échec du chargement des conseillers.", + "Try again": "Réessayer", + "No advisors are currently available.": "Aucun conseiller n'est disponible actuellement." } diff --git a/src/translations/locales/gu.json b/src/translations/locales/gu.json index f793732..9711fbd 100644 --- a/src/translations/locales/gu.json +++ b/src/translations/locales/gu.json @@ -758,5 +758,8 @@ "Select date": "તારીખ પસંદ કરો", "Day": "દિવસ", "Month": "મહિનો", - "Year": "વર્ષ" + "Year": "વર્ષ", + "Failed to load advisors.": "સલાહકારોને લોડ કરવામાં નિષ્ફળ.", + "Try again": "ફરી પ્રયાસ કરો", + "No advisors are currently available.": "હાલમાં કોઈ સલાહકાર ઉપલબ્ધ નથી." } diff --git a/src/translations/locales/ha.json b/src/translations/locales/ha.json index 288962b..3cab8d7 100644 --- a/src/translations/locales/ha.json +++ b/src/translations/locales/ha.json @@ -758,5 +758,8 @@ "Select date": "Zaɓi kwanan wata", "Day": "Rana", "Month": "Wata", - "Year": "Shekara" + "Year": "Shekara", + "Failed to load advisors.": "Gaza loda masu ba da shawara.", + "Try again": "Sake gwadawa", + "No advisors are currently available.": "Babu masu ba da shawara a halin yanzu." } diff --git a/src/translations/locales/he.json b/src/translations/locales/he.json index 0487469..eb1f4dc 100644 --- a/src/translations/locales/he.json +++ b/src/translations/locales/he.json @@ -286,5 +286,8 @@ "Month": "חודש", "Year": "שנה", "Age": "גיל", - "Confirm": "אישור" + "Confirm": "אישור", + "Failed to load advisors.": "טעינת היועצים נכשלה.", + "Try again": "נסה שוב", + "No advisors are currently available.": "אין כרגע יועצים זמינים." } diff --git a/src/translations/locales/hi.json b/src/translations/locales/hi.json index 7c6062c..79c28ea 100644 --- a/src/translations/locales/hi.json +++ b/src/translations/locales/hi.json @@ -758,5 +758,8 @@ "Select date": "तारीख़ चुनें", "Day": "दिन", "Month": "महीना", - "Year": "साल" + "Year": "साल", + "Failed to load advisors.": "सलाहकारों को लोड करने में विफल।", + "Try again": "फिर से प्रयास करें", + "No advisors are currently available.": "इस समय कोई सलाहकार उपलब्ध नहीं है।" } diff --git a/src/translations/locales/id.json b/src/translations/locales/id.json index c064273..943ad8d 100644 --- a/src/translations/locales/id.json +++ b/src/translations/locales/id.json @@ -286,5 +286,8 @@ "Month": "Bulan", "Year": "Tahun", "Age": "Usia", - "Confirm": "Konfirmasi" + "Confirm": "Konfirmasi", + "Failed to load advisors.": "Gagal memuat penasihat.", + "Try again": "Coba lagi", + "No advisors are currently available.": "Saat ini tidak ada penasihat yang tersedia." } diff --git a/src/translations/locales/ks.json b/src/translations/locales/ks.json index 06a2fa6..b401f5a 100644 --- a/src/translations/locales/ks.json +++ b/src/translations/locales/ks.json @@ -286,5 +286,8 @@ "Month": "ماہ", "Year": "ؤری", "Age": "عمر", - "Confirm": "تصدیق کریں" + "Confirm": "تصدیق کریں", + "Failed to load advisors.": "مشیرن لوڈ کرنأک ناکام۔", + "Try again": "دوبآ کوشش کریو", + "No advisors are currently available.": "فی الحأل کاہن مشیر دستیاب چھُنہِ۔" } diff --git a/src/translations/locales/pt.json b/src/translations/locales/pt.json index 8089ad4..5cf895f 100644 --- a/src/translations/locales/pt.json +++ b/src/translations/locales/pt.json @@ -286,5 +286,8 @@ "Month": "Mês", "Year": "Ano", "Age": "Idade", - "Confirm": "Confirmar" + "Confirm": "Confirmar", + "Failed to load advisors.": "Falha ao carregar os consultores.", + "Try again": "Tentar novamente", + "No advisors are currently available.": "Nenhum consultor disponível no momento." } diff --git a/src/translations/locales/ru.json b/src/translations/locales/ru.json index 2f3b8c8..b475194 100644 --- a/src/translations/locales/ru.json +++ b/src/translations/locales/ru.json @@ -763,5 +763,8 @@ "Select date": "Выберите дату", "Day": "День", "Month": "Месяц", - "Year": "Год" + "Year": "Год", + "Failed to load advisors.": "Не удалось загрузить консультантов.", + "Try again": "Попробовать снова", + "No advisors are currently available.": "На данный момент нет доступных консультантов." } diff --git a/src/translations/locales/sw.json b/src/translations/locales/sw.json index a7c5de4..decfc89 100644 --- a/src/translations/locales/sw.json +++ b/src/translations/locales/sw.json @@ -286,5 +286,8 @@ "Month": "Mwezi", "Year": "Mwaka", "Age": "Umri", - "Confirm": "Thibitisha" + "Confirm": "Thibitisha", + "Failed to load advisors.": "Imeshindwa kupakia washauri.", + "Try again": "Jaribu tena", + "No advisors are currently available.": "Hakuna washauri wanaopatikana kwa sasa." } diff --git a/src/translations/locales/tg.json b/src/translations/locales/tg.json index ea175a2..149c142 100644 --- a/src/translations/locales/tg.json +++ b/src/translations/locales/tg.json @@ -286,5 +286,8 @@ "Month": "Моҳ", "Year": "Сол", "Age": "Синну сол", - "Confirm": "Тасдиқ кунед" + "Confirm": "Тасдиқ кунед", + "Failed to load advisors.": "Бор кардани маслиҳатдиҳондагон ноком буд.", + "Try again": "Дубора кӯшиш кунед", + "No advisors are currently available.": "Дар айни замон маслиҳатдиҳон дастрас нест." } diff --git a/src/translations/locales/tr.json b/src/translations/locales/tr.json index 595a2ed..28d7d3c 100644 --- a/src/translations/locales/tr.json +++ b/src/translations/locales/tr.json @@ -286,5 +286,8 @@ "Month": "Ay", "Year": "Yıl", "Age": "Yaş", - "Confirm": "Onayla" + "Confirm": "Onayla", + "Failed to load advisors.": "Danışmanlar yüklenemedi.", + "Try again": "Tekrar dene", + "No advisors are currently available.": "Şu anda uygun danışman yok." } diff --git a/src/translations/locales/ul.json b/src/translations/locales/ul.json index d089543..dabddc9 100644 --- a/src/translations/locales/ul.json +++ b/src/translations/locales/ul.json @@ -286,5 +286,8 @@ "Month": "ئاي", "Year": "يىل", "Age": "يېشى", - "Confirm": "جەزملەش" + "Confirm": "جەزملەش", + "Failed to load advisors.": "مشاورین لوڈ نہیں ہو سکے۔", + "Try again": "دوبارہ کوشش کریں", + "No advisors are currently available.": "اس وقت کوئی مشاور دستیاب نہیں ہے۔" } diff --git a/src/translations/locales/ur.json b/src/translations/locales/ur.json index b86f9e9..9192bea 100644 --- a/src/translations/locales/ur.json +++ b/src/translations/locales/ur.json @@ -286,5 +286,8 @@ "Month": "مہینہ", "Year": "سال", "Age": "عمر", - "Confirm": "تصدیق کریں" + "Confirm": "تصدیق کریں", + "Failed to load advisors.": "مشاورین لوڈ نہیں ہو سکے۔", + "Try again": "دوبارہ کوشش کریں", + "No advisors are currently available.": "اس وقت کوئی مشاور دستیاب نہیں ہے۔" } diff --git a/src/translations/locales/uz.json b/src/translations/locales/uz.json index 1d23def..491433e 100644 --- a/src/translations/locales/uz.json +++ b/src/translations/locales/uz.json @@ -286,5 +286,8 @@ "Month": "Oy", "Year": "Yil", "Age": "Yosh", - "Confirm": "Tasdiqlash" + "Confirm": "Tasdiqlash", + "Failed to load advisors.": "Maslahatchilarni yuklab bo‘lmadi.", + "Try again": "Qayta urinib ko‘ring", + "No advisors are currently available.": "Hozircha mavjud maslahatchi yo‘q." } diff --git a/src/translations/locales/zh.json b/src/translations/locales/zh.json index 4e59cb3..31e0fa5 100644 --- a/src/translations/locales/zh.json +++ b/src/translations/locales/zh.json @@ -758,5 +758,8 @@ "Select date": "选择日期", "Day": "日", "Month": "月", - "Year": "年" + "Year": "年", + "Failed to load advisors.": "加载顾问失败。", + "Try again": "重试", + "No advisors are currently available.": "目前没有可用的顾问。" }