diff --git a/src/components/screens-component/chat-screen/components/ticker-designs.tsx b/src/components/screens-component/chat-screen/components/ticker-designs.tsx new file mode 100644 index 0000000..bdc5931 --- /dev/null +++ b/src/components/screens-component/chat-screen/components/ticker-designs.tsx @@ -0,0 +1,550 @@ +/** + * Ticker Feature — BharatVistaar Homepage Announcement Banners + * + * Controlled by uiTicker in src/config/env.ts (values: 1 | 2 | 3 | 4 | 5) + * + * Variant 1 placement: Below the ChatHeader (full-width persistent strip) + * Variants 2-4 placement: Welcome panel, between avatar & quick-action cards + * Variant 5 placement: Above the ChatHeader (full-width branded hero) + * + * All text and announcement content is fully localised via useLanguage(). + */ + +import { useState, useEffect } from "react"; +import { X, ChevronLeft, ChevronRight, Zap, IndianRupee, CalendarDays, ChevronRight as ChevronDown } from "lucide-react"; +import { cn } from "@/lib/utils"; +import { env } from "@/config/env"; +import { useLanguage } from "@/components/LanguageProvider"; + +// ─── Types ──────────────────────────────────────────────────────────────────── + +type Category = "feature" | "payment" | "event"; + +export interface Announcement { + id: string; + category: Category; + titleKey: string; + bodyKey?: string; + date: string; + expiresAt?: string; + isNew?: boolean; +} + +// ─── Static announcement list (titles/bodies resolved via t() at render time) ─ + +export const ANNOUNCEMENTS: Announcement[] = [ + /* + { id: "1", category: "payment", titleKey: "ticker.sample.1_title", bodyKey: "ticker.sample.1_body", date: "Jun 18, 2025", isNew: true }, + { id: "2", category: "feature", titleKey: "ticker.sample.2_title", bodyKey: "ticker.sample.2_body", date: "Jun 15, 2025", isNew: true }, + { id: "3", category: "event", titleKey: "ticker.sample.3_title", bodyKey: "ticker.sample.3_body", date: "Jun 25, 2025" }, + { id: "4", category: "feature", titleKey: "ticker.sample.4_title", date: "Jun 10, 2025" }, + */ + { id: "5", category: "feature", titleKey: "ticker.sample.5_title", date: "Aug 12, 2026", isNew: true }, + { + id: "pest-detection", + category: "feature", + titleKey: "pestApi.title", + bodyKey: "pestApi.description", + date: "Aug 12, 2026", + expiresAt: "2026-08-19T23:59:59+05:30", + isNew: true, + }, +]; + +// Keep the old export name working for any imports that used it +export const SAMPLE_ANNOUNCEMENTS = ANNOUNCEMENTS; + +// ─── Category meta (icon component — not localised) ──────────────────────── + +const META: Record; +}> = { + payment: { + labelKey: "ticker.labels.payment", + text: "text-emerald-700 dark:text-emerald-300", + bg: "bg-emerald-50 dark:bg-emerald-900/20", + border: "border-emerald-200 dark:border-emerald-800", + leftBorder: "border-l-emerald-500", + icon: IndianRupee, + }, + feature: { + labelKey: "ticker.labels.feature", + text: "text-blue-700 dark:text-blue-300", + bg: "bg-blue-50 dark:bg-blue-900/20", + border: "border-blue-200 dark:border-blue-800", + leftBorder: "border-l-blue-500", + icon: Zap, + }, + event: { + labelKey: "ticker.labels.event", + text: "text-amber-700 dark:text-amber-300", + bg: "bg-amber-50 dark:bg-amber-900/20", + border: "border-amber-200 dark:border-amber-800", + leftBorder: "border-l-amber-500", + icon: CalendarDays, + }, +}; + +// ───────────────────────────────────────────────────────────────────────────── +// VARIANT 1 — Scrolling News Ticker Strip +// ───────────────────────────────────────────────────────────────────────────── + +interface TickerVariant1Props { + announcements?: Announcement[]; + inLayout?: boolean; +} + +export function TickerVariant1({ announcements = ANNOUNCEMENTS, inLayout = false }: TickerVariant1Props) { + const { t } = useLanguage(); + const [dismissed, setDismissed] = useState(false); + if (dismissed) return null; + + const scrollText = announcements + .map((a) => { + const emoji = a.category === "payment" ? "💰" : a.category === "feature" ? "✨" : "📅"; + return `${emoji} ${t(a.titleKey) as string}`; + }) + .join(" • "); + + if (inLayout) { + return ( +
+ + + {t("ticker.live") as string} + +
+ + {scrollText}        {scrollText} + +
+ + +
+ ); + } + + return ( +
+ + + {t("ticker.live") as string} + +
+ + {scrollText}        {scrollText} + +
+ + +
+ ); +} + +// ───────────────────────────────────────────────────────────────────────────── +// VARIANT 5 — Branded Top Announcement Hero +// ───────────────────────────────────────────────────────────────────────────── + +export function TickerVariant5({ announcements = ANNOUNCEMENTS }: { announcements?: Announcement[] }) { + const { t } = useLanguage(); + const [dismissed, setDismissed] = useState(false); + const [idx, setIdx] = useState(0); + const activeAnnouncements = announcements.filter((announcement) => ( + !announcement.expiresAt || Date.now() <= Date.parse(announcement.expiresAt) + )); + + useEffect(() => { + if (activeAnnouncements.length < 2) return; + const timer = window.setInterval(() => { + setIdx((current) => (current + 1) % activeAnnouncements.length); + }, 6000); + return () => window.clearInterval(timer); + }, [activeAnnouncements.length]); + + if (dismissed || !activeAnnouncements.length) return null; + + const safeIdx = idx % activeAnnouncements.length; + const ann = activeAnnouncements[safeIdx]!; + const meta = META[ann.category]; + const Icon = meta.icon; + + return ( +
+
+
+
+ +
+
+ +
+ +
+
+ + {t(meta.labelKey) as string} + + {ann.isNew && ( + + {t("ticker.new") as string} + + )} +
+

