diff --git a/ATTRIBUTION.md b/ATTRIBUTION.md index 4f940140..4257a3a8 100644 --- a/ATTRIBUTION.md +++ b/ATTRIBUTION.md @@ -67,3 +67,4 @@ Generated-in-code assets are original and have no file to list: | `crates/ui-egui/src/i18n/sv.tsv` | Erik Holmbom (@holmbom) with Claude Code (AI-assisted) | Original Swedish translations of CADCraft English strings | MIT OR Apache-2.0 (`LICENSE-MIT`, `LICENSE-APACHE`) | No proprietary localization resources copied; terminology and the running app reviewed by a native speaker | | `crates/ui-egui/src/i18n/it.tsv` | Emanuele Bottelli (AI-assisted) | Original Italian translations of CADCraft English strings | MIT OR Apache-2.0 (`LICENSE-MIT`, `LICENSE-APACHE`) | No proprietary localization resources copied | | `crates/ui-egui/src/i18n/ko.tsv` | @huk082 (AI-assisted) | Original Korean translations of CADCraft English strings | MIT OR Apache-2.0 (`LICENSE-MIT`, `LICENSE-APACHE`) | No proprietary localization resources copied; no font assets added | +| `crates/ui-egui/src/i18n/ar.tsv` | @hasan-sdaif | Original Arabic translations of CADCraft English strings | MIT OR Apache-2.0 (`LICENSE-MIT`, `LICENSE-APACHE`) | No proprietary localization resources copied | diff --git a/README.md b/README.md index 10d17964..a259af4f 100644 --- a/README.md +++ b/README.md @@ -111,7 +111,7 @@ numbers): | Layouts & plotting | Paper-space layouts, viewports (scale, lock, per-viewport layer freeze), MSPACE/PSPACE through viewports, page setups, PLOT and EXPORTPDF | | Parametric | Geometric and dimensional constraints, AUTOCONSTRAIN, PARAMETERS with expressions, conflict detection; constraints re-solve after every edit | | Grips | Hot grips with Space to cycle Stretch, Move, Rotate, Scale and Mirror | -| Interface languages | English, Ukrainian (Українська), Brazilian Portuguese (Português (Brasil)), German (Deutsch), Spanish (Español), Czech (Čeština), Russian (Русский), French (Français), Simplified Chinese (简体中文, with an installed CJK font), Italian (Italiano), Korean (한국어, with an installed Hangul font) and Swedish (Svenska), live switching and a remembered Auto/system-language choice; [details](docs/localization.md) | +| Interface languages | English, Ukrainian (Українська), Brazilian Portuguese (Português (Brasil)), German (Deutsch), Spanish (Español), Czech (Čeština), Russian (Русский), French (Français), Simplified Chinese (简体中文, with an installed CJK font), Italian (Italiano), Korean (한국어, with an installed Hangul font), Swedish (Svenska) and Arabic (العربية, with an installed Arabic font), live switching and a remembered Auto/system-language choice; [details](docs/localization.md) | | Automation | MCP server, JSON control channel, `cadcraft-cli` (info, convert, run, commands, mcp) | ## Quick start diff --git a/crates/ui-egui/src/i18n/ar.tsv b/crates/ui-egui/src/i18n/ar.tsv new file mode 100644 index 00000000..dd250520 --- /dev/null +++ b/crates/ui-egui/src/i18n/ar.tsv @@ -0,0 +1,1235 @@ +# CADCraft Arabic interface catalog — original translations. +# License: MIT OR Apache-2.0 (the repository LICENSE-MIT and LICENSE-APACHE). +# Written from CADCraft's English strings; no proprietary translations were copied. +# UTF-8: contextEnglish sourceArabic (العربية) translation. +# Empty context = ordinary label; @plural = zero|one|two|few|many|other forms with {n}. +# Command IDs, typed keywords, technology/product names and user data stay unchanged. + Cancel إلغاء + OK موافق + or [ أو [ + % of all commits % من كل الإيداعات + * Wildcard Match * مطابقة أحرف البدل + *VARIES* *متفاوت* + + | Top | 2D Wireframe + | علوي | هيكل سلكي ثنائي الأبعاد + +Bin +Bin + +LOC +LOC + 1 Viewport إطار عرض واحد + 2 Points نقطتان + 2 Viewports إطاران للعرض + 2D Solid مجسّم ثنائي الأبعاد + 3 Points 3 نقاط + 3 Viewports 3 أطر عرض + 3D Face وجه ثلاثي الأبعاد + 3D Mouse فأرة ثلاثية الأبعاد + 3D Mouse Navigation التنقل بالفأرة ثلاثية الأبعاد + 3D Mouse... فأرة ثلاثية الأبعاد... + 3D Operations عمليات ثلاثية الأبعاد + 3D Polyline متعدد خطوط ثلاثي الأبعاد + 3D mouse busy, possibly 3DxWare or missing device permissions الفأرة ثلاثية الأبعاد مشغولة، ربما بسبب 3DxWare أو نقص أذونات الجهاز + 3D mouse connected اتصلت الفأرة ثلاثية الأبعاد + 3D mouse disconnected انقطع اتصال الفأرة ثلاثية الأبعاد + 3D mouse input could not be started تعذر بدء إدخال الفأرة ثلاثية الأبعاد + 3D mouse input is unavailable on this platform إدخال الفأرة ثلاثية الأبعاد غير متاح على هذه المنصة + 4 Viewports 4 أطر عرض + < Less than < أصغر من + <> Not Equal <> لا يساوي + = Equals = يساوي + > Greater than > أكبر من + A built-in table: editing it keeps an edited copy in the drawing. جدول مدمج: تحريره يُبقي نسخة محررة في الرسم. + A drawing opened from a file keeps that file's format. الرسم المفتوح من ملف يحتفظ بتنسيق ذلك الملف. + A variable name starts with a letter and has only letters, digits and _ يبدأ اسم المتغير بحرف ولا يحوي إلا أحرفاً وأرقاماً و _ + About حول + About CADCraft حول CADCraft + Absolute مطلق + Accessibility إمكانية الوصول + Add إضافة + Add Current Scale إضافة المقياس الحالي + Add Leader إضافة خط إشارة + Add Vertex إضافة رأس + Add/Delete Scales... إضافة/حذف المقاييس... + Additional angles زوايا إضافية + Align محاذاة + Align Text محاذاة النص + Aligned مصطف + All الكل + All Annotation Objects كل كائنات التوضيح + All Scales كل المقاييس + All Used Layers كل الطبقات المستخدمة + All files كل الملفات + An array that would create more objects than this is refused. يُرفض المصفوف الذي ينشئ كائنات أكثر من هذا. + Angle الزاوية + Angular زاوي + Annotation Visibility ظهور التوضيح + Annotation scale مقياس التوضيح + Annotative Object Scale مقياس كائن التوضيح + Annotative Update تحديث التوضيح + Apparent Intersection تقاطع ظاهري + Append to current selection set إلحاق بمجموعة التحديد الحالية + Apply تطبيق + Apply to: تطبيق على: + Apply true color تطبيق اللون الحقيقي + Arc قوس + Arc Length طول القوس + Area المساحة + Arrange Panel لوحة الترتيب + Array صفيفة + Attach إرفاق + Attach DWG... إرفاق DWG... + Attribute سمة + Attribute Definition تعريف السمة + Attribute Display عرض السمات + Audit تدقيق + Auto (system language) تلقائي (لغة النظام) + Auto Constrain تقييد تلقائي + AutoConstrain قيد تلقائي + Automatic save every حفظ تلقائي كل + Automatic save file location موقع ملف الحفظ التلقائي + Axis, End محور، نهاية + Base أساس + Baseline خط الأساس + Batch Publish نشر دفعي + Batch Publish... نشر دفعي... + Binary assets added الأصول الثنائية المضافة + Binary assets removed الأصول الثنائية المُزالة + Bind ربط + Bind... ربط... + Blend دمج تدريجي + Block كتلة + Block Attribute Manager... مدير سمات الكتلة... + Block Editor محرر الكتل + Block Reference مرجع كتلة + Block... كتلة... + Blocks كتل + Blue أزرق + Bold غامق + Boolean منطقي + Boundary حدود + Boundary... حدود... + Box المربع + Break كسر + Break At Point فصل عند نقطة + Bring Above Objects إحضار فوق الكائنات + Bring Annotations to Front إحضار التوضيحات إلى الأمام + Bring to Front إحضار إلى المقدمة + Bulleted list قائمة نقطية + ByBlock حسب الكتلة + ByColor حسب اللون + ByLayer حسب الطبقة + CADCraft Help تعليمات CADCraft + CADCraft keeps these preferences, object snap modes and drafting toggles for your user account and restores them when it starts. يحتفظ CADCraft بهذه التفضيلات وأنماط الالتقاط بالكائن ومفاتيح تبديل الرسم لحساب مستخدمك ويعيدها عند بدء التشغيل. + Calibrate معايرة + Calibrate 3D Mouse معايرة الفأرة ثلاثية الأبعاد + Cancel إلغاء + Cartesian (x, y) ديكارتي (x, y) + Center وسط + Center Line خط المركز + Center Mark علامة المركز + Center X مركز X + Center Y مركز Y + Center Z مركز Z + Center, Diameter مركز، قطر + Center, Radius مركز، نصف قطر + Center, Start, Angle مركز، بداية، زاوية + Center, Start, End مركز، بداية، نهاية + Center, Start, Length مركز، بداية، طول + Chamfer شطف + Change Space تغيير الفراغ + Change to Current Layer تغيير إلى الطبقة الحالية + Changed: {n} تم التغيير: {n} + Changes apply at once and are kept for next time. تُطبَّق التغييرات فوراً وتُحفظ للمرة القادمة. + Circle دائرة + Circumference المحيط + Clear مسح + Clear Command History مسح سجل الأوامر + Clear History مسح السجل + Clip مقطع + Clip Viewport قص إطار العرض + Clipboard الحافظة + Close إغلاق + Close All إغلاق الكل + Close All Other Drawings إغلاق كل الرسومات الأخرى + Close Array Editing إغلاق تحرير المصفوفة + Close Comparison إغلاق المقارنة + Closed مغلق + Coincident تطابق + Collapse Palettes طي اللوحات + Collapse Tool Sets طي مجموعات الأدوات + Collinear استقامة + Color لون + Color 8 اللون 8 + Color 9 اللون 9 + Color Index فهرس اللون + Color-dependent معتمد على اللون + Color... اللون... + Command Aliases اختصارات الأوامر + Command History سجل الأوامر + Command Line سطر الأوامر + Command Line History Lines أسطر سجل سطر الأوامر + Command Reference مرجع الأوامر + Command line history سجل سطر الأوامر + Commits الإيداعات + Company الشركة + Compare Drawings... مقارنة الرسومات... + Computer-aided design and drafting: an open-source, clean-room CAD application written in pure Rust. تصميم وصياغة بمساعدة الحاسوب: تطبيق CAD مفتوح المصدر بمنهجية النسخ النظيف مكتوب بلغة Rust خالصة. + Concentric تمركز + Cone مخروط + Constraint Bars أشرطة القيود + Constraint Settings إعدادات القيود + Construction Line خط إنشائي + Contents المحتويات + Continue متابعة + Contributors المساهمون + Control Vertices رؤوس التحكم + Convert تحويل + Convert to Arc تحويل إلى قوس + Convert to Line تحويل إلى خط + Copy نسخ + Copy Full File Path نسخ مسار الملف الكامل + Copy History نسخ السجل + Copy Layout نسخ التخطيط + Copy Nested Objects نسخ الكائنات المتداخلة + Copy Selection نسخ التحديد + Copy as JSON نسخ بصيغة JSON + Copy with Base Point نسخ من نقطة أساس + Count عدّ + Count List قائمة العد + Count Table جدول العد + Create Block إنشاء كتلة + Creates a user parameter ينشئ معلمة مستخدم + Crosshair size حجم المؤشر المتصالب + Ctrl+Enter to finish Ctrl+Enter للإنهاء + Current Scale Only المقياس الحالي فقط + Current layer الطبقة الحالية + Current selection التحديد الحالي + Current: {color} الحالي: {color} + Cut قص + Cyan سماوي + Cylinder أسطوانة + DWG DWG + DWG Reference... مرجع DWG... + DXF DXF + Dark داكن + Data Extraction... استخراج البيانات... + Data Link... ربط البيانات... + Default افتراضي + Default Save Format تنسيق الحفظ الافتراضي + Default Save Version إصدار الحفظ الافتراضي + Default save version إصدار الحفظ الافتراضي + Define Attributes تعريف السمات + Define Attributes... تعريف السمات... + Defined width العرض المعرَّف + Degree درجة + Degrees of Freedom درجات الحرية + Degrees of freedom: {n} درجات الحرية: {n} + Delete حذف + Delete Column حذف العمود + Delete Constraints حذف القيود + Delete Current Scale حذف المقياس الحالي + Delete Dimension Style حذف نمط التأشير + Delete Duplicate Objects حذف الكائنات المكررة + Delete Layer حذف الطبقة + Delete Layer State حذف حالة الطبقة + Delete Layout حذف التخطيط + Delete Row حذف الصف + Delete Text Style حذف نمط النص + Delta X دلتا X + Delta Y دلتا Y + Description الوصف + Deselect All إلغاء تحديد الكل + Detach فصل + Diameter القطر + Dim style نمط التأشير + Dimension بُعد + Dimension Break كسر التأشير + Dimension Edit تحرير التأشير + Dimension Objects Only كائنات التأشير فقط + Dimension Space تباعد التأشير + Dimension Style Override تجاوز نمط التأشير + Dimension Style... نمط التأشير... + Dimension Text Edit تحرير نص التأشير + Dimension style نمط التأشير + Dimensional Constraint قيد بُعدي + Dimensional Constraint Parameters معلمات القيد البعدي + Dimensional Constraints قيود بُعدية + Disassociate Dimensions فصل ارتباط التأشيرات + Display عرض + Display name الاسم المعروض + Display plot styles عرض أنماط الطباعة + Distance المسافة + Divide قسمة + Do not plot (click: plot) بدون طباعة (انقر: طباعة) + Donut حلقة + Double-click to edit the description انقر نقراً مزدوجاً لتحرير الوصف + Down أسفل + Drafting الصياغة + Drafting Settings إعدادات الرسم + Drafting Settings... إعدادات الرسم... + Draw رسم + Draw Order ترتيب الرسم + Drawing (DWG) رسم (DWG) + Drawing (DXF) رسم (DXF) + Drawing Limits حدود الرسم + Drawing Recovery Manager... مدير استرداد الرسومات... + Drawing Template (DWT) قالب رسم (DWT) + Drawing Utilities أدوات مساعدة للرسم + Drawing as bytes الرسم كبايتات + Drawings (DWG, DXF) رسومات (DWG, DXF) + Drawings with no file yet are saved in the default version. 0 minutes turns automatic save off. تُحفظ الرسومات التي لا ملف لها بعد بالإصدار الافتراضي. 0 دقيقة تُوقف الحفظ التلقائي. + Dynamic ديناميكي + Dynamic Dimensions تأشيرات ديناميكية + Dynamic Input إدخال ديناميكي + Dynamic Input (F12) إدخال ديناميكي (F12) + Edit تحرير + Edit Array تحرير المصفوفة + Edit Attributes... تحرير السمات... + Edit Table Cell تحرير خلية الجدول + Edit Text... تحرير النص... + Elevation الارتفاع + Ellipse شكل بيضاوي + Elliptical Arc قوس إهليلجي + Enable 3D mouse navigation تمكين التنقل بالفأرة ثلاثية الأبعاد + Enable Dynamic Input (F12) تمكين الإدخال الديناميكي (F12) + End Object Isolation إنهاء عزل الكائنات + End Width العرض النهائي + End X النهاية X + End Y النهاية Y + End angle زاوية النهاية + Endpoint نقطة نهاية + Enter إدخال + Enter Top, Zero or Bottom. أدخل أعلى أو صفر أو أسفل. + Enter a fit data option أدخل خيار بيانات الملاءمة + Enter a pattern name أدخل اسم نمط + Enter a vertex editing option أدخل خيار تحرير الرؤوس + Enter an option أدخل خياراً + Enter angle of xline أدخل زاوية الخط الإنشائي + Enter angle of xline (0) or أدخل زاوية الخط الإنشائي (0) أو + Enter area of rectangle in current units أدخل مساحة المستطيل بالوحدات الحالية + Enter attribute prompt أدخل موجه السمة + Enter attribute tag name أدخل اسم وسم السمة + Enter attribute value أدخل قيمة السمة + Enter block name أدخل اسم الكتلة + Enter constraint type أدخل نوع القيد + Enter continuity أدخل الاستمرارية + Enter default attribute value أدخل قيمة السمة الافتراضية + Enter degree of spline أدخل درجة السبلاين + Enter delta angle أدخل زاوية دلتا + Enter delta length or أدخل طول دلتا أو + Enter dimension text أدخل نص التأشير + Enter dimension text (<> = measurement) أدخل نص التأشير (<> = القياس) + Enter dimension value or [name=expression] أدخل قيمة التأشير أو [name=expression] + Enter dimension variable name to override أدخل اسم متغير التأشير للتجاوز + Enter justification type أدخل نوع المحاذاة + Enter leader text أدخل نص خط الإشارة + Enter mline scale أدخل مقياس الخط المتعدد + Enter mode أدخل الوضع + Enter name of block to insert أدخل اسم الكتلة المراد إدراجها + Enter new text أدخل نصاً جديداً + Enter next point أدخل النقطة التالية + Enter number of columns أدخل عدد الأعمدة + Enter number of data rows أدخل عدد صفوف البيانات + Enter number of items أدخل عدد العناصر + Enter number of items along path أدخل عدد العناصر على المسار + Enter number of sides أدخل عدد الأضلاع + Enter number of turns أدخل عدد اللفات + Enter percentage length أدخل النسبة المئوية للطول + Enter rectangle length أدخل طول المستطيل + Enter rectangle width أدخل عرض المستطيل + Enter scale factor أدخل معامل المقياس + Enter text أدخل النص + Enter text (use \P for new paragraphs) أدخل النص (استخدم \P للفقرات الجديدة) + Enter the number of segments أدخل عدد المقاطع + Enter twist direction of helix أدخل اتجاه التفاف الحلزون + Entire drawing الرسم بأكمله + Equal تساوٍ + Erase محو + Evaluate تقييم + Exclude from new selection set استثناء من مجموعة التحديد الجديدة + Explode تفجير + Export تصدير + Export Table تصدير الجدول + Export to PDF... تصدير إلى PDF... + Export... تصدير... + Expression تعبير + Extend تمديد + Extension امتداد + Extents حدود قصوى + External Reference مرجع خارجي + External References مراجع خارجية + Extrude بثق + File ملف + File Tab علامة تبويب الملف + Fillet تدوير زاوية + Filter تصفية + Filters مرشحات + Find and Replace بحث واستبدال + Find... بحث... + First الأول + First commit أول إيداع + Fit Points نقاط الملاءمة + Fix إصلاح + Flatten Objects تسطيح الكائنات + Format الصيغة + Freehand رسم حر + Freeze تجميد + Freeze Layer تجميد الطبقة + Freeze in new viewports تجميد في أطر العرض الجديدة + Freeze/Thaw تجميد/إذابة + Freeze/Thaw in all viewports تجميد/إذابة في كل أطر العرض + Freeze/Thaw in the current viewport تجميد/إذابة في إطار العرض الحالي + From من + From Template... من قالب... + General عام + Geometric Center المركز الهندسي + Geometric Constraint قيد هندسي + Geometric Constraints قيود هندسية + Geometry الهندسة + Get Variable جلب متغير + Get View جلب العرض + Get from the Drawing جلب من الرسم + Global شامل + Global width العرض الشامل + Grab bag متفرقات + Gradient التدرج اللوني + Gradient... تدرج... + Grayscale تدرج رمادي + Green أخضر + Grid (F7) الشبكة (F7) + Grid Display عرض الشبكة + Grid On (F7) تشغيل الشبكة (F7) + Grid snap التقاط الشبكة + Grid spacing تباعد الشبكة + Grip Edit تحرير بالمقبض + Grip Mirror عكس بالمقبض + Grip Option خيار المقبض + Grip Rotate تدوير بالمقبض + Grip Scale تحجيم بالمقبض + Grip Stretch تمديد بالمقبض + Grip size حجم المقبض + Group تجميع + Group Edit تحرير المجموعة + Group Options خيارات المجموعة + Group Selection تحديد المجموعة + Hatch تظليل + Hatch Edit تحرير التهشير + Hatch Pattern نمط التهشير + Hatch Patterns أنماط التهشير + Hatch... تهشير... + Height الارتفاع + Height: {height} الارتفاع: {height} + Helix حلزون + Help مساعدة + Hide All إخفاء الكل + Hide All Constraint Bars إخفاء كل أشرطة القيود + Hide All Dynamic Dimensions إخفاء كل التأشيرات الديناميكية + Hide CADCraft إخفاء CADCraft + Hide Layer List إخفاء قائمة الطبقات + Hide Objects إخفاء الكائنات + Hide Others إخفاء الطبقات الأخرى + Hide Palette إخفاء اللوحة + Hide Palettes إخفاء اللوحات + History سجل الإجراءات + Hold Shift to add to the selection استمر في الضغط على Shift للإضافة إلى التحديد + Home الرئيسية + Horizontal أفقي + HorizontalDistance المسافة الأفقية + How to apply: كيفية التطبيق: + ID Point تحديد هوية نقطة + Import استيراد + Import... استيراد... + In داخل + In-window Menu Bar شريط قوائم داخل النافذة + Include in new selection set تضمين في مجموعة التحديد الجديدة + Increment angle زاوية الزيادة + Index Color لون مفهرس + Index color: {index} اللون المفهرس: {index} + Infer Constraints استنتاج القيود + Inquiry استعلام + Insert إدراج + Insert Block إدراج كتلة + Insert Column إدراج عمود + Insert Row إدراج صف + Insert Table Formula إدراج صيغة جدول + Insert tab علامة تبويب الإدراج + Insert this block إدراج هذه الكتلة + Insertion إدراج + Insertion X إدراج X + Insertion Y إدراج Y + Insertion Z إدراج Z + Inspect Constraints فحص القيود + Inspect Drawing فحص الرسم + Inspection تفتيش + Interface Language لغة الواجهة + Interface Theme سمة الواجهة + Interface language لغة الواجهة + Interface theme سمة الواجهة + Intersect تقاطع + Intersection تقاطع + Isolate عزل + Isolate Layer عزل الطبقة + Isolate Objects عزل الكائنات + Isometric Drafting صياغة متساوية القياس + Isometric Plane المستوى متساوي القياس + Isometric snap التقاط متساوي القياس + Jogged متعرج + Jogged Linear خطي متعرج + Join وصل + Join the ArtCraft Discord… الانضمام إلى Discord الخاص بـ ArtCraft… + Join us on Discord انضم إلينا على Discord + Keep an editable copy of this table in the drawing الإبقاء على نسخة قابلة للتحرير من هذا الجدول في الرسم + Keep the system cursor visible over the drawing area إبقاء مؤشر النظام مرئياً فوق منطقة الرسم + Language اللغة + Largest array أكبر مصفوفة + Last الأخير + Last commit آخر إيداع + Layer طبقة + Layer Delete حذف طبقة + Layer Match مطابقة طبقة + Layer Merge دمج طبقة + Layer Off إيقاف طبقة + Layer Properties خصائص الطبقة + Layer Properties Manager مدير خصائص الطبقات + Layer Properties Manager — current viewport مدير خصائص الطبقات — إطار العرض الحالي + Layer State حالة الطبقة + Layer States Manager... مدير حالات الطبقات... + Layer Tools أدوات الطبقات + Layer contains objects (double-click to make current) تحتوي الطبقة على كائنات (انقر نقراً مزدوجاً لجعلها الحالية) + Layer is empty (double-click to make current) الطبقة فارغة (انقر نقراً مزدوجاً لجعلها الحالية) + Layers الطبقات + Layers Palette لوحة الطبقات + Layers displayed: {shown} of {total}. Current layer: {layer} الطبقات المعروضة: {shown} من {total}. الطبقة الحالية: {layer} + Layout تخطيط + Layout list قائمة التخطيطات + Layout paper ورقة التخطيط + Layout {name}: {table} التخطيط {name}: {table} + Leader قائد + Leaders Only خطوط الإشارة فقط + Left يسار + Left device button: zoom extents. Right device button: calibrate. زر الجهاز الأيسر: تكبير الحدود. زر الجهاز الأيمن: معايرة. + Length الطول + Length X الطول X + Length Y الطول Y + Lengthen إطالة + Light فاتح + Line خط + Line delta فرق الأسطر + Linear خطي + Lines +/− الأسطر +/− + Lines added الأسطر المضافة + Lines deleted الأسطر المحذوفة + Lines of Command History أسطر سجل الأوامر + Linetype نوع الخط + Linetype Scale مقياس نوع الخط + Linetype scale مقياس نوع الخط + Linetype... نوع الخط... + Lineweight سماكة الخط + Lineweight... سماكة الخط... + List قائمة + List Blocks سرد الكتل + List Dimension Styles سرد أنماط التأشير + List Groups سرد المجموعات + List Layer States سرد حالات الطبقات + List Layouts سرد التخطيطات + List System Variables سرد متغيرات النظام + List Text Styles سرد أنماط النص + Load all تحميل الكل + Load... تحميل... + Loaded محمَّل + Loaded linetypes أنواع الخطوط المحمَّلة + Lock قفل + Lock Layer تأمين الطبقة + Lock viewport تأمين إطار العرض + Lock/Unlock تأمين/إلغاء التأمين + Loft رفع + Ltscale Ltscale + MIT OR Apache-2.0. Not affiliated with Autodesk, Inc. MIT أو Apache-2.0. غير تابع لشركة Autodesk, Inc. + MODEL نموذج + MText نص متعدد الأسطر + Magenta أرجواني + Major line every خط رئيسي كل + Make Current تعيين كحالي + Make Object's Layer Current جعل طبقة الكائن الحالية + Make it a block of this drawing, keeping its layer names اجعله كتلة من هذا الرسم مع الإبقاء على أسماء طبقاته + Make it a block of this drawing; its layers become NAME$0$LAYER اجعله كتلة من هذا الرسم؛ تصبح طبقاته NAME$0$LAYER + Make... إنشاء... + Match Layer مطابقة الطبقة + Match Properties مطابقة الخصائص + Measure قياس + Measure Distance قياس مسافة + Measure Geometry قياس هندسة + Merge Cells دمج الخلايا + Merged PRs طلبات السحب المدموجة + Mid Between 2 Points الوسط بين نقطتين + Midpoint نقطة منتصف + Mirror مرآة + Model النموذج + Model Space (in viewport) فراغ النموذج (في إطار العرض) + Model background خلفية النموذج + Modeling النمذجة + Models النماذج + Modify تعديل + More toolbar commands المزيد من أوامر شريط الأدوات + Move نقل + Move sideways to pan; push/pull or twist to zoom. حرّك جانبياً للإزاحة؛ ادفع أو اسحب أو لُف للتكبير. + Multileader قائد متعدد + Multileader Style... نمط خط الإشارة المتعدد... + Multileader style نمط خط الإشارة المتعدد + Multiline متعدد الأسطر + Multiline Style... نمط الخط المتعدد... + Multiline Text نص متعدد الأسطر + Multiline Text... نص متعدد الأسطر... + Multiline... خط متعدد... + Multiple متعدد + Multiple Point نقاط متعددة + My بلدي + My properties: not available yet خصائصي: غير متاحة بعد + Name الاسم + Name (A–Z) الاسم (أ–ي) + Named مسمى + Named Views... طرق عرض مسماة... + Nearest الأقرب + New جديد + New (metric) جديد (متري) + New CTB CTB جديد + New Drawing رسم جديد + New Drawing (⌘N) رسم جديد (⌘N) + New Drawing... رسم جديد... + New Layer طبقة جديدة + New Layout تخطيط جديد + New STB STB جديد + New VP Freeze تجميد إطار عرض جديد + New Viewports... أطر عرض جديدة... + New from Template... جديد من قالب... + New layout تخطيط جديد + New state name اسم حالة جديدة + New style نمط جديد + Next Change التغيير التالي + No لا + No blocks defined in this drawing. لا كتل معرَّفة في هذا الرسم. + No contributor data was built into this copy. لم تُضمَّن بيانات المساهمين في هذه النسخة. + No external references are attached. لا مراجع خارجية مرفقة. + No model credits were built into this copy. لم يُضمَّن ذكر النماذج في هذه النسخة. + No plot style tables. لا جداول أنماط طباعة. + No saved layer states لا حالات طبقات محفوظة + No selection لا تحديد + No supported 3D mouse found لم يُعثر على فأرة ثلاثية الأبعاد مدعومة + Node عقدة + None لا شيء + Not Found غير موجود + Not available غير متاح + Not available yet غير متاح بعد + Not loaded غير محمَّل + Numbered list قائمة مرقمة + OK موافق + Object كائن + Object Snap التقاط الكائن + Object Snap (F3) الالتقاط بالكائن (F3) + Object Snap On (F3) تشغيل الالتقاط بالكائن (F3) + Object Snap Tracking تعقب الالتقاط بالكائن + Object Snap Tracking (F11) تعقب الالتقاط بالكائن (F11) + Object Snap Tracking Settings إعدادات تعقب الالتقاط بالكائن + Object snap aperture فتحة الالتقاط بالكائن + Object snap marker size حجم علامة الالتقاط بالكائن + Object type: نوع الكائن: + Oblique مائل + Off متوقف + Offset الإزاحة + On تشغيل + On/Off تشغيل/إيقاف + One of the Crafting Apps by the ArtCraft team and community. أحد تطبيقات Crafting من فريق ArtCraft والمجتمع. + Only in this drawing: {n} في هذا الرسم فقط: {n} + Only in {name}: {n} في {name} فقط: {n} + Open فتح + Open (⌘O) فتح (⌘O) + Open Sample Drawing فتح رسم نموذجي + Open Xref فتح مرجعاً خارجياً + Open a drawing first. افتح رسماً أولاً. + Open and Save فتح وحفظ + Open sample drawing فتح رسم نموذجي + Open... فتح... + Operator: العامل: + Options الخيارات + Options... خيارات... + Orbit تدوير مداري + Ordinate إحداثي + Ortho (F8) التعامد (F8) + Ortho Mode الوضع المتعامد + Ortho Mode (F8) وضع التعامد (F8) + Osnap Settings... إعدادات الالتقاط بالكائن... + Out خارج + Over-constrained مقيَّد أكثر من اللازم + Overlay تراكب + Override تجاوز + PAPER ورقة + PRs طلبات السحب + Page Setup Manager مدير إعداد الصفحة + Page Setup Manager... مدير إعداد الصفحة... + Pan إزاحة + Pan Down إزاحة لأسفل + Pan Left إزاحة لليسار + Pan Right إزاحة لليمين + Pan Up إزاحة لأعلى + Pan sensitivity حساسية الإزاحة + Paper Space فراغ الورقة + Parallel متوازٍ + Parameters Manager مدير المعلمات + Parametric بارامتري + Paste لصق + Paste as Block لصق ككتلة + Paste to Command Line لصق في سطر الأوامر + Paste to Original Coordinates لصق بالإحداثيات الأصلية + Path Array صفيفة مسار + Pattern النمط + Percent مئوية + Perpendicular عمودي + Pickbox size حجم صندوق الاختيار + Plot طباعة + Plot (click: do not plot) طباعة (انقر: بدون طباعة) + Plot Preview معاينة الطباعة + Plot Style Manager مدير أنماط الطباعة + Plot Style Manager... مدير أنماط الطباعة... + Plot Style... نمط الطباعة... + Plot Styles... أنماط الطباعة... + Plot Window نافذة الطباعة + Plot style نمط الطباعة + Plot style attached to نمط الطباعة المرفق بـ + Plot style table جدول أنماط الطباعة + Plot table type نوع جدول الطباعة + Plotter Manager مدير الطابعات + Plotter Manager... مدير الطابعات... + Plus/minus زائد/ناقص + Point تأشير + Point Filters مرشحات النقطة + Point Style... نمط النقطة... + Polar (distance < angle) قطبي (المسافة < الزاوية) + Polar Array صفيفة قطبية + Polar Tracking تعقب قطبي + Polar Tracking (F10) التعقب القطبي (F10) + Polar Tracking On (F10) تشغيل التعقب القطبي (F10) + Polar angle measurement قياس الزاوية القطبية + Polar distance المسافة القطبية + Polar: {distance} < {angle}° قطبي: {distance} < {angle}° + PolarSnap التقاط قطبي + Polygon مضلع + Polygonal مضلع + Polygonal Viewport إطار عرض مضلع + Polyline خط متعدد + Polyline Edit تحرير متعدد الخطوط + Position X الموضع X + Position Y الموضع Y + Position Z الموضع Z + Previous السابق + Previous Change التغيير السابق + Previous Layer الطبقة السابقة + Primitives العناصر الأولية + Print طباعة + Print... طباعة... + Profiles ملفات تعريف + Properties خصائص + Properties Inspector مفتش الخصائص + Properties: الخصائص: + Proxy وكيل + Purge تنقية + Pyramid هرم + Quadrant ربع + Query Entities الاستعلام عن الكيانات + Quick سريع + Quick Dimension تأشير سريع + Quick Properties خصائص سريعة + Quick Select تحديد سريع + Quick Select Properties خصائص التحديد السريع + Quick Select... تحديد سريع... + QuickCalc الحاسبة السريعة + QuickCalc Pick اختيار الحاسبة السريعة + Quit CADCraft إنهاء CADCraft + Radius نصف القطر + Raster Image صورة نقطية + Ray شعاع + Read-only للقراءة فقط + Real name الاسم الحقيقي + Realtime في الوقت الحقيقي + Reassociate Dimensions إعادة ارتباط التأشيرات + Recalculate Table Formulas إعادة حساب صيغ الجدول + Recent الأخيرة + Recent Commands الأوامر الحديثة + Recent Input الإدخال الحديث + Recover... استرداد... + Rectangle مستطيل + Rectangular مستطيل + Rectangular Array صفيفة مستطيلة + Rectangular snap التقاط مستطيل + Red أحمر + Redo إعادة + Redo (⇧⌘Z) إعادة (⇧⌘Z) + Redraw إعادة رسم + Reference Manager مدير المراجع + Reference Name اسم المرجع + References: {n} المراجع: {n} + Regen تجديد + Regen All تجديد الكل + Region منطقة + Region/Mass Properties خصائص النطاق/الكتلة + Reinitialize إعادة تهيئة + Relative نسبي + Relative to last segment نسبي إلى المقطع الأخير + Release the 3D mouse to calibrate its resting position اترك الفأرة ثلاثية الأبعاد لمعايرة موضع سكونها + Reload إعادة تحميل + Reload All إعادة تحميل الكل + Remove إزالة + Remove Leader إزالة خط الإشارة + Remove Vertex إزالة رأس + Remove the viewport override إزالة تجاوز إطار العرض + Rename Dimension Style إعادة تسمية نمط التأشير + Rename Layer إعادة تسمية طبقة + Rename Layer State إعادة تسمية حالة الطبقة + Rename Layout إعادة تسمية التخطيط + Rename Text Style إعادة تسمية نمط النص + Rename... إعادة تسمية... + Repeat {command} تكرار {command} + Requires a point (x,y, @dx,dy or @d حدد النقطة الثانية أو <استخدم النقطة الأولى كإزاحة> + Specify second source point حدد نقطة المصدر الثانية + Specify side to offset حدد الجانب المراد إزاحته + Specify start angle حدد زاوية البداية + Specify start point حدد نقطة البداية + Specify start point of arc حدد نقطة بداية القوس + Specify start point of polyline حدد نقطة بداية متعدد الخطوط + Specify start point of text حدد نقطة بداية النص + Specify starting width حدد عرض البداية + Specify starting width for next segment حدد عرض بداية المقطع التالي + Specify tangent direction for the start point of arc حدد اتجاه المماس لنقطة بداية القوس + Specify the elevation for rectangles حدد الارتفاع للمستطيلات + Specify thickness for rectangles حدد السماكة للمستطيلات + Specify third point on circle حدد النقطة الثالثة على الدائرة + Specify third point on circle: _tan to حدد النقطة الثالثة على الدائرة: _تماس إلى + Specify third source point or حدد نقطة المصدر الثالثة أو <متابعة> + Specify through point حدد نقطة العبور + Specify top diameter حدد القطر العلوي + Specify top radius or حدد نصف القطر العلوي أو + Specify total angle حدد الزاوية الكلية + Specify total length or حدد الطول الكلي أو + Specify width for rectangles حدد العرض للمستطيلات + Sphere كرة + Spline سبلاين + Spline Edit تحرير السبلاين + Stack (type 1/2 then select) تكديس (اكتب 1/2 ثم حدد) + Standard معيار + Start البداية + Start Width العرض الابتدائي + Start X البداية X + Start Y البداية Y + Start angle زاوية البداية + Start, Center, Angle بداية، مركز، زاوية + Start, Center, End بداية، مركز، نهاية + Start, Center, Length بداية، مركز، طول + Start, End, Angle بداية، نهاية، زاوية + Start, End, Direction بداية، نهاية، اتجاه + Start, End, Radius بداية، نهاية، نصف قطر + Status الحالة + Status Bar شريط الحالة + Stretch تمديد + Stretch Vertex تمديد رأس + Style: Standard النمط: Standard + Subtract طرح + Sweep كنس + Switch Drawing تبديل الرسم + Switch Layout تبديل التخطيط + Switch between model space in a viewport and paper space التبديل بين فراغ النموذج في إطار العرض وفراغ الورقة + Symmetric تناظر + Synchronize Attributes مزامنة السمات + Synchronize Multiple-scale Positions مزامنة مواضع المقاييس المتعددة + TOP أعلى + Table جدول + Table Breaks فواصل الجدول + Table Cell Style نمط خلية الجدول + Table Style... نمط الجدول... + Table style نمط الجدول + Table... جدول... + Tan, Tan, Radius مماس، مماس، نصف قطر + Tan, Tan, Tan مماس، مماس، مماس + Tangent مماس + Temporary track point نقطة تعقب مؤقتة + Text نص + Text Editor محرر النص + Text Height ارتفاع النص + Text Objects Only كائنات النص فقط + Text Style... نمط النص... + Text height ارتفاع النص + Text override تجاوز النص + Text style نمط النص + Thaw All Layers إذابة كل الطبقات + Thaw Layer إذابة الطبقة + The aperture is how near the cursor must come to a point for an object snap to find it. الفتحة هي مدى اقتراب المؤشر من نقطة كي يجدها الالتقاط بالكائن. + There is nothing here yet. لا يوجد شيء هنا بعد. + Thickness السماكة + Time وقت + Time-sensitive right-click: a quick click is Enter, holding opens the menu النقر الأيمن حساس للوقت: النقرة السريعة تعني Enter، والاستمرار يفتح القائمة + To إلى + To get started, create or open a drawing. للبدء، أنشئ رسماً أو افتح واحداً. + Toggle PICKADD (off: each pick replaces the selection) تبديل PICKADD (إيقاف: كل اختيار يستبدل التحديد) + Toggle PICKADD (on: picks add to the selection) تبديل PICKADD (تشغيل: تُضاف الاختيارات إلى التحديد) + Tolerance... تفاوت... + Tool Bar شريط الأدوات + Tool Sets مجموعات الأدوات + Tools أدوات + Torus حلقي + Trace تتبع + Track orthogonally only تعقب متعامد فقط + Track using all polar angle settings تعقب باستخدام كل إعدادات الزوايا القطبية + Transparency شفافية + Trim حدود التشذيب + True Color لون حقيقي + Turn All Layers On تشغيل كل الطبقات + Turn Off Layer إيقاف طبقة + Turn On Layer تشغيل طبقة + Turn Quick Properties off (QPMODE) إيقاف الخصائص السريعة (QPMODE) + Turned off, a right-click while a command runs always opens the shortcut menu. عند إيقافه، يفتح النقر الأيمن أثناء تشغيل أمر القائمة المختصرة دائماً. + Type النوع + Type a command اكتب أمراً + Type text; Enter starts a new paragraph اكتب النص؛ يبدأ Enter فقرة جديدة + UCS Icon أيقونة UCS + Undo تراجع + Undo (⌘Z) تراجع (⌘Z) + Ungroup فك التجميع + Union اتحاد + Unisolate Layer إلغاء عزل الطبقة + Units Conversion تحويل الوحدات + Units... الوحدات... + Unload إلغاء التحميل + Unloaded غير محمَّل + Unlock Layer إلغاء تأمين الطبقة + Unlock viewport إلغاء تأمين إطار العرض + Unmerge Cells إلغاء دمج الخلايا + Unreferenced غير مُشار إليه + Unresolved غير محلول + Unsaved Layer State حالة طبقة غير محفوظة + Up أعلى + Update تحديث + Update Data Links تحديث ارتباطات البيانات + Use System Setting استخدام إعداد النظام + Use for this layout استخدام لهذا التخطيط + Use object linetype استخدام نوع خط الكائن + Use object lineweight استخدام سماكة خط الكائن + User مستخدم + User Parameters معلمات المستخدم + User Preferences تفضيلات المستخدم + Username اسم المستخدم + VP Color لون إطار العرض + VP Freeze تجميد إطار العرض + Value القيمة + Value: القيمة: + Variables متغيرات + Version الإصدار + Version 2000 الإصدار 2000 + Version 2004 الإصدار 2004 + Version 2007 الإصدار 2007 + Version 2010 الإصدار 2010 + Version 2013 الإصدار 2013 + Version 2018 الإصدار 2018 + Version {version} الإصدار {version} + Vertical عمودي + VerticalDistance المسافة الرأسية + View عرض + ViewCube ViewCube + Viewport منفذ العرض + Viewport Layer Freeze تجميد طبقة إطار العرض + Viewport Properties خصائص إطار العرض + Viewport is locked إطار العرض مؤمَّن + Viewport scale مقياس إطار العرض + Viewport {id} إطار العرض {id} + Viewports منافذ عرض + Volume مستوى الصوت + WCS ⌄ WCS ⌄ + White أبيض + Width factor معامل العرض + Window نافذة + Wipeout مسح + Workspace Switching تبديل مساحة العمل + Write Block كتابة كتلة + X X + Xline خط إنشائي + Y Y + Yellow أصفر + Yes نعم + Zoom التكبير + Zoom All تكبير الكل + Zoom Dynamic تكبير ديناميكي + Zoom Extents تكبير الحدود + Zoom In تكبير + Zoom Object تكبير كائن + Zoom Out تصغير + Zoom Previous تكبير السابق + Zoom Realtime تكبير فوري + Zoom Window تكبير نافذة + Zoom sensitivity حساسية التكبير + error خطأ + min دقيقة + objects كائنات + {contributors} · {commits} {contributors} · {commits} + {kind} (constraint {id}) {kind} (قيد {id}) + {kind} constraint {name} = {expression} (double-click to edit) قيد {kind} {name} = {expression} (انقر نقراً مزدوجاً للتحرير) + {name}: {distance} < {angle}° {name}: {distance} < {angle}° + ƒx New User Parameter ƒx معلمة مستخدم جديدة + ΔLOC ΔLOC + −Bin −Bin + −LOC −LOC + ⌘↩ to finish ⌘↩ للإنهاء +menu Dimension تأشير +menu Draw رسم +menu Modify تعديل +menu View عرض +@plural {n} commit {n} إيداع|{n} إيداع|{n} إيداعان|{n} إيداعات|{n} إيداعاً|{n} إيداع +@plural {n} contributor {n} مساهم|{n} مساهم|{n} مساهمان|{n} مساهمين|{n} مساهماً|{n} مساهم diff --git a/crates/ui-egui/src/i18n/mod.rs b/crates/ui-egui/src/i18n/mod.rs index 4a94e75a..9c10511a 100644 --- a/crates/ui-egui/src/i18n/mod.rs +++ b/crates/ui-egui/src/i18n/mod.rs @@ -37,10 +37,12 @@ pub enum Preference { Korean, #[serde(rename = "sv")] Swedish, + #[serde(rename = "ar")] + Arabic, } impl Preference { - pub const ALL: [Self; 13] = [ + pub const ALL: [Self; 14] = [ Self::Auto, Self::English, Self::Ukrainian, @@ -54,6 +56,7 @@ impl Preference { Self::Italian, Self::Korean, Self::Swedish, + Self::Arabic, ]; /// The codes a preference can be given as, for messages ("auto, en or uk"). @@ -80,6 +83,7 @@ impl Preference { Self::Italian => "it", Self::Korean => "ko", Self::Swedish => "sv", + Self::Arabic => "ar", } } @@ -104,6 +108,7 @@ impl Preference { } } Self::Swedish => "Svenska", + Self::Arabic => "العربية", } } @@ -130,6 +135,7 @@ impl Preference { Self::Italian => "it", Self::Korean => "ko", Self::Swedish => "sv", + Self::Arabic => "ar", Self::Auto => locales.iter().find_map(|s| locale_language(s)).unwrap_or("en"), } } @@ -146,7 +152,7 @@ pub struct Language { catalog: OnceLock>, } -pub static LANGUAGES: [Language; 12] = [ +pub static LANGUAGES: [Language; 13] = [ Language { code: "en", name: "English", source: "", plural: plural_en, plural_forms: 2, catalog: OnceLock::new() }, Language { code: "uk", name: "Українська", source: include_str!("uk.tsv"), plural: plural_uk, plural_forms: 3, catalog: OnceLock::new() @@ -177,6 +183,10 @@ pub static LANGUAGES: [Language; 12] = [ Language { code: "ko", name: "한국어", source: include_str!("ko.tsv"), plural: plural_ko, plural_forms: 1, catalog: OnceLock::new() }, // Swedish plurals follow the English rule: one (1), other. Language { code: "sv", name: "Svenska", source: include_str!("sv.tsv"), plural: plural_en, plural_forms: 2, catalog: OnceLock::new() }, + // العربية (Arabic) is right-to-left; an installed Arabic font (`theme::arabic_font`) + // covers its glyphs, and the shell keeps egui's left-to-right run order. Six plural + // forms: zero, one, two, few, many, other. + Language { code: "ar", name: "العربية", source: include_str!("ar.tsv"), plural: plural_arabic, plural_forms: 6, catalog: OnceLock::new() }, ]; /// BCP 47 and POSIX locale tags, including `uk-UA`, `uk_UA.UTF-8` and `pt_BR.UTF-8`. @@ -293,6 +303,19 @@ fn plural_ko(_n: u64) -> usize { 0 } +/// Arabic integer plurals (CLDR `ar`): zero (0), one (1), two (2), few (3–10, 103–110), +/// many (11–99) — the same rule pdfcraft uses, so the sibling apps agree. +pub fn plural_arabic(n: u64) -> usize { + match (n, n % 100) { + (0, _) => 0, + (1, _) => 1, + (2, _) => 2, + (_, 3..=10) => 3, + (_, 11..=99) => 4, + _ => 5, + } +} + fn plural_en(n: u64) -> usize { usize::from(n != 1) } diff --git a/crates/ui-egui/src/i18n/tests.rs b/crates/ui-egui/src/i18n/tests.rs index b2abbc1d..15de435a 100644 --- a/crates/ui-egui/src/i18n/tests.rs +++ b/crates/ui-egui/src/i18n/tests.rs @@ -39,7 +39,7 @@ fn catalog_is_valid_and_preserves_placeholders_and_ellipses() { /// to English for what they don't cover yet; their gaps are reported, not enforced, so adding a /// command doesn't require a row in every language. const REQUIRED: &[&str] = &["uk"]; -const REPORTED: &[&str] = &["pt-BR", "de", "es", "cs", "ru", "fr", "zh", "it", "ko", "sv"]; +const REPORTED: &[&str] = &["pt-BR", "de", "es", "cs", "ru", "fr", "zh", "it", "ko", "sv", "ar"]; fn check(language: &str, what: &str, missing: Vec) { if REQUIRED.contains(&language) { diff --git a/crates/ui-egui/src/options/mod.rs b/crates/ui-egui/src/options/mod.rs index 145a0dbc..852b065b 100644 --- a/crates/ui-egui/src/options/mod.rs +++ b/crates/ui-egui/src/options/mod.rs @@ -10,7 +10,7 @@ //! |---|---| //! | `theme` | `"system"`, `"light"` or `"dark"` | //! | `animations` | `"system"`, `"on"` or `"off"`: dialog and menu fades and smoothed scrolling | -//! | `interfaceLanguage` | `"auto"`, `"en"`, `"uk"`, `"pt-BR"`, `"de"`, `"es"`, `"cs"`, `"ru"`, `"fr"`, `"zh"`, `"it"`, `"ko"` or `"sv"` | +//! | `interfaceLanguage` | `"auto"`, `"en"`, `"uk"`, `"pt-BR"`, `"de"`, `"es"`, `"cs"`, `"ru"`, `"fr"`, `"zh"`, `"it"`, `"ko"`, `"sv"` or `"ar"` | //! | `saveFormat` | `"dxf"` or `"dwg"`: the format Save As suggests for new drawings | //! | `saveVersion` | `"2000"` … `"2018"`: the version drawings with no file yet are saved in | //! | `SAVETIME` | minutes between automatic saves, 0–600 (0: off) | diff --git a/crates/ui-egui/src/theme.rs b/crates/ui-egui/src/theme.rs index ff6e054b..9064b92e 100644 --- a/crates/ui-egui/src/theme.rs +++ b/crates/ui-egui/src/theme.rs @@ -306,7 +306,8 @@ pub fn mono() -> FontId { /// then CJK fonts after the Latin ones, so Latin text keeps its look, in every interface /// language: file, layout and layer names can be Japanese or Chinese whatever the interface /// shows (#513). In a Chinese interface (`language` "zh…") the Chinese font comes first, else a -/// Japanese one, so names take their own glyph forms. A font embedded from craft-fonts comes +/// Japanese one, so names take their own glyph forms; in an Arabic interface an installed +/// Arabic font follows. A font embedded from craft-fonts comes /// last, for systems without any (and the web build, which has no system fonts). A Korean /// interface adds a Hangul font only when the CJK font found doesn't cover Hangul /// ([`korean_font`]). @@ -351,6 +352,13 @@ pub fn install_fonts(ctx: &egui::Context, language: &str) { .enumerate() .map(|(i, bytes)| (format!("system-cjk-{i}"), std::sync::Arc::new(egui::FontData::from_owned(bytes)))), ); + // العربية: an installed Arabic face after the Latin ones (egui's bundled faces carry no + // Arabic glyphs), for the Arabic interface. + if language == "ar" + && let Some(bytes) = arabic_font().and_then(|p| read_capped(p, MAX_UI_FONT_BYTES)) + { + added.push(("system-arabic".into(), std::sync::Arc::new(egui::FontData::from_owned(bytes)))); + } } let mut embedded: Vec<_> = cadcraft_fonts::CRAFT_FONTS .iter() @@ -429,6 +437,49 @@ pub fn cjk_font() -> Option<&'static std::path::Path> { None } +/// An installed font with Arabic glyphs, for the العربية interface; fonts are never bundled +/// (only looked for where the OS or common packages put them). Checked once. +pub fn arabic_font() -> Option<&'static std::path::Path> { + #[cfg(not(target_arch = "wasm32"))] + { + static FOUND: std::sync::OnceLock> = std::sync::OnceLock::new(); + FOUND + .get_or_init(|| { + let candidates: &[&str] = if cfg!(target_os = "macos") { + &[ + "/System/Library/Fonts/GeezaPro.ttc", + "/System/Library/Fonts/Supplemental/Geeza Pro.ttf", + "/System/Library/Fonts/Supplemental/Al Nile.ttc", + "/System/Library/Fonts/Supplemental/Baghdad.ttf", + ] + } else if cfg!(windows) { + &[ + "C:\\Windows\\Fonts\\segoeui.ttf", + "C:\\Windows\\Fonts\\tahoma.ttf", + "C:\\Windows\\Fonts\\trado.ttf", + "C:\\Windows\\Fonts\\arabtype.ttf", + "C:\\Windows\\Fonts\\arial.ttf", + ] + } else { + &[ + "/usr/share/fonts/truetype/noto/NotoSansArabic-Regular.ttf", + "/usr/share/fonts/noto/NotoSansArabic-Regular.ttf", + "/usr/share/fonts/opentype/noto/NotoSansArabic-Regular.ttf", + "/usr/share/fonts/truetype/noto/NotoNaskhArabic-Regular.ttf", + "/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf", + "/usr/share/fonts/TTF/DejaVuSans.ttf", + "/usr/share/fonts/truetype/amiri/Amiri-Regular.ttf", + "/usr/share/fonts/truetype/kacst/KacstOne.ttf", + ] + }; + candidates.iter().map(std::path::PathBuf::from).find(|p| p.is_file()) + }) + .as_deref() + } + #[cfg(target_arch = "wasm32")] + None +} + /// An installed Japanese font, for Japanese names in a non-Chinese interface. Checked once. #[cfg_attr(target_arch = "wasm32", allow(dead_code))] fn japanese_font() -> Option<&'static std::path::Path> { @@ -566,10 +617,11 @@ pub fn shows_hangul(language: &str) -> bool { } /// Whether the interface can show `language` without missing-glyph boxes: Chinese needs an -/// installed CJK font, Korean a font with Hangul. +/// installed CJK font, Korean a font with Hangul, العربية an installed Arabic font. pub fn can_show(language: &str) -> bool { match language { "ko" => shows_hangul("ko"), + "ar" => arabic_font().is_some(), l if l.starts_with("zh") => cjk_font().is_some(), _ => true, } diff --git a/docs/control-protocol.md b/docs/control-protocol.md index 13320d8d..e07d758b 100644 --- a/docs/control-protocol.md +++ b/docs/control-protocol.md @@ -152,8 +152,8 @@ Select a language with `engine.execute` and the UI command `ui.language`: {"id":1,"method":"engine.execute","params":{"command":"ui.language","params":{"lang":"uk"}}} ``` -Supported values are `auto`, `en`, `uk`, `pt-BR`, `de`, `es`, `cs`, `ru`, `fr`, `zh`, `it`, `ko` and `sv`. -Chinese needs an installed CJK font; Korean needs a font covering the Korean interface from the +Supported values are `auto`, `en`, `uk`, `pt-BR`, `de`, `es`, `cs`, `ru`, `fr`, `zh`, `it`, `ko`, `sv` and `ar`. +Chinese needs an installed CJK font, Arabic an installed Arabic font; Korean needs a font covering the Korean interface from the optional craft-fonts input or the operating system. Without a suitable font, the saved choice is retained and the result's `shown` is `en`. `ui.set` also accepts `{"interfaceLanguage":"uk"}`; `ui.inspect` reports the saved choice in its UI state. diff --git a/docs/localization.md b/docs/localization.md index 791adec2..86bcdc6e 100644 --- a/docs/localization.md +++ b/docs/localization.md @@ -1,7 +1,7 @@ # Interface languages Choose **Edit → Interface Language** and select **Auto (system language)**, **English**, -**Українська**, **Português (Brasil)**, **Deutsch**, **Español**, **Čeština** (Czech), **Русский**, **Français**, **简体中文**, **Italiano**, **한국어** (Korean), or **Svenska** (Swedish). +**Українська**, **Português (Brasil)**, **Deutsch**, **Español**, **Čeština** (Czech), **Русский**, **Français**, **简体中文**, **Italiano**, **한국어** (Korean), **Svenska** (Swedish), or **العربية** (Arabic). The interface updates without restarting, including the native macOS menus. The choice is saved with the other interface preferences (`cadcraft.prefs`, beside the theme): eframe storage on the desktop, browser local storage on the web. Installations without a saved @@ -22,7 +22,7 @@ Automation can select the language through the existing control channel: ``` The `ui.set` method also accepts `{"interfaceLanguage":"cs"}`. Supported values are `auto`, -`en`, `uk`, `pt-BR`, `de`, `es`, `cs`, `ru`, `fr`, `zh`, `it`, `ko`, and `sv`; invalid values are rejected without changing the current +`en`, `uk`, `pt-BR`, `de`, `es`, `cs`, `ru`, `fr`, `zh`, `it`, `ko`, `sv`, and `ar`; invalid values are rejected without changing the current selection. Resetting palettes keeps the language choice. ## Translation coverage