0%
balqalam Logo
بالقلم
المميزاتالمجتمعالتسعيرالوثائق
تسجيل الدخول
  • مقدمة
  • العرض
  • MVP
  • خارطة الطريق
  • متطلبات المنتج
  • ابدأ الآن
  • البيئة المحلية
  • البنية المعمارية
  • الهيكل
  • الأنماط
  • الحزمة التقنية
  • قاعدة البيانات
  • تعدّد المستأجرين
  • الفهرس (Catalog)
  • العمل دون اتصال
  • المصادقة
  • التهيئة (Onboarding)
  • تدفق التكامل (Integration Flow)
  • التهيئة (Provision)
  • القبول
  • الحضور
  • الامتثال التنظيمي
  • الملف الشخصي
  • الاجتماعات
  • إدارة الرسوم
  • الفاتورة
  • التدويل
  • الترجمة
  • دليل الترجمة
  • أمان قاعدة البيانات
  • المساهمة
  • هَوْغوارتس
  • عرض حي
  • الإلهام
المبيعات والانتشار
  • المبيعات
  • الذهاب إلى السوق
  • التسويق
  • القبول — تسليط الضوء
  • البرنامج التجريبي
  • العملاء المحتملون
  • العرض التجاري
  • قوالب التواصل
  • دراسة الحالة
  • المنافسون
  • نموذج العمل
  • الاقتصاد المشترك
  • الجذب والنمو
التمويل والشراكات
  • الحصول على الدعم
  • عرض المستثمر
  • غرفة البيانات
  • المستثمرون
  • المُسرِّعات
  • الحاضنات
  • المنح
  • الرعاة
  • الشركاء
  • المسابقات والهاكاثونات
  • الجامعات ومراكز التدريب

الترجمة

السابقالتالي

i18n من طبقتين — JSON قاموس للواجهة الثابتة، وlocalize() المُجمَّعة للمحتوى الديناميكي. فجوات التغطية وأنماط التبني.

تعمل الترجمة على طبقتين: ملفات JSON القاموس للواجهة الثابتة (تطابق ar/en يفرضه اختبار في CI) ومحرك localize() المُجمَّع لمحتوى قاعدة البيانات الديناميكي عبر مخبأ ثلاثي الطبقات (ذاكرة LRU ← جدول Translation ← Google Translate). لم يعد بإمكان الانحراف أن يصل للإنتاج: تطابق مفاتيح en/ar، والبقايا غير المترجمة، وعدّادات السلاسل المكتوبة يدويًا، وفئات RTL الفيزيائية كلها محروسة ضمن pnpm test وضمن CI. المتبقي هو مسح السلاسل اليدوية الذي تتعقبه أرقام الأساس — شغّل npx tsx scripts/i18n-hardcoded-ratchet.ts --by-dir للعدد الحيّ.

البنية المعمارية

الطبقةالمحتوىالآلية
1 — واجهة ثابتةsidebar، رؤوس الجداول، شارات الحالة، التسمياتJSON قاموس → getDictionary() → dictionary.key
2 — محتوى ديناميكيإعلانات، مواد، أقسام، فعالياتتخزين بلغة واحدة → localize()/getLabels() المُجمَّعة → LRU → كاش → Google

ملفات البنية التحتية

الملفالغرض
src/components/translation/localize.tslocalize()/localizeOne() المُجمَّعة — المفضّلة
src/components/translation/registry.tsخريطة TRANSLATABLE (النموذج ← الحقول)
src/components/translation/prewarm.tsتعبئة المخبأ عند الكتابة عبر after()
src/components/translation/person.tsgetNames()/getLabels() — مُجمَّعة
src/components/translation/display.tsgetText()، getFields() — للقيم المفردة فقط
src/components/translation/actions.tsنواة translate() (LRU ← كاش ← Google)
src/components/translation/google.tsعميل Google: مهلة، تقسيم دفعات، سياسة إعادة
src/components/translation/util.tswithLang، detectScript
src/components/internationalization/helpers/index.tsValidationHelper، ToastHelper، ErrorHelper
src/components/internationalization/namespaces.tsسجل نطاقات الأسماء الوحيد (خادم + عميل)
src/components/internationalization/dictionaries.tsمحمّلات قاموس بنطاق المسار (ملفوفة بـ cache())

فجوات التغطية

الفجوةالحالة
نص الأزرار (Save، Cancel، Delete…)المفاتيح موجودة في dictionary.common.*
التحقّق (رسائل Zod)يحتاج إعادة هيكلة بمصنع schema
خيارات config / selectيحتاج مصانع خيارات
تسميات النماذج وplaceholdersتبنٍّ جزئي
أخطاء server actionsيحتاج نمط رمز خطأ
تبويبات / تسميات مجموعات المعالجمعلّق
الحالات الفارغةمعلّق
رسائل Toastيحتاج توصيل ToastHelper