+ {t(ann.titleKey) as string} +

+ {ann.bodyKey && ( +

+ {t(ann.bodyKey) as string} +

+ )} +
+ +
+ + {ann.date} +
+ + +
+ + {activeAnnouncements.length > 1 && ( +
+ {activeAnnouncements.map((item, index) => ( +
+ )} +
+ ); +} + +// ───────────────────────────────────────────────────────────────────────────── +// VARIANT 2 — Pinned Banner Card +// ───────────────────────────────────────────────────────────────────────────── + +export function TickerVariant2({ announcements = ANNOUNCEMENTS }: { announcements?: Announcement[] }) { + const { t } = useLanguage(); + const [dismissed, setDismissed] = useState(false); + const [idx, setIdx] = useState(0); + if (dismissed || !announcements.length) return null; + + const ann = announcements[idx]!; + const meta = META[ann.category]; + const Icon = meta.icon; + const prev = () => setIdx((i) => (i - 1 + announcements.length) % announcements.length); + const next = () => setIdx((i) => (i + 1) % announcements.length); + + return ( +
+
+
+ + + {t(meta.labelKey) as string} + + {ann.isNew && ( + {t("ticker.new") as string} + )} +
+ +
+ +

{t(ann.titleKey) as string}

+ {ann.bodyKey &&

{t(ann.bodyKey) as string}

} +

{ann.date}

+ + {announcements.length > 1 && ( +
+
+ {announcements.map((_, i) => ( +
+
+ + +
+
+ )} +
+ ); +} + +// ───────────────────────────────────────────────────────────────────────────── +// VARIANT 3 — Smart Alert Feed +// +// Category filter tabs (All / Payment / Feature / Event) with item counts. +// Tap a row to expand its body inline. Unread dot + NEW badge. Dismissable. +// ───────────────────────────────────────────────────────────────────────────── + +type TabFilter = "all" | Category; + +const ALERT_COLORS: Record = { + payment: { bar: "#10b981", iconBg: "#ecfdf5", iconText: "#065f46", badge: "#d1fae5", badgeText: "#065f46" }, + feature: { bar: "#3b82f6", iconBg: "#eff6ff", iconText: "#1e3a8a", badge: "#dbeafe", badgeText: "#1e3a8a" }, + event: { bar: "#f59e0b", iconBg: "#fffbeb", iconText: "#92400e", badge: "#fef3c7", badgeText: "#92400e" }, +}; + +export function TickerVariant3({ announcements = ANNOUNCEMENTS }: { announcements?: Announcement[] }) { + const { t } = useLanguage(); + const [activeTab, setActiveTab] = useState("all"); + const [expandedId, setExpandedId] = useState(null); + // Use a plain string[] so React always detects the state change + const [readIds, setReadIds] = useState([]); + const [dismissed, setDismissed] = useState(false); + + if (dismissed || !announcements.length) return null; + + const TAB_CONFIG: { id: TabFilter; label: string; emoji: string }[] = [ + { id: "all", label: t("ticker.tabs.all") as string, emoji: "🔔" }, + { id: "payment", label: t("ticker.tabs.payment") as string, emoji: "💰" }, + { id: "feature", label: t("ticker.tabs.feature") as string, emoji: "✨" }, + { id: "event", label: t("ticker.tabs.event") as string, emoji: "📅" }, + ]; + + const filtered = activeTab === "all" ? announcements : announcements.filter((a) => a.category === activeTab); + // Count unread items in the currently active tab only + const unreadCount = filtered.filter((a) => !readIds.includes(a.id)).length; + + const handleRowClick = (id: string) => { + // Toggle expand; mark as read with a new array reference so React re-renders reliably + setExpandedId((prev) => (prev === id ? null : id)); + setReadIds((prev) => prev.includes(id) ? prev : [...prev, id]); + }; + + const unreadLabel = unreadCount === 1 + ? (t("ticker.unread_one") as string).replace("[count]", String(unreadCount)) + : (t("ticker.unread_many") as string).replace("[count]", String(unreadCount)); + + return ( +
+ + {/* Header */} +
+
+ 🔔 + {t("ticker.announcements") as string} + {unreadCount > 0 && ( + + {unreadCount} + + )} +
+ +
+ + {/* Filter tabs */} +
+ {TAB_CONFIG.map((tab) => { + const count = tab.id === "all" ? announcements.length : announcements.filter((a) => a.category === tab.id).length; + const isActive = activeTab === tab.id; + return ( + + ); + })} +
+ + {/* Alert rows */} +
+ {filtered.length === 0 ? ( +

{t("ticker.empty") as string}

+ ) : ( + filtered.map((ann) => { + const ac = ALERT_COLORS[ann.category]; + const meta = META[ann.category]; + const Icon = meta.icon; + const isExpanded = expandedId === ann.id; + const isRead = readIds.includes(ann.id); + + return ( + + ); + }) + )} +
+ + {/* Footer */} +
+

+ {unreadCount > 0 ? unreadLabel : t("ticker.allCaughtUp") as string} +

+
+
+ ); +} + +// ───────────────────────────────────────────────────────────────────────────── +// VARIANT 4 — Auto-rotating Carousel Card +// ───────────────────────────────────────────────────────────────────────────── + +export function TickerVariant4({ announcements = ANNOUNCEMENTS }: { announcements?: Announcement[] }) { + const { t } = useLanguage(); + const [idx, setIdx] = useState(0); + const [paused, setPaused] = useState(false); + const [dismissed, setDismissed] = useState(false); + + useEffect(() => { + if (paused || dismissed || !announcements.length) return; + const timer = setInterval(() => setIdx((i) => (i + 1) % announcements.length), 4000); + return () => clearInterval(timer); + }, [paused, dismissed, announcements.length]); + + if (dismissed || !announcements.length) return null; + + const ann = announcements[idx]!; + const meta = META[ann.category]; + const Icon = meta.icon; + + return ( +
setPaused(true)} onMouseLeave={() => setPaused(false)}> +
+
+ +
+
+
+ + {t(meta.labelKey) as string} + + {ann.isNew && ( + + {t("ticker.new") as string} + + )} +
+

