From 6953e5e99958896400b659c4e59e2bc577a19533 Mon Sep 17 00:00:00 2001 From: OmarFK11 Date: Thu, 18 Jun 2026 20:34:10 +0100 Subject: [PATCH] add arabic language support --- ui/src/i18n.js | 5 + ui/src/index.tsx | 3 + ui/src/locales/ar.json | 230 ++++++++++++++++++++++++++++++++++++++ ui/src/utils/constants.ts | 5 + 4 files changed, 243 insertions(+) create mode 100644 ui/src/locales/ar.json diff --git a/ui/src/i18n.js b/ui/src/i18n.js index 133d1aeb..3c122bb5 100644 --- a/ui/src/i18n.js +++ b/ui/src/i18n.js @@ -6,6 +6,7 @@ import zh from './locales/zh.json' import de from './locales/de.json' import pt from './locales/pt.json' import ko from './locales/ko.json' +import ar from './locales/ar.json' const resources = { en: { @@ -23,6 +24,10 @@ const resources = { ko: { translation: ko, }, + ar: { + translation: ar, + }, + } const currentLocale = localStorage.getItem('lang') || 'en' diff --git a/ui/src/index.tsx b/ui/src/index.tsx index 9eb5a73c..1a9164a7 100644 --- a/ui/src/index.tsx +++ b/ui/src/index.tsx @@ -10,6 +10,8 @@ import enUS from 'antd/locale/en_US' import deDE from 'antd/locale/de_DE' import ptBR from 'antd/locale/pt_BR' import koKR from 'antd/locale/ko_KR' +import arAR from 'antd/locale/ar_AR' + import { BrowserRouter } from 'react-router-dom' import WrappedRoutes from '@/router' import store from '@/store' @@ -36,6 +38,7 @@ function App() { de: deDE, pt: ptBR, ko: koKR, + ar: arAR, } return ( diff --git a/ui/src/locales/ar.json b/ui/src/locales/ar.json new file mode 100644 index 00000000..8b1e23c8 --- /dev/null +++ b/ui/src/locales/ar.json @@ -0,0 +1,230 @@ +{ + "Help": "مساعدة", + "ReadOnlyMode": "وضع القراءة فقط", + "Search": "بحث", + "Cluster": "عنقود", + "Insight": "رؤى", + "KeywordSearch": "البحث بالكلمات المفتاحية", + "SQLSearch": "بحث SQL", + "SearchUsingSQL": "البحث باستخدام SQL", + "PopularQueries": "استعلامات شائعة", + "ClusterManagement": "إدارة العناقيد", + "AllClusters": "كل العناقيد", + "HealthyClusters": "العناقيد السليمة", + "UnhealthyClusters": "العناقيد غير السليمة", + "SortByName": "الترتيب حسب الاسم", + "SortByTime": "الترتيب حسب الطابع الزمني", + "RegisterCluster": "تسجيل عنقود", + "Edit": "تعديل", + "RotateCertificate": "تدوير الشهادة", + "Delete": "حذف", + "AboutInSearchResult": "حول", + "SearchResult": "نتائج البحث", + "AllIssues": "كل المشاكل", + "HighRisk": "عالي الخطورة", + "MediumRisk": "متوسط الخطورة", + "LowRisk": "منخفض الخطورة", + "Rescan": "إعادة الفحص", + "CheckAllIssues": "فحص جميع المشاكل", + "ResourceTopology": "طوبولوجيا الموارد", + "LogAggregator": "مجمّع السجلات", + "LogAggregator.SelectContainer": "اختر الحاوية", + "LogAggregator.ResumeLogs": "استئناف السجلات", + "LogAggregator.PauseLogs": "إيقاف مؤقت للسجلات", + "LogAggregator.ClearLogs": "مسح السجلات", + "LogAggregator.DiagnoseLogs": "تشخيص بالذكاء الاصطناعي", + "LogAggregator.Connected": "متصل", + "LogAggregator.Disconnected": "غير متصل", + "LogAggregator.ConnectedTip": "متصل بالحاوية {{container}}", + "LogAggregator.DisconnectedTip": "فقد الاتصال. جارٍ إعادة المحاولة...", + "LogAggregator.DiagnosisResult": "نتيجة التشخيص بالذكاء الاصطناعي", + "LogAggregator.PreparingDiagnosis": "جارٍ التحليل...", + "LogAggregator.DiagnosisError": "فشل التشخيص", + "LogAggregator.TryAgainLater": "يرجى المحاولة لاحقًا", + "LogAggregator.DiagnosisConnectionError": "فشل الاتصال بالتشخيص", + "LogAggregator.FailedToStartDiagnosis": "فشل بدء التشخيص", + "LogAggregator.FailedToDiagnoseLogs": "فشل تشخيص السجلات", + "LogAggregator.StopDiagnosis": "إيقاف التحليل", + "LogAggregator.DownloadLogs": "تنزيل السجلات", + "LogAggregator.DownloadError": "فشل تنزيل السجلات", + "LogAggregator.Settings": "إعدادات السجلات", + "LogAggregator.Since": "عرض السجلات منذ", + "LogAggregator.SinceTime": "عرض السجلات من وقت محدد", + "LogAggregator.TailLines": "عدد الأسطر المعروضة", + "LogAggregator.ShowTimestamps": "إظهار الطوابع الزمنية", + "LogAggregator.NoLogsSelected": "لم يتم تحديد أي سجلات", + "LogAggregator.SearchPlaceholder": "ابحث في السجلات...", + "LogAggregator.SearchModeHighlight": "وضع التمييز", + "LogAggregator.SearchModeFilter": "وضع التصفية", + "LogAggregator.FullScreen": "ملء الشاشة", + "EventAggregator": "الأحداث", + "EventAggregator.Type": "نوع الحدث", + "EventAggregator.Normal": "عادي", + "EventAggregator.Warning": "تحذير", + "EventAggregator.NoEvents": "لا توجد أحداث", + "EventAggregator.SearchEvents": "البحث في الأحداث...", + "EventAggregator.ColumnType": "النوع", + "EventAggregator.ColumnReason": "السبب", + "EventAggregator.ColumnMessage": "الرسالة", + "EventAggregator.ColumnTimes": "عدد المرات", + "EventAggregator.ColumnFirstSeen": "أول ظهور", + "EventAggregator.ColumnLastSeen": "آخر ظهور", + "EventAggregator.Diagnose": "تشخيص بالذكاء الاصطناعي", + "EventAggregator.DiagnosisInProgress": "جارٍ التحليل...", + "EventAggregator.DiagnosisResult": "نتيجة التشخيص بالذكاء الاصطناعي", + "EventAggregator.PreparingDiagnosis": "جارٍ التحليل...", + "EventAggregator.DiagnosisError": "فشل التشخيص", + "EventAggregator.TryAgainLater": "يرجى المحاولة لاحقًا", + "EventAggregator.DiagnosisConnectionError": "فشل الاتصال بالتشخيص", + "EventAggregator.FailedToStartDiagnosis": "فشل بدء التشخيص", + "EventAggregator.FailedToDiagnoseLogs": "فشل تشخيص الأحداث", + "EventAggregator.ConnectionError": "فشل الاتصال ببث الأحداث", + "EventAggregator.StopDiagnosis": "إيقاف التشخيص", + "EventAggregator.DiagnosisFailed": "فشل التشخيص", + "Name": "الاسم", + "Times": "عدد المرات", + "FilterByName": "تصفية حسب الاسم", + "SelectResourcesAboveToSeeDetailsHere": "اختر الموارد أعلاه لعرض التفاصيل", + "Issues": "المشاكل", + "Critical": "حرج", + "High": "عالي", + "Medium": "متوسط", + "Low": "منخفض", + "Safe": "آمن", + "IssueSource": "مصدر المشكلة", + "NumberOfOccurrences": "عدد التكرارات", + "Description": "الوصف", + "RelatedResources": "الموارد المرتبطة", + "More": "المزيد", + "Less": "إخفاء", + "Capacity": "السعة", + "Memory": "الذاكرة", + "MemoryCapacity": "سعة الذاكرة", + "Version": "الإصدار", + "SorryThePageYouVisitedDoesNotExist": "الصفحة غير موجودة", + "BackToHome": "العودة إلى الصفحة الرئيسية", + "Cancel": "إلغاء", + "Submit": "إرسال", + "OK": "حسنًا", + "DisplayName": "اسم العرض", + "ClusterName": "اسم العنقود", + "ClusterDetail": "تفاصيل العنقود", + "DataSyncConfiguration": "إعدادات مزامنة البيانات", + "VerifiedSuccessfullyAndSubmitted": "تم التحقق والإرسال بنجاح", + "VerificationSuccessfulButSubmissionFailed": "تم التحقق بنجاح لكن فشل الإرسال", + "KubeConfigDoesNotMeetTheRequirements": "ملف KubeConfig غير صالح. يرجى رفع ملف شهادة صحيح", + "UploadSuccessful": "تم الرفع بنجاح", + "TheFileMustBeIn": "يجب أن يكون الملف بصيغة", + "TheKubeConfigFileCannotBeEmpty": "ملف KubeConfig لا يمكن أن يكون فارغًا", + "Upload": "رفع", + "ConfigurationFile": "ملف الإعدادات", + "VerifyAndSubmit": "تحقق وأرسل", + "ExistingConfigurations": "الإعدادات الحالية", + "NewConfiguration": "إعداد جديد", + "PleaseUploadNewKubeConfigFile": "يرجى رفع ملف KubeConfig جديد", + "SubmitAnd3STOClusterPage": "تم التحقق والإرسال. جارٍ التوجيه إلى صفحة إدارة العناقيد...", + "SubmitAndValidate": "جارٍ التحقق...", + "SubmitAndUpdate": "تحقق وتحديث", + "DeleteAndNoLongUpdateResources": "حذف هذا العنقود سيزيله من العرض ويوقف مزامنة الموارد", + "UpdateSuccess": "تم التحديث بنجاح", + "RequestFailedAndTry": "فشل الطلب. يرجى المحاولة مرة أخرى", + "DeletedSuccess": "تم الحذف بنجاح", + "EmptyCluster": "لا توجد عناقيد مسجلة", + "ClusterRequiresKubeConfigConfigurationFileAccess": "سجل عنقود جديد عبر رفع ملف KubeConfig الخاص به", + "PleaseEnterKeywords": "أدخل الكلمات المفتاحية", + "IssuesDetail": "تفاصيل المشكلة", + "Close": "إغلاق", + "Total": "الإجمالي", + "ViewIssueDetail": "عرض تفاصيل المشكلة", + "Occur": "يحدث", + "CollectedFrom": "تم جمعه من", + "Tool": "الأداة", + "NoIssuesFound": "لم يتم العثور على مشاكل", + "HealthScore": "نقاط الصحة", + "TriggeredTimestamp": "وقت التفعيل", + "Exception": "استثناء", + "Warning": "تحذير", + "Normal": "طبيعي", + "CreateTime": "وقت الإنشاء", + "InDevelopment": "قيد التطوير", + "InputClusterName": "أدخل اسم العنقود", + "YAML": { + "NoContent": "لا يوجد محتوى للتفسير", + "Interpret": "تفسير بالذكاء الاصطناعي", + "InterpretResult": "نتيجة التفسير", + "InterpretInProgress": "جارٍ التفسير...", + "StopInterpret": "إيقاف التفسير", + "InterpretConnectionError": "خطأ في اتصال التفسير", + "FailedToStartInterpret": "فشل بدء التفسير", + "FailedToInterpret": "فشل التفسير", + "TabName": "YAML", + "Refresh": "تحديث" + }, + "Yesterday": "أمس", + "Collapse": "طيّ", + "Expand": "توسيع", + "Detail": "تفاصيل", + "View": "عرض", + "AllTags": "كل الوسوم", + "DuplicateData": "بيانات مكررة. يرجى إعادة التحقق", + "AreYouSureDeleteResourceGroupRule": "هل أنت متأكد أنك تريد حذف قاعدة مجموعة الموارد هذه؟", + "Copy": "نسخ", + "CopySuccess": "تم النسخ بنجاح", + "TotalResourceGroupRules": "إجمالي قواعد مجموعة الموارد", + "TotalResources": "إجمالي الموارد", + "ClusterCount": "عدد العناقيد", + "UnableCreateResourceGroupInReadOnly": "لا يمكن إنشاء قواعد مجموعة موارد في وضع القراءة فقط", + "PleaseEnterValidSQLStatement": "أدخل عبارة SQL صالحة", + "NoClusterAndJumpToClusterPage": "لا توجد عناقيد متصلة. يرجى تسجيل عنقود أولاً", + "Logout": "تسجيل الخروج", + "TokenCreationGuide": "الرمز مطلوب للوصول إلى عقدة Hub. اعرف المزيد: [كيفية إنشاء رمز]", + "LoginFailedAndCheck": "فشل تسجيل الدخول. يرجى التحقق من صحة الرمز", + "UnLoginAndTokenLogin": "غير مسجل الدخول. يرجى إدخال الرمز لتسجيل الدخول", + "LoginSuccess": "تم تسجيل الدخول بنجاح", + "Login": "تسجيل الدخول", + "LogoutSuccess": "تم تسجيل الخروج بنجاح", + "InputToken": "أدخل الرمز", + "SearchByNaturalLanguage": "البحث باللغة الطبيعية", + "CannotBeEmpty": "لا يمكن أن يكون فارغًا", + "DefaultTag": "وسم افتراضي", + "FailedToParsePodDetails": "فشل تحليل تفاصيل Pod", + "CopiedToClipboard": "تم النسخ إلى الحافظة", + "Metrics": { + "Tooltips": { + "NodeCount": "إجمالي عدد العقد في العنقود", + "ServerVersion": "إصدار خادم Kubernetes", + "ReadyNodes": "عدد العقد في حالة جاهزة", + "Pods": "عدد الـ Pods الحالي مقابل الحد الأقصى", + "CPU": "استخدام المعالج / إجمالي المعالج", + "Memory": "استخدام الذاكرة / إجمالي الذاكرة", + "MetricsServer": "يقوم Metrics Server بجمع مقاييس الموارد من Kubelets" + } + }, + "Enabled": "مفعّل", + "Disabled": "معطّل", + "ExceptionList": { + "NoIssues": "لا توجد مشاكل", + "NoIssuesFound": "لم يتم العثور على مشاكل", + "InterpretConnectionError": "فشل الاتصال بالتفسير", + "FailedToInterpretLogs": "فشل تفسير السجلات", + "Interpret": "تفسير بالذكاء الاصطناعي", + "InterpretResult": "نتيجة التفسير بالذكاء الاصطناعي", + "StopInterpret": "إيقاف التفسير", + "InterpretInProgress": "جارٍ التحليل...", + "InterpretFailed": "فشل التفسير", + "TryAgainLater": "يرجى المحاولة لاحقًا", + "Rescan": "إعادة الفحص", + "Collapse": "طيّ", + "Expand": "توسيع", + "CheckAllIssues": "فحص جميع المشاكل", + "ViewIssueDetail": "عرض تفاصيل المشكلة", + "Occur": "يحدث", + "Times": "مرات", + "CollectedFrom": "تم جمعه من", + "Tool": "الأداة", + "Description": "الوصف", + "High": "عالي", + "Medium": "متوسط", + "Low": "منخفض" + } +} diff --git a/ui/src/utils/constants.ts b/ui/src/utils/constants.ts index 82dd9bb7..071867d8 100644 --- a/ui/src/utils/constants.ts +++ b/ui/src/utils/constants.ts @@ -131,6 +131,10 @@ export const Languages = [ label: '한국어', value: 'ko', }, + { + label: 'العربية', + value: 'ar', + }, ] export const LanguagesMap = { @@ -139,4 +143,5 @@ export const LanguagesMap = { de: 'Deutsch', pt: 'Português', ko: '한국어', + ar: 'العربية', }