عناصر sidebar Cards وLab تفتقد أيضاً مفاتيح القاموس. شغّل /i18n-check للعدد الحالي لكل منطقة.

ترتيب الأولويات

  1. نص الأزرار — المفاتيح موجودة بالفعل في dictionary.common.*.
  2. تسميات مجموعات المعالج — رؤية عالية.
  3. تسميات النماذج — أكبر أثر على UX.
  4. خيارات select — يحتاج مصنع config.
  5. التحقّق — يحتاج إعادة هيكلة بمصنع schema.
  6. أخطاء server actions — يحتاج نمط رمز خطأ.
  7. الحالات الفارغة.
  8. رسائل Toast — يحتاج توصيل القاموس.
  9. توسيع getText لبقية ملفات المحتوى.

نمط النموذج

مرّر شرائح القاموس إلى نماذج العميل.

// content.tsx
const dictionary = await getDictionary(lang)
return <StudentForm dictionary={dictionary.school.students} />
 
// form.tsx
<FormLabel>{dictionary.form.name}</FormLabel>
<Input placeholder={dictionary.form.namePlaceholder} {...field} />

نمط Select

صدّر مصانع خيارات، لا مصفوفات ثابتة.

export const getGenderOptions = (d: Dictionary["school"]) => [
  { value: "male", label: d.students.gender.male },
  { value: "female", label: d.students.gender.female },
]

نمط التحقّق

تتحوّل schemas إلى مصانع تستقبل ValidationHelper. يعمل بالفعل في onboarding وauth.

import { getValidationMessages } from "@/components/internationalization/helpers"
 
export const createStudentSchema = (
  v: ReturnType<typeof getValidationMessages>
) =>
  z.object({
    name: z.string().min(1, v.required()),
    email: z.string().email(v.email()),
    phone: z.string().min(10, v.minLength(10)),
  })

العائق: ملفات التحقّق عبر اللوحة بحاجة للتحوّل من schemas على مستوى الوحدة إلى مصانع.

نمط Toast

import { getToastMessages } from "@/components/internationalization/helpers"
 
const t = useMemo(() => getToastMessages(dictionary), [dictionary])
 
if (result.success) toast.success(t.success.student.created())
else toast.error(t.error.student.createFailed())

العائق: toasts تعمل على العميل؛ ToastHelper يحتاج القاموس في نطاقه.

نمط أخطاء server action

أعِد رموز أخطاء؛ ترجِم على العميل.

// actions.ts
if (!session?.user) return { success: false, errorCode: "NOT_AUTHENTICATED" }
if (!schoolId) return { success: false, errorCode: "MISSING_SCHOOL_CONTEXT" }
 
// form.tsx
const ERROR_MAP: Record<string, string> = {
  NOT_AUTHENTICATED: dictionary.messages.errors.auth.notAuthenticated,
  MISSING_SCHOOL_CONTEXT:
    dictionary.messages.errors.tenant.missingSchoolContext,
}
toast.error(
  ERROR_MAP[result.errorCode] ?? dictionary.messages.errors.server.internalError
)

الحالة لكل منطقة

كل المناطق الـ21 (Dashboard، Students، Teachers، Classes، Subjects، Announcements، Events، Assignments، Parents، Grades، Classrooms، Exams، Finance، Attendance، Timetable، Profile، Settings، Notifications، Admission، School Config، Reports) تستخدم القاموس لرؤوس الجداول وsidebar لكنها جزئية على getText، النماذج، الـselects، التحقّق، الـtoasts، والإجراءات. Students/Teachers/Classes/Subjects/Announcements/Parents/Classrooms/Exams/Attendance/Profile تستخدم getText لبعض الأسطح؛ الباقي بانتظار display-text.

مسارات المعالج (/students/add، /teachers/add، /exams/manage، /exams/qbank، /finance/invoice) فيها نماذج، selects، تحقّق، toasts، وأخطاء إجراءات مكتوبة يدوياً.

الحواجز الواقية

الطبقةما تفعله
.claude/rules/translation.mdقاعدة بنطاق المسار تنطلق على تعديلات src/components/** وsrc/app/**
.claude/hooks/check-i18n.shhook PostToolUse يرفع رايات على سلاسل <FormLabel> وtoast.success/error المكتوبة يدوياً
CLAUDE.md gotcha #12يذكّر بأن كل نص واجهة يجب أن يستخدم مفاتيح القاموس

انظر أيضاً

  • تعدد المستأجرين
  • الأنماط
  • التحقّق
  • النماذج
التدويلدليل الترجمة

On This Page

البنية المعماريةملفات البنية التحتيةفجوات التغطيةترتيب الأولوياتنمط النموذجنمط Selectنمط التحقّقنمط Toastنمط أخطاء server actionالحالة لكل منطقةالحواجز الواقيةانظر أيضاً

من تطوير Databayt ·

مرحباً بك في بالقلم.

رحلة عظيمة على وشك أن تبدأ.