fix(blog): زبان ویرایش بهازای هر مقاله بهخاطر سپرده میشود، شمارندهٔ متا روی زبان فعال، جهت محتوای ادیتور از زبان ویرایش
This commit is contained in:
@@ -134,7 +134,7 @@ const STATUS_TEXT: Record<string, string> = {
|
||||
* مسیرها: /admin/write (مقاله جدید) و /admin/write/:id (ویرایش).
|
||||
*/
|
||||
export function ArticleWritePage() {
|
||||
const { isAuthenticated, saveStatus, runSave, editLang, toggleEditLang, role } = useAdmin()
|
||||
const { isAuthenticated, saveStatus, runSave, editLang, toggleEditLang, syncEditLang, role } = useAdmin()
|
||||
const { id } = useParams<{ id: string }>()
|
||||
const navigate = useNavigate()
|
||||
const { data, updateSite } = useSiteData()
|
||||
@@ -219,6 +219,23 @@ export function ArticleWritePage() {
|
||||
|
||||
const article = existing ?? fetched
|
||||
|
||||
// زبان ویرایش این مقاله بهازای خودش بهخاطر سپرده میشود — رفرش تب را عوض نکند
|
||||
useEffect(() => {
|
||||
if (!id) return
|
||||
const saved = localStorage.getItem(`aramesh_write_lang_${id}`)
|
||||
if (saved === 'en' || saved === 'fa') {
|
||||
syncEditLang(saved)
|
||||
return
|
||||
}
|
||||
const art = existing ?? null
|
||||
if (art) {
|
||||
const hasEn = Boolean((art as Draft).title_en?.trim()) || Boolean((art as Draft).body_en as unknown)
|
||||
const hasFa = Boolean((art as Draft).title?.trim())
|
||||
if (hasEn && !hasFa) syncEditLang('en')
|
||||
}
|
||||
// eslint-disable-next-line react-hooks/exhaustive-deps
|
||||
}, [id, Boolean(article)])
|
||||
|
||||
// وقتی مقاله موجود شناخته شد، فرم و شناسه ساختهشده یکبار مقداردهی میشود
|
||||
useEffect(() => {
|
||||
if (!article || createdRef.current) return
|
||||
@@ -338,7 +355,6 @@ export function ArticleWritePage() {
|
||||
queueSave({ [name]: e.target.value }),
|
||||
})
|
||||
|
||||
const metaLength = (draft.meta_description ?? '').trim().length
|
||||
// در زبان انگلیسی، فیلدهای متنی به ستونهای _en میروند؛ اسلاگ/تصویر/وضعیت مشترکاند
|
||||
const suf = <N extends string>(name: N) => `${name}${editLang === 'en' ? '_en' : ''}` as keyof Draft
|
||||
// مقدار فعال فیلد دوزبانه — برای value ورودیها و چکلیست سئو
|
||||
@@ -353,6 +369,7 @@ export function ArticleWritePage() {
|
||||
|
||||
const activeVal = (name: 'title' | 'slug' | 'author' | 'seo_keyphrase' | 'meta_description' | 'excerpt'): string =>
|
||||
String((editLang === 'en' ? draft[`${name}_en` as keyof Draft] : draft[name]) ?? '')
|
||||
const metaLength = activeVal('meta_description').trim().length
|
||||
|
||||
// متن جایگزین تصویر شاخص — با watch('title') بهصورت زنده ساخته میشود
|
||||
const imageAltFallback = [watchedTitle.trim(), FEATURED_IMAGE_ALT_SUFFIX]
|
||||
@@ -376,7 +393,11 @@ export function ArticleWritePage() {
|
||||
<div className="flex items-center gap-4">
|
||||
<button
|
||||
type="button"
|
||||
onClick={toggleEditLang}
|
||||
onClick={() => {
|
||||
const next = editLang === 'en' ? 'fa' : 'en'
|
||||
toggleEditLang()
|
||||
if (createdId) localStorage.setItem(`aramesh_write_lang_${createdId}`, next)
|
||||
}}
|
||||
title="تعیین میکند متن مقاله روی کدام زبان ذخیره شود"
|
||||
className={`px-4 py-2 text-xs font-bold transition-colors duration-200 ${
|
||||
editLang === 'en'
|
||||
@@ -505,6 +526,7 @@ export function ArticleWritePage() {
|
||||
<div className="mt-8">
|
||||
<ArticleEditor
|
||||
contentKey={loadedContentKey}
|
||||
contentLang={editLang}
|
||||
doc={(editLang === 'en' ? draft.body_en : draft.body) as unknown as Record<string, unknown>}
|
||||
onChange={(json) => {
|
||||
// زمان مطالعه بهصورت پویا از متن سند محاسبه میشود — به زبان جاری
|
||||
|
||||
Reference in New Issue
Block a user