From 632edaf0815b6f74b5736256876117500c3f6006 Mon Sep 17 00:00:00 2001 From: aramesh-site deploy Date: Thu, 1 Oct 2026 16:54:44 +0000 Subject: [PATCH] =?UTF-8?q?fix(en):=20=D9=87=D8=B4=D8=AA=20=D8=A7=D8=B5?= =?UTF-8?q?=D9=84=D8=A7=D8=AD=20=D8=B3=D8=A7=DB=8C=D8=AA=20=D8=A7=D9=86?= =?UTF-8?q?=DA=AF=D9=84=DB=8C=D8=B3=DB=8C=20=E2=80=94=20=D8=AF=DA=A9=D9=85?= =?UTF-8?q?=D9=87=D9=94=20=D9=87=DB=8C=D8=B1=D9=88=20=D8=A8=D8=A7=20ps=20?= =?UTF-8?q?=D9=85=D9=86=D8=B7=D9=82=DB=8C=D8=8C=20=D9=BE=DB=8C=D9=88=D9=86?= =?UTF-8?q?=D8=AF=20=D8=AF=D8=B1=D8=A8=D8=A7=D8=B1=D9=87=20=D9=85=D8=A7=20?= =?UTF-8?q?=D8=B2=DB=8C=D8=B1=20=D8=AA=DB=8C=D8=AA=D8=B1=D8=8C=20justify?= =?UTF-8?q?=20=D9=85=D8=AA=D9=86=20=D8=AF=D8=B1=D8=A8=D8=A7=D8=B1=D9=87=20?= =?UTF-8?q?=D9=85=D8=A7=D8=8C=20=D9=85=D8=AA=D8=A7=DB=8C=20=D9=85=D9=82?= =?UTF-8?q?=D8=A7=D9=84=D9=87=20(=D9=86=D9=88=DB=8C=D8=B3=D9=86=D8=AF?= =?UTF-8?q?=D9=87/=D8=AA=D8=A7=D8=B1=DB=8C=D8=AE/=D8=B2=D9=85=D8=A7=D9=86?= =?UTF-8?q?=20=D9=85=D8=B7=D8=A7=D9=84=D8=B9=D9=87)=20=D8=AF=D9=88=D8=B2?= =?UTF-8?q?=D8=A8=D8=A7=D9=86=D9=87=D8=8C=20=D8=AA=DB=8C=D8=AA=D8=B1=20?= =?UTF-8?q?=D9=81=D9=87=D8=B1=D8=B3=D8=AA=20=D9=85=D8=B7=D8=A7=D9=84=D8=A8?= =?UTF-8?q?=D8=8C=20H1=20=D8=A7=D9=86=DA=AF=D9=84=DB=8C=D8=B3=DB=8C=20?= =?UTF-8?q?=D8=AF=D8=B1=20=D8=A7=D8=AF=DB=8C=D8=AA=D9=88=D8=B1=20+=20?= =?UTF-8?q?=DA=86=DA=A9=E2=80=8C=D9=84=DB=8C=D8=B3=D8=AA=20=D8=B3=D8=A6?= =?UTF-8?q?=D9=88=20=D8=B2=D8=A8=D8=A7=D9=86=E2=80=8C=D8=A2=DA=AF=D8=A7?= =?UTF-8?q?=D9=87=D8=8C=20=D8=A8=D8=A7=D8=B2=DA=AF=D8=B4=D8=AA=20=D8=A8?= =?UTF-8?q?=D9=87=20=D9=88=D8=A8=D9=84=D8=A7=DA=AF=20=D8=A8=D8=A7=20=D8=AD?= =?UTF-8?q?=D9=81=D8=B8=20=D8=B2=D8=A8=D8=A7=D9=86=D8=8C=20=D8=AF=D8=B3?= =?UTF-8?q?=D8=AA=D9=87=E2=80=8C=D8=A8=D9=86=D8=AF=DB=8C=20=D8=A7=D9=86?= =?UTF-8?q?=DA=AF=D9=84=DB=8C=D8=B3=DB=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frontend/src/admin/ArticleWritePage.tsx | 55 +++++++++++++++---------- frontend/src/components/ArticleMeta.tsx | 15 ++++--- frontend/src/components/home/Hero.tsx | 19 ++++++++- frontend/src/components/home/Story.tsx | 2 +- frontend/src/i18n/dict.ts | 6 +++ frontend/src/pages/ArticleDetail.tsx | 2 +- frontend/src/pages/Blog.tsx | 8 ++-- 7 files changed, 74 insertions(+), 33 deletions(-) diff --git a/frontend/src/admin/ArticleWritePage.tsx b/frontend/src/admin/ArticleWritePage.tsx index 7d42aa3..b095366 100644 --- a/frontend/src/admin/ArticleWritePage.tsx +++ b/frontend/src/admin/ArticleWritePage.tsx @@ -327,7 +327,7 @@ export function ArticleWritePage() { setDeleting(true) await runSave(async () => { await adminApi.remove('articles', createdId) - navigate('/blog') + navigate(`${editLang === 'en' ? '/en' : ''}/blog`) }) setDeleting(false) } @@ -353,7 +353,7 @@ export function ArticleWritePage() {
@@ -451,7 +451,7 @@ export function ArticleWritePage() { render={({ field }) => ( { field.onChange(event.target.value) queueSave({ [suf('title')]: event.target.value }) @@ -548,10 +548,10 @@ export function ArticleWritePage() { {/* چکیده و متادیتا */} @@ -594,23 +594,34 @@ export function ArticleWritePage() {
- +
- {/* تک‌انتخابی: ورودی/خروجی Controller یک {value,label} یا null است */} - ( - { - field.onChange(option) - queueSave({ category: categoryValue(option) }) - }} - /> - )} - /> + {editLang === 'en' ? ( + + ) : ( + /* تک‌انتخابی: ورودی/خروجی Controller یک {value,label} یا null است */ + ( + { + field.onChange(option) + queueSave({ category: categoryValue(option) }) + }} + /> + )} + /> + )}
diff --git a/frontend/src/components/ArticleMeta.tsx b/frontend/src/components/ArticleMeta.tsx index 50dec99..bf5a078 100644 --- a/frontend/src/components/ArticleMeta.tsx +++ b/frontend/src/components/ArticleMeta.tsx @@ -2,6 +2,7 @@ import { CalendarIcon, ClockIcon } from 'lucide-react' import type { Article } from '../data/site' import { JALALI_TIME_FORMATTER, formatJalali } from '../utils/date' import { toPersianDigits } from '../utils/digits' +import { useLang } from '../i18n/lang' type ArticleMetaProps = { article: Article @@ -13,13 +14,17 @@ type ArticleMetaProps = { * آواتار حرف اول نویسنده، نام نویسنده، تاریخ جلالی و زمان مطالعه. */ export function ArticleMeta({ article, className = '' }: ArticleMetaProps) { + const { t, lang } = useLang() const rawDate = (article.date ?? '').trim() - const author = (article.author ?? '').trim() || 'گروه ساختمانی آرامش' + const author = (article.author ?? '').trim() || t('brandFallback') const initial = author.charAt(0) - // تاریخ ذخیره‌شده (میلادی) به شمسی تبدیل می‌شود؛ در نبود تاریخ، امروز با ساعت نمایش داده می‌شود + // فارسی: تاریخ شمسی با ارقام فارسی؛ انگلیسی: تاریخ میلادی لاتین + const enDateLabel = rawDate + ? new Intl.DateTimeFormat('en-GB', { day: 'numeric', month: 'long', year: 'numeric' }).format(new Date(rawDate)) + : new Intl.DateTimeFormat('en-GB', { day: 'numeric', month: 'long', year: 'numeric', hour: '2-digit', minute: '2-digit' }).format(new Date()) const todayLabel = `${formatJalali(new Date())} — ساعت ${JALALI_TIME_FORMATTER.format(new Date())}` - const dateLabel = formatJalali(rawDate, todayLabel) + const dateLabel = lang === 'en' ? enDateLabel : formatJalali(rawDate, todayLabel) return (
@@ -30,7 +35,7 @@ export function ArticleMeta({ article, className = '' }: ArticleMetaProps) { {author} - نویسنده + {t('author')} @@ -46,7 +51,7 @@ export function ArticleMeta({ article, className = '' }: ArticleMetaProps) { {article.read && ( )}
diff --git a/frontend/src/components/home/Hero.tsx b/frontend/src/components/home/Hero.tsx index 62c66d4..bd1767b 100644 --- a/frontend/src/components/home/Hero.tsx +++ b/frontend/src/components/home/Hero.tsx @@ -1,5 +1,6 @@ import React from 'react' import { motion, useScroll, useTransform } from 'framer-motion' +import { Link } from 'react-router-dom' import { ArrowLeftIcon, ChevronDownIcon } from 'lucide-react' import { ButtonLink } from '../Button' import { useSite } from '../../api' @@ -77,6 +78,22 @@ export function Hero() { saveHero('subtitle', v)} /> + {/* پیوند درباره ما — زیر تیتر، در هر دو زبان */} + + + {t('aboutUs')} + + {/* داک دکمه‌ها: استایل کپسولی، شیشه‌ای و دایره‌ای */} saveHero('cta_primary_label', v)} /> diff --git a/frontend/src/components/home/Story.tsx b/frontend/src/components/home/Story.tsx index f12ec49..6c81289 100644 --- a/frontend/src/components/home/Story.tsx +++ b/frontend/src/components/home/Story.tsx @@ -47,7 +47,7 @@ export function Story({ showLink = true, showLabel = true, showQuote = false, al {story.paragraphs.map((paragraph, i) => ( -

+

saveParagraph(i, v)} />

))} diff --git a/frontend/src/i18n/dict.ts b/frontend/src/i18n/dict.ts index 4960405..9c53c6d 100644 --- a/frontend/src/i18n/dict.ts +++ b/frontend/src/i18n/dict.ts @@ -84,6 +84,9 @@ export const fa = { relatedArticlesAria: 'مقالات مرتبط', relatedArticles: 'مقالات مرتبط', readArticlePrefix: 'خواندن مقاله', + author: 'نویسنده', + tableOfContents: 'فهرست مطالب', + aboutUs: 'درباره ما', articleImagePrefix: 'تصویر مقاله', featuredArticle: 'مقاله ویژه', readMore: 'ادامه مطلب', @@ -204,6 +207,9 @@ export const en: Dict = { relatedArticlesAria: 'Related articles', relatedArticles: 'Related articles', readArticlePrefix: 'Read article', + author: 'Author', + tableOfContents: 'Table of Contents', + aboutUs: 'About Us', articleImagePrefix: 'Image of article', featuredArticle: 'Featured article', readMore: 'Read more', diff --git a/frontend/src/pages/ArticleDetail.tsx b/frontend/src/pages/ArticleDetail.tsx index f4d9e6a..eb3c80f 100644 --- a/frontend/src/pages/ArticleDetail.tsx +++ b/frontend/src/pages/ArticleDetail.tsx @@ -164,7 +164,7 @@ export function ArticleDetail() { dir={dir} className={`order-first lg:order-none lg:row-start-1 ${tocColumns}`} > - + )}
diff --git a/frontend/src/pages/Blog.tsx b/frontend/src/pages/Blog.tsx index b316ce1..f4e0f5e 100644 --- a/frontend/src/pages/Blog.tsx +++ b/frontend/src/pages/Blog.tsx @@ -26,7 +26,7 @@ function DraftBadge({ className = '' }: { className?: string }) { export function Blog() { const { articles } = useSite() - const { t, href } = useLang() + const { t, href, lang } = useLang() const { isEditMode } = useAdmin() // دکمه «نوشتن مقاله جدید» فقط در حالت ویرایش ادمین دیده می‌شود @@ -96,10 +96,12 @@ export function Blog() {

{featured.excerpt}

- {formatJalali(featured.date)} + {lang === 'en' + ? new Intl.DateTimeFormat('en-GB', { day: 'numeric', month: 'long', year: 'numeric' }).format(new Date(featured.date)) + : formatJalali(featured.date)} - {toPersianDigits(featured.read)} + {lang === 'en' ? featured.read : toPersianDigits(featured.read)}