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")}
+ ›
+
+