Browse Source

feat(i18n): add Arabic language support (#9947)

NourEldin Osama 1 month ago
parent
commit
ba2e35e29c

+ 8 - 2
packages/app/src/context/language.tsx

@@ -14,6 +14,7 @@ import { dict as da } from "@/i18n/da"
 import { dict as ja } from "@/i18n/ja"
 import { dict as ja } from "@/i18n/ja"
 import { dict as pl } from "@/i18n/pl"
 import { dict as pl } from "@/i18n/pl"
 import { dict as ru } from "@/i18n/ru"
 import { dict as ru } from "@/i18n/ru"
+import { dict as ar } from "@/i18n/ar"
 import { dict as uiEn } from "@opencode-ai/ui/i18n/en"
 import { dict as uiEn } from "@opencode-ai/ui/i18n/en"
 import { dict as uiZh } from "@opencode-ai/ui/i18n/zh"
 import { dict as uiZh } from "@opencode-ai/ui/i18n/zh"
 import { dict as uiZht } from "@opencode-ai/ui/i18n/zht"
 import { dict as uiZht } from "@opencode-ai/ui/i18n/zht"
@@ -25,13 +26,14 @@ import { dict as uiDa } from "@opencode-ai/ui/i18n/da"
 import { dict as uiJa } from "@opencode-ai/ui/i18n/ja"
 import { dict as uiJa } from "@opencode-ai/ui/i18n/ja"
 import { dict as uiPl } from "@opencode-ai/ui/i18n/pl"
 import { dict as uiPl } from "@opencode-ai/ui/i18n/pl"
 import { dict as uiRu } from "@opencode-ai/ui/i18n/ru"
 import { dict as uiRu } from "@opencode-ai/ui/i18n/ru"
+import { dict as uiAr } from "@opencode-ai/ui/i18n/ar"
 
 
-export type Locale = "en" | "zh" | "zht" | "ko" | "de" | "es" | "fr" | "da" | "ja" | "pl" | "ru"
+export type Locale = "en" | "zh" | "zht" | "ko" | "de" | "es" | "fr" | "da" | "ja" | "pl" | "ru" | "ar"
 
 
 type RawDictionary = typeof en & typeof uiEn
 type RawDictionary = typeof en & typeof uiEn
 type Dictionary = i18n.Flatten<RawDictionary>
 type Dictionary = i18n.Flatten<RawDictionary>
 
 
-const LOCALES: readonly Locale[] = ["en", "zh", "zht", "ko", "de", "es", "fr", "da", "ja", "pl", "ru"]
+const LOCALES: readonly Locale[] = ["en", "zh", "zht", "ko", "de", "es", "fr", "da", "ja", "pl", "ru", "ar"]
 
 
 function detectLocale(): Locale {
 function detectLocale(): Locale {
   if (typeof navigator !== "object") return "en"
   if (typeof navigator !== "object") return "en"
@@ -51,6 +53,7 @@ function detectLocale(): Locale {
     if (language.toLowerCase().startsWith("ja")) return "ja"
     if (language.toLowerCase().startsWith("ja")) return "ja"
     if (language.toLowerCase().startsWith("pl")) return "pl"
     if (language.toLowerCase().startsWith("pl")) return "pl"
     if (language.toLowerCase().startsWith("ru")) return "ru"
     if (language.toLowerCase().startsWith("ru")) return "ru"
+    if (language.toLowerCase().startsWith("ar")) return "ar"
   }
   }
 
 
   return "en"
   return "en"
@@ -77,6 +80,7 @@ export const { use: useLanguage, provider: LanguageProvider } = createSimpleCont
       if (store.locale === "ja") return "ja"
       if (store.locale === "ja") return "ja"
       if (store.locale === "pl") return "pl"
       if (store.locale === "pl") return "pl"
       if (store.locale === "ru") return "ru"
       if (store.locale === "ru") return "ru"
+      if (store.locale === "ar") return "ar"
       return "en"
       return "en"
     })
     })
 
 
@@ -98,6 +102,7 @@ export const { use: useLanguage, provider: LanguageProvider } = createSimpleCont
       if (locale() === "ja") return { ...base, ...i18n.flatten({ ...ja, ...uiJa }) }
       if (locale() === "ja") return { ...base, ...i18n.flatten({ ...ja, ...uiJa }) }
       if (locale() === "pl") return { ...base, ...i18n.flatten({ ...pl, ...uiPl }) }
       if (locale() === "pl") return { ...base, ...i18n.flatten({ ...pl, ...uiPl }) }
       if (locale() === "ru") return { ...base, ...i18n.flatten({ ...ru, ...uiRu }) }
       if (locale() === "ru") return { ...base, ...i18n.flatten({ ...ru, ...uiRu }) }
+      if (locale() === "ar") return { ...base, ...i18n.flatten({ ...ar, ...uiAr }) }
       return { ...base, ...i18n.flatten({ ...ko, ...uiKo }) }
       return { ...base, ...i18n.flatten({ ...ko, ...uiKo }) }
     })
     })
 
 
@@ -115,6 +120,7 @@ export const { use: useLanguage, provider: LanguageProvider } = createSimpleCont
       ja: "language.ja",
       ja: "language.ja",
       pl: "language.pl",
       pl: "language.pl",
       ru: "language.ru",
       ru: "language.ru",
+      ar: "language.ar",
     }
     }
 
 
     const label = (value: Locale) => t(labelKey[value])
     const label = (value: Locale) => t(labelKey[value])

+ 635 - 0
packages/app/src/i18n/ar.ts

