From 0c6e1a7125c094b0ba7568bff106b18fb46a31aa Mon Sep 17 00:00:00 2001 From: payacom <59262811+payacom@users.noreply.github.com> Date: Sun, 16 Aug 2026 11:42:39 +0330 Subject: [PATCH] lang full --- next.config.ts | 21 +- src/app/billboards/[id]/[title]/page.tsx | 6 +- src/app/booking/[userId]/page.tsx | 6 +- src/app/new-post/page.tsx | 1 + src/app/settings/booking/list/page.tsx | 12 +- .../settings/booking/new/services/page.tsx | 16 +- .../settings/edit/analytics/region/page.tsx | 19 +- src/app/settings/edit/expertise/page.tsx | 2 +- src/app/settings/edit/page.tsx | 5 - .../settings/profile/user-settings/page.tsx | 30 +- src/app/settings/wallet/page.tsx | 24 +- src/app/shops/listing/[listingId]/page.tsx | 6 +- src/app/shops/new/location/page.tsx | 1 + src/app/shops/profile/[shopId]/page.tsx | 8 +- src/app/users/[username]/page.tsx | 11 +- src/components/auth/ExpertisePicker.tsx | 102 +- .../NewBillboard/step1/LocationSelector.tsx | 1 + src/components/booking/BookingListCard.tsx | 74 +- src/components/main/Services/ServiceItem.tsx | 15 +- .../MainModelCard/MainModelCardActions.tsx | 6 +- src/components/posts/ReelsPostActions.tsx | 12 +- .../NewProject/step1/LocationSelector.tsx | 1 + src/components/ui/BackButton.tsx | 2 +- .../ui/CountryProvinceCitySelect.tsx | 65 +- src/constants/index.ts | 25 - src/contexts/LanguageProvider.tsx | 8 +- src/data/geo/cities.json | 509028 ++++++++++++++- src/data/geo/provinces.json | 7317 +- src/hooks/usePostSocialActions.tsx | 44 +- src/lib/i18n/clientLanguage.ts | 24 +- src/lib/i18n/registry.ts | 71 +- src/lib/i18n/resources.ts | 203 +- src/lib/pwaConfig.ts | 31 +- src/lib/sitemap/builders.ts | 40 +- src/locales/az/common.json | 709 + src/locales/az/seo.json | 124 +- src/locales/bn/common.json | 1977 + src/locales/bn/seo.json | 226 + src/locales/de/common.json | 709 + src/locales/de/seo.json | 94 +- src/locales/el/common.json | 709 + src/locales/el/seo.json | 126 +- src/locales/en/common.json | 8 +- src/locales/es/common.json | 709 + src/locales/es/seo.json | 94 +- src/locales/fa/common.json | 10 +- src/locales/fi/common.json | 1967 + src/locales/fi/seo.json | 226 + src/locales/fr/common.json | 709 + src/locales/fr/seo.json | 94 +- src/locales/hi/common.json | 1977 + src/locales/hi/seo.json | 233 + src/locales/hr/common.json | 1967 + src/locales/hr/seo.json | 231 + src/locales/hu/common.json | 709 + src/locales/hu/seo.json | 126 +- src/locales/hy/common.json | 709 + src/locales/hy/seo.json | 124 +- src/locales/it/common.json | 709 + src/locales/it/seo.json | 94 +- src/locales/ja/common.json | 1977 + src/locales/ja/seo.json | 226 + src/locales/ko/common.json | 1977 + src/locales/ko/seo.json | 226 + src/locales/ku/common.json | 709 + src/locales/ms/common.json | 1977 + src/locales/ms/seo.json | 226 + src/locales/nl/common.json | 709 + src/locales/nl/seo.json | 126 +- src/locales/no/common.json | 1967 + src/locales/no/seo.json | 226 + src/locales/pl/common.json | 709 + src/locales/pl/seo.json | 94 +- src/locales/ps/common.json | 709 + src/locales/ro/common.json | 709 + src/locales/ro/seo.json | 126 +- src/locales/ru/common.json | 709 + src/locales/ru/seo.json | 124 +- src/locales/sk/common.json | 1967 + src/locales/sk/seo.json | 248 + src/locales/sr/common.json | 1967 + src/locales/sr/seo.json | 226 + src/locales/sv/common.json | 1967 + src/locales/sv/seo.json | 226 + src/locales/th/common.json | 1977 + src/locales/th/seo.json | 226 + src/locales/tl/common.json | 1977 + src/locales/tl/seo.json | 226 + src/locales/tr/common.json | 709 + src/locales/tr/seo.json | 124 +- src/locales/uk/common.json | 709 + src/locales/uk/seo.json | 94 +- src/locales/uz/common.json | 709 + src/locales/uz/seo.json | 124 +- src/locales/zh-CN/common.json | 1977 + src/locales/zh-CN/seo.json | 226 + src/locales/zh-HK/common.json | 1977 + src/locales/zh-HK/seo.json | 226 + src/locales/zh-TW/common.json | 1977 + src/locales/zh-TW/seo.json | 226 + src/types/types.ts | 1 + 101 files changed, 565082 insertions(+), 1137 deletions(-) create mode 100644 src/locales/bn/common.json create mode 100644 src/locales/bn/seo.json create mode 100644 src/locales/fi/common.json create mode 100644 src/locales/fi/seo.json create mode 100644 src/locales/hi/common.json create mode 100644 src/locales/hi/seo.json create mode 100644 src/locales/hr/common.json create mode 100644 src/locales/hr/seo.json create mode 100644 src/locales/ja/common.json create mode 100644 src/locales/ja/seo.json create mode 100644 src/locales/ko/common.json create mode 100644 src/locales/ko/seo.json create mode 100644 src/locales/ms/common.json create mode 100644 src/locales/ms/seo.json create mode 100644 src/locales/no/common.json create mode 100644 src/locales/no/seo.json create mode 100644 src/locales/sk/common.json create mode 100644 src/locales/sk/seo.json create mode 100644 src/locales/sr/common.json create mode 100644 src/locales/sr/seo.json create mode 100644 src/locales/sv/common.json create mode 100644 src/locales/sv/seo.json create mode 100644 src/locales/th/common.json create mode 100644 src/locales/th/seo.json create mode 100644 src/locales/tl/common.json create mode 100644 src/locales/tl/seo.json create mode 100644 src/locales/zh-CN/common.json create mode 100644 src/locales/zh-CN/seo.json create mode 100644 src/locales/zh-HK/common.json create mode 100644 src/locales/zh-HK/seo.json create mode 100644 src/locales/zh-TW/common.json create mode 100644 src/locales/zh-TW/seo.json diff --git a/next.config.ts b/next.config.ts index 78d4dda..8152ad1 100644 --- a/next.config.ts +++ b/next.config.ts @@ -23,12 +23,6 @@ const nextConfig = { port: '', pathname: '/**', }, - { - protocol: 'https', - hostname: 'blog.modstagram.com', // اجازه دادن به نمایش تصاویر وبلاگ - port: '', - pathname: '/**', - }, { protocol: 'https', hostname: 'api.modstagram.com', @@ -96,20 +90,7 @@ const nextConfig = { ]; }, - // ۴. فقط وبلاگ — API/storage از Route Handler پروکسی می‌شوند - async rewrites() { - return [ - { - source: '/blog', - destination: 'https://blog.modstagram.com/blog', - }, - { - source: '/blog/:path*', - destination: 'https://blog.modstagram.com/blog/:path*', - }, - ]; - }, - // ۵. تنظیمات هدرها + // ۴. تنظیمات هدرها async headers() { return [ { diff --git a/src/app/billboards/[id]/[title]/page.tsx b/src/app/billboards/[id]/[title]/page.tsx index c8fad2c..b865801 100644 --- a/src/app/billboards/[id]/[title]/page.tsx +++ b/src/app/billboards/[id]/[title]/page.tsx @@ -3,6 +3,7 @@ import BillboardDetailContent from "@/components/billboards/BillboardDetailConte import BillboardNotFound from "@/components/billboards/BillboardNotFound"; import { IAdvertising, IRate } from "@/types/types"; import { cookies } from "next/headers"; +import { cache } from "react"; import { Metadata } from "next"; import { generatePageMetadata } from "@/utils/generatePageMetadata"; import { getLocaleBundle } from "@/lib/i18n/resources"; @@ -12,7 +13,8 @@ interface IBillboardProps { params: Promise<{ id: string; title: string }>; } -async function getBillboardData(id: string, token: string) { +// Deduped per request — see loadUser in users/[username]/page.tsx for rationale. +const getBillboardData = cache(async (id: string, token: string) => { const response = await fetch(`${BASE_URL}/advertising/get/web/${id}`, { next: { revalidate: 60 }, headers: { @@ -21,7 +23,7 @@ async function getBillboardData(id: string, token: string) { }); if (!response.ok) return null; return await response.json(); -} +}); export async function generateMetadata({ params, diff --git a/src/app/booking/[userId]/page.tsx b/src/app/booking/[userId]/page.tsx index 7cc768a..b7632e3 100644 --- a/src/app/booking/[userId]/page.tsx +++ b/src/app/booking/[userId]/page.tsx @@ -213,7 +213,7 @@ function BookingFlowPage() { {t("booking.noAvailableSlots")}

) : ( -
+
{slots.map((slot) => (
diff --git a/src/app/settings/booking/list/page.tsx b/src/app/settings/booking/list/page.tsx index 6d7b628..2f9b33b 100644 --- a/src/app/settings/booking/list/page.tsx +++ b/src/app/settings/booking/list/page.tsx @@ -63,7 +63,17 @@ export default function BookingListPage() {

) : ( filteredConfigs.map((config) => ( - + + setConfigs((prev) => + prev + ? prev.map((c) => (c._id === id ? { ...c, status } : c)) + : prev + ) + } + /> )) )} diff --git a/src/app/settings/booking/new/services/page.tsx b/src/app/settings/booking/new/services/page.tsx index 1719e09..accb565 100644 --- a/src/app/settings/booking/new/services/page.tsx +++ b/src/app/settings/booking/new/services/page.tsx @@ -160,7 +160,7 @@ function BookingServicesPage() { ) : ( -
+
{services.map((service) => { const id = service.id || service._id || ""; const selected = selectedIds.has(id); @@ -173,22 +173,26 @@ function BookingServicesPage() { onKeyDown={(e) => { if (e.key === "Enter" || e.key === " ") toggle(id); }} - className={`relative w-full cursor-pointer rounded-2xl ${ - selected ? "bg-[#0095f6]/10" : "" + className={`flex w-full cursor-pointer items-center gap-2 rounded-2xl pe-2 ${ + selected + ? "bg-[#0095f6]/10 ring-1 ring-[#0095f6]/50 dark:bg-[#0095f6]/15" + : "" }`} > {selected && ( )} - +
+ +
); })} diff --git a/src/app/settings/edit/analytics/region/page.tsx b/src/app/settings/edit/analytics/region/page.tsx index bd70b5c..4935b28 100644 --- a/src/app/settings/edit/analytics/region/page.tsx +++ b/src/app/settings/edit/analytics/region/page.tsx @@ -80,15 +80,16 @@ export default function RegionPage() {

)} - - {t("settings.edit.save")} - +
+ + {t("settings.edit.save")} + +
diff --git a/src/app/settings/edit/expertise/page.tsx b/src/app/settings/edit/expertise/page.tsx index 387a22f..ccd39cc 100644 --- a/src/app/settings/edit/expertise/page.tsx +++ b/src/app/settings/edit/expertise/page.tsx @@ -151,7 +151,7 @@ function Expertise() { return ( -
+

{t("settings.edit.expertise.question")}

diff --git a/src/app/settings/edit/page.tsx b/src/app/settings/edit/page.tsx index ec7dd7c..44de98c 100644 --- a/src/app/settings/edit/page.tsx +++ b/src/app/settings/edit/page.tsx @@ -16,10 +16,8 @@ const EDIT_NAV_KEY: Record = { "/username": "username", "/password": "password", "/google-account": "googleAccount", - "/instagram-import": "instagramImport", "/two-factor": "twoFactor", "/link-device": "linkDevice", - "/analytics": "analytics", "/avatar": "avatar", "/Authentication": "authentication", "/expertise": "expertise", @@ -31,9 +29,6 @@ const EDIT_NAV_KEY: Record = { "/public-relations": "publicRelations", "/shaba": "shaba", "/location": "location", - "/blocked-users": "blockedUsers", - "/archive": "archive", - "/activity": "activity", }; function EditPage() { diff --git a/src/app/settings/profile/user-settings/page.tsx b/src/app/settings/profile/user-settings/page.tsx index afea95c..2261d5f 100644 --- a/src/app/settings/profile/user-settings/page.tsx +++ b/src/app/settings/profile/user-settings/page.tsx @@ -10,14 +10,14 @@ import Link from "next/link"; import toast from "react-hot-toast"; import { useTranslation } from "react-i18next"; import { useAppLanguage } from "@/contexts/LanguageProvider"; -import { isAppLanguage } from "@/lib/i18n/constants"; +import { isAppLanguage, type AppLanguage } from "@/lib/i18n/constants"; type PrivacyPatch = { allow_save_posts?: boolean; ghost_mode?: boolean; show_location?: boolean; post_location_enabled?: boolean; is_private?: boolean; - preferred_language?: "fa" | "en"; + preferred_language?: AppLanguage; }; type PrivacyResponse = { @@ -26,7 +26,7 @@ type PrivacyResponse = { show_location: boolean; post_location_enabled: boolean; is_private: boolean; - preferred_language?: "fa" | "en"; + preferred_language?: AppLanguage; }; export default function UserSettingsPage() { @@ -191,6 +191,30 @@ export default function UserSettingsPage() { + + {t("settings.edit.nav.blockedUsers")} + + + + + {t("settings.edit.nav.archive")} + + + + + {t("settings.edit.nav.activity")} + + +