{t(ann.titleKey) as string}

+

{ann.date}

+
+ +
+
+ {announcements.map((_, i) => ( +
+
+ ); +} + +// ───────────────────────────────────────────────────────────────────────────── +// TickerBanner — master switch, reads VITE_UI_TICKER from env +// ───────────────────────────────────────────────────────────────────────────── + +interface TickerBannerProps { + variant?: 1 | 2 | 3 | 4; + announcements?: Announcement[]; +} + +export function TickerBanner({ variant, announcements }: TickerBannerProps) { + const v = variant ?? env.uiTicker; + const props = { announcements }; + + if (v === 1) return ; + if (v === 2) return ; + if (v === 3) return ; + if (v === 4) return ; + + return null; +} diff --git a/src/components/screens-component/chat-screen/components/welcome-panel.tsx b/src/components/screens-component/chat-screen/components/welcome-panel.tsx index d23195d..3292657 100644 --- a/src/components/screens-component/chat-screen/components/welcome-panel.tsx +++ b/src/components/screens-component/chat-screen/components/welcome-panel.tsx @@ -2,6 +2,8 @@ import { Avatar, AvatarFallback, AvatarImage } from "@/components/ui/avatar"; import { Button } from "@/components/ui/button"; import { CHAT_ASSISTANT } from "../config"; import { QuickAction } from "@/hooks/store/chat"; +import { TickerBanner } from "./ticker-designs"; +import { env } from "@/config/env"; type WelcomePanelProps = { onAction: (id: string) => void; @@ -33,6 +35,9 @@ export function WelcomePanel({ onAction, actions }: WelcomePanelProps) { + {/* Ticker banners 2-4 live inside the welcome panel; variants 1 and 5 live in the layout. */} + {env.uiTicker >= 2 && env.uiTicker <= 4 && } + {/* Cards List (Full width as per image 1) */}
{actions.map((action) => { diff --git a/src/config/env.ts b/src/config/env.ts index efbf382..8db4e00 100644 --- a/src/config/env.ts +++ b/src/config/env.ts @@ -1,7 +1,16 @@ export const env = { -apiBaseUrl: import.meta.env.VITE_API_BASE_URL as string, - apiKey: import.meta.env.VITE_API_KEY as string, - mode: import.meta.env.MODE as string, + apiBaseUrl: import.meta.env.VITE_API_BASE_URL as string, + apiKey: import.meta.env.VITE_API_KEY as string, + mode: import.meta.env.MODE as string, + // Ticker Feature UI Variant + // Controls which announcement banner design is shown on the chatbot homepage. + // Values: 1 = Scrolling Strip (below header) + // 2 = Pinned Banner Card (prev/next arrows) + // 3 = Story-ring Bubbles (tap to expand) + // 4 = Auto-rotating Carousel + // 5 = Branded Top Announcement Hero (above header) + // After changing this value, RESTART the dev server (Ctrl+C then npm run dev). + uiTicker: 5, }; // if (!env.apiBaseUrl) throw new Error("Missing VITE_API_BASE_URL"); diff --git a/src/layouts/chat-layout/index.tsx b/src/layouts/chat-layout/index.tsx index eca1f32..375a79b 100644 --- a/src/layouts/chat-layout/index.tsx +++ b/src/layouts/chat-layout/index.tsx @@ -1,5 +1,7 @@ import { ChatHeader } from "@/components/screens-component/layouts/chat-header"; +import { TickerVariant1, TickerVariant5 } from "@/components/screens-component/chat-screen/components/ticker-designs"; import { ChatInput, type ChatInputPayload } from "@/components/screens-component/chat-screen/components/chat-input"; +import { env } from "@/config/env"; import { CHAT_USER } from "@/components/screens-component/chat-screen/config"; import { useChatStore } from "@/hooks/store/chat"; import { Outlet } from "@tanstack/react-router"; @@ -99,6 +101,8 @@ function ChatLayout() { onClose={handleCloseToast} /> )} + {/* Variant 5: Branded announcement hero at the top of the chatbot */} + {env.uiTicker === 5 && } setSettingsOpen(true)} onBack={() => window.history.back()} /> + {/* Variant 1: Original scrolling strip below the header */} + {env.uiTicker === 1 && } {/* Only this area can scroll (via ChatShell/MessageList) */}
diff --git a/translations/as.json b/translations/as.json index 9aa7c7f..96d02e6 100644 --- a/translations/as.json +++ b/translations/as.json @@ -320,5 +320,36 @@ "continue": "আগবাঢ়ক", "submit": "বিশ্লেষণ কৰি জমা দিয়ক", "cancel": "বাতিল কৰক" + }, + "ticker": { + "live": "লাইভ", + "announcements": "ঘোষণাসমূহ", + "dismiss": "বন্ধ কৰক", + "new": "নতুন", + "tabs": { + "all": "সকলো", + "payment": "পেমেন্ট", + "feature": "বৈশিষ্ট্য", + "event": "অনুষ্ঠান" + }, + "labels": { + "payment": "পেমেন্ট", + "feature": "নতুন বৈশিষ্ট্য", + "event": "অনুষ্ঠান" + }, + "empty": "এই শ্ৰেণীত কোনো ঘোষণা নাই", + "unread_one": "[count]টা নপড়া ঘোষণা", + "unread_many": "[count]টা নপড়া ঘোষণা", + "allCaughtUp": "সকলো পড়া হৈছে ✓", + "sample": { + "1_title": "PM-KISAN ১৯তম কিস্তি মুকলি — যোগ্য কৃষকসকলৰ বাবে 2,000 টকা জমা", + "1_body": "আপোনাৰ বেংক একাউণ্ট বা আধাৰ-সংযুক্ত একাউণ্ট পৰীক্ষা কৰক৷ 18 জুন 2025ত পুঁজি জমা কৰা হৈছে৷", + "2_title": "শস্য বীমা (PMFBY) প্ৰশ্নসমূহ এতিয়া BharatVistaar-ত লাইভ!", + "2_body": "দাবীৰ স্থিতি, প্ৰিমিয়াম গণনা আৰু পঞ্জীয়নৰ শেষ তাৰিখ সম্পৰ্কে সোধক৷", + "3_title": "কৃষক সন্মিলন 2025 — 25 জুনৰ ভিতৰত পঞ্জীয়ন কৰক", + "3_body": "কৃষি মন্ত্ৰণালয়ৰ অনুষ্ঠান, বিজ্ঞান ভৱন, নতুন দিল্লী৷ সকলো কৃষকৰ বাবে বিনামূলীয়া৷", + "4_title": "মাটি স্বাস্থ্য কাৰ্ড সমৰ্থন যোগ কৰা হৈছে — তৎকালে শস্য পৰামৰ্শ পাওক", + "5_title": "Bharati-এ এতিয়া তেলুগু, বাংলা, গুজৰাটী আৰু আন ৭টা ভাষাত কথোপকথন কৰিব পাৰে" + } } } diff --git a/translations/bn.json b/translations/bn.json index e9da6bc..237d8b4 100644 --- a/translations/bn.json +++ b/translations/bn.json @@ -320,5 +320,36 @@ "continue": "চালিয়ে যান", "submit": "বিশ্লেষণ করে জমা দিন", "cancel": "বাতিল করুন" + }, + "ticker": { + "live": "লাইভ", + "announcements": "ঘোষণাসমূহ", + "dismiss": "বন্ধ করুন", + "new": "নতুন", + "tabs": { + "all": "সব", + "payment": "পেমেন্ট", + "feature": "বৈশিষ্ট্য", + "event": "ইভেন্ট" + }, + "labels": { + "payment": "পেমেন্ট", + "feature": "নতুন বৈশিষ্ট্য", + "event": "ইভেন্ট" + }, + "empty": "এই বিভাগে কোনো ঘোষণা নেই", + "unread_one": "[count]টি অপঠিত ঘোষণা", + "unread_many": "[count]টি অপঠিত ঘোষণা", + "allCaughtUp": "সব পড়া হয়েছে ✓", + "sample": { + "1_title": "PM-KISAN ১৯তম কিস্তি জারি — যোগ্য কৃষকদের ₹2,000 জমা", + "1_body": "আপনার ব্যাংক অ্যাকাউন্ট বা আধার-লিঙ্কড অ্যাকাউন্ট চেক করুন। ১৮ জুন ২০২৫ তারিখে তহবিল জমা হয়েছে।", + "2_title": "ফসল বীমা (PMFBY) প্রশ্ন এখন BharatVistaar-এ লাইভ!", + "2_body": "দাবির স্থিতি, প্রিমিয়াম গণনা এবং নথিভুক্তির সময়সীমা সম্পর্কে জিজ্ঞাসা করুন।", + "3_title": "কিষান সম্মেলন 2025 — 25 জুনের মধ্যে নিবন্ধন করুন", + "3_body": "কৃষি মন্ত্রণালয়ের অনুষ্ঠান, বিজ্ঞান ভবন, নতুন দিল্লি। সব কৃষকদের জন্য বিনামূল্যে।", + "4_title": "মৃত্তিকা স্বাস্থ্য কার্ড সহায়তা যোগ — তাৎক্ষণিক ফসল পরামর্শ পান", + "5_title": "Bharati এখন তেলুগু, বাংলা, গুজরাটি এবং আরও ৭টি ভাষায় কথোপকথন করতে পারে" + } } } diff --git a/translations/en.json b/translations/en.json index 9a00146..73c1096 100644 --- a/translations/en.json +++ b/translations/en.json @@ -320,5 +320,36 @@ "yourArea": "Your area", "kmAway": "~[km] km away", "pleaseNote": "Please note" + }, + "ticker": { + "live": "LIVE", + "announcements": "Announcements", + "dismiss": "Dismiss", + "new": "NEW", + "tabs": { + "all": "All", + "payment": "Payment", + "feature": "Feature", + "event": "Event" + }, + "labels": { + "payment": "PAYMENT", + "feature": "NEW FEATURE", + "event": "EVENT" + }, + "empty": "No announcements in this category", + "unread_one": "[count] unread announcement", + "unread_many": "[count] unread announcements", + "allCaughtUp": "All caught up ✓", + "sample": { + "1_title": "PM-KISAN 19th Installment released — ₹2,000 credited to eligible farmers", + "1_body": "Check your bank account or Aadhaar-linked account. Funds credited on June 18, 2025.", + "2_title": "Crop Insurance (PMFBY) queries now live on BharatVistaar!", + "2_body": "Ask about claim status, premium calculation, and enrollment deadlines.", + "3_title": "Kisan Sammelan 2025 — Register by June 25", + "3_body": "Ministry of Agriculture event at Vigyan Bhawan, New Delhi. Free for all farmers.", + "4_title": "Soil Health Card support added — get crop recommendations instantly", + "5_title": "Bharati can now converse in Telugu, Bengali, Gujarati, and 7 other languages" + } } -} \ No newline at end of file +} diff --git a/translations/gu.json b/translations/gu.json index f338912..b6a691a 100644 --- a/translations/gu.json +++ b/translations/gu.json @@ -310,5 +310,36 @@ "estimatedTime": "અંદાજિત ડાઉનટાઈમ: 2-3 કલાક", "contact": "તાત્કાલિક પ્રશ્નો માટે કૃપા કરીને સપોર્ટનો સંપર્ક કરો." }, - "chatErrorMessage": "માફ કરશો, તમારી વિનંતી પ્રક્રિયા કરતી વખતે ભૂલ આવી. કૃપા કરીને ફરી પ્રયાસ કરો." + "chatErrorMessage": "માફ કરશો, તમારી વિનંતી પ્રક્રિયા કરતી વખતે ભૂલ આવી. કૃપા કરીને ફરી પ્રયાસ કરો.", + "ticker": { + "live": "લાઈવ", + "announcements": "જાહેરાતો", + "dismiss": "બંધ કરો", + "new": "નવું", + "tabs": { + "all": "બધા", + "payment": "ચૂકવણી", + "feature": "સુવિધા", + "event": "કાર્યક્રમ" + }, + "labels": { + "payment": "ચૂકવણી", + "feature": "નવી સુવિધા", + "event": "કાર્યક્રમ" + }, + "empty": "આ શ્રેણીમાં કોઈ જાહેરાત નથી", + "unread_one": "[count] વાંચ્યા વિનાની જાહેરાત", + "unread_many": "[count] વાંચ્યા વિનાની જાહેરાતો", + "allCaughtUp": "બધું વાંચ્યું ✓", + "sample": { + "1_title": "PM-KISAN 19મો હપ્તો જારી — પાત્ર ખેડૂતોને ₹2,000 જમા", + "1_body": "તમારું બેંક ખાતું અથવા આધાર-લિંક્ડ ખાતું તપાસો. 18 જૂન 2025ના રોજ ભંડોળ જમા કરાયું.", + "2_title": "પાક વીમો (PMFBY) પ્રશ્નો હવે BharatVistaar પર લાઈવ!", + "2_body": "દાવાની સ્થિતિ, પ્રીમિયમ ગણતરી અને નોંધણીની છેલ્લી તારીખો વિશે પૂછો.", + "3_title": "કિસાન સંમેલન 2025 — 25 જૂન સુધી નોંધણી કરો", + "3_body": "કૃષિ મંત્રાલયનો કાર્યક્રમ, વિજ્ઞાન ભવન, નવી દિલ્હી. બધા ખેડૂતો મા૾ે મફત.", + "4_title": "માાટી આરોગ્ય કાર્ડ સહાય ઉમેરાઈ — તત્કાળ પાક ભલામણો મેળવો", + "5_title": "Bharati હવે તેલુગુ, બંગાળી, ગુજરાતી અને અન્ય 7 ભાષાઓમાં વાતચીત કરી શકે છે" + } + } } diff --git a/translations/hi.json b/translations/hi.json index 6249619..8696de0 100644 --- a/translations/hi.json +++ b/translations/hi.json @@ -321,5 +321,36 @@ "yourArea": "आपका क्षेत्र", "kmAway": "~[km] किमी दूर", "pleaseNote": "कृपया ध्यान दें" + }, + "ticker": { + "live": "लाइव", + "announcements": "घोषणाएं", + "dismiss": "बंद करें", + "new": "नया", + "tabs": { + "all": "सभी", + "payment": "भुगतान", + "feature": "सुविधा", + "event": "कार्यक्रम" + }, + "labels": { + "payment": "भुगतान", + "feature": "नई सुविधा", + "event": "कार्यक्रम" + }, + "empty": "इस श्रेणी में कोई घोषणा नहीं", + "unread_one": "[count] अपठित घोषणा", + "unread_many": "[count] अपठित घोषणाएं", + "allCaughtUp": "सब पढ़ लिया ✓", + "sample": { + "1_title": "PM-KISAN 19वीं किस्त जारी — पात्र किसानों को ₹2,000 क्रेडिट", + "1_body": "अपना बैंक खाता या आधार-लिंक्ड खाता जांचें। 18 जून 2025 को राशि जमा की गई।", + "2_title": "फसल बीमा (PMFBY) प्रश्न अब BharatVistaar पर लाइव!", + "2_body": "दावे की स्थिति, प्रीमियम गणना और नामांकन की अंतिम तिथि के बारे में पूछें।", + "3_title": "किसान सम्मेलन 2025 — 25 जून तक पंजीकरण करें", + "3_body": "कृषि मंत्रालय का कार्यक्रम, विज्ञान भवन, नई दिल्ली। सभी किसानों के लिए निःशुल्क।", + "4_title": "मृदा स्वास्थ्य कार्ड सहायता जोड़ी — तुरंत फसल सिफारिशें पाएं", + "5_title": "Bharati अब तेलुगु, बंगाली, गुजराती और 7 अन्य भाषाओं में बातचीत कर सकती है" + } } -} \ No newline at end of file +} diff --git a/translations/kn.json b/translations/kn.json index 2f35cc6..8906ea0 100644 --- a/translations/kn.json +++ b/translations/kn.json @@ -320,5 +320,36 @@ "continue": "ಮುಂದುವರಿಸಿ", "submit": "ವಿಶ್ಲೇಷಿಸಿ ಸಲ್ಲಿಸಿ", "cancel": "ರದ್ದುಮಾಡಿ" + }, + "ticker": { + "live": "ಲೈವ್", + "announcements": "ಪ್ರಕಟನಗಳು", + "dismiss": "ಮುಚ್ಚು", + "new": "ಹೊಸ", + "tabs": { + "all": "ಎಲ್ಲಾ", + "payment": "ಪಾವತಿ", + "feature": "ವೈಶಿಷ್ಟ್ಯ", + "event": "ಕಾರ್ಯಕ್ರಮ" + }, + "labels": { + "payment": "ಪಾವತಿ", + "feature": "ಹೊಸ ವೈಶಿಷ್ಟ್ಯ", + "event": "ಕಾರ್ಯಕ್ರಮ" + }, + "empty": "ಈ ವರ್ಗದಲ್ಲಿ ಯಾವುದೇ ಪ್ರಕಟನಗಳಿಲ್ಲ", + "unread_one": "[count] ಓದದ ಪ್ರಕಟನ", + "unread_many": "[count] ಓದದ ಪ್ರಕಟನಗಳು", + "allCaughtUp": "ಎಲ್ಲಾ ಓದಲಾಗಿದೆ ✓", + "sample": { + "1_title": "PM-KISAN 19ನೇ ಕಂತು ಬಿಡುಗಡೆ — ಅರ್ಹ ರೈತರಿಗೆ ₹2,000 ಜಮಾ", + "1_body": "ನಿಮ್ಮ ಬ್ಯಾಂಕ್ ಖಾತೆ ಅಥವಾ ಆಧಾರ್-ಲಿಂಕ್ಡ್ ಖಾತೆ ಪರಿಶೀಲಿಸಿ. ಜೂನ್ 18, 2025 ರಂದು ಹಣ ಜಮಾ ಮಾಡಲಾಗಿದೆ.", + "2_title": "ಬೆಳೆ ವಿಮೆ (PMFBY) ಪ್ರಶ್ನಗಳು ಈಗ BharatVistaar ನಲ್ಲಿ ಲೈವ್!", + "2_body": "ಕ್ಲೇಮ್ ಸ್ಥಿತಿ, ಪ್ರೀಮಿಯಂ ಲೆಕ್ಕಾಚಾರ ಮತ್ತು ನೋಂದಣಿ ಗಡುವುಗಳ ಬಗ್ಗೆ ಕೇಳಿ.", + "3_title": "ಕಿಸಾನ್ ಸಮ್ಮೇಳನ 2025 — ಜೂನ್ 25 ರಂದು ನೋಂದಾಯಿಸಿ", + "3_body": "ಕೃಷಿ ಸಚಿವಾಲಯದ ಕಾರ್ಯಕ್ರಮ, ವಿಜ್ಞಾನ್ ಭವನ್, ನವದೆಹಲಿ. ಎಲ್ಲಾ ರೈತರಿಗೆ ಉಚಿತ.", + "4_title": "ಮಣ್ಣು ಆರೋಗ್ಯ ಕಾರ್ಡ್ ಬೆಂಬಲ ಸೇರಿಸಲಾಗಿದೆ — ತಕ್ಷಣ ಬೆಳೆ ಶಿಫಾರಸುಗಳನ್ನು ಪಡೆಯಿರಿ", + "5_title": "Bharati ಈಗ ತೆಲುಗು, ಬಂಗಾಳಿ, ಗುಜರಾತಿ ಮತ್ತು ಇತರ 7 ಭಾಷೆಗಳಲ್ಲಿ ಸಂಭಾಷಿಸಬಹುದು" + } } } diff --git a/translations/ml.json b/translations/ml.json index d761cf5..f301f99 100644 --- a/translations/ml.json +++ b/translations/ml.json @@ -320,5 +320,36 @@ "continue": "തുടരുക", "submit": "വിശകലനം ചെയ്ത് സമർപ്പിക്കുക", "cancel": "റദ്ദാക്കുക" + }, + "ticker": { + "live": "തൽസമയം", + "announcements": "അറിയിപ്പുകൾ", + "dismiss": "അടക്കുക", + "new": "പുതിയത്", + "tabs": { + "all": "എല്ലാം", + "payment": "പേയ്‌മെന്റ്", + "feature": "ഫീച്ചർ", + "event": "ഇവന്റ്" + }, + "labels": { + "payment": "പേയ്‌മെന്റ്", + "feature": "പുതിയ ഫീച്ചർ", + "event": "ഇവന്റ്" + }, + "empty": "ഈ വിഭാഗത്തിൽ അറിയിപ്പുകളൊന്നുമില്ല", + "unread_one": "[count] വായിക്കാത്ത അറിയിപ്പ്", + "unread_many": "[count] വായിക്കാത്ത അറിയിപ്പുകൾ", + "allCaughtUp": "എല്ലാം വായിച്ചു ✓", + "sample": { + "1_title": "PM-KISAN 19-ാം ഗഡു പുറത്തിറക്കി — യോഗ്യരായ കർഷകർക്ക് ₹2,000 ക്രെഡിറ്റ്", + "1_body": "നിങ്ങളുടെ ബാമ്ക് അക്കൗണ്ട് അല്ലെങ്കിൽ ആധാർ-ലിങ്ക്ഡ് അക്കൗണ്ട് പരിശോധിക്കുക. ജൂൺ 18, 2025-ൽ ഫണ്ഡ് ക്രെഡിറ് ചെയ്തു.", + "2_title": "വിള ഇൻഷ്യുറൻസ് (PMFBY) ചോദ്യങ്ങൾ ഇപ്പോൾ BharatVistaar-ൽ ലൈവ്!", + "2_body": "ക്ലെയിം സ്റ്റാറ്റസ്, പ്രീമിയം കണക്കുകൂട്ടൽ, എൻറോൾമെന്റ് അവസാന തീയതികൾ എന്നിവ ചോദിക്കുക.", + "3_title": "കിസാൻ സമ്മേളൻ 2025 — ജൂൺ 25-നകം രജിസ്റ്റർ ചെയ്യുക", + "3_body": "കൃഷി മന്ത്രാലയ പരിപാടി, വിജ്ഞാൻ ഭവൻ, ന്യൂഡൽഹി. എല്ലാ കർഷകർക്കും സൗജന്യം.", + "4_title": "മണ്ണ് ആരോഗ്യ കാർഡ് പിന്തുന ചേർത്തു — ഉടനടി വിള ശുപാർശകൾ നേടൂ", + "5_title": "Bharati-ക്ക് ഇപ്പോൾ തെലുങ്ക്, ബംഗാളി, ഗുജറാത്തി കൂടാതെ മറ്റ് 7 ഭാഷകളിൽ സംവദിക്കാനാകും" + } } } diff --git a/translations/mr.json b/translations/mr.json index c7e8be9..88d22ba 100644 --- a/translations/mr.json +++ b/translations/mr.json @@ -527,5 +527,36 @@ "kmAway": "~[km] किमी दूर", "pleaseNote": "कृपया लक्षात घ्या" }, - "chatErrorMessage": "क्षमस्व, तुमची विनंती प्रक्रिया करताना त्रुटी आली. कृपया पुन्हा प्रयत्न करा." + "chatErrorMessage": "क्षमस्व, तुमची विनंती प्रक्रिया करताना त्रुटी आली. कृपया पुन्हा प्रयत्न करा.", + "ticker": { + "live": "लाइव्ह", + "announcements": "घोषणा", + "dismiss": "बंद करा", + "new": "नवीन", + "tabs": { + "all": "सर्व", + "payment": "देयक", + "feature": "वैशिष्ट्य", + "event": "कार्यक्रम" + }, + "labels": { + "payment": "देयक", + "feature": "नवीन वैशिष्ट्य", + "event": "कार्यक्रम" + }, + "empty": "या श्रेणीत कोणत्याही घोषणा नाहीत", + "unread_one": "[count] न वाचलेली घोषणा", + "unread_many": "[count] न वाचलेल्या घोषणा", + "allCaughtUp": "सर्व वाचले ✓", + "sample": { + "1_title": "PM-KISAN 19वा हप्ता जारी — पात्र शेतकर्यांना ₹2,000 जमा", + "1_body": "तुमचे बँक खाते किंवा आधार-लिंक्ड खाते तपासा. 18 जून 2025 रोजी निधी जमा करण्यात आली.", + "2_title": "पीक विमा (PMFBY) प्रश्न आता BharatVistaar वर लाइव्ह!", + "2_body": "दाव्याची स्थिती, प्रीमियम गणना आणि नोंदणीच्या अंतिम तारखा बद्दल विचारा.", + "3_title": "किसान संमेलन 2025 — 25 जूनपर्यंत नोंदणी करा", + "3_body": "कृषी मंत्रालयाचा कार्यक्रम, विज्ञान भवन, नवी दिल्ली. सर्व शेतकर्यांसाठी मोफत.", + "4_title": "मृदा आरोग्य कार्ड समर्थन जोडले — तत्काळ पीक शिफारसी मिळवा", + "5_title": "Bharati आता तेलुगू, बंगाली, गुजराती आणि इतर 7 भाषांमध्ये संवाद साधू शकते" + } + } } diff --git a/translations/ta.json b/translations/ta.json index dfeec80..54a8974 100644 --- a/translations/ta.json +++ b/translations/ta.json @@ -320,5 +320,36 @@ "continue": "தொடரவும்", "submit": "பகுப்பாய்வு செய்து சமர்ப்பிக்கவும்", "cancel": "ரத்து செய்" + }, + "ticker": { + "live": "நேரடி", + "announcements": "அறிவிப்புகள்", + "dismiss": "மூடு", + "new": "புதியது", + "tabs": { + "all": "அனைத்தும்", + "payment": "கட்டணம்", + "feature": "அம்சம்", + "event": "நிகழ்வு" + }, + "labels": { + "payment": "கட்டணம்", + "feature": "புதிய அம்சம்", + "event": "நிகழ்வு" + }, + "empty": "இந்த வகையில் அறிவிப்புகள் இல்லை", + "unread_one": "[count] படிக்காத அறிவிப்பு", + "unread_many": "[count] படிக்காத அறிவிப்புகள்", + "allCaughtUp": "அனைத்தும் படிக்கப்பட்டது ✓", + "sample": { + "1_title": "PM-KISAN 19வது தவணை வெளியீடு — தகுதியான விவசாயிகளுக்கு ₹2,000 வரவு", + "1_body": "உங்கள் வங்கிக் கணக்கு அல்லது ஆதார்-இணைக்கப்பட்ட கணக்கை சரிபாருங்கள். ஜூன் 18, 2025 அன் நிதி வரவு வைக்கப்பட்டது.", + "2_title": "பயிர் காப்பீடு (PMFBY) கேள்விகள் இப்போது BharatVistaar-ல் நேரடியாக!", + "2_body": "கோரிக்கை நிலை, பிரீமியம் கணக்கீடு மற்றும் பதிவு கடைசி தேதிகள் பற்றி கேளுங்கள்.", + "3_title": "கிசான் சம்மேளன் 2025 — ஜூன் 25 க்குள் பதிவு செய்யுங்கள்", + "3_body": "விவசாய அமைச்சகத்தின் நிகழ்வு, வி஺9்ஜான் பவன், புது தில்லி. அனைத்து விவசாயிகளுக்கும் இலவசம்.", + "4_title": "மண் ஆரோக்கிய அட்டை ஆதரவு சேர்க்கப்பட்டது — உடனடி பயிர் பரிந்துரைகள் பெறுங்கள்", + "5_title": "Bharati இப்போது தெலுங்கு, வங்காளம், குஜராத்தி மற்றும் மேலும் 7 மொழிகளில் உரையாட முடியும்" + } } } diff --git a/translations/te.json b/translations/te.json index f4b0288..48173a7 100644 --- a/translations/te.json +++ b/translations/te.json @@ -320,5 +320,36 @@ "continue": "కొనసాగించండి", "submit": "విశ్లేషించి సమర్పించండి", "cancel": "రద్దు చేయండి" + }, + "ticker": { + "live": "లైవ్", + "announcements": "ప్రకటనలు", + "dismiss": "మూసివేయి", + "new": "కొత్త", + "tabs": { + "all": "అన్నీ", + "payment": "చెల్లింపు", + "feature": "ఫీచర్", + "event": "కార్యక్రమం" + }, + "labels": { + "payment": "చెల్లింపు", + "feature": "కొత్త ఫీచర్", + "event": "కార్యక్రమం" + }, + "empty": "ఈ వర్గంలో ప్రకటనలు లేవు", + "unread_one": "[count] చదవని ప్రకటన", + "unread_many": "[count] చదవని ప్రకటనలు", + "allCaughtUp": "అన్నీ చదివారు ✓", + "sample": { + "1_title": "PM-KISAN 19వ వాయిదా విడుదల — అర్హులైన రైతులకు ₹2,000 జమా", + "1_body": "మీ బ్యాంక్ ఖాతా లేదా ఆధార్-లింక్డ్ ఖాతాను తనిఖీ చెయ్యండి. జూన్ 18, 2025న నిధులు జమా చేయబడ్డాయి.", + "2_title": "పంట బీమా (PMFBY) ప్రశ్నలు ఇప్పుడు BharatVistaar లో లైవ్!", + "2_body": "క్లేమ్ స్థితి, ప్రీమియం లెక్కింపు మరియు నమోదు గడువుల గురించి అడగండి.", + "3_title": "కిసాన్ సమ్మేళన్ 2025 — జూన్ 25 లోపల నమోదు చేసుకోండి", + "3_body": "వ్యవసాయ మంత్రిత్వ శాఖ కార్యక్రమం, విజ్ఞాన్ భవన్, న్యూ ఢిల్లీ. రైతులందరికీ ఉచితం.", + "4_title": "నేల ఆరోగ్య కార్డు మద్దతు జోడించబడింది — తక్షణం పంట సిఫారసులు పొందండి", + "5_title": "Bharati ఇప్పుడు తెలుగు, బెంగాలీ, గుజరాతీ మరియు మరో 7 భాషల్లో సంభాషించగలదు" + } } }