@@ -0,0 +1,635 @@
+export const dict = {
+  "command.category.suggested": "مقترح",
+  "command.category.view": "عرض",
+  "command.category.project": "مشروع",
+  "command.category.provider": "موفر",
+  "command.category.server": "خادم",
+  "command.category.session": "جلسة",
+  "command.category.theme": "سمة",
+  "command.category.language": "لغة",
+  "command.category.file": "ملف",
+  "command.category.terminal": "محطة طرفية",
+  "command.category.model": "نموذج",
+  "command.category.mcp": "MCP",
+  "command.category.agent": "وكيل",
+  "command.category.permissions": "أذونات",
+  "command.category.workspace": "مساحة عمل",
+  "command.category.settings": "إعدادات",
+
+  "theme.scheme.system": "نظام",
+  "theme.scheme.light": "فاتح",
+  "theme.scheme.dark": "داكن",
+
+  "command.sidebar.toggle": "تبديل الشريط الجانبي",
+  "command.project.open": "فتح مشروع",
+  "command.provider.connect": "اتصال بموفر",
+  "command.server.switch": "تبديل الخادم",
+  "command.settings.open": "فتح الإعدادات",
+  "command.session.previous": "الجلسة السابقة",
+  "command.session.next": "الجلسة التالية",
+  "command.session.archive": "أرشفة الجلسة",
+
+  "command.palette": "لوحة الأوامر",
+
+  "command.theme.cycle": "تغيير السمة",
+  "command.theme.set": "استخدام السمة: {{theme}}",
+  "command.theme.scheme.cycle": "تغيير مخطط الألوان",
+  "command.theme.scheme.set": "استخدام مخطط الألوان: {{scheme}}",
+
+  "command.language.cycle": "تغيير اللغة",
+  "command.language.set": "استخدام اللغة: {{language}}",
+
+  "command.session.new": "جلسة جديدة",
+  "command.file.open": "فتح ملف",
+  "command.file.open.description": "البحث في الملفات والأوامر",
+  "command.terminal.toggle": "تبديل المحطة الطرفية",
+  "command.review.toggle": "تبديل المراجعة",
+  "command.terminal.new": "محطة طرفية جديدة",
+  "command.terminal.new.description": "إنشاء علامة تبويب جديدة للمحطة الطرفية",
+  "command.steps.toggle": "تبديل الخطوات",
+  "command.steps.toggle.description": "إظهار أو إخفاء خطوات الرسالة الحالية",
+  "command.message.previous": "الرسالة السابقة",
+  "command.message.previous.description": "انتقل إلى رسالة المستخدم السابقة",
+  "command.message.next": "الرسالة التالية",
+  "command.message.next.description": "انتقل إلى رسالة المستخدم التالية",
+  "command.model.choose": "اختيار نموذج",
+  "command.model.choose.description": "حدد نموذجًا مختلفًا",
+  "command.mcp.toggle": "تبديل MCPs",
+  "command.mcp.toggle.description": "تبديل MCPs",
+  "command.agent.cycle": "تغيير الوكيل",
+  "command.agent.cycle.description": "التبديل إلى الوكيل التالي",
+  "command.agent.cycle.reverse": "تغيير الوكيل للخلف",
+  "command.agent.cycle.reverse.description": "التبديل إلى الوكيل السابق",
+  "command.model.variant.cycle": "تغيير جهد التفكير",
+  "command.model.variant.cycle.description": "التبديل إلى مستوى الجهد التالي",
+  "command.permissions.autoaccept.enable": "قبول التعديلات تلقائيًا",
+  "command.permissions.autoaccept.disable": "إيقاف قبول التعديلات تلقائيًا",
+  "command.session.undo": "تراجع",
+  "command.session.undo.description": "تراجع عن الرسالة الأخيرة",
+  "command.session.redo": "إعادة",
+  "command.session.redo.description": "إعادة الرسالة التي تم التراجع عنها",
+  "command.session.compact": "ضغط الجلسة",
+  "command.session.compact.description": "تلخيص الجلسة لتقليل حجم السياق",
+  "command.session.fork": "تشعب من الرسالة",
+  "command.session.fork.description": "إنشاء جلسة جديدة من رسالة سابقة",
+  "command.session.share": "مشاركة الجلسة",
+  "command.session.share.description": "مشاركة هذه الجلسة ونسخ الرابط إلى الحافظة",
+  "command.session.unshare": "إلغاء مشاركة الجلسة",
+  "command.session.unshare.description": "إيقاف مشاركة هذه الجلسة",
+
+  "palette.search.placeholder": "البحث في الملفات والأوامر",
+  "palette.empty": "لا توجد نتائج",
+  "palette.group.commands": "الأوامر",
+  "palette.group.files": "الملفات",
+
+  "dialog.provider.search.placeholder": "البحث عن موفرين",
+  "dialog.provider.empty": "لم يتم العثور على موفرين",
+  "dialog.provider.group.popular": "شائع",
+  "dialog.provider.group.other": "آخر",
+  "dialog.provider.tag.recommended": "موصى به",
+  "dialog.provider.anthropic.note": "اتصل باستخدام Claude Pro/Max أو مفتاح API",
+
+  "dialog.model.select.title": "تحديد نموذج",
+  "dialog.model.search.placeholder": "البحث عن نماذج",
+  "dialog.model.empty": "لا توجد نتائج للنماذج",
+  "dialog.model.manage": "إدارة النماذج",
+  "dialog.model.manage.description": "تخصيص النماذج التي تظهر في محدد النماذج.",
+
+  "dialog.model.unpaid.freeModels.title": "نماذج مجانية مقدمة من OpenCode",
+  "dialog.model.unpaid.addMore.title": "إضافة المزيد من النماذج من موفرين مشهورين",
+
+  "dialog.provider.viewAll": "عرض جميع الموفرين",
+
+  "provider.connect.title": "اتصال {{provider}}",
+  "provider.connect.title.anthropicProMax": "تسجيل الدخول باستخدام Claude Pro/Max",
+  "provider.connect.selectMethod": "حدد طريقة تسجيل الدخول لـ {{provider}}.",
+  "provider.connect.method.apiKey": "مفتاح API",
+  "provider.connect.status.inProgress": "جارٍ التفويض...",
+  "provider.connect.status.waiting": "في انتظار التفويض...",
+  "provider.connect.status.failed": "فشل التفويض: {{error}}",
+  "provider.connect.apiKey.description":
+    "أدخل مفتاح واجهة برمجة تطبيقات {{provider}} الخاص بك لتوصيل حسابك واستخدام نماذج {{provider}} في OpenCode.",
+  "provider.connect.apiKey.label": "مفتاح واجهة برمجة تطبيقات {{provider}}",
+  "provider.connect.apiKey.placeholder": "مفتاح API",
+  "provider.connect.apiKey.required": "مفتاح API مطلوب",
+  "provider.connect.opencodeZen.line1":
+    "يمنحك OpenCode Zen الوصول إلى مجموعة مختارة من النماذج الموثوقة والمحسنة لوكلاء البرمجة.",
+  "provider.connect.opencodeZen.line2":
+    "باستخدام مفتاح API واحد، ستحصل على إمكانية الوصول إلى نماذج مثل Claude و GPT و Gemini و GLM والمزيد.",
+  "provider.connect.opencodeZen.visit.prefix": "قم بزيارة ",
+  "provider.connect.opencodeZen.visit.link": "opencode.ai/zen",
+  "provider.connect.opencodeZen.visit.suffix": " للحصول على مفتاح API الخاص بك.",
+  "provider.connect.oauth.code.visit.prefix": "قم بزيارة ",
+  "provider.connect.oauth.code.visit.link": "هذا الرابط",
+  "provider.connect.oauth.code.visit.suffix":
+    " للحصول على رمز التفويض الخاص بك لتوصيل حسابك واستخدام نماذج {{provider}} في OpenCode.",
+  "provider.connect.oauth.code.label": "رمز تفويض {{method}}",
+  "provider.connect.oauth.code.placeholder": "رمز التفويض",
+  "provider.connect.oauth.code.required": "رمز التفويض مطلوب",
+  "provider.connect.oauth.code.invalid": "رمز التفويض غير صالح",
+  "provider.connect.oauth.auto.visit.prefix": "قم بزيارة ",
+  "provider.connect.oauth.auto.visit.link": "هذا الرابط",
+  "provider.connect.oauth.auto.visit.suffix":
+    " وأدخل الرمز أدناه لتوصيل حسابك واستخدام نماذج {{provider}} في OpenCode.",
+  "provider.connect.oauth.auto.confirmationCode": "رمز التأكيد",
+  "provider.connect.toast.connected.title": "تم توصيل {{provider}}",
+  "provider.connect.toast.connected.description": "نماذج {{provider}} متاحة الآن للاستخدام.",
+
+  "model.tag.free": "مجاني",
+  "model.tag.latest": "الأحدث",
+  "model.provider.anthropic": "Anthropic",
+  "model.provider.openai": "OpenAI",
+  "model.provider.google": "Google",
+  "model.provider.xai": "xAI",
+  "model.provider.meta": "Meta",
+  "model.input.text": "نص",
+  "model.input.image": "صورة",
+  "model.input.audio": "صوت",
+  "model.input.video": "فيديو",
+  "model.input.pdf": "pdf",
+  "model.tooltip.allows": "يسمح: {{inputs}}",
+  "model.tooltip.reasoning.allowed": "يسمح بالاستنتاج",
+  "model.tooltip.reasoning.none": "بدون استنتاج",
+  "model.tooltip.context": "حد السياق {{limit}}",
+
+  "common.search.placeholder": "بحث",
+  "common.loading": "جارٍ التحميل",
+  "common.loading.ellipsis": "...",
+  "common.cancel": "إلغاء",
+  "common.submit": "إرسال",
+  "common.save": "حفظ",
+  "common.saving": "جارٍ الحفظ...",
+  "common.default": "افتراضي",
+  "common.attachment": "مرفق",
+
+  "prompt.placeholder.shell": "أدخل أمر shell...",
+  "prompt.placeholder.normal": 'اسأل أي شيء... "{{example}}"',
+  "prompt.mode.shell": "Shell",
+  "prompt.mode.shell.exit": "esc للخروج",
+
+  "prompt.example.1": "إصلاح TODO في قاعدة التعليمات البرمجية",
+  "prompt.example.2": "ما هو المكدس التقني لهذا المشروع؟",
+  "prompt.example.3": "إصلاح الاختبارات المعطلة",
+  "prompt.example.4": "اشرح كيف تعمل المصادقة",
+  "prompt.example.5": "البحث عن وإصلاح الثغرات الأمنية",
+  "prompt.example.6": "إضافة اختبارات وحدة لخدمة المستخدم",
+  "prompt.example.7": "إعادة هيكلة هذه الدالة لتكون أكثر قابلية للقراءة",
+  "prompt.example.8": "ماذا يعني هذا الخطأ؟",
+  "prompt.example.9": "ساعدني في تصحيح هذه المشكلة",
+  "prompt.example.10": "توليد وثائق API",
+  "prompt.example.11": "تحسين استعلامات قاعدة البيانات",
+  "prompt.example.12": "إضافة التحقق من صحة الإدخال",
+  "prompt.example.13": "إنشاء مكون جديد لـ...",
+  "prompt.example.14": "كيف أقوم بنشر هذا المشروع؟",
+  "prompt.example.15": "مراجعة الكود الخاص بي لأفضل الممارسات",
+  "prompt.example.16": "إضافة معالجة الأخطاء لهذه الدالة",
+  "prompt.example.17": "اشرح نمط regex هذا",
+  "prompt.example.18": "تحويل هذا إلى TypeScript",
+  "prompt.example.19": "إضافة تسجيل الدخول (logging) في جميع أنحاء قاعدة التعليمات البرمجية",
+  "prompt.example.20": "ما هي التبعيات القديمة؟",
+  "prompt.example.21": "ساعدني في كتابة برنامج نصي للهجرة",
+  "prompt.example.22": "تنفيذ التخزين المؤقت لهذه النقطة النهائية",
+  "prompt.example.23": "إضافة ترقيم الصفحات إلى هذه القائمة",
+  "prompt.example.24": "إنشاء أمر CLI لـ...",
+  "prompt.example.25": "كيف تعمل متغيرات البيئة هنا؟",
+
+  "prompt.popover.emptyResults": "لا توجد نتائج مطابقة",
+  "prompt.popover.emptyCommands": "لا توجد أوامر مطابقة",
+  "prompt.dropzone.label": "أفلت الصور أو ملفات PDF هنا",
+  "prompt.slash.badge.custom": "مخصص",
+  "prompt.context.active": "نشط",
+  "prompt.context.includeActiveFile": "تضمين الملف النشط",
+  "prompt.action.attachFile": "إرفاق ملف",
+  "prompt.action.send": "إرسال",
+  "prompt.action.stop": "توقف",
+
+  "prompt.toast.pasteUnsupported.title": "لصق غير مدعوم",
+  "prompt.toast.pasteUnsupported.description": "يمكن لصق الصور أو ملفات PDF فقط هنا.",
+  "prompt.toast.modelAgentRequired.title": "حدد وكيلاً ونموذجاً",
+  "prompt.toast.modelAgentRequired.description": "اختر وكيلاً ونموذجاً قبل إرسال الموجه.",
+  "prompt.toast.worktreeCreateFailed.title": "فشل إنشاء شجرة العمل",
+  "prompt.toast.sessionCreateFailed.title": "فشل إنشاء الجلسة",
+  "prompt.toast.shellSendFailed.title": "فشل إرسال أمر shell",
+  "prompt.toast.commandSendFailed.title": "فشل إرسال الأمر",
+  "prompt.toast.promptSendFailed.title": "فشل إرسال الموجه",
+
+  "dialog.mcp.title": "MCPs",
+  "dialog.mcp.description": "{{enabled}} من {{total}} مفعل",
+  "dialog.mcp.empty": "لم يتم تكوين MCPs",
+
+  "mcp.status.connected": "متصل",
+  "mcp.status.failed": "فشل",
+  "mcp.status.needs_auth": "يحتاج إلى مصادقة",
+  "mcp.status.disabled": "معطل",
+
+  "dialog.fork.empty": "لا توجد رسائل للتفرع منها",
+
+  "dialog.directory.search.placeholder": "البحث في المجلدات",
+  "dialog.directory.empty": "لم يتم العثور على مجلدات",
+
+  "dialog.server.title": "الخوادم",
+  "dialog.server.description": "تبديل خادم OpenCode الذي يتصل به هذا التطبيق.",
+  "dialog.server.search.placeholder": "البحث في الخوادم",
+  "dialog.server.empty": "لا توجد خوادم بعد",
+  "dialog.server.add.title": "إضافة خادم",
+  "dialog.server.add.url": "عنوان URL للخادم",
+  "dialog.server.add.placeholder": "http://localhost:4096",
+  "dialog.server.add.error": "تعذر الاتصال بالخادم",
+  "dialog.server.add.checking": "جارٍ التحقق...",
+  "dialog.server.add.button": "إضافة",
+  "dialog.server.default.title": "الخادم الافتراضي",
+  "dialog.server.default.description":
+    "الاتصال بهذا الخادم عند بدء تشغيل التطبيق بدلاً من بدء خادم محلي. يتطلب إعادة التشغيل.",
+  "dialog.server.default.none": "لم يتم تحديد خادم",
+  "dialog.server.default.set": "تعيين الخادم الحالي كافتراضي",
+  "dialog.server.default.clear": "مسح",
+
+  "dialog.project.edit.title": "تحرير المشروع",
+  "dialog.project.edit.name": "الاسم",
+  "dialog.project.edit.icon": "أيقونة",
+  "dialog.project.edit.icon.alt": "أيقونة المشروع",
+  "dialog.project.edit.icon.hint": "انقر أو اسحب صورة",
+  "dialog.project.edit.icon.recommended": "موصى به: 128x128px",
+  "dialog.project.edit.color": "لون",
+
+  "context.breakdown.title": "تفصيل السياق",
+  "context.breakdown.note": 'تفصيل تقريبي لرموز الإدخال. يشمل "أخرى" تعريفات الأدوات والنفقات العامة.',
+  "context.breakdown.system": "النظام",
+  "context.breakdown.user": "المستخدم",
+  "context.breakdown.assistant": "المساعد",
+  "context.breakdown.tool": "استدعاءات الأداة",
+  "context.breakdown.other": "أخرى",
+
+  "context.systemPrompt.title": "موجه النظام",
+  "context.rawMessages.title": "الرسائل الخام",
+
+  "context.stats.session": "جلسة",
+  "context.stats.messages": "رسائل",
+  "context.stats.provider": "موفر",
+  "context.stats.model": "نموذج",
+  "context.stats.limit": "حد السياق",
+  "context.stats.totalTokens": "إجمالي الرموز",
+  "context.stats.usage": "استخدام",
+  "context.stats.inputTokens": "رموز الإدخال",
+  "context.stats.outputTokens": "رموز الإخراج",
+  "context.stats.reasoningTokens": "رموز الاستنتاج",
+  "context.stats.cacheTokens": "رموز التخزين المؤقت (قراءة/كتابة)",
+  "context.stats.userMessages": "رسائل المستخدم",
+  "context.stats.assistantMessages": "رسائل المساعد",
+  "context.stats.totalCost": "التكلفة الإجمالية",
+  "context.stats.sessionCreated": "تم إنشاء الجلسة",
+  "context.stats.lastActivity": "آخر نشاط",
+
+  "context.usage.tokens": "رموز",
+  "context.usage.usage": "استخدام",
+  "context.usage.cost": "تكلفة",
+  "context.usage.clickToView": "انقر لعرض السياق",
+
+  "language.en": "الإنجليزية",
+  "language.zh": "الصينية (المبسطة)",
+  "language.zht": "الصينية (التقليدية)",
+  "language.ko": "الكورية",
+  "language.de": "الألمانية",
+  "language.es": "الإسبانية",
+  "language.fr": "الفرنسية",
+  "language.ja": "اليابانية",
+  "language.da": "الدانماركية",
+  "language.ru": "الروسية",
+  "language.pl": "البولندية",
+  "language.ar": "العربية",
+
+  "toast.language.title": "لغة",
+  "toast.language.description": "تم التبديل إلى {{language}}",
+
+  "toast.theme.title": "تم تبديل السمة",
+  "toast.scheme.title": "مخطط الألوان",
+
+  "toast.permissions.autoaccept.on.title": "قبول التعديلات تلقائيًا",
+  "toast.permissions.autoaccept.on.description": "سيتم الموافقة تلقائيًا على أذونات التحرير والكتابة",
+  "toast.permissions.autoaccept.off.title": "توقف قبول التعديلات تلقائيًا",
+  "toast.permissions.autoaccept.off.description": "ستتطلب أذونات التحرير والكتابة موافقة",
+
+  "toast.model.none.title": "لم يتم تحديد نموذج",
+  "toast.model.none.description": "قم بتوصيل موفر لتلخيص هذه الجلسة",
+
+  "toast.file.loadFailed.title": "فشل تحميل الملف",
+
+  "toast.session.share.copyFailed.title": "فشل نسخ عنوان URL إلى الحافظة",
+  "toast.session.share.success.title": "تمت مشاركة الجلسة",
+  "toast.session.share.success.description": "تم نسخ عنوان URL للمشاركة إلى الحافظة!",
+  "toast.session.share.failed.title": "فشل مشاركة الجلسة",
+  "toast.session.share.failed.description": "حدث خطأ أثناء مشاركة الجلسة",
+
+  "toast.session.unshare.success.title": "تم إلغاء مشاركة الجلسة",
+  "toast.session.unshare.success.description": "تم إلغاء مشاركة الجلسة بنجاح!",
+  "toast.session.unshare.failed.title": "فشل إلغاء مشاركة الجلسة",
+  "toast.session.unshare.failed.description": "حدث خطأ أثناء إلغاء مشاركة الجلسة",
+
+  "toast.session.listFailed.title": "فشل تحميل الجلسات لـ {{project}}",
+
+  "toast.update.title": "تحديث متاح",
+  "toast.update.description": "نسخة جديدة من OpenCode ({{version}}) متاحة الآن للتثبيت.",
+  "toast.update.action.installRestart": "تثبيت وإعادة تشغيل",
+  "toast.update.action.notYet": "ليس الآن",
+
+  "error.page.title": "حدث خطأ ما",
+  "error.page.description": "حدث خطأ أثناء تحميل التطبيق.",
+  "error.page.details.label": "تفاصيل الخطأ",
+  "error.page.action.restart": "إعادة تشغيل",
+  "error.page.action.checking": "جارٍ التحقق...",
+  "error.page.action.checkUpdates": "التحقق من وجود تحديثات",
+  "error.page.action.updateTo": "تحديث إلى {{version}}",
+  "error.page.report.prefix": "يرجى الإبلاغ عن هذا الخطأ لفريق OpenCode",
+  "error.page.report.discord": "على Discord",
+  "error.page.version": "الإصدار: {{version}}",
+
+  "error.dev.rootNotFound":
+    "لم يتم العثور على العنصر الجذري. هل نسيت إضافته إلى index.html؟ أو ربما تمت كتابة سمة id بشكل خاطئ؟",
+
+  "error.globalSync.connectFailed": "تعذر الاتصال بالخادم. هل هناك خادم يعمل في `{{url}}`؟",
+
+  "error.chain.unknown": "خطأ غير معروف",
+  "error.chain.causedBy": "بسبب:",
+  "error.chain.apiError": "خطأ API",
+  "error.chain.status": "الحالة: {{status}}",
+  "error.chain.retryable": "قابل لإعادة المحاولة: {{retryable}}",
+  "error.chain.responseBody": "نص الاستجابة:\n{{body}}",
+  "error.chain.didYouMean": "هل كنت تعني: {{suggestions}}",
+  "error.chain.modelNotFound": "النموذج غير موجود: {{provider}}/{{model}}",
+  "error.chain.checkConfig": "تحقق من أسماء الموفر/النموذج في التكوين (opencode.json)",
+  "error.chain.mcpFailed": 'فشل خادم MCP "{{name}}". لاحظ أن OpenCode لا يدعم مصادقة MCP بعد.',
+  "error.chain.providerAuthFailed": "فشلت مصادقة الموفر ({{provider}}): {{message}}",
+  "error.chain.providerInitFailed": 'فشل تهيئة الموفر "{{provider}}". تحقق من بيانات الاعتماد والتكوين.',
+  "error.chain.configJsonInvalid": "ملف التكوين في {{path}} ليس JSON(C) صالحًا",
+  "error.chain.configJsonInvalidWithMessage": "ملف التكوين في {{path}} ليس JSON(C) صالحًا: {{message}}",
+  "error.chain.configDirectoryTypo":
+    'الدليل "{{dir}}" في {{path}} غير صالح. أعد تسمية الدليل إلى "{{suggestion}}" أو قم بإزالته. هذا خطأ مطبعي شائع.',
+  "error.chain.configFrontmatterError": "فشل تحليل frontmatter في {{path}}:\n{{message}}",
+  "error.chain.configInvalid": "ملف التكوين في {{path}} غير صالح",
+  "error.chain.configInvalidWithMessage": "ملف التكوين في {{path}} غير صالح: {{message}}",
+
+  "notification.permission.title": "مطلوب إذن",
+  "notification.permission.description": "{{sessionTitle}} في {{projectName}} يحتاج إلى إذن",
+  "notification.question.title": "سؤال",
+  "notification.question.description": "{{sessionTitle}} في {{projectName}} لديه سؤال",
+  "notification.action.goToSession": "انتقل إلى الجلسة",
+
+  "notification.session.responseReady.title": "الاستجابة جاهزة",
+  "notification.session.error.title": "خطأ في الجلسة",
+  "notification.session.error.fallbackDescription": "حدث خطأ",
+
+  "home.recentProjects": "المشاريع الحديثة",
+  "home.empty.title": "لا توجد مشاريع حديثة",
+  "home.empty.description": "ابدأ بفتح مشروع محلي",
+
+  "session.tab.session": "جلسة",
+  "session.tab.review": "مراجعة",
+  "session.tab.context": "سياق",
+  "session.review.filesChanged": "تم تغيير {{count}} ملفات",
+  "session.review.loadingChanges": "جارٍ تحميل التغييرات...",
+  "session.review.empty": "لا توجد تغييرات في هذه الجلسة بعد",
+  "session.messages.renderEarlier": "عرض الرسائل السابقة",
+  "session.messages.loadingEarlier": "جارٍ تحميل الرسائل السابقة...",
+  "session.messages.loadEarlier": "تحميل الرسائل السابقة",
+  "session.messages.loading": "جارٍ تحميل الرسائل...",
+  "session.messages.jumpToLatest": "الانتقال إلى الأحدث",
+
+  "session.context.addToContext": "إضافة {{selection}} إلى السياق",
+
+  "session.new.worktree.main": "الفرع الرئيسي",
+  "session.new.worktree.mainWithBranch": "الفرع الرئيسي ({{branch}})",
+  "session.new.worktree.create": "إنشاء شجرة عمل جديدة",
+  "session.new.lastModified": "آخر تعديل",
+
+  "session.header.search.placeholder": "بحث {{project}}",
+
+  "session.share.popover.title": "نشر على الويب",
+  "session.share.popover.description.shared": "هذه الجلسة عامة على الويب. يمكن لأي شخص لديه الرابط الوصول إليها.",
+  "session.share.popover.description.unshared": "شارك الجلسة علنًا على الويب. ستكون متاحة لأي شخص لديه الرابط.",
+  "session.share.action.share": "مشاركة",
+  "session.share.action.publish": "نشر",
+  "session.share.action.publishing": "جارٍ النشر...",
+  "session.share.action.unpublish": "إلغاء النشر",
+  "session.share.action.unpublishing": "جارٍ إلغاء النشر...",
+  "session.share.action.view": "عرض",
+  "session.share.copy.copied": "تم النسخ",
+  "session.share.copy.copyLink": "نسخ الرابط",
+
+  "lsp.tooltip.none": "لا توجد خوادم LSP",
+  "lsp.label.connected": "{{count}} LSP",
+
+  "prompt.loading": "جارٍ تحميل الموجه...",
+  "terminal.loading": "جارٍ تحميل المحطة الطرفية...",
+  "terminal.title": "محطة طرفية",
+  "terminal.title.numbered": "محطة طرفية {{number}}",
+  "terminal.connectionLost.title": "فقد الاتصال",
+  "terminal.connectionLost.description": "انقطع اتصال المحطة الطرفية. يمكن أن يحدث هذا عند إعادة تشغيل الخادم.",
+
+  "common.closeTab": "إغلاق علامة التبويب",
+  "common.dismiss": "رفض",
+  "common.requestFailed": "فشل الطلب",
+  "common.moreOptions": "مزيد من الخيارات",
+  "common.learnMore": "اعرف المزيد",
+  "common.rename": "إعادة تسمية",
+  "common.reset": "إعادة تعيين",
+  "common.delete": "حذف",
+  "common.close": "إغلاق",
+  "common.edit": "تحرير",
+  "common.loadMore": "تحميل المزيد",
+  "common.key.esc": "ESC",
+
+  "sidebar.menu.toggle": "تبديل القائمة",
+  "sidebar.settings": "الإعدادات",
+  "sidebar.help": "مساعدة",
+  "sidebar.workspaces.enable": "تمكين مساحات العمل",
+  "sidebar.workspaces.disable": "تعطيل مساحات العمل",
+  "sidebar.gettingStarted.title": "البدء",
+  "sidebar.gettingStarted.line1": "يتضمن OpenCode نماذج مجانية حتى تتمكن من البدء فورًا.",
+  "sidebar.gettingStarted.line2": "قم بتوصيل أي موفر لاستخدام النماذج، بما في ذلك Claude و GPT و Gemini وما إلى ذلك.",
+  "sidebar.project.recentSessions": "الجلسات الحديثة",
+  "sidebar.project.viewAllSessions": "عرض جميع الجلسات",
+
+  "settings.section.desktop": "سطح المكتب",
+  "settings.tab.general": "عام",
+  "settings.tab.shortcuts": "اختصارات",
+
+  "settings.general.section.appearance": "المظهر",
+  "settings.general.section.notifications": "إشعارات النظام",
+  "settings.general.section.sounds": "المؤثرات الصوتية",
+
+  "settings.general.row.language.title": "اللغة",
+  "settings.general.row.language.description": "تغيير لغة العرض لـ OpenCode",
+  "settings.general.row.appearance.title": "المظهر",
+  "settings.general.row.appearance.description": "تخصيص كيفية ظهور OpenCode على جهازك",
+  "settings.general.row.theme.title": "السمة",
+  "settings.general.row.theme.description": "تخصيص سمة OpenCode.",
+  "settings.general.row.font.title": "الخط",
+  "settings.general.row.font.description": "تخصيص الخط الأحادي المستخدم في كتل التعليمات البرمجية",
+  "font.option.ibmPlexMono": "IBM Plex Mono",
+  "font.option.cascadiaCode": "Cascadia Code",
+  "font.option.firaCode": "Fira Code",
+  "font.option.hack": "Hack",
+  "font.option.inconsolata": "Inconsolata",
+  "font.option.intelOneMono": "Intel One Mono",
+  "font.option.jetbrainsMono": "JetBrains Mono",
+  "font.option.mesloLgs": "Meslo LGS",
+  "font.option.robotoMono": "Roboto Mono",
+  "font.option.sourceCodePro": "Source Code Pro",
+  "font.option.ubuntuMono": "Ubuntu Mono",
+  "sound.option.alert01": "تنبيه 01",
+  "sound.option.alert02": "تنبيه 02",
+  "sound.option.alert03": "تنبيه 03",
+  "sound.option.alert04": "تنبيه 04",
+  "sound.option.alert05": "تنبيه 05",
+  "sound.option.alert06": "تنبيه 06",
+  "sound.option.alert07": "تنبيه 07",
+  "sound.option.alert08": "تنبيه 08",
+  "sound.option.alert09": "تنبيه 09",
+  "sound.option.alert10": "تنبيه 10",
+  "sound.option.bipbop01": "بيب بوب 01",
+  "sound.option.bipbop02": "بيب بوب 02",
+  "sound.option.bipbop03": "بيب بوب 03",
+  "sound.option.bipbop04": "بيب بوب 04",
+  "sound.option.bipbop05": "بيب بوب 05",
+  "sound.option.bipbop06": "بيب بوب 06",
+  "sound.option.bipbop07": "بيب بوب 07",
+  "sound.option.bipbop08": "بيب بوب 08",
+  "sound.option.bipbop09": "بيب بوب 09",
+  "sound.option.bipbop10": "بيب بوب 10",
+  "sound.option.staplebops01": "ستابل بوبس 01",
+  "sound.option.staplebops02": "ستابل بوبس 02",
+  "sound.option.staplebops03": "ستابل بوبس 03",
+  "sound.option.staplebops04": "ستابل بوبس 04",
+  "sound.option.staplebops05": "ستابل بوبس 05",
+  "sound.option.staplebops06": "ستابل بوبس 06",
+  "sound.option.staplebops07": "ستابل بوبس 07",
+  "sound.option.nope01": "كلا 01",
+  "sound.option.nope02": "كلا 02",
+  "sound.option.nope03": "كلا 03",
+  "sound.option.nope04": "كلا 04",
+  "sound.option.nope05": "كلا 05",
+  "sound.option.nope06": "كلا 06",
+  "sound.option.nope07": "كلا 07",
+  "sound.option.nope08": "كلا 08",
+  "sound.option.nope09": "كلا 09",
+  "sound.option.nope10": "كلا 10",
+  "sound.option.nope11": "كلا 11",
+  "sound.option.nope12": "كلا 12",
+  "sound.option.yup01": "نعم 01",
+  "sound.option.yup02": "نعم 02",
+  "sound.option.yup03": "نعم 03",
+  "sound.option.yup04": "نعم 04",
+  "sound.option.yup05": "نعم 05",
+  "sound.option.yup06": "نعم 06",
+
+  "settings.general.notifications.agent.title": "وكيل",
+  "settings.general.notifications.agent.description": "عرض إشعار النظام عندما يكتمل الوكيل أو يحتاج إلى اهتمام",
+  "settings.general.notifications.permissions.title": "أذونات",
+  "settings.general.notifications.permissions.description": "عرض إشعار النظام عند الحاجة إلى إذن",
+  "settings.general.notifications.errors.title": "أخطاء",
+  "settings.general.notifications.errors.description": "عرض إشعار النظام عند حدوث خطأ",
+
+  "settings.general.sounds.agent.title": "وكيل",
+  "settings.general.sounds.agent.description": "تشغيل صوت عندما يكتمل الوكيل أو يحتاج إلى اهتمام",
+  "settings.general.sounds.permissions.title": "أذونات",
+  "settings.general.sounds.permissions.description": "تشغيل صوت عند الحاجة إلى إذن",
+  "settings.general.sounds.errors.title": "أخطاء",
+  "settings.general.sounds.errors.description": "تشغيل صوت عند حدوث خطأ",
+
+  "settings.shortcuts.title": "اختصارات لوحة المفاتيح",
+  "settings.shortcuts.reset.button": "إعادة التعيين إلى الافتراضيات",
+  "settings.shortcuts.reset.toast.title": "تم إعادة تعيين الاختصارات",
+  "settings.shortcuts.reset.toast.description": "تم إعادة تعيين اختصارات لوحة المفاتيح إلى الافتراضيات.",
+  "settings.shortcuts.conflict.title": "الاختصار قيد الاستخدام بالفعل",
+  "settings.shortcuts.conflict.description": "{{keybind}} معين بالفعل لـ {{titles}}.",
+  "settings.shortcuts.unassigned": "غير معين",
+  "settings.shortcuts.pressKeys": "اضغط على المفاتيح",
+  "settings.shortcuts.search.placeholder": "البحث في الاختصارات",
+  "settings.shortcuts.search.empty": "لم يتم العثور على اختصارات",
+
+  "settings.shortcuts.group.general": "عام",
+  "settings.shortcuts.group.session": "جلسة",
+  "settings.shortcuts.group.navigation": "تصفح",
+  "settings.shortcuts.group.modelAndAgent": "النموذج والوكيل",
+  "settings.shortcuts.group.terminal": "المحطة الطرفية",
+  "settings.shortcuts.group.prompt": "موجه",
+
+  "settings.providers.title": "الموفرون",
+  "settings.providers.description": "ستكون إعدادات الموفر قابلة للتكوين هنا.",
+  "settings.models.title": "النماذج",
+  "settings.models.description": "ستكون إعدادات النموذج قابلة للتكوين هنا.",
+  "settings.agents.title": "الوكلاء",
+  "settings.agents.description": "ستكون إعدادات الوكيل قابلة للتكوين هنا.",
+  "settings.commands.title": "الأوامر",
+  "settings.commands.description": "ستكون إعدادات الأمر قابلة للتكوين هنا.",
+  "settings.mcp.title": "MCP",
+  "settings.mcp.description": "ستكون إعدادات MCP قابلة للتكوين هنا.",
+
+  "settings.permissions.title": "الأذونات",
+  "settings.permissions.description": "تحكم في الأدوات التي يمكن للخادم استخدامها بشكل افتراضي.",
+  "settings.permissions.section.tools": "الأدوات",
+  "settings.permissions.toast.updateFailed.title": "فشل تحديث الأذونات",
+
+  "settings.permissions.action.allow": "سماح",
+  "settings.permissions.action.ask": "سؤال",
+  "settings.permissions.action.deny": "رفض",
+
+  "settings.permissions.tool.read.title": "قراءة",
+  "settings.permissions.tool.read.description": "قراءة ملف (يطابق مسار الملف)",
+  "settings.permissions.tool.edit.title": "تحرير",
+  "settings.permissions.tool.edit.description":
+    "تعديل الملفات، بما في ذلك التحرير والكتابة والتصحيحات والتحرير المتعدد",
+  "settings.permissions.tool.glob.title": "Glob",
+  "settings.permissions.tool.glob.description": "مطابقة الملفات باستخدام أنماط glob",
+  "settings.permissions.tool.grep.title": "Grep",
+  "settings.permissions.tool.grep.description": "البحث في محتويات الملف باستخدام التعبيرات العادية",
+  "settings.permissions.tool.list.title": "قائمة",
+  "settings.permissions.tool.list.description": "سرد الملفات داخل دليل",
+  "settings.permissions.tool.bash.title": "Bash",
+  "settings.permissions.tool.bash.description": "تشغيل أوامر shell",
+  "settings.permissions.tool.task.title": "Task",
+  "settings.permissions.tool.task.description": "تشغيل الوكلاء الفرعيين",
+  "settings.permissions.tool.skill.title": "Skill",
+  "settings.permissions.tool.skill.description": "تحميل مهارة بالاسم",
+  "settings.permissions.tool.lsp.title": "LSP",
+  "settings.permissions.tool.lsp.description": "تشغيل استعلامات خادم اللغة",
+  "settings.permissions.tool.todoread.title": "قراءة المهام",
+  "settings.permissions.tool.todoread.description": "قراءة قائمة المهام",
+  "settings.permissions.tool.todowrite.title": "كتابة المهام",
+  "settings.permissions.tool.todowrite.description": "تحديث قائمة المهام",
+  "settings.permissions.tool.webfetch.title": "جلب الويب",
+  "settings.permissions.tool.webfetch.description": "جلب محتوى من عنوان URL",
+  "settings.permissions.tool.websearch.title": "بحث الويب",
+  "settings.permissions.tool.websearch.description": "البحث في الويب",
+  "settings.permissions.tool.codesearch.title": "بحث الكود",
+  "settings.permissions.tool.codesearch.description": "البحث عن كود على الويب",
+  "settings.permissions.tool.external_directory.title": "دليل خارجي",
+  "settings.permissions.tool.external_directory.description": "الوصول إلى الملفات خارج دليل المشروع",
+  "settings.permissions.tool.doom_loop.title": "حلقة الموت",
+  "settings.permissions.tool.doom_loop.description": "اكتشاف استدعاءات الأدوات المتكررة بمدخلات متطابقة",
+
+  "workspace.new": "مساحة عمل جديدة",
+  "workspace.type.local": "محلي",
+  "workspace.type.sandbox": "صندوق رمل",
+  "workspace.create.failed.title": "فشل إنشاء مساحة العمل",
+  "workspace.delete.failed.title": "فشل حذف مساحة العمل",
+  "workspace.resetting.title": "إعادة تعيين مساحة العمل",
+  "workspace.resetting.description": "قد يستغرق هذا دقيقة.",
+  "workspace.reset.failed.title": "فشل إعادة تعيين مساحة العمل",
+  "workspace.reset.success.title": "تمت إعادة تعيين مساحة العمل",
+  "workspace.reset.success.description": "مساحة العمل تطابق الآن الفرع الافتراضي.",
+  "workspace.status.checking": "التحقق من التغييرات غير المدمجة...",
+  "workspace.status.error": "تعذر التحقق من حالة git.",
+  "workspace.status.clean": "لم يتم اكتشاف تغييرات غير مدمجة.",
+  "workspace.status.dirty": "تم اكتشاف تغييرات غير مدمجة في مساحة العمل هذه.",
+  "workspace.delete.title": "حذف مساحة العمل",
+  "workspace.delete.confirm": 'حذف مساحة العمل "{{name}}"؟',
+  "workspace.delete.button": "حذف مساحة العمل",
+  "workspace.reset.title": "إعادة تعيين مساحة العمل",
+  "workspace.reset.confirm": 'إعادة تعيين مساحة العمل "{{name}}"؟',
+  "workspace.reset.button": "إعادة تعيين مساحة العمل",
+  "workspace.reset.archived.none": "لن تتم أرشفة أي جلسات نشطة.",
+  "workspace.reset.archived.one": "ستتم أرشفة جلسة واحدة.",
+  "workspace.reset.archived.many": "ستتم أرشفة {{count}} جلسات.",
+  "workspace.reset.note": "سيؤدي هذا إلى إعادة تعيين مساحة العمل لتتطابق مع الفرع الافتراضي.",
+}

