hermes-agent/web/src/i18n/ar.ts
Brooklyn Nicholson e39e3fb011 feat(web): add Arabic (ar) locale with RTL support
Adds the Arabic catalog to the dashboard, registers it in the locale list
and picker, and flips the document direction to RTL when Arabic is active.
Introduces a `defineLocale` merge helper (mirroring the desktop app) so the
Arabic catalog can be a partial override that falls back to English for any
untranslated key instead of hand-porting every future string.

Co-authored-by: morolab <ahmedmoro@gmail.com>
2026-07-24 12:10:00 -05:00

701 lines
32 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import { defineLocale } from "./define-locale";
export const ar = defineLocale({
common: {
save: "حفظ",
saving: "جاري الحفظ...",
cancel: "إلغاء",
close: "إغلاق",
confirm: "تأكيد",
delete: "حذف",
refresh: "تحديث",
retry: "إعادة المحاولة",
search: "بحث...",
loading: "جاري التحميل...",
create: "إنشاء",
creating: "جاري الإنشاء...",
set: "تعيين",
replace: "استبدال",
clear: "مسح",
live: "مباشر",
off: "مغلق",
enabled: "مفعّل",
disabled: "معطّل",
active: "نشط",
inactive: "غير نشط",
unknown: "غير معروف",
untitled: "بدون عنوان",
none: "لا يوجد",
form: "نموذج",
noResults: "لا توجد نتائج",
of: "من",
page: "صفحة",
msgs: "رسائل",
tools: "أدوات",
match: "مطابقة",
other: "آخر",
configured: "مكوَّن",
removed: "مزال",
failedToToggle: "فشل التبديل",
failedToRemove: "فشل الحذف",
failedToReveal: "فشل الإظهار",
collapse: "طي",
expand: "توسيع",
general: "عام",
messaging: "مراسلة",
pluginLoadFailed:
"تعذر تحميل سكربت هذا المكوِّن الإضافي. تفقَّد علامة الشبكة (dashboard-plugins/…) ومسار ملحقات الخادم.",
pluginNotRegistered:
"لم يستدعِ سكربت المكوِّن الإضافي register()، أو حدث خطأ في السكربت. افتح وحدة تحكم المتصفح للتفاصيل.",
},
app: {
brand: "Hermes Agent",
brandShort: "HA",
closeNavigation: "إغلاق التنقل",
closeModelTools: "إغلاق النموذج والأدوات",
footer: {
org: "Nous Research",
},
activeSessionsLabel: "الجلسات النشطة:",
gatewayStatusLabel: "حالة البوابة:",
gatewayStrip: {
failed: "فشل البدء",
off: "مغلق",
running: "يعمل",
starting: "قيد البدء",
stopped: "متوقف",
},
nav: {
analytics: "التحليلات",
chat: "المحادثة",
config: "الإعدادات",
cron: "المهام المجدولة",
documentation: "التوثيق",
keys: "المفاتيح",
logs: "السجلات",
models: "النماذج",
profiles: "الملفات الشخصية",
plugins: "المكوِّنات الإضافية",
sessions: "الجلسات",
skills: "المهارات",
},
modelToolsSheetSubtitle: "& أدوات",
modelToolsSheetTitle: "النموذج",
navigation: "التنقل",
openDocumentation: "فتح التوثيق في تبويب جديد",
openNavigation: "فتح التنقل",
pluginNavSection: "المكوِّنات الإضافية",
sessionsActiveCount: "{count} نشطة",
statusOverview: "نظرة عامة على الحالة",
system: "النظام",
webUi: "واجهة الويب",
},
status: {
actionFailed: "فشلت الإجراء",
actionFinished: "انتهى",
actions: "إجراءات",
agent: "العامل",
activeSessions: "الجلسات النشطة",
connected: "متصل",
connectedPlatforms: "المنصات المتصلة",
disconnected: "غير متصل",
error: "خطأ",
failed: "فشل",
gateway: "البوابة",
gatewayFailedToStart: "فشل بدء البوابة",
lastUpdate: "آخر تحديث",
noneRunning: "لا شيء",
notRunning: "لا يعمل",
pid: "PID",
platformDisconnected: "غير متصل",
platformError: "خطأ",
recentSessions: "الجلسات الأخيرة",
restartGateway: "إعادة تشغيل البوابة",
restartingGateway: "إعادة تشغيل البوابة…",
running: "يعمل",
runningRemote: "يعمل (عن بعد)",
startFailed: "فشل البدء",
starting: "قيد البدء",
startedInBackground: "بدء في الخلفية — تحقق من السجلات للتقدم",
stopped: "متوقف",
updateHermes: "تحديث Hermes",
updatingHermes: "جاري تحديث Hermes…",
waitingForOutput: "في انتظار الناتج…",
},
sessions: {
title: "الجلسات",
searchPlaceholder: "بحث في محتوى الرسائل...",
noSessions: "لا توجد جلسات حتى الآن",
noMatch: "لا توجد جلسات تطابق بحثك",
startConversation: "ابدأ محادثة لتظهر هنا",
noMessages: "لا توجد رسائل",
untitledSession: "جلسة بدون عنوان",
deleteSession: "حذف الجلسة",
confirmDeleteTitle: "حذف الجلسة؟",
confirmDeleteMessage:
"سيزيل هذا نهائيًا المحادثة وجميع رسائلها. لا يمكن التراجع عن هذا الإجراء.",
sessionDeleted: "تم حذف الجلسة",
failedToDelete: "فشل حذف الجلسة",
resumeInChat: "استئناف في المحادثة",
previousPage: "الصفحة السابقة",
nextPage: "الصفحة التالية",
roles: {
user: "المستخدم",
assistant: "المساعد",
system: "النظام",
tool: "أداة",
},
},
analytics: {
period: "الفترة:",
totalTokens: "إجمالي الرموز",
totalSessions: "إجمالي الجلسات",
apiCalls: "استدعاءات API",
dailyTokenUsage: "استخدام الرموز اليومي",
dailyBreakdown: "التفصيل اليومي",
perModelBreakdown: "التفصيل حسب النموذج",
topSkills: "أعلى المهارات استخدامًا",
skill: "مهارة",
loads: "تم تحميل العامل",
edits: "تم إدارة العامل",
lastUsed: "آخر استخدام",
input: "إدخال",
output: "إخراج",
total: "الإجمالي",
noUsageData: "لا توجد بيانات استخدام لهذه الفترة",
startSession: "ابدأ جلسة لرؤية التحليلات هنا",
date: "التاريخ",
model: "النموذج",
tokens: "رموز",
perDayAvg: "في اليوم (متوسط)",
acrossModels: "عبر {count} نموذج",
inOut: "{input} إدخال / {output} إخراج",
},
models: {
modelsUsed: "النماذج المستخدمة",
estimatedCost: "التكلفة التقريبية",
tokens: "رموز",
sessions: "جلسات",
avgPerSession: "متوسط/جلسة",
apiCalls: "استدعاءات API",
toolCalls: "استدعاءات الأدوات",
noModelsData: "لا توجد بيانات نموذج لهذه الفترة",
startSession: "ابدأ جلسة لرؤية بيانات النماذج هنا",
},
logs: {
title: "السجلات",
autoRefresh: "تحديث تلقائي",
file: "ملف",
level: "المستوى",
component: "المكوِّن",
lines: "الأسطر",
noLogLines: "لم يُعثر على أسطر سجل",
},
cron: {
confirmDeleteMessage:
"يزيل هذا المهمة من الجدولة. لا يمكن التراجع عن الإجراء.",
confirmDeleteTitle: "حذف المهمة المجدولة؟",
newJob: "مهمة cron جديدة",
nameOptional: "الاسم (اختياري)",
namePlaceholder: "مثال: ملخص يومي",
prompt: "المطالبة",
promptPlaceholder: "ماذا يجب أن يفعل العامل في كل تشغيل؟",
schedule: "الجدولة (تعبير cron)",
schedulePlaceholder: "0 9 * * *",
deliverTo: "التسليم إلى",
scheduledJobs: "المهام المجدولة",
noJobs: "لم يتم تكوين أي مهام cron. أنشئ واحدة أعلاه.",
last: "آخر",
next: "التالي",
pause: "إيقاف مؤقت",
resume: "استئناف",
triggerNow: "تشغيل الآن",
delivery: {
local: "محلي",
telegram: "Telegram",
discord: "Discord",
slack: "Slack",
email: "البريد الإلكتروني",
},
},
profiles: {
newProfile: "ملف شخصي جديد",
name: "الاسم",
namePlaceholder: "مثال: coder, writer, إلخ.",
nameRequired: "الاسم مطلوب",
nameRule:
"حروف صغيرة، أرقام، _ و - فقط؛ يجب البدء بحرف أو رقم؛ حتى 64 حرفًا.",
invalidName: "اسم ملف شخصي غير صالح",
allProfiles: "الملفات الشخصية",
noProfiles: "لم يُعثر على ملفات شخصية.",
defaultBadge: "افتراضي",
hasEnv: "env",
model: "النموذج",
skills: "المهارات",
rename: "إعادة تسمية",
editSoul: "تعديل SOUL.md",
soulSection: "SOUL.md (شخصية / موجه النظام)",
soulPlaceholder: "# كيف يجب أن يتصرف هذا العامل…",
saveSoul: "حفظ SOUL",
soulSaved: "تم حفظ SOUL.md",
openInTerminal: "نسخ أمر CLI",
commandCopied: "تم النسخ إلى الحافظة",
copyFailed: "تعذر النسخ",
confirmDeleteTitle: "حذف الملف الشخصي؟",
confirmDeleteMessage:
"هذا يحذف نهائيًا الملف الشخصي '{name}' — الإعدادات، المفاتيح، الذكريات، الجلسات، المهارات، مهام cron. لا يمكن التراجع عن الإجراء.",
created: "تم الإنشاء",
deleted: "تم الحذف",
renamed: "تمت إعادة التسمية",
},
pluginsPage: {
contextEngineLabel: "محرك السياق",
dashboardSlots: "فتحات لوحة التحكم",
disableRuntime: "تعطيل",
enableAfterInstall: "تفعيل بعد التثبيت",
enableRuntime: "تفعيل",
forceReinstall: "إعادة تثبيت إجباري (حذف المجلد الموجود أولاً)",
headline:
"اكتشف وثبِّت وفعِّل وحدِّث مكوِّنات Hermes الإضافية (مطابقة `hermes plugins`).",
identifierLabel: "رابط Git أو owner/repo",
inactive: "غير نشط",
installBtn: "تثبيت من Git",
installHeading: "تثبيت من GitHub / رابط Git",
installHint: "استخدم اختصار owner/repo أو رابط استنساخ كامل يبدأ بـ https:// أو git@.",
memoryProviderLabel: "مزوِّد الذاكرة",
missingEnvWarn: "عيّن هذه المتغيرات في المفاتيح قبل أن يتمكن المكوِّن الإضافي من العمل:",
noDashboardTab: "لا يوجد تبويب لوحة تحكم",
openTab: "فتح",
orphanHeading: "امتدادات لوحة التحكم فقط (لا يوجد تطابق plugin.yaml للعامل)",
pluginListHeading: "المكوِّنات الإضافية المثبتة",
providerDefaults: "مدمج / افتراضي",
providersHeading: "مكوِّنات مزوِّدات وقت التشغيل",
providersHint:
"يكتب memory.provider (فارغ = مدمج) و context.engine إلى config.yaml. يسري في الجلسة التالية.",
refreshDashboard: "إعادة فحص امتدادات لوحة التحكم",
removeConfirm: "إزالة هذا المكوِّن الإضافي من ~/.hermes/plugins/؟",
removeHint: "يمكن إزالة المكوِّنات المثبتة من المستخدم تحت ~/.hermes/plugins فقط.",
rescanHeading: "سجل مكوِّنات SPA",
rescanHint: "أعد الفحص بعد إضافة ملفات على القرص لتمكن الشريط الجانبي من التقاط المخطوطات الجديدة.",
runtimeHeading: "وقت تشغيل البوابة (مكوِّنات YAML)",
saveProviders: "حفظ إعدادات مزوِّد الذاكرة",
savedProviders: "تم حفظ إعدادات مزوِّد الذاكرة.",
sourceBadge: "المصدر",
authRequired: "مصادقة مطلوبة",
authRequiredHint: "شغِّل هذا الأمر للمصادقة:",
updateGit: "سحب من Git",
versionBadge: "الإصدار",
showInSidebar: "إظهار في الشريط الجانبي",
hideFromSidebar: "إخفاء من الشريط الجانبي",
},
skills: {
title: "المهارات",
searchPlaceholder: "بحث في المهارات ومجموعات الأدوات...",
enabledOf: "{enabled}/{total} مفعلة",
all: "الكل",
categories: "الفئات",
filters: "الفلاتر",
noSkills: "لم يُعثر على مهارات. يتم تحميل المهارات من ~/.hermes/skills/",
noSkillsMatch: "لا توجد مهارات تطابق بحثك أو الفلاتر.",
skillCount: "{count} مهارة{s}",
resultCount: "{count} نتيجة{s}",
noDescription: "لا يوجد وصف متاح.",
toolsets: "مجموعات الأدوات",
toolsetLabel: "مجموعة أدوات {name}",
noToolsetsMatch: "لا توجد مجموعات أدوات تطابق البحث.",
setupNeeded: "يلزم الإعداد",
disabledForCli: "معطَّل لواجهة CLI",
more: "+{count} المزيد",
},
config: {
configPath: "~/.hermes/config.yaml",
filters: "الفلاتر",
sections: "الأقسام",
exportConfig: "تصدير الإعدادات كـ JSON",
importConfig: "استيراد الإعدادات من JSON",
resetDefaults: "إعادة التعيين للافتراضيات",
resetScopeTooltip: "إعادة تعيين {scope} للافتراضيات",
confirmResetScope:
"إعادة تعيين جميع إعدادات {scope} للافتراضيات؟ هذا يحدِّث النموذج فقط — لا تُكتب التغييرات في config.yaml حتى تضغط على حفظ.",
resetScopeToast: "تمت إعادة تعيين {scope} للافتراضيات — راجع واحفظ للتثبيت",
rawYaml: "إعدادات YAML الأولية",
searchResults: "نتائج البحث",
fields: "حقل{s}",
noFieldsMatch: 'لا توجد حقول تطابق "{query}"',
configSaved: "تم حفظ الإعدادات",
yamlConfigSaved: "تم حفظ إعدادات YAML",
failedToSave: "فشل الحفظ",
failedToSaveYaml: "فشل حفظ YAML",
failedToLoadRaw: "فشل تحميل الإعدادات الأولية",
configImported: "تم استيراد الإعدادات — راجع واحفظ",
invalidJson: "ملف JSON غير صالح",
categories: {
general: "عام",
agent: "العامل",
terminal: "الطرفية",
display: "العرض",
delegation: "التفويض",
memory: "الذاكرة",
compression: "الضغط",
security: "الأمان",
browser: "المتصفح",
voice: "الصوت",
tts: "تحويل النص إلى كلام",
stt: "تحويل الكلام إلى نص",
logging: "التسجيل",
discord: "Discord",
auxiliary: "إضافي",
},
},
env: {
changesNote: "يتم حفظ التغييرات على القرص فورًا. تلتقط الجلسات النشطة المفاتيح الجديدة تلقائيًا.",
confirmClearMessage:
"سيتم إزالة القيمة المخزنة لهذا المتغير من ملف .env. لا يمكن التراجع عن هذا من الواجهة.",
confirmClearTitle: "مسح هذا المفتاح؟",
description: "إدارة مفاتيح API والأسرار المخزَّنة في",
hideAdvanced: "إخفاء المتقدمة",
showAdvanced: "إظهار المتقدمة",
llmProviders: "مزوِّدو LLM",
providersConfigured: "{configured} من {total} مزوِّدين مكوَّنين",
getKey: "الحصول على المفتاح",
notConfigured: "{count} غير مكوَّن",
notSet: "غير معيّن",
keysCount: "{count} مفتاح{s}",
enterValue: "أدخل القيمة...",
replaceCurrentValue: "استبدال القيمة الحالية ({preview})",
showValue: "إظهار القيمة الحقيقية",
hideValue: "إخفاء القيمة",
},
oauth: {
title: "عمليات تسجيل دخول المزوِّدين (OAuth)",
providerLogins: "عمليات تسجيل دخول المزوِّدين (OAuth)",
description:
"{connected} من {total} مزوِّدي OAuth متصلون. تتدفق عمليات تسجيل الدخول حاليًا عبر CLI؛ انسخ الأمر وألصقه في طرفية للإعداد.",
connected: "متصل",
expired: "منتهي الصلاحية",
notConnected: "غير متصل. شغِّل {command} في طرفية.",
runInTerminal: "في طرفية.",
noProviders: "لم يُكتشف أي مزوِّد يدعم OAuth.",
login: "تسجيل الدخول",
disconnect: "قطع الاتصال",
managedExternally: "مدار خارجيًا",
copied: "تم النسخ ✓",
cli: "CLI",
copyCliCommand: "نسخ أمر CLI (لخارجي / احتياطي)",
connect: "اتصال",
sessionExpires: "تنتهي صلاحية الجلسة خلال {time}",
initiatingLogin: "بدء تدفق تسجيل الدخول…",
exchangingCode: "تبديل الرمز برموز الوصول…",
connectedClosing: "متصل! إغلاق…",
loginFailed: "فشل تسجيل الدخول.",
sessionExpired: "انتهت صلاحية الجلسة. انقر إعادة المحاولة لبدء تسجيل دخول جديد.",
reOpenAuth: "إعادة فتح صفحة المصادقة",
reOpenVerification: "إعادة فتح صفحة التحقق",
submitCode: "تقديم الرمز",
pasteCode: "ألصق رمز التفويض (مع لاحقة #state مقبولة)",
waitingAuth: "في انتظار تفويضك في المتصفح…",
enterCodePrompt: "فتح تبويب جديد. أدخل هذا الرمز عند الطلب:",
pkceStep1: "فتح تبويب جديد إلى claude.ai. سجِّل الدخول وانقر تفويض.",
pkceStep2: "انسخ رمز التفويض المعروض بعد التفويض.",
pkceStep3: "ألصقه أدناه وقدِّم.",
flowLabels: {
pkce: "تسجيل دخول المتصفح (PKCE)",
device_code: "رمز الجهاز",
external: "CLI خارجي",
},
expiresIn: "تنتهي خلال {time}",
},
language: {
switchTo: "التبديل إلى الإنجليزية",
},
theme: {
title: "السمة",
switchTheme: "تبديل السمة",
},
achievements: {
hero: {
kicker: "Agentic Gamerscore",
title: "إنجازات Hermes",
subtitle:
"شارات Hermes قابلة للجمع مكتسبة من سجل الجلسات الفعلي. الإنجازات غير المكتملة المعروفة تُعرض كـ Discovered؛ تبقى الإنجازات السرية مخفية حتى يظهر السلوك المطابق لأول مرة.",
scan_subtitle:
"فحص سجل جلسات Hermes. يمكن أن يستغرق الفحص الأول 510 ثوانٍ على السجلات الكبيرة.",
},
actions: {
rescan: "إعادة الفحص",
},
stats: {
unlocked: "مفتوحة",
unlocked_hint: "شارات مكتسبة",
discovered: "مكتشفة",
discovered_hint: "معروفة، لم تُكتسب بعد",
secrets: "أسرار",
secrets_hint: "مخفية حتى أول إشارة",
highest_tier: "أعلى مستوى",
highest_tier_hint: "نحاس → فضة → ذهب ← ماس → أوليمبي",
latest: "الأحدث",
latest_hint_empty: "شغِّل Hermes أكثر",
none_yet: "لا توجد بعد",
},
state: {
unlocked: "مفتوح",
discovered: "مكتشف",
secret: "سري",
},
tier: {
target: "الهدف {tier}",
hidden: "مخفي",
complete: "مكتمل",
objective: "الهدف",
},
progress: {
hidden: "مخفي",
},
scan: {
building_headline: "إنشاء ملف الإنجاز…",
building_detail:
"قراءة الجلسات، استدعاءات الأدوات، بيانات تعريف النموذج، وحالة الفتح.",
starting_headline: "بدء فحص الإنجازات…",
progress_detail:
"تم فحص {scanned} من {total} جلسة · {pct}%. تنفتح الشارات مع تدفق المزيد من السجل.",
idle_detail:
"قراءة الجلسات، استدعاءات الأدوات، بيانات تعريف النموذج، وحالة الفتح. تظهر الشارات هنا عند فتحها.",
},
guide: {
tiers_header: "المستويات",
secret_header: "الإنجازات السرية",
secret_body:
"تخفى الأسرار محددها الدقيق. بمجرد أن ترى Hermes إشارة ذات صلة، تصبح البطاقة مكتشفة وتعرض متطلباتها.",
scan_status_header: "حالة الفحص",
scan_status_body:
"تُفحص Hermes السجل المحلي مرة واحدة، ثم تظهر البطاقات تلقائيًا. لا يوجد توقف إذا استغرق هذا بضع ثوانٍ.",
what_scanned_header: "ما يتم فحصه",
what_scanned_body:
"الجلسات، استدعاءات الأدوات، بيانات تعريف النموذج، الأخطاء، الإنجازات، وحالة الفتح المحلية.",
},
card: {
share_title: "مشاركة هذا الإنجاز",
share_label: "مشاركة {name}",
share_text: "مشاركة",
how_to_reveal: "كيفية الإظهار",
what_counts: "ما يُحتسب",
evidence_label: "دليل",
evidence_session_fallback: "جلسة",
no_evidence: "لا دليل بعد",
},
latest: {
header: "آخر الفتوحات",
},
empty: {
no_secrets_header: "لا توجد أسرار مخفية متبقية في هذا الفحص.",
no_secrets_body:
"تلميح: تبدأ الأسرار عادة من أنماط الفشل غير العادية أو أنماط المستخدم المتقدم — تعارضات المنافذ، حواجز الأذونات، متغيرات بيئة مفقودة، أخطاء YAML، تصادمات Docker، استخدام الإرجاع أو التبقي، ضربات التخزين المؤقت، أو إصلاحات صغيرة بعد الكثير من الأخطاء الحمراء."
},
filters: {
all_categories: "الكل",
visibility_all: "الكل",
visibility_unlocked: "مفتوح",
visibility_discovered: "مكتشف",
visibility_secret: "سري",
},
share: {
dialog_label: "مشاركة الإنجاز",
header: "مشاركة: {name}",
close: "إغلاق",
rendering: "جاري العرض…",
card_alt: "بطاقة مشاركة {name}",
error_generic: "حدث خطأ ما.",
x_title: "يفتح X مع منشومعد مسبقًا",
x_button: "مشاركة على X",
copy_title: "نسخ الصورة للصقها في منشورك",
copy_button: "نسخ الصورة",
copied: "تم النسخ ✓",
download_button: "تنزيل PNG",
hint:
"المشاركة على X تفتح منشورًا معدَّلاً مسبقًا في تبويب جديد. انقر نسخ الصورة أولاً إذا أردت شارة الإنجاز 1200×630 مرفقة — يسمح X باللصق مباشرة في مؤلف التغريد. تنزيل PNG يحفظ الملف للاستخدام anywhere.",
clipboard_unsupported:
"نسخ صورة الحافظة غير مدعوم في هذا المتصفح — استخدم التنزيل بدلاً من ذلك.",
tweet_text: "فتحت للتو {tier_part}\"{name}\" في Hermes Agent ☤"
},
},
kanban: {
loading: "جاري تحميل لوحة Kanban…",
loadFailed: "فشل تحميل لوحة Kanban: ",
loadFailedHint:
"يُنشئ الواجهة الخلفية kanban.db تلقائيًا عند أول قراءة. إذا استمرت المشكلة، تفقَّد سجلات لوحة التحكم.",
board: "لوحة",
newBoard: "+ لوحة جديدة",
newBoardTitle: "لوحة جديدة",
newBoardDescription:
"تتيح اللوحات فصل تدفقات العمل غير المرتبطة — واحدة لكل مشروع أو مستودع أو مجال.",
slug: "المعرِّف",
slugHint: "— أحرف صغيرة، واصلات، مثال atm10-server",
displayName: "الاسم المعروض",
displayNameHint: "(اختياري)",
description: "الوصف",
descriptionHint: "(اختياري)",
icon: "أيقونة",
iconHint: "(حرف واحد أو رمز تعبيري)",
switchAfterCreate: "التبديل إلى هذه اللوحة بعد إنشائها",
cancel: "إلغاء",
creating: "جاري الإنشاء…",
createBoard: "إنشاء لوحة",
search: "بحث",
filterCards: "تصفية البطاقات…",
tenant: "المستأجر",
allTenants: "كل المستأجرين",
assignee: "المكلَّف",
allProfiles: "كل الملفات الشخصية",
showArchived: "إظهار المؤرشفة",
lanesByProfile: "مسارات حسب الملف الشخصي",
nudgeDispatcher: "دفع المُجلِّب",
refresh: "تحديث",
selected: "محدد",
complete: "إكمال",
archive: "أرشفة",
apply: "تطبيق",
clear: "مسح",
createTask: "إنشاء مهمة في هذا العمود",
noTasks: "— لا توجد مهام —",
unassigned: "غير مكلَّف",
needsAssignee: "يحتاج مكلِّف",
needsAssigneeHint:
"المتطلبات مُلباة، لكن المُجلِّب يتخطى هذه المهمة حتى تعيّن ملفًا شخصيًا.",
untitled: "(بدون عنوان)",
loadingDetail: "جاري التحميل…",
addComment: "إضافة تعليق… (Enter للتقديم)",
comment: "تعليق",
status: "الحالة",
workspace: "مساحة العمل",
skills: "المهارات",
createdBy: "أنشئ بواسطة",
result: "النتيجة",
comments: "التعليقات",
events: "الأحداث",
runHistory: "سجل التنفيذ",
workerLog: "سجل العامل",
loadingLog: "جاري تحميل السجل…",
noWorkerLog:
"— لا يوجد سجل عامل بعد (لم تُنشَ المهمة أو تم تدوير السجل) —",
noDescription: "— لا يوجد وصف —",
noComments: "— لا توجد تعليقات —",
edit: "تعديل",
save: "حفظ",
dependencies: "الاعتماديات",
parents: "الآباء:",
children: "الأبناء:",
none: "لا شيء",
addParent: "— إضافة أب —",
addChild: "— إضافة ابن —",
removeDependency: "إزالة الاعتماد",
block: "حظر",
unblock: "إلغاء الحظر",
notifyHomeChannels: "إشعار القنوات الرئيسية",
diagnostics: "التشخيصات",
hide: "إخفاء",
show: "إظهار",
attention: "انتباه",
tasksNeedAttention: "مهام تحتاج انتباه",
taskNeedsAttention: "مهمة واحدة تحتاج انتباه",
diagnostic: "تشخيصي",
open: "فتح",
close: "إغلاق (Esc)",
reassignTo: "إعادة تعيين إلى:",
copied: "تم النسخ",
copyCommand: "نسخ الأمر إلى الحافظة",
reclaim: "استعادة",
reassign: "إعادة تعيين",
renderingError: "اصطدم تبويب Kanban بخطأ عرض",
reloadView: "إعادة تحميل العرض",
wsAuthFailed:
"فشلت مصادقة WebSocket — أعد تحميل الصفحة لتحديث رمز الجلسة.",
markDone: "تحديد {n} مهمة كمكتملة؟",
markArchived: "أرشفة {n} مهمة؟",
warning: "تحذير",
phantomIds: "معرفات وهمية:",
active: "نشط",
ended: "منتهٍ",
noProfile: "(لا يوجد ملف شخصي)",
showAllAttempts: "إظهار كل المحاولات",
sendingUpdates: "إرسال التحديثات إلى",
sendNotifications: "إرسال إشعارات مكتمل / محظور / متروك لـ",
archiveBoardConfirm:
"أرشفة لوحة '{name}'؟ ستُنقَل إلى boards/_archived/ لتتمكن من استرجاعها لاحقًا. المهام على هذه اللوحة لن تظهر بعد الآن في أي مكان في الواجهة.",
archiveBoardTitle: "أرشفة هذه اللوحة",
boardSwitcherHint: "تتيح اللوحات فصل تدفقات عمل غير مرتبطة",
taskCreatedWarning: "تم إنشاء المهمة، لكن: ",
moveFailed: "فشل النقل: ",
bulkFailed: "مجموعة: ",
completionBlockedHallucination: "⚠ الحظر — معرّفات بطاقات وهمية",
suspectedHallucinatedReferences: "⚠ النص يشير إلى معرّفات بطاقات وهمية",
pickProfileFirst: "اختر ملفًا شخصيًا أولاً.",
unblockedMessage: "تم إلغاء حظر {id}. المهمة جاهزة للدورة التالية.",
unblockFailed: "فشل إلغاء الحظر: ",
reclaimedMessage: "تم استعادة {id}. المهمة عادت إلى جاهزة.",
reclaimFailed: "فشل الاستعادة: ",
reassignedMessage: "تم إعادة تعيين {id} إلى {profile}.",
reassignFailed: "فشل إعادة التعيين: ",
selectForBulk: "تحديد لإجراءات جماعية",
clickToEdit: "انقر للتعديل",
clickToEditAssignee: "انقر لتعديل المكلَّف",
emptyAssignee: "(فارغ = إزالة التكليف)",
columnLabels: {
triage: "فرز",
todo: "مهام",
ready: "جاهز",
running: "قيد التنفيذ",
blocked: "محظور",
done: "منجز",
archived: "مؤرشف",
},
columnHelp: {
triage: "أفكار أولية — سيصِغ المُحدِّد المواصفات",
todo: "في انتظار الاعتماديات أو غير مكلَّف",
ready: "الاعتماديات مُلباة؛ عيّن ملفًا شخصيًا للتشغيل",
running: "مطالب بعامل — قيد التنفيذ",
blocked: "طلب العامل مدخلات من الإنسان",
done: "مكتمل",
archived: "مؤرشف",
},
confirmDone:
"تحديد هذه المهمة كمكتملة؟ سيتم تحرير مطالبة العامل ويصبح الأبناء المعتمدون جاهزين.",
confirmArchive:
"أرشفة هذه المهمة؟ ستختفي من عرض اللوحة الافتراضي.",
confirmBlocked:
"تحديد هذه المهمة كمحظورة؟ سيتم تحرير مطالبة العامل.",
completionSummary:
"ملخص الإنجاز لـ {label}. يُخزَّن كنتيجة للمهمة.",
completionSummaryRequired:
"ملخص الإنجاز مطلوب قبل تحديد المهمة كمكتملة.",
triagePlaceholder: "فكرةrough — سيقوم الذكاء الاصطناعي بصياغة المواصفات…",
taskTitlePlaceholder: "عنوان المهمة الجديد…",
specifier: "محدِّد المواصفات",
assigneePlaceholder: "المكلَّف",
priority: "الأولوية",
skillsPlaceholder:
"مهارات (اختياري، مفصولة بفواصل): translation, github-code-review",
noParent: "— لا يوجد أب —",
workspacePathDir: "مسار مساحة العمل (مطلوب، مثال ~/projects/my-app)",
workspacePathOptional:
"مسار مساحة العمل (اختياري، مستنتج من المكلَّف إذا كان فارغًا)",
logTruncated: "(عرض آخر 100 كيلوبايت — السجل الكامل في ",
logAt: ")",
},
});