+ 1 - 0
packages/app/src/i18n/da.ts

@@ -279,6 +279,7 @@ export const dict = {
   "language.da": "Dansk",
   "language.da": "Dansk",
   "language.ru": "Russisk",
   "language.ru": "Russisk",
   "language.pl": "Polsk",
   "language.pl": "Polsk",
+  "language.ar": "Arabisk",
 
 
   "toast.language.title": "Sprog",
   "toast.language.title": "Sprog",
   "toast.language.description": "Skiftede til {{language}}",
   "toast.language.description": "Skiftede til {{language}}",

+ 2 - 0
packages/app/src/i18n/de.ts

@@ -284,6 +284,8 @@ export const dict = {
   "language.da": "Dänisch",
   "language.da": "Dänisch",
   "language.ru": "Russisch",
   "language.ru": "Russisch",
   "language.pl": "Polnisch",
   "language.pl": "Polnisch",
+  "language.ru": "Russisch",
+  "language.ar": "Arabisch",
 
 
   "toast.language.title": "Sprache",
   "toast.language.title": "Sprache",
   "toast.language.description": "Zu {{language}} gewechselt",
   "toast.language.description": "Zu {{language}} gewechselt",

+ 1 - 0
packages/app/src/i18n/en.ts

@@ -296,6 +296,7 @@ export const dict = {
   "language.da": "Danish",
   "language.da": "Danish",
   "language.ru": "Russian",
   "language.ru": "Russian",
   "language.pl": "Polish",
   "language.pl": "Polish",
+  "language.ar": "Arabic",
 
 
   "toast.language.title": "Language",
   "toast.language.title": "Language",
   "toast.language.description": "Switched to {{language}}",
   "toast.language.description": "Switched to {{language}}",

+ 2 - 0
packages/app/src/i18n/es.ts

@@ -279,6 +279,8 @@ export const dict = {
   "language.da": "Danés",
   "language.da": "Danés",
   "language.ru": "Ruso",
   "language.ru": "Ruso",
   "language.pl": "Polaco",
   "language.pl": "Polaco",
+  "language.ru": "Ruso",
+  "language.ar": "Árabe",
 
 
   "toast.language.title": "Idioma",
   "toast.language.title": "Idioma",
   "toast.language.description": "Cambiado a {{language}}",
   "toast.language.description": "Cambiado a {{language}}",

+ 2 - 0
packages/app/src/i18n/fr.ts

@@ -279,6 +279,8 @@ export const dict = {
   "language.da": "Danois",
   "language.da": "Danois",
   "language.ru": "Russe",
   "language.ru": "Russe",
   "language.pl": "Polonais",
   "language.pl": "Polonais",
+  "language.ru": "Russe",
+  "language.ar": "Arabe",
 
 
   "toast.language.title": "Langue",
   "toast.language.title": "Langue",
   "toast.language.description": "Passé à {{language}}",
   "toast.language.description": "Passé à {{language}}",

+ 2 - 0
packages/app/src/i18n/ja.ts

@@ -277,6 +277,8 @@ export const dict = {
   "language.da": "デンマーク語",
   "language.da": "デンマーク語",
   "language.ru": "ロシア語",
   "language.ru": "ロシア語",
   "language.pl": "ポーランド語",
   "language.pl": "ポーランド語",
+  "language.ru": "ロシア語",
+  "language.ar": "アラビア語",
 
 
   "toast.language.title": "言語",
   "toast.language.title": "言語",
   "toast.language.description": "{{language}}に切り替えました",
   "toast.language.description": "{{language}}に切り替えました",

+ 2 - 0
packages/app/src/i18n/ko.ts

@@ -281,6 +281,8 @@ export const dict = {
   "language.da": "덴마크어",
   "language.da": "덴마크어",
   "language.ru": "러시아어",
   "language.ru": "러시아어",
   "language.pl": "폴란드어",
   "language.pl": "폴란드어",
+  "language.ru": "러시아어",
+  "language.ar": "아랍어",
 
 
   "toast.language.title": "언어",
   "toast.language.title": "언어",
   "toast.language.description": "{{language}}(으)로 전환됨",
   "toast.language.description": "{{language}}(으)로 전환됨",

+ 2 - 0
packages/app/src/i18n/pl.ts

@@ -294,6 +294,8 @@ export const dict = {
   "language.ja": "Japoński",
   "language.ja": "Japoński",
   "language.da": "Duński",
   "language.da": "Duński",
   "language.pl": "Polski",
   "language.pl": "Polski",
+  "language.ru": "Rosyjski",
+  "language.ar": "Arabski",
 
 
   "toast.language.title": "Język",
   "toast.language.title": "Język",
   "toast.language.description": "Przełączono na {{language}}",
   "toast.language.description": "Przełączono na {{language}}",

+ 1 - 0
packages/app/src/i18n/ru.ts

@@ -295,6 +295,7 @@ export const dict = {
   "language.ja": "Японский",
   "language.ja": "Японский",
   "language.da": "Датский",
   "language.da": "Датский",
   "language.ru": "Русский",
   "language.ru": "Русский",
+  "language.ar": "Арабский",
 
 
   "toast.language.title": "Язык",
   "toast.language.title": "Язык",
   "toast.language.description": "Переключено на {{language}}",
   "toast.language.description": "Переключено на {{language}}",

+ 2 - 0
packages/app/src/i18n/zh.ts

@@ -277,6 +277,8 @@ export const dict = {
   "language.da": "丹麦语",
   "language.da": "丹麦语",
   "language.ru": "俄语",
   "language.ru": "俄语",
   "language.pl": "波兰语",
   "language.pl": "波兰语",
+  "language.ru": "俄语",
+  "language.ar": "阿拉伯语",
 
 
   "toast.language.title": "语言",
   "toast.language.title": "语言",
   "toast.language.description": "已切换到{{language}}",
   "toast.language.description": "已切换到{{language}}",

+ 2 - 0
packages/app/src/i18n/zht.ts

@@ -272,6 +272,8 @@ export const dict = {
   "language.zh": "簡體中文",
   "language.zh": "簡體中文",
   "language.zht": "繁體中文",
   "language.zht": "繁體中文",
   "language.ko": "韓語",
   "language.ko": "韓語",
+  "language.ru": "俄語",
+  "language.ar": "阿拉伯語",
 
 
   "toast.language.title": "語言",
   "toast.language.title": "語言",
   "toast.language.description": "已切換到 {{language}}",
   "toast.language.description": "已切換到 {{language}}",

+ 90 - 0
packages/ui/src/i18n/ar.ts

@@ -0,0 +1,90 @@
+export const dict = {
+  "ui.sessionReview.title": "تغييرات الجلسة",
+  "ui.sessionReview.diffStyle.unified": "موجد",
+  "ui.sessionReview.diffStyle.split": "منقسم",
+  "ui.sessionReview.expandAll": "توسيع الكل",
+  "ui.sessionReview.collapseAll": "طي الكل",
+
+  "ui.sessionTurn.steps.show": "إظهار الخطوات",
+  "ui.sessionTurn.steps.hide": "إخفاء الخطوات",
+  "ui.sessionTurn.summary.response": "استجابة",
+  "ui.sessionTurn.diff.showMore": "إظهار المزيد من التغييرات ({{count}})",
+
+  "ui.sessionTurn.retry.retrying": "إعادة المحاولة",
+  "ui.sessionTurn.retry.inSeconds": "خلال {{seconds}} ثواني",
+
+  "ui.sessionTurn.status.delegating": "تفويض العمل",
+  "ui.sessionTurn.status.planning": "تخطيط الخطوات التالية",
+  "ui.sessionTurn.status.gatheringContext": "جمع السياق",
+  "ui.sessionTurn.status.searchingCodebase": "البحث في قاعدة التعليمات البرمجية",
+  "ui.sessionTurn.status.searchingWeb": "البحث في الويب",
+  "ui.sessionTurn.status.makingEdits": "إجراء تعديلات",
+  "ui.sessionTurn.status.runningCommands": "تشغيل الأوامر",
+  "ui.sessionTurn.status.thinking": "تفكير",
+  "ui.sessionTurn.status.thinkingWithTopic": "تفكير - {{topic}}",
+  "ui.sessionTurn.status.gatheringThoughts": "جمع الأفكار",
+  "ui.sessionTurn.status.consideringNextSteps": "النظر في الخطوات التالية",
+
+  "ui.messagePart.diagnostic.error": "خطأ",
+  "ui.messagePart.title.edit": "تحرير",
+  "ui.messagePart.title.write": "كتابة",
+  "ui.messagePart.option.typeOwnAnswer": "اكتب إجابتك الخاصة",
+  "ui.messagePart.review.title": "مراجعة إجاباتك",
+
+  "ui.list.loading": "جارٍ التحميل",
+  "ui.list.empty": "لا توجد نتائج",
+  "ui.list.emptyWithFilter.prefix": "لا توجد نتائج لـ",
+  "ui.list.emptyWithFilter.suffix": "",
+
+  "ui.messageNav.newMessage": "رسالة جديدة",
+
+  "ui.textField.copyToClipboard": "نسخ إلى الحافظة",
+  "ui.textField.copied": "تم النسخ",
+
+  "ui.imagePreview.alt": "معاينة الصورة",
+
+  "ui.tool.read": "قراءة",
+  "ui.tool.list": "قائمة",
+  "ui.tool.glob": "Glob",
+  "ui.tool.grep": "Grep",
+  "ui.tool.webfetch": "جلب الويب",
+  "ui.tool.shell": "Shell",
+  "ui.tool.patch": "تصحيح",
+  "ui.tool.todos": "المهام",
+  "ui.tool.todos.read": "قراءة المهام",
+  "ui.tool.questions": "أسئلة",
+  "ui.tool.agent": "وكيل {{type}}",
+
+  "ui.common.file.one": "ملف",
+  "ui.common.file.other": "ملفات",
+  "ui.common.question.one": "سؤال",
+  "ui.common.question.other": "أسئلة",
+
+  "ui.common.add": "إضافة",
+  "ui.common.cancel": "إلغاء",
+  "ui.common.confirm": "تأكيد",
+  "ui.common.dismiss": "رفض",
+  "ui.common.next": "التالي",
+  "ui.common.submit": "إرسال",
+
+  "ui.permission.deny": "رفض",
+  "ui.permission.allowAlways": "السماح دائمًا",
+  "ui.permission.allowOnce": "السماح مرة واحدة",
+
+  "ui.message.expand": "توسيع الرسالة",
+  "ui.message.collapse": "طي الرسالة",
+  "ui.message.copy": "نسخ",
+  "ui.message.copied": "تم النسخ!",
+  "ui.message.attachment.alt": "مرفق",
+
+  "ui.patch.action.deleted": "محذوف",
+  "ui.patch.action.created": "تم الإنشاء",
+  "ui.patch.action.moved": "منقول",
+  "ui.patch.action.patched": "مصحح",
+
+  "ui.question.subtitle.answered": "{{count}} أجيب",
+  "ui.question.answer.none": "(لا توجد إجابة)",
+  "ui.question.review.notAnswered": "(لم يتم الرد)",
+  "ui.question.multiHint": "(حدد كل ما ينطبق)",
+  "ui.question.custom.placeholder": "اكتب إجابتك...",
+}