From 6c72999361ac1b3cdf2c592f1f244243beeb2dea Mon Sep 17 00:00:00 2001 From: Davit Matchakhelidze Date: Fri, 23 Oct 2026 02:23:44 +0400 Subject: [PATCH 01/25] i18n: add Georgian (ka) interface language MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add a Georgian catalog (ka.tsv, 1,383 rows): the union of the existing catalogs, four menu headings (ზომების დატანა for the Dimension menu, ზომა for the object) and single-form counts, since a Georgian noun stays singular after a numeral. No marked UI literal falls back to English. Prompts read "მიუთითეთ …" for Specify and "შეიყვანეთ …" for Enter; clickable keywords keep the spelling the engine accepts. No Mtavruli. Register the language (Preference::Georgian, `ka`, ქართული) and add locale, preference, count, menu-heading, live-switch, dialog and no-Mtavruli tests. Docs, README and ATTRIBUTION list it. Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01YMTAbGNRxnMEzRvYnQGphF --- ATTRIBUTION.md | 1 + README.md | 2 +- ROADMAP.md | 1 + crates/ui-egui/src/i18n/ka.tsv | 1399 +++++++++++++++++++++++++++++ crates/ui-egui/src/i18n/mod.rs | 23 +- crates/ui-egui/src/i18n/tests.rs | 111 ++- crates/ui-egui/src/options/mod.rs | 2 +- docs/localization-parity.md | 4 +- docs/localization.md | 20 +- 9 files changed, 1554 insertions(+), 9 deletions(-) create mode 100644 crates/ui-egui/src/i18n/ka.tsv diff --git a/ATTRIBUTION.md b/ATTRIBUTION.md index 264c7430f..3779b71bc 100644 --- a/ATTRIBUTION.md +++ b/ATTRIBUTION.md @@ -71,3 +71,4 @@ Generated-in-code assets are original and have no file to list: | `crates/ui-egui/src/i18n/hu.tsv` | @Skaywalker | Original Hungarian translations of CADCraft English strings | MIT OR Apache-2.0 (`LICENSE-MIT`, `LICENSE-APACHE`) | No proprietary localization resources copied | | `crates/ui-egui/src/i18n/tr.tsv` | @ogzhnklvz (AI-assisted) | Original Turkish translations of CADCraft English strings | MIT OR Apache-2.0 (`LICENSE-MIT`, `LICENSE-APACHE`) | No proprietary localization resources copied; written from the English strings, no other catalog used as a source; the running app reviewed by a native speaker | | `crates/ui-egui/src/i18n/el.tsv` | @Camthalion77 with ChatGPT (AI-assisted) | Original Greek translations of CADCraft English strings | MIT OR Apache-2.0 (`LICENSE-MIT`, `LICENSE-APACHE`) | No proprietary localization resources copied; independent native proofreading pending | +| `crates/ui-egui/src/i18n/ka.tsv` | @devius with Claude (AI-assisted) | Original Georgian translations of CADCraft English strings | MIT OR Apache-2.0 (`LICENSE-MIT`, `LICENSE-APACHE`) | No proprietary localization resources copied; written from the English strings, no other catalog used as a source; no font assets added (the Georgian face comes from craft-fonts) | diff --git a/README.md b/README.md index 655b944f5..c762a223e 100644 --- a/README.md +++ b/README.md @@ -118,7 +118,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), Swedish (Svenska), Arabic (العربية, with an installed Arabic font), Hungarian (Magyar) and Turkish (Türkçe), 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), Arabic (العربية, with an installed Arabic font), Hungarian (Magyar), Turkish (Türkçe) and Georgian (ქართული), 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/ROADMAP.md b/ROADMAP.md index d54f3bf8b..93b3a701e 100644 --- a/ROADMAP.md +++ b/ROADMAP.md @@ -95,6 +95,7 @@ Ukrainian and German. Detail: [localization-parity.md](docs/localization-parity. | Indonesian | none | 0% | | Japanese | none | 0% | | Greek | complete current catalog | 1,330 current source keys; independent proofreading pending | +| Georgian | complete current catalog | 1,383 rows; native proofreading pending | | German | partial | ≈ 100% of the catalog (989 rows) | | Korean | none | 0% | | Vietnamese | none | 0% | diff --git a/crates/ui-egui/src/i18n/ka.tsv b/crates/ui-egui/src/i18n/ka.tsv new file mode 100644 index 000000000..25512c91f --- /dev/null +++ b/crates/ui-egui/src/i18n/ka.tsv @@ -0,0 +1,1399 @@ +# CADCraft Georgian (ქართული) interface catalog — original translations by the CADCraft contributors. +# License: MIT OR Apache-2.0 (the repository LICENSE-MIT and LICENSE-APACHE). +# Written from CADCraft's English strings; no proprietary translations were copied. +# Clean room: every entry is written from the plain meaning of the English label in ordinary +# Georgian computing and technical-drawing (ხაზვა) vocabulary (შრე, ზომა, დაშტრიხვა, მომრგვალება, +# ფასკა, წანაცვლება, მოკვეთა, ობიექტზე მიბმა, ხედვის არე, განლაგება). No other product's Georgian +# interface, string table or terminology database was consulted, and no other catalog is used as a source. +# UTF-8: contextEnglish sourceGeorgian translation. +# Empty context = ordinary label; @plural = one form with {n} (a Georgian noun stays singular after +# a numeral: "5 კომიტი"); menu = a menu heading where it differs from the label. +# Commands are verbal nouns (შენახვა, შემობრუნება); prompts read "მიუთითეთ …" for Specify, +# "შეიყვანეთ …" for Enter and "მონიშნეთ …" for Select. Georgian has no letter case: nothing is +# capitalised and Mtavruli is never used. +# Keep command IDs, keywords (Top, Zero, Bottom, _tan to, nX/nXP, Multiple, PICKADD, QPMODE), +# technology/product names and user data unchanged. + + Apply გამოყენება + Attach DWG... DWG-ის მიმაგრება... + Bind ჩაშენება + Detach მოხსნა + Loaded ჩატვირთულია + 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 + No external references are attached. გარე მიმართვები მიმაგრებული არ არის. + Not Found ვერ მოიძებნა + Not loaded არ არის ჩატვირთული + Open გახსნა + Overlay ზედდება + Reference Manager მიმართვების მენეჯერი + Reference Name მიმართვის სახელი + References: {n} მიმართვა: {n} + Reload ხელახლა ჩატვირთვა + Reload All ყველას ხელახლა ჩატვირთვა + Saved Path შენახული გზა + Unload განტვირთვა + Unloaded განტვირთულია + Unreferenced მიმართვის გარეშე + Unresolved დაუდგენელი + Cancel გაუქმება + OK OK + or [ ან [ + % of all commits ყველა კომიტის % + * Wildcard Match * შაბლონით დამთხვევა + *VARIES* *სხვადასხვა* + + | Top | 2D Wireframe + | ზედა | 2D კარკასი + +Bin +Bin + +LOC +LOC + 1 Viewport 1 ხედვის არე + 2 Points 2 წერტილი + 2 Viewports 2 ხედვის არე + 2D Solid 2D შევსებული არე + 3 Points 3 წერტილი + 3 Viewports 3 ხედვის არე + 3D Face 3D წახნაგი + 3D Operations 3D ოპერაციები + 3D Polyline 3D ტეხილი + 4 Viewports 4 ხედვის არე + < Less than < ნაკლებია + <> Not Equal <> არ უდრის + = Equals = უდრის + > Greater than > მეტია + A variable name starts with a letter and has only letters, digits and _ ცვლადის სახელი ასოთი იწყება და მხოლოდ ასოებს, ციფრებსა და _-ს შეიცავს + About პროგრამის შესახებ + About CADCraft CADCraft-ის შესახებ + Absolute აბსოლუტური + Add Leader მიმთითებლის დამატება + Additional angles დამატებითი კუთხეები + Align სწორება + Align Text ტექსტის სწორება + Aligned გასწორებული + All ყველა + All Annotation Objects ყველა ანოტაციური ობიექტი + All Used Layers ყველა გამოყენებული შრე + All files ყველა ფაილი + Angle კუთხე + Angular კუთხური + Annotation Visibility ანოტაციის ხილვადობა + Annotation scale ანოტაციის მასშტაბი + Apparent Intersection ხილული გადაკვეთა + Append to current selection set მიმდინარე მონიშნულზე დამატება + Apply to: გამოყენება: + Apply true color ნამდვილი ფერის გამოყენება + Arc რკალი + Arc Length რკალის სიგრძე + Area ფართობი + Arrange Panel პანელის დალაგება + Array მასივი + Attach მიმაგრება + Attribute ატრიბუტი + Attribute Definition ატრიბუტის განსაზღვრა + Attribute Display ატრიბუტების ჩვენება + Audit აუდიტი + Auto (system language) ავტომატური (სისტემის ენა) + Auto Constrain ავტომატური შეზღუდვა + AutoConstrain ავტოშეზღუდვა + Axis, End ღერძი, ბოლო + Base საბაზო წერტილი + Baseline საბაზისო ხაზი + Batch Publish პაკეტური გამოქვეყნება + Binary assets added დამატებული ბინარული ფაილები + Binary assets removed წაშლილი ბინარული ფაილები + Bind... ჩაშენება... + Blend გადასვლა + Block ბლოკი + Block Attribute Manager... ბლოკის ატრიბუტების მენეჯერი... + Block Editor ბლოკის რედაქტორი + Block Reference ბლოკის ჩასმა + Block... ბლოკი... + Blocks ბლოკები + Blue ლურჯი + Bold მუქი + Boolean ლოგიკური + Boundary საზღვარი + Boundary... საზღვარი... + Box პარალელეპიპედი + Break გაწყვეტა + Break At Point წერტილში გაწყვეტა + Break-line Symbol წყვეტის ხაზის სიმბოლო + Bring Above Objects ობიექტებზე ზემოთ გადატანა + Bring Annotations to Front ანოტაციების წინა პლანზე გადმოტანა + Bring to Front წინა პლანზე გადმოტანა + Bulleted list ბურთულებიანი სია + ByBlock ბლოკის მიხედვით + ByColor ფერის მიხედვით + ByLayer შრის მიხედვით + CADCraft Help CADCraft-ის დახმარება + 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} + Circle წრე + Circumference წრეწირის სიგრძე + Clear History ისტორიის გასუფთავება + Clear გასუფთავება + Clip მოჭრა + Clip Viewport ხედვის არის მოჭრა + Clipboard გაცვლის ბუფერი + Close დახურვა + Close All ყველას დახურვა + Close All Other Drawings ყველა სხვა ნახაზის დახურვა + Closed შეკრული + Close Comparison შედარების დახურვა + Coincident დამთხვევა + Collapse Palettes პალიტრების ჩაკეცვა + Collapse Tool Sets ხელსაწყოთა ნაკრებების ჩაკეცვა + Collinear კოლინეარობა + Color ფერი + Color 8 ფერი 8 + Color 9 ფერი 9 + Color Index ფერის ინდექსი + Color... ფერი... + Command Aliases ბრძანებების ფსევდონიმები + Command History ბრძანებების ისტორია + Clear Command History ბრძანებების ისტორიის გასუფთავება + Command Line ბრძანების სტრიქონი + Command Line History Lines ბრძანების სტრიქონის ისტორიის სტრიქონები + Command Reference ბრძანებების ცნობარი + 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 Text to Mtext ტექსტის Mtext-ად გარდაქმნა + Copy კოპირება + Copy Full File Path ფაილის სრული გზის კოპირება + Copy History ისტორიის კოპირება + Copy Layout განლაგების კოპირება + Copy Nested Objects ჩადგმული ობიექტების კოპირება + Copy Selection მონიშნულის კოპირება + Copy with Base Point კოპირება საბაზო წერტილით + Count დათვლა + Count List დათვლის სია + Count Table დათვლის ცხრილი + Create Block ბლოკის შექმნა + Creates a user parameter ქმნის მომხმარებლის პარამეტრს + Ctrl+Enter to finish დასასრულებლად: Ctrl+Enter + Current layer მიმდინარე შრე + Current selection მიმდინარე მონიშნული + Current: {color} მიმდინარე: {color} + Cut ამოჭრა + Cyan ცისფერი + Cylinder ცილინდრი + DWG DWG + DWG Reference... DWG მიმართვა... + DXF DXF + Dark ბნელი + Data Extraction... მონაცემების ამოღება... + Default ნაგულისხმევი + Data Link... მონაცემთა კავშირი... + Default Save Format შენახვის ნაგულისხმევი ფორმატი + Default Save Version შენახვის ნაგულისხმევი ვერსია + Define Attributes ატრიბუტების განსაზღვრა + Define Attributes... ატრიბუტების განსაზღვრა... + Defined width განსაზღვრული სიგანე + Degree გრადუსი + Degrees of Freedom თავისუფლების ხარისხები + Degrees of freedom: {n} თავისუფლების ხარისხი: {n} + Delete წაშლა + Delete Column სვეტის წაშლა + Delete Constraints შეზღუდვების წაშლა + 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 ყველა მონიშვნის მოხსნა + Diameter დიამეტრი + Dim style ზომის სტილი + Dimension Break ზომის გაწყვეტა + Dimension Edit ზომის რედაქტირება + Dimension ზომა + 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 name საჩვენებელი სახელი + 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 Template (DWT) ნახაზის შაბლონი (DWT) + Drawing Utilities ნახაზის უტილიტები + Drawings (DWG, DXF) ნახაზები (DWG, DXF) + SVG drawings (SVG, SVGZ) SVG ნახაზები (SVG, SVGZ) + Dynamic დინამიკური + Dynamic Dimensions დინამიკური ზომები + Dynamic Input დინამიკური შეყვანა + Dynamic Input (F12) დინამიკური შეყვანა (F12) + E ა + Edit რედაქტირება + Edit Attributes... ატრიბუტების რედაქტირება... + Edit Text... ტექსტის რედაქტირება... + Edit Table Cell ცხრილის უჯრის რედაქტირება + Elevation ნიშნული + Ellipse ელიფსი + Elliptical Arc ელიფსური რკალი + 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. შეიყვანეთ Top, Zero ან 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 გამოთვლა + Evaluate LISP LISP-ის გამოთვლა + Exclude from new selection set ახალი მონიშნულიდან გამორიცხვა + Explode დაშლა + Explode Attributes to Text ატრიბუტების ტექსტად დაშლა + Export ექსპორტი + Export Table ცხრილის ექსპორტი + Export to PDF... PDF-ად ექსპორტი... + Express Tools Express Tools + 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 from the Drawing ნახაზიდან აღება + Get Variable ცვლადის მიღება + Get View ხედის მიღება + Global გლობალური + Global width საერთო სიგანე + Grab bag სხვადასხვა + Gradient გრადიენტი + Gradient... გრადიენტი... + 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 სახელურით გაწელვა + Group დაჯგუფება + Group Edit ჯგუფის რედაქტირება + Group Options დაჯგუფების პარამეტრები + Group Selection ჯგუფის მონიშვნა + Hatch დაშტრიხვა + Hatch Edit დაშტრიხვის რედაქტირება + Hatch Patterns დაშტრიხვის ნიმუშები + Hatch... დაშტრიხვა... + Height სიმაღლე + Height: {height} სიმაღლე: {height} + Helix სპირალი + Help დახმარება + Hide All ყველას დამალვა + Hide All Constraint Bars შეზღუდვების ყველა ზოლის დამალვა + Hide All Dynamic Dimensions ყველა დინამიკური ზომის დამალვა + Hide Layer List შრეების სიის დამალვა + Hide Objects ობიექტების დამალვა + Hide Palettes პალიტრების დამალვა + History ისტორია + Home საწყისი პოზიცია + Horizontal ჰორიზონტალური + HorizontalDistance ჰორიზონტალური მანძილი + How to apply: გამოყენების წესი: + ID Point წერტილის კოორდინატები + Import იმპორტი + Align Multileaders მულტიმიმთითებლების სწორება + Collect შეგროვება + Collect Multileaders მულტიმიმთითებლების შეგროვება + Edit Multileader მულტიმიმთითებლის რედაქტირება + 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 tab ტაბულაციის ჩასმა + Insert this block ამ ბლოკის ჩასმა + Insert Table Formula ცხრილში ფორმულის ჩასმა + Insertion ჩასმის წერტილი + Insertion X ჩასმის წერტილი X + Insertion Y ჩასმის წერტილი Y + Insertion Z ჩასმის წერტილი Z + Inspect Constraints შეზღუდვების შემოწმება + Inspect Drawing ნახაზის შემოწმება + Inspection შემოწმება + Interface Language ინტერფეისის ენა + Interface Theme ინტერფეისის თემა + Intersect გადაკვეთა + Intersection გადაკვეთა + Isolate იზოლირება + Isolate Layer შრის იზოლირება + Isolate Objects ობიექტების იზოლირება + Isometric Drafting იზომეტრიული ხაზვა + Jogged გატეხილი + Jogged Linear გატეხილი წრფივი + Join შეერთება + Join the ArtCraft Discord… შემოუერთდით ArtCraft-ის Discord-ს… + Join us on Discord შემოგვიერთდით Discord-ზე + Isometric Plane იზომეტრიული სიბრტყე + Isometric snap იზომეტრიული მიბმა + Language ენა + 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 შრეების პალიტრა + Hide Palette პალიტრის დამალვა + Layers displayed: {shown} of {total}. Current layer: {layer} ნაჩვენები შრეები: {shown} / {total}. მიმდინარე შრე: {layer} + Layout განლაგება + Layout list განლაგებების სია + Leader მიმთითებელი + Leaders Only მხოლოდ მიმთითებლები + Left მარცხნივ + 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 ხაზის ტიპის მასშტაბი + Ltscale ხაზის ტიპის მასშტაბი + 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... ჩატვირთვა... + Load Application... აპლიკაციის ჩატვირთვა... + Loaded linetypes ჩატვირთული ხაზის ტიპები + Lock ჩაკეტვა + Lock Layer შრის ჩაკეტვა + Lock viewport ხედვის არის ჩაკეტვა + Lock/Unlock ჩაკეტვა/განბლოკვა + Loft კვეთებით აგება + MIT OR Apache-2.0. Not affiliated with Autodesk, Inc. MIT OR Apache-2.0. Autodesk, Inc.-თან კავშირი არ აქვს. + MODEL მოდელი + MText MText + Magenta მეწამული + Major line every მთავარი ხაზის ბიჯი + Make Current მიმდინარედ დაყენება + Make Object's Layer Current ობიექტის შრის მიმდინარედ დაყენება + Make... შექმნა... + Match Layer შრის მისადაგება + Match Properties თვისებების გადატანა + Measure გაზომვა + Measure Distance მანძილის გაზომვა + Measure Geometry გეომეტრიის გაზომვა + Merge Cells უჯრების შერწყმა + Merged PRs გაერთიანებული PR-ები + Mid Between 2 Points შუა 2 წერტილს შორის + Midpoint შუა წერტილი + Mirror არეკვლა + Model მოდელი + Model Space (in viewport) მოდელის სივრცე (ხედვის არეში) + Modeling მოდელირება + Models მოდელები + Modify შეცვლა + Move გადაადგილება + Move/Copy/Rotate გადაადგილება/კოპირება/შემობრუნება + Multileader მულტიმიმთითებელი + Multileader Style... მულტიმიმთითებლის სტილი... + Multileader style მულტიმიმთითებლის სტილი + Multiline მულტიხაზი + Multiline Text მრავალსტრიქონიანი ტექსტი + Multiline Text... მრავალსტრიქონიანი ტექსტი... + Multiple რამდენიმე + Multiple Point რამდენიმე წერტილი + My ჩემი + My properties: not available yet ჩემი თვისებები: ჯერ ხელმისაწვდომი არ არის + N ჩ + Name სახელი + Name (A–Z) სახელი (ა–ჰ) + Named Views... დასახელებული ხედები... + Nearest უახლოესი + New ახალი + New (metric) ახალი (მეტრული) + New Drawing ახალი ნახაზი + New Drawing (⌘N) ახალი ნახაზი (⌘N) + New Drawing... ახალი ნახაზი... + New Layer ახალი შრე + New Layout ახალი განლაგება + New VP Freeze გაყინვა ახალ ხედვის არეებში + New Viewports... ახალი ხედვის არეები... + New from Template... ახალი შაბლონიდან... + New layout ახალი განლაგება + New state name მდგომარეობის ახალი სახელი + Next Change შემდეგი ცვლილება + No არა + No blocks defined in this drawing. ამ ნახაზში ბლოკები არ არის განსაზღვრული. + No contributor data was built into this copy. ამ ასლში მონაწილეების მონაცემები არ არის ჩაშენებული. + No model credits were built into this copy. ამ ასლში მოდელების მონაცემები არ არის ჩაშენებული. + No saved layer states შრის შენახული მდგომარეობები არ არის + No selection მონიშნული არაფერია + Node კვანძი + None არცერთი + Not available მიუწვდომელია + Not available yet ჯერ ხელმისაწვდომი არ არის + Numbered list დანომრილი სია + OK 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 type: ობიექტის ტიპი: + Oblique დახრა + Off გამორთული + Offset წანაცვლება + On ჩართული + On/Off ჩართვა/გამორთვა + One of the Crafting Apps by the ArtCraft team and community. ArtCraft-ის გუნდისა და საზოგადოების ერთ-ერთი Crafting App. + Only in this drawing: {n} მხოლოდ ამ ნახაზში: {n} + Only in {name}: {n} მხოლოდ ფაილში {name}: {n} + Open (⌘O) გახსნა (⌘O) + Open Sample Drawing სანიმუშო ნახაზის გახსნა + Open sample drawing სანიმუშო ნახაზის გახსნა + Open Xref გარე მიმართვის გახსნა + Open... გახსნა... + Open Recent ბოლოს გახსნილი ფაილების გახსნა + Clear Recent Files ბოლოს გახსნილი ფაილების სიის გასუფთავება + Operator: ოპერატორი: + Orbit ორბიტა + Ordinate კოორდინატული + Ortho (F8) ორთო (F8) + Ortho Mode ორთო რეჟიმი + Ortho Mode (F8) ორთო რეჟიმი (F8) + Osnap Settings... ობიექტზე მიბმის პარამეტრები... + Out დაპატარავება + Over-constrained ზედმეტად შეზღუდული + Override გადაფარვა + PAPER ფურცელი + Percent პროცენტი + Polar (distance < angle) პოლარული (მანძილი < კუთხე) + PRs PR-ები + Page Setup Manager გვერდის პარამეტრების მენეჯერი + Page Setup Manager... გვერდის პარამეტრების მენეჯერი... + Pan პანორამა + Pan Down პანორამა ქვემოთ + Pan Left პანორამა მარცხნივ + Pan Right პანორამა მარჯვნივ + Pan Up პანორამა ზემოთ + Paper Space ფურცლის სივრცე + Parallel პარალელური + Parameters Manager პარამეტრების მენეჯერი + Parametric პარამეტრული + Paste ჩასმა + Paste as Block ბლოკად ჩასმა + Paste to Command Line ბრძანების სტრიქონში ჩასმა + Paste to Original Coordinates საწყის კოორდინატებზე ჩასმა + Path Array ტრაექტორიული მასივი + Pattern ნიმუში + Perpendicular მართობი + Plot დაბეჭდვა + Plot (click: do not plot) იბეჭდება (დაწკაპეთ, რომ არ დაიბეჭდოს) + Plot Preview ნახვა ამობეჭდვამდე + Plot Window ბეჭდვის ფანჯარა + Plot style ბეჭდვის სტილი + Plot style attached to მიმაგრებული ბეჭდვის სტილი + Plot style table ბეჭდვის სტილების ცხრილი + Plot Style... ბეჭდვის სტილი... + Plot Style Manager ბეჭდვის სტილების მენეჯერი + Plot Style Manager... ბეჭდვის სტილების მენეჯერი... + Plot Styles... ბეჭდვის სტილები... + Plotter Manager პლოტერების მენეჯერი + Plotter Manager... პლოტერების მენეჯერი... + New CTB ახალი CTB + New STB ახალი STB + New style ახალი სტილი + Reset Panel Layout პანელების განლაგების ჩამოყრა + Send Hatches to Back დაშტრიხვების უკანა პლანზე გადატანა + Send Under Objects ობიექტების ქვეშ გადატანა + Text Objects Only მხოლოდ ტექსტური ობიექტები + Use for this layout ამ განლაგებისთვის გამოყენება + Display plot styles ბეჭდვის სტილების ჩვენება + No plot style tables. ბეჭდვის სტილების ცხრილები არ არის. + A built-in table: editing it keeps an edited copy in the drawing. ჩაშენებული ცხრილი: რედაქტირებისას შეცვლილი ასლი ნახაზში ინახება. + Keep an editable copy of this table in the drawing ამ ცხრილის რედაქტირებადი ასლის ნახაზში შენახვა + Layout {name}: {table} განლაგება {name}: {table} + Grayscale ნაცრისფერი ტონები + Screening ფერის ინტენსივობა + Use object linetype ობიექტის ხაზის ტიპის გამოყენება + Use object lineweight ობიექტის ხაზის სისქის გამოყენება + Remove წაშლა + Add დამატება + Open a drawing first. ჯერ გახსენით ნახაზი. + Plot table type ბეჭდვის ცხრილის ტიპი + Color-dependent ფერზე დამოკიდებული + Named დასახელებული + Plus/minus პლუს/მინუს + Point წერტილი + Point Filters წერტილის ფილტრები + Point Style... წერტილის სტილი... + 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... დაბეჭდვა... + 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 ზომების ხელახლა მიბმა + Recent ბოლოდროინდელი + Recent Commands ბოლოდროინდელი ბრძანებები + Recent Input ბოლოდროინდელი შეყვანა + Recover... აღდგენა... + Rectangle მართკუთხედი + Recalculate Table Formulas ცხრილის ფორმულების გადათვლა + Rectangular მართკუთხა + Rectangular snap მართკუთხა მიბმა + Rectangular Array მართკუთხა მასივი + Red წითელი + Redo ხელახლა შესრულება + Redo (⇧⌘Z) ხელახლა შესრულება (⇧⌘Z) + Redraw გადახატვა + Regen რეგენერაცია + Regen All ყველაფრის რეგენერაცია + Region რეგიონი + Region/Mass Properties რეგიონის/მასის თვისებები + Reinitialize ხელახლა ინიციალიზება + Relative ფარდობითი + Relative to last segment ბოლო სეგმენტის მიმართ + Remove Leader მიმთითებლის მოცილება + 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 მიუთითეთ წრის მესამე წერტილი: _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 გაწელვა + Style: Standard სტილი: Standard + Subtract გამოკლება + Sweep ტრაექტორიით აგება + Switch Drawing ნახაზის გადართვა + Switch Layout განლაგების გადართვა + Switch between model space in a viewport and paper space გადართვა ხედვის არეში მოდელის სივრცესა და ფურცლის სივრცეს შორის + Symmetric სიმეტრია + Synchronize Attributes ატრიბუტების სინქრონიზაცია + To სადამდე + Toggle PICKADD (off: each pick replaces the selection) PICKADD-ის გადართვა (გამორთული: ყოველი არჩევა ცვლის მონიშნულს) + Toggle PICKADD (on: picks add to the selection) PICKADD-ის გადართვა (ჩართული: არჩეული ემატება მონიშნულს) + 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 Style... ტექსტის სტილი... + Text height ტექსტის სიმაღლე + Text override ტექსტის ჩანაცვლება + Text style ტექსტის სტილი + Thaw All Layers ყველა შრის გალღობა + Thaw Layer შრის გალღობა + There is nothing here yet. აქ ჯერ არაფერია. + Thickness სისქე + Time დრო + To get started, create or open a drawing. დასაწყებად შექმენით ან გახსენით ნახაზი. + 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) + 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... ერთეულები... + Unlock Layer შრის განბლოკვა + Unlock viewport ხედვის არის განბლოკვა + Unmerge Cells უჯრების შერწყმის გაუქმება + Unsaved Layer State შრეების შეუნახავი მდგომარეობა + Up ზემოთ + Update Data Links მონაცემთა ბმულების განახლება + Update განახლება + Use System Setting სისტემის პარამეტრის გამოყენება + User მომხმარებელი + User Parameters მომხმარებლის პარამეტრები + Username მომხმარებლის სახელი + Volume მოცულობა + 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 ხედვის არეები + W დ + WCS WCS + White თეთრი + Width factor სიგანის კოეფიციენტი + Window ფანჯარა + Wipeout დამფარავი არე + Workspace Switching სამუშაო სივრცის გადართვა + Write Block ბლოკის ჩაწერა + Xline დამხმარე ხაზი + Yellow ყვითელი + Yes დიახ + Zoom მასშტაბი + Zoom All მასშტაბი: ყველაფერი + Zoom Dynamic მასშტაბი: დინამიკური + Zoom Extents მასშტაბი: საზღვრები + Zoom In გადიდება + Zoom Object მასშტაბი: ობიექტი + Zoom Out დაპატარავება + Zoom Previous მასშტაბი: წინა + Zoom Realtime მასშტაბი: რეალურ დროში + Zoom Window მასშტაბი: ფანჯარა + error შეცდომა + {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 ⌘↩ — დასრულება +@plural {n} commit {n} კომიტი +@plural {n} contributor {n} მონაწილე + Drawing as bytes ნახაზი ბაიტებად + Services სერვისები + Hide CADCraft CADCraft-ის დამალვა + Hide Others სხვების დამალვა + Accessibility ხელმისაწვდომობა + Show System Cursor სისტემური კურსორის ჩვენება + Animation Effects ანიმაციის ეფექტები + Animation effects ანიმაციის ეფექტები + Interface scale ინტერფეისის მასშტაბი + Import... იმპორტი... + Export... ექსპორტი... + Batch Publish... პაკეტური გამოქვეყნება... + Scale List... მასშტაბების სია... + Annotative Object Scale ანოტაციური ობიექტის მასშტაბი + Add Current Scale მიმდინარე მასშტაბის დამატება + Delete Current Scale მიმდინარე მასშტაბის წაშლა + Add/Delete Scales... მასშტაბების დამატება/წაშლა... + Synchronize Multiple-scale Positions მრავალმასშტაბიანი პოზიციების სინქრონიზაცია + Annotative Update ანოტაციურის განახლება + Show Annotative Objects ანოტაციური ობიექტების ჩვენება + Current Scale Only მხოლოდ მიმდინარე მასშტაბი + All Scales ყველა მასშტაბი + Drawing Recovery Manager... ნახაზების აღდგენის მენეჯერი... + Tolerance... დაშვება... + Add Vertex წვეროს დამატება + Remove Vertex წვეროს მოშორება + Convert to Arc რკალად გარდაქმნა + Convert to Line ხაზად გარდაქმნა + Stretch Vertex წვეროს გაწელვა + Edit Array მასივის რედაქტირება + Close Array Editing მასივის რედაქტირების დახურვა + Multiline... მულტიხაზი... + Multiline Style... მულტიხაზის სტილი... + Solid Editing სხეულის რედაქტირება + 3D Mouse... 3D მაუსი... + 3D Mouse 3D მაუსი + Calibrate 3D Mouse 3D მაუსის კალიბრაცია + 3D Mouse Navigation 3D მაუსით ნავიგაცია + 3D mouse input is unavailable on this platform 3D მაუსის შეყვანა ამ პლატფორმაზე მიუწვდომელია + No supported 3D mouse found მხარდაჭერილი 3D მაუსი ვერ მოიძებნა + Release the 3D mouse to calibrate its resting position გაუშვით 3D მაუსი ხელიდან, რომ მისი უძრავი მდგომარეობა დაკალიბრდეს + 3D mouse connected 3D მაუსი დაკავშირებულია + 3D mouse busy, possibly 3DxWare or missing device permissions 3D მაუსი დაკავებულია: შესაძლოა, 3DxWare-ის ან მოწყობილობის ნებართვების არქონის გამო + 3D mouse disconnected 3D მაუსი გათიშულია + 3D mouse input could not be started 3D მაუსის შეყვანა ვერ ჩაირთო + Enable 3D mouse navigation 3D მაუსით ნავიგაციის ჩართვა + Pan sensitivity პანორამის მგრძნობელობა + Zoom sensitivity მასშტაბის მგრძნობელობა + Reverse zoom direction მასშტაბის მიმართულების შებრუნება + Calibrate კალიბრაცია + Move sideways to pan; push/pull or twist to zoom. გვერდზე გაწევით — პანორამა; მიწევით/გამოწევით ან მობრუნებით — მასშტაბი. + Left device button: zoom extents. Right device button: calibrate. მოწყობილობის მარცხენა ღილაკი: მასშტაბი საზღვრებით. მარჯვენა ღილაკი: კალიბრაცია. + More toolbar commands ხელსაწყოთა ზოლის სხვა ბრძანებები + Default save version შენახვის ნაგულისხმევი ვერსია + Automatic save every ავტომატური შენახვა ყოველ + min წთ + Automatic save file location ავტომატური შენახვის ფაილის მდებარეობა + Drawings with no file yet are saved in the default version. 0 minutes turns automatic save off. ჯერ ფაილის არმქონე ნახაზები ნაგულისხმევ ვერსიაში ინახება. 0 წუთი ავტომატურ შენახვას გამორთავს. + Time-sensitive right-click: a quick click is Enter, holding opens the menu დროზე დამოკიდებული მარჯვენა დაწკაპება: მოკლე დაწკაპება Enter-ია, დაჭერით გაიხსნება მენიუ + Turned off, a right-click while a command runs always opens the shortcut menu. გამორთვისას ბრძანების შესრულების დროს მარჯვენა დაწკაპება ყოველთვის კონტექსტურ მენიუს ხსნის. + Hatch Pattern დაშტრიხვის ნიმუში + Search for pattern ნიმუშის ძიება + Run Script... სკრიპტის გაშვება... + Query Texts ტექსტების მოთხოვნა + Analyze Shapes ფიგურების ანალიზი + Hatch Pick დაშტრიხვის არჩევა + Hatch and Gradient დაშტრიხვა და გრადიენტი + Color 1 ფერი 1 + Color 2 ფერი 2 + Shape ფიგურა + Curved მრუდი + Spherical სფერული + Hemispherical ნახევარსფერული + Inverted შებრუნებული + Centered ცენტრში + Hatch origin დაშტრიხვის საწყისი წერტილი + Use current origin მიმდინარე საწყისი წერტილის გამოყენება + Specified origin მითითებული საწყისი წერტილი + Click to set new origin დაწკაპეთ ახალი საწყისი წერტილის დასაყენებლად + Default to boundary extents ნაგულისხმევად საზღვრის გაბარიტები + Bottom left ქვედა მარცხენა + Bottom right ქვედა მარჯვენა + Top left ზედა მარცხენა + Top right ზედა მარჯვენა + Boundaries საზღვრები + Add: Pick points დამატება: წერტილების არჩევა + Add: Select objects დამატება: ობიექტების მონიშვნა + Boundaries picked: {n} არჩეული საზღვრები: {n} + Select boundaries to remove მონიშნეთ მოსაშორებელი საზღვრები + Island კუნძული + Associative ასოციაციური + Create separate hatches ცალკეული დაშტრიხვების შექმნა + Island detection კუნძულების აღმოჩენა + Normal ჩვეულებრივი + Outer გარე + Ignore უგულებელყოფა + Origin: {x}, {y} საწყისი წერტილი: {x}, {y} + Sheet Books to PDF... ფურცლების წიგნები PDF-ში... + Not a number or distance: {text} არც რიცხვია და არც მანძილი: {text} + Dynamic Block Data დინამიკური ბლოკის მონაცემები + Custom მორგებული + Dynamic Block Reference დინამიკური ბლოკის ჩასმა + Set Dynamic Property დინამიკური თვისების დაყენება + Dynamic Block Grips დინამიკური ბლოკის სახელურები + Drag Dynamic Grip დინამიკური სახელურის გადათრევა + Save Block ბლოკის შენახვა + Save Block As ბლოკის შენახვა როგორც + Close Block Editor ბლოკის რედაქტორის დახურვა + Unsaved changes შეუნახავი ცვლილებები + Edit Block Definition ბლოკის განსაზღვრების რედაქტირება + Block to create or edit შესაქმნელი ან დასარედაქტირებელი ბლოკი + Open in Block Editor ბლოკის რედაქტორში გახსნა + This drawing ეს ნახაზი + contains authoring elements. Open in Block Editor? შეიცავს ბლოკის აგების ელემენტებს. გაიხსნას ბლოკის რედაქტორში? + New block ახალი ბლოკი + Italic დახრილი + Underline ხაზგასმული + Overline ზედა ხაზი + Justify ორმხრივი სწორება + Text color ტექსტის ფერი + Click the ruler to add a tab stop, right-click to remove one დაწკაპეთ სახაზავზე ტაბულაციის პოზიციის დასამატებლად, მარჯვენა დაწკაპებით — წასაშლელად + Select using two clicks only მონიშვნა მხოლოდ ორი დაწკაპებით + Define each corner of the selection window with a separate click. მონიშვნის ფანჯრის თითოეული კუთხე ცალკე დაწკაპებით განისაზღვრება. + Type an alias name. აკრიფეთ ფსევდონიმის სახელი. + Choose the command the alias starts. აირჩიეთ ბრძანება, რომელსაც ფსევდონიმი გაუშვებს. + {command} is an unknown command. {command} უცნობი ბრძანებაა. + {alias} is already defined; select it and use Edit. {alias} უკვე განსაზღვრულია; მონიშნეთ და გამოიყენეთ „რედაქტირება“. + More than {n} aliases. {n}-ზე მეტი ფსევდონიმი. + Alias file: {file} ფსევდონიმების ფაილი: {file} + No alias file loaded. REINIT replaces these aliases with a file's. ფსევდონიმების ფაილი არ არის ჩატვირთული. REINIT ამ ფსევდონიმებს ფაილიდან წაკითხულით ჩაანაცვლებს. + Alias ფსევდონიმი + Command ბრძანება + overrides built-in ჩაშენებულს ჩაანაცვლებს + built-in ჩაშენებული + Add… დამატება… + Edit… რედაქტირება… + Save alias ფსევდონიმის შენახვა + Discard მოშორება + Customize მორგება + Edit Command Aliases (PGP)... ბრძანებების ფსევდონიმების რედაქტირება (PGP)... + B B + CADCraft CADCraft + X X + Y Y +menu Dimension ზომების დატანა +menu Draw ხაზვა +menu Modify შეცვლა +menu View ხედი + Arrow size ისრის ზომა + Dim scale overall ზომის საერთო მასშტაბი + Precision სიზუსტე + Layouts განლაგებები + Printer/plotter პრინტერი/პლოტერი + Paper size ფურცლის ზომა + Orientation ორიენტაცია + Portrait ვერტიკალური + Landscape ჰორიზონტალური + Plot area ბეჭდვის არე + Fit to paper ფურცელში ჩატევა + Center the plot ნაბეჭდის ცენტრირება + Plot object lineweights ობიექტების ხაზის სისქეების ბეჭდვა + Plot transparency გამჭვირვალობის ბეჭდვა + Apply to Layout განლაგებაზე გამოყენება + Enter name of LISP file to load შეიყვანეთ ჩასატვირთი LISP ფაილის სახელი + Enter geometric characteristic შეიყვანეთ გეომეტრიული მახასიათებელი + Enter block names to extract შეიყვანეთ ამოსაღები ბლოკების სახელები + Limits ზღვრები + Plot offset ბეჭდვის წანაცვლება + X offset (mm) X წანაცვლება (მმ) + Y offset (mm) Y წანაცვლება (მმ) + First corner პირველი კუთხე + Opposite corner საპირისპირო კუთხე + Window < ფანჯარა < diff --git a/crates/ui-egui/src/i18n/mod.rs b/crates/ui-egui/src/i18n/mod.rs index a0bf590db..673ed2151 100644 --- a/crates/ui-egui/src/i18n/mod.rs +++ b/crates/ui-egui/src/i18n/mod.rs @@ -45,10 +45,12 @@ pub enum Preference { Hungarian, #[serde(rename = "tr")] Turkish, + #[serde(rename = "ka")] + Georgian, } impl Preference { - pub const ALL: [Self; 17] = [ + pub const ALL: [Self; 18] = [ Self::Auto, Self::English, Self::Greek, @@ -66,6 +68,7 @@ impl Preference { Self::Arabic, Self::Hungarian, Self::Turkish, + Self::Georgian, ]; /// The codes a preference can be given as, for messages ("auto, en or uk"). @@ -96,6 +99,7 @@ impl Preference { Self::Arabic => "ar", Self::Hungarian => "hu", Self::Turkish => "tr", + Self::Georgian => "ka", } } @@ -124,6 +128,15 @@ impl Preference { Self::Arabic => "العربية", Self::Hungarian => "Magyar", Self::Turkish => "Türkçe", + // Georgian letters come from the craft-fonts Georgian face; a build without it shows + // the English name (as Korean does) and keeps the interface in English. + Self::Georgian => { + if crate::theme::can_show("ka") { + "ქართული" + } else { + "Georgian" + } + } } } @@ -154,6 +167,7 @@ impl Preference { Self::Arabic => "ar", Self::Hungarian => "hu", Self::Turkish => "tr", + Self::Georgian => "ka", Self::Auto => locales.iter().find_map(|s| locale_language(s)).unwrap_or("en"), } } @@ -170,7 +184,7 @@ pub struct Language { catalog: OnceLock>, } -pub static LANGUAGES: [Language; 16] = [ +pub static LANGUAGES: [Language; 17] = [ Language { code: "en", name: "English", source: "", plural: plural_en, plural_forms: 2, catalog: OnceLock::new() }, // Greek: one for exactly 1; other for zero and all other integer counts. Language { code: "el", name: "Ελληνικά", source: include_str!("el.tsv"), plural: plural_en, plural_forms: 2, catalog: OnceLock::new() }, @@ -211,6 +225,11 @@ pub static LANGUAGES: [Language; 16] = [ Language { code: "hu", name: "Magyar", source: include_str!("hu.tsv"), plural: plural_ko, plural_forms: 1, catalog: OnceLock::new() }, // Turkish keeps a noun singular after a number ("3 commit"), so like Korean it has one form. Language { code: "tr", name: "Türkçe", source: include_str!("tr.tsv"), plural: plural_ko, plural_forms: 1, catalog: OnceLock::new() }, + // Georgian keeps a noun singular after a numeral ("5 კომიტი"), so one form, the Korean rule. + // Its letters come from the craft-fonts `Geor` face (`theme::can_show`). + Language { + code: "ka", name: "ქართული", source: include_str!("ka.tsv"), plural: plural_ko, plural_forms: 1, catalog: OnceLock::new() + }, ]; /// BCP 47 and POSIX locale tags, including `uk-UA`, `uk_UA.UTF-8` and `pt_BR.UTF-8`. diff --git a/crates/ui-egui/src/i18n/tests.rs b/crates/ui-egui/src/i18n/tests.rs index bbbcded39..052cae5fb 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", "ar", "hu", "tr", "el"]; +const REPORTED: &[&str] = &["pt-BR", "de", "es", "cs", "ru", "fr", "zh", "it", "ko", "sv", "ar", "hu", "tr", "el", "ka"]; fn check(language: &str, what: &str, missing: Vec) { if REQUIRED.contains(&language) { @@ -1172,3 +1172,112 @@ fn default_fonts_cover_all_greek_letters_in_the_catalog() { } }); } + +#[test] +fn georgian_locales_preferences_and_single_count_form() { + for tag in ["ka", "ka-GE", "ka_GE", "ka_GE.UTF-8", "KA-ge", " ka-GE "] { + assert_eq!(locale_language(tag), Some("ka"), "{tag}"); + } + // `kat`/`geo` are the three-letter codes and `kab` is Kabyle; none picks Georgian. + for tag in ["kat", "geo", "kab", "kartuli"] { + assert_eq!(locale_language(tag), None, "{tag}"); + } + assert_eq!(Preference::parse("ka"), Some(Preference::Georgian)); + assert_eq!(Preference::Georgian.code(), "ka"); + assert_eq!(Preference::Georgian.name(), if crate::theme::can_show("ka") { "ქართული" } else { "Georgian" }); + assert_eq!(Preference::Georgian.resolve(&["en-US".into()]), "ka"); + assert_eq!(Preference::Auto.resolve(&["pl-PL".into(), "ka-GE".into(), "en-US".into()]), "ka"); + let saved = serde_json::to_string(&Preference::Georgian).unwrap(); + assert_eq!(saved, "\"ka\""); + let mut app = CadApp::new(Session::new(), Services::default()); + app.ui.interface_language = Preference::Georgian; + let mut restored = CadApp::new(Session::new(), Services::default()); + restored.load_prefs(&app.prefs_json()); + assert_eq!(restored.ui.interface_language, Preference::Georgian); + with_language("ka", || { + // A Georgian noun stays singular after a numeral, 1 included. + for n in [0, 1, 2, 5, 21, u64::MAX] { + assert_eq!(count(n, "{n} contributor", "{n} contributors"), format!("{n} მონაწილე")); + assert_eq!(count(n, "{n} commit", "{n} commits"), format!("{n} კომიტი")); + } + assert_eq!(t("Open"), "გახსნა"); + assert_eq!(menu("Dimension"), "ზომების დატანა"); + assert_eq!(t("Dimension"), "ზომა"); + assert_eq!(menu("Draw"), "ხაზვა"); + assert_eq!(menu("File"), "ფაილი"); + }); + assert_eq!(t("Open"), "Open", "language must not leak outside a render scope"); +} + +#[test] +fn georgian_catalog_covers_marked_ui_literals_without_mtavruli() { + assert!(missing_marked_ui_literals("ka").is_empty(), "{:?}", missing_marked_ui_literals("ka")); + assert!(missing_commands_menus_tools_and_snap_labels("ka").is_empty(), "{:?}", missing_commands_menus_tools_and_snap_labels("ka")); + // Mtavruli (U+1C90–U+1CBF) is a display style, not upper-case Georgian: never in the catalog. + let mtavruli: Vec = include_str!("ka.tsv").chars().filter(|c| ('\u{1c90}'..='\u{1cbf}').contains(c)).collect(); + assert!(mtavruli.is_empty(), "{mtavruli:?}"); +} + +#[test] +fn georgian_live_switch_keeps_drawing_and_falls_back_without_font() { + let mut app = CadApp::new(Session::new(), Services::default()); + app.ui.in_window_menu = true; + app.session.state_mut().unwrap().title = "Open".into(); + let ctx = egui::Context::default(); + app.logic(&ctx); + assert!(render(&mut app, &ctx).contains("Properties")); + app.start("line"); + let prompt = crate::control::cmdline_state(&app); + let commands = crate::control::all_commands(&app); + let result = app.run("ui.language", json!({"lang": "ka"})).unwrap(); + let supported = crate::theme::can_show("ka"); + assert_eq!(result["shown"], if supported { "ka" } else { "en" }); + assert_eq!(app.ui.interface_language, Preference::Georgian); + app.logic(&ctx); + assert_eq!(app.fonts_language, Some(app.language())); + let text = render(&mut app, &ctx); + if supported { + for label in ["თვისებები", "ფაილი", "ხედი", "ხაზვა", "ზომების დატანა", "მიუთითეთ პირველი წერტილი"] + { + assert!(text.contains(label), "missing {label}: {text}"); + } + } else { + assert!(text.contains("Properties")); + } + assert_eq!(app.session.state().unwrap().title, "Open"); + assert_eq!(crate::control::cmdline_state(&app), prompt); + assert_eq!(crate::control::all_commands(&app), commands); + app.run("ui.language", json!({"lang": "en"})).unwrap(); + app.logic(&ctx); + assert!(render(&mut app, &ctx).contains("Properties")); +} + +#[test] +fn georgian_dialogs_render_with_stable_ids() { + if !crate::theme::can_show("ka") { + return; // The fallback path is covered above; do not claim glyph rendering here. + } + for (dialog, source) in [ + ("dsettings", "Drafting Settings"), + ("about", "About CADCraft"), + ("commands", "Command Reference"), + ("blocks", "Blocks"), + ("layers", "Layer Properties Manager"), + ("qselect", "Quick Select"), + ("parameters", "Parameters Manager"), + ("language", "Interface Language"), + ("options:preferences", "User Preferences"), + ] { + let mut app = CadApp::new(Session::new(), Services::default()); + app.ui.interface_language = Preference::Georgian; + app.ui.dialog = Some(dialog.into()); + let ctx = egui::Context::default(); + app.logic(&ctx); + let text = render(&mut app, &ctx); + assert!(text.contains(tr("ka", source)), "{dialog}: {text}"); + if dialog == "language" { + assert!(text.contains("ქართული"), "{dialog}: {text}"); + } + assert_eq!(app.ui.dialog.as_deref(), Some(dialog)); + } +} diff --git a/crates/ui-egui/src/options/mod.rs b/crates/ui-egui/src/options/mod.rs index d2f805aa6..a3fbd37fc 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"`, `"sv"`, `"ar"`, `"hu"`, `"tr"` or `"el"` | +//! | `interfaceLanguage` | `"auto"`, `"en"`, `"uk"`, `"pt-BR"`, `"de"`, `"es"`, `"cs"`, `"ru"`, `"fr"`, `"zh"`, `"it"`, `"ko"`, `"sv"`, `"ar"`, `"hu"`, `"tr"`, `"el"` or `"ka"` | //! | `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/docs/localization-parity.md b/docs/localization-parity.md index 3dbd01e22..a4ededd9b 100644 --- a/docs/localization-parity.md +++ b/docs/localization-parity.md @@ -70,9 +70,10 @@ plus native review by a human; extending the catalog to the remaining English-on | Swedish | sv | 1,330 catalog rows; reference catalog, marked UI literals and menu headings covered (no gaps reported) | dialogs and tooltips yes; contextual menu headings; command reference searchable in Swedish | Latin: yes (bundled egui proportional and monospace fonts; å ä ö é and Swedish quotes tested) | AI-assisted (Claude Code) by @holmbom; terminology and the running app reviewed by a native speaker | complete current catalog; English-only interface gaps remain | line-by-line proofreading + shared English-only UI work | | Italian | it | 1,227 catalog rows; reference catalog and marked UI literals covered | dialogs and tooltips yes; contextual menu headings (Visualizza / Vista, Edita / Modifica); command reference searchable in Italian | Latin: yes (bundled egui fonts; accented letters tested) | AI-assisted by Emanuele Bottelli (Claude), written from the English strings with Italian desktop-CAD vocabulary; no native proofreading pass yet | complete current catalog; English-only interface gaps remain | native review + shared English-only UI work | | Hungarian | hu | 1,326 catalog rows; reference catalog, marked UI literals and menu headings covered (no gaps reported) | dialogs and tooltips yes; contextual menu headings; command reference searchable in Hungarian | Latin: yes (bundled egui proportional and monospace fonts; ő ű Ő Ű and the other accented letters tested) | translated by @Skaywalker from the English strings; independent native proofreading pending | complete current catalog; English-only interface gaps remain | native proofreading + shared English-only UI work | +| Georgian | ka | 1,383 catalog rows (1,377 ordinary, 4 menu, 2 count); the existing catalog union, marked UI literals and menu headings covered (no gaps reported) | dialogs and tooltips yes; contextual menu headings (ზომების დატანა / ზომა); command reference searchable in Georgian | Georgian (Mkhedruli): the craft-fonts Noto Sans Georgian (`Geor`) face, embedded in release and web builds; English fallback without it; Mtavruli never used (tested) | AI-assisted (Claude), written from the English strings with Georgian technical-drawing vocabulary; native proofreading pending | complete current catalog; English-only interface gaps remain | native proofreading + shared English-only UI work | | Turkish | tr | 1,330 catalog rows; reference catalog, marked UI literals and menu headings covered (no gaps reported) | dialogs and tooltips yes; contextual menu headings (Ölçülendirme / Ölçü); command reference searchable in Turkish | Latin: yes (bundled egui proportional and monospace fonts; Ç Ğ İ Ö Ş Ü ç ğ ı ö ş ü tested) | AI-assisted by @ogzhnklvz, written from the English strings with Turkish desktop-CAD vocabulary; the running app reviewed by a native speaker | complete current catalog; English-only interface gaps remain | line-by-line proofreading + shared English-only UI work | -Other languages shipped: Ukrainian, Brazilian Portuguese, German, Czech, Russian, French, Italian, Korean, Swedish, Hungarian and Turkish. +Other languages shipped: Ukrainian, Brazilian Portuguese, German, Czech, Russian, French, Italian, Korean, Swedish, Hungarian, Turkish, Greek and Georgian. Czech, Swedish, Hungarian and Brazilian Portuguese cover the reference catalog and every marked UI literal; engine diagnostics and uncatalogued text remain English. AutoCAD for Mac ships 7 non-English languages (zh-Hans, es, fr, ja, de, ko, it); of those, CADCraft now ships German and Korean, @@ -86,6 +87,7 @@ each language, which needs humans. Translations parallelise fully once the catal | Date | Change | Summary | |---|---|---| +| 2026-10-23 | minor | Georgian (`ka`) added: 1,383 rows (the existing catalog union), single count form, four menu headings, prompt keywords kept in English; the craft-fonts `Geor` face in release and web builds (pin a71c20e3); locale/preferences/menu/live-switch/dialog/font/no-Mtavruli tests; native proofreading pending | | 2026-10-15 | minor | Greek (`el`) catalog: 1,330 rows, context/plural/locale/font tests; review pending | | 2026-10-14 | minor | Swedish completed: 95 rows for strings added since (Hatch and Gradient dialog, Block Editor, REFEDIT, multileader editing, Options selection settings, MTEXT editor, recent files); 1,330 rows, every key of the Ukrainian reference catalog | | 2026-10-18 | minor | Turkish added: 1,330 rows (the existing catalog union), single count form, four menu headings, prompt keywords kept in English; locale/preferences/menu/live-switch/dialog/font tests; no gaps in the marked UI literals; AI-assisted, the running app reviewed by a native speaker | diff --git a/docs/localization.md b/docs/localization.md index d3c6cc4e1..03af02bfb 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), **Svenska** (Swedish), **العربية** (Arabic), **Magyar** (Hungarian), **Türkçe** (Turkish), or **Ελληνικά** (Greek). +**Українська**, **Português (Brasil)**, **Deutsch**, **Español**, **Čeština** (Czech), **Русский**, **Français**, **简体中文**, **Italiano**, **한국어** (Korean), **Svenska** (Swedish), **العربية** (Arabic), **Magyar** (Hungarian), **Türkçe** (Turkish), **Ελληνικά** (Greek), or **ქართული** (Georgian). 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 @@ -11,7 +11,7 @@ Auto uses the first supported language in the operating system's preferred local browser's `navigator.languages` on the web. BCP 47 and POSIX tags select their primary language: `uk-UA` → `uk`, `de_AT.UTF-8` → `de`, `es-MX` → `es`, `pt_BR.UTF-8` → `pt-BR`, `cs-CZ` and `cs_CZ.UTF-8` → `cs`, `it-IT` and `it_CH.UTF-8` → `it`, `ko-KR` and `ko_KR.UTF-8` → `ko`, -`sv-SE`, `sv-FI` and `sv_SE.UTF-8` → `sv`, `hu-HU` and `hu_HU.UTF-8` → `hu`, `tr-TR` and `tr_TR.UTF-8` → `tr`. Unsupported languages fall back to English. +`sv-SE`, `sv-FI` and `sv_SE.UTF-8` → `sv`, `hu-HU` and `hu_HU.UTF-8` → `hu`, `tr-TR` and `tr_TR.UTF-8` → `tr`, `ka-GE` and `ka_GE.UTF-8` → `ka`. Unsupported languages fall back to English. Set `CADCRAFT_LOCALE=cs-CZ` to override the desktop's locale for a launch. An explicit saved language choice takes precedence over that override. @@ -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`, `sv`, `ar`, `hu`, `tr`, and `el`; invalid values are rejected without changing the current +`en`, `uk`, `pt-BR`, `de`, `es`, `cs`, `ru`, `fr`, `zh`, `it`, `ko`, `sv`, `ar`, `hu`, `tr`, `el`, and `ka`; invalid values are rejected without changing the current selection. Resetting palettes keeps the language choice. ## Translation coverage @@ -115,6 +115,20 @@ original AI-assisted work contributed by @Camthalion77 with language review; it from Autodesk localization files. Independent native proofreading and visual checks remain follow-up work. +## Georgian (`ka`) interface + +Georgian has **1,383 rows**: 1,377 ordinary labels, four contextual menu headings (**ზომების +დატანა** for the Dimension menu, **ზომა** for the object; **ხაზვა** for Draw) and two single-form +count templates, since a Georgian noun stays singular after a numeral ("5 კომიტი"). It covers the +union of the existing catalogs, and no marked UI literal falls back to English. Commands are verbal +nouns (**შენახვა**, **შემობრუნება**); prompts read "მიუთითეთ …" for Specify, "შეიყვანეთ …" for +Enter and "მონიშნეთ …" for Select, and clickable keywords keep the spelling the engine accepts. +Georgian has no letter case, so nothing is capitalised, and Mtavruli (a display style, not upper +case) never appears; a test checks that. The translation is original, AI-assisted work written from +the English strings with Georgian technical-drawing vocabulary (შრე, დაშტრიხვა, მომრგვალება, ფასკა, +წანაცვლება, ობიექტზე მიბმა, ხედვის არე); no other product's localization was consulted. Native +proofreading of the running app is still to do. + ## Adding translations The implementation follows the display-time catalog pattern used by From 93e4ff10c47bbfafe2b807671465c3abc8e74107 Mon Sep 17 00:00:00 2001 From: Davit Matchakhelidze Date: Fri, 23 Oct 2026 02:23:44 +0400 Subject: [PATCH 02/25] fonts: draw the Georgian interface with the craft-fonts Georgian face MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bump craft-fonts-ref to a71c20e3, which adds Noto Sans Georgian (`Geor`), and build the web release with craft-fonts (`web-craft-fonts: true`). The interface loads the embedded `Geor` face after the CJK faces in every language (the picker names ქართული), and the web build embeds it too (232 KB). Without it `can_show("ka")` is false: the saved choice is kept, the interface stays English and the language command says why. Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01YMTAbGNRxnMEzRvYnQGphF --- .github/workflows/freebsd.yml | 2 +- .github/workflows/release.yml | 3 +- crates/fonts/build.rs | 10 +++---- crates/fonts/src/craft_fonts.rs | 3 +- crates/ui-egui/src/menus.rs | 12 +++++--- crates/ui-egui/src/theme.rs | 52 +++++++++++++++++++++++++++------ docs/control-protocol.md | 4 +-- docs/localization.md | 7 +++++ 8 files changed, 70 insertions(+), 23 deletions(-) diff --git a/.github/workflows/freebsd.yml b/.github/workflows/freebsd.yml index e7a607181..b23a86341 100644 --- a/.github/workflows/freebsd.yml +++ b/.github/workflows/freebsd.yml @@ -26,4 +26,4 @@ jobs: # Intentionally tracked at @main (not SHA-pinned) so org-wide CI improvements, security fixes, and build optimizations propagate without PR churn across all craftapp repos. uses: storytold/craft-common-actions/.github/workflows/freebsd.yml@main with: - craft-fonts-ref: 3d9ab3a132ed0eff457e424226a435a901da30d3 + craft-fonts-ref: a71c20e30af613287c504f7e685ca8fad77752bc diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 04206b9c8..12fc211ae 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -24,7 +24,8 @@ jobs: with: app-name: cadcraft app-title: CADCraft - craft-fonts-ref: 3d9ab3a132ed0eff457e424226a435a901da30d3 + craft-fonts-ref: a71c20e30af613287c504f7e685ca8fad77752bc + web-craft-fonts: true version: ${{ inputs.version }} secrets: APPLE_CERTIFICATE: ${{ secrets.APPLE_CERTIFICATE }} diff --git a/crates/fonts/build.rs b/crates/fonts/build.rs index 7eb2a784b..833ba6f63 100644 --- a/crates/fonts/build.rs +++ b/crates/fonts/build.rs @@ -3,9 +3,9 @@ //! empty, `CRAFT_FONTS` is empty and the build is unchanged. It only reads the local checkout //! (no network). A bad checkout is a warning, or an error with `CRAFT_FONTS_REQUIRED=1`. //! -//! On wasm32 it embeds only BIZ UDPGothic Regular and the `Arab` faces (about 5.5 MB), to keep the -//! web build within hosting limits (Cloudflare Pages: 25 MiB per file). The web build has no -//! system fonts, so these are its only fallback for Japanese and Arabic-script text. +//! On wasm32 it embeds only BIZ UDPGothic Regular and the `Arab` and `Geor` faces (about 5.7 MB), +//! to keep the web build within hosting limits (Cloudflare Pages: 25 MiB per file). The web build +//! has no system fonts, so these are its only fallback for Japanese, Arabic-script and Georgian text. use std::fmt::Write as _; use std::path::PathBuf; @@ -50,8 +50,8 @@ fn craft_fonts(dir: &std::path::Path) -> Result { println!("cargo::warning=craft-fonts: not embedding {family} {style} (AGENTS.md: no Adobe fonts)"); continue; } - let arabic = scripts.split(',').any(|s| s.trim() == "Arab"); - let web_face = (*family == "BIZ UDPGothic" && *style == "Regular") || arabic; + let web_script = scripts.split(',').any(|s| matches!(s.trim(), "Arab" | "Geor")); + let web_face = (*family == "BIZ UDPGothic" && *style == "Regular") || web_script; if wasm && !web_face { continue; } diff --git a/crates/fonts/src/craft_fonts.rs b/crates/fonts/src/craft_fonts.rs index fb290775f..713b6632a 100644 --- a/crates/fonts/src/craft_fonts.rs +++ b/crates/fonts/src/craft_fonts.rs @@ -1,7 +1,7 @@ //! Fonts from the optional craft-fonts build input (). //! //! Built with `CRAFT_FONTS_DIR=`, `build.rs` embeds the fonts listed in its -//! `fonts/manifest.txt` (web builds: only BIZ UDPGothic Regular and the Arabic faces). +//! `fonts/manifest.txt` (web builds: only BIZ UDPGothic Regular and the Arabic and Georgian faces). //! Without it [`CRAFT_FONTS`] is empty and nothing changes. The font table ([`crate::ttf`]) //! lists the embedded fonts with the installed ones, under [`CraftFont::stem`]. A text style //! can name one (`BIZ UDPGothic`), and they are fallbacks for characters a text's font lacks. @@ -84,6 +84,7 @@ mod tests { Some("Jpan") => '\u{3042}', Some("Arab") => '\u{0628}', Some("Hang" | "Kore") => '가', + Some("Geor") => 'ა', _ => 'A', }; assert!(face.is_some_and(|x| x.has_glyph(sample)), "{} lacks {sample}", f.family); diff --git a/crates/ui-egui/src/menus.rs b/crates/ui-egui/src/menus.rs index d4ac0d3e6..35e381c7a 100644 --- a/crates/ui-egui/src/menus.rs +++ b/crates/ui-egui/src/menus.rs @@ -137,10 +137,14 @@ fn run_ui_command_inner(app: &mut CadApp, id: &str, params: &Value) -> Option { + "No font covers the Korean interface, so it stays in English. Install a Hangul font (Malgun Gothic or Nanum Gothic), or build with a Hang/Kore craft-fonts face." + } + "ka" => "This build has no Georgian font, so the interface stays in English. Build with craft-fonts (its Geor face) to use Georgian.", + _ => { + "No Chinese font is installed, so the interface stays in English. Install one (Noto Sans CJK, for example) to use Chinese." + } }); } Ok(json!({"interfaceLanguage": preference.code(), "shown": shown})) diff --git a/crates/ui-egui/src/theme.rs b/crates/ui-egui/src/theme.rs index 6c8dd83d0..9105423c1 100644 --- a/crates/ui-egui/src/theme.rs +++ b/crates/ui-egui/src/theme.rs @@ -307,7 +307,8 @@ pub fn mono() -> FontId { /// 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; in an Arabic interface an installed -/// Arabic font follows. A font embedded from craft-fonts comes +/// Arabic font follows. The embedded Georgian face loads in every language, so the language +/// picker can show ქართული. 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`]). @@ -391,7 +392,8 @@ pub fn install_fonts(ctx: &egui::Context, language: &str) { /// shows (#513), with the interface's own face leading. A sans-serif face reads best, and a /// Chinese interface takes the face with its own glyphs ahead of a Japanese one — a Japanese face /// shares most ideographs but lacks the simplified-only ones (图 园 测), which would be tofu. -/// العربية adds its Arabic face after those, egui's bundled faces carrying no Arabic glyphs. +/// The Georgian face follows in every language (egui's bundled faces carry no Georgian glyphs, and +/// the picker names the language ქართული); العربية adds its Arabic face after those. fn embedded_ui_faces<'a>(faces: &[&'a cadcraft_fonts::CraftFont], language: &str) -> Vec<&'a cadcraft_fonts::CraftFont> { let cjk = |f: &&cadcraft_fonts::CraftFont| f.style == "Regular" && f.scripts.iter().any(|s| matches!(*s, "Jpan" | "Hans" | "Hant")); let mut out: Vec<_> = faces.iter().copied().filter(cjk).collect(); @@ -399,6 +401,7 @@ fn embedded_ui_faces<'a>(faces: &[&'a cadcraft_fonts::CraftFont], language: &str if language.starts_with("zh") { out.sort_by_key(|f| !f.scripts.contains(&"Hans")); } + out.extend(faces.iter().copied().filter(|f| f.style == "Regular" && f.scripts.contains(&"Geor"))); if language == "ar" { out.extend(faces.iter().copied().filter(|f| f.style == "Regular" && f.scripts.contains(&"Arab"))); } @@ -636,11 +639,13 @@ pub fn shows_hangul(language: &str) -> bool { /// Whether the interface can show `language` without missing-glyph boxes: Chinese needs a font /// with its glyphs (installed, or the CJK face this build embedded from craft-fonts), Korean a -/// font with Hangul, العربية an installed Arabic font or the embedded Arabic face. +/// font with Hangul, العربية an installed Arabic font or the embedded Arabic face, ქართული the +/// embedded Georgian face. pub fn can_show(language: &str) -> bool { match language { "ko" => shows_hangul("ko"), "ar" => arabic_font().is_some() || embedded_script("Arab"), + "ka" => embedded_script("Geor"), l if l.starts_with("zh") => cjk_font().is_some() || embedded_script("Hans") || embedded_script("Hant"), _ => true, } @@ -738,13 +743,16 @@ mod tests { let japanese = face("BIZ UDPGothic", &["Jpan", "Latn"]); let chinese = face("Han Test Face", &["Hans", "Latn"]); let arabic = face("Noto Sans Arabic", &["Arab"]); - let faces = [&japanese, &chinese, &arabic]; + let georgian = face("Noto Sans Georgian", &["Geor"]); + let faces = [&japanese, &chinese, &arabic, &georgian]; // Every interface reads CJK names, so both CJK faces load, the sans-serif face first. - assert_eq!(families(&super::embedded_ui_faces(&faces, "en")), ["BIZ UDPGothic", "Han Test Face"]); + // The Georgian face loads in every interface too, after them: the picker shows ქართული. + assert_eq!(families(&super::embedded_ui_faces(&faces, "en")), ["BIZ UDPGothic", "Han Test Face", "Noto Sans Georgian"]); // A Chinese interface takes the Han face first: a Japanese face lacks 图 园 测. - assert_eq!(families(&super::embedded_ui_faces(&faces, "zh")), ["Han Test Face", "BIZ UDPGothic"]); + assert_eq!(families(&super::embedded_ui_faces(&faces, "zh")), ["Han Test Face", "BIZ UDPGothic", "Noto Sans Georgian"]); // العربية adds the Arabic face, after the CJK ones egui's bundled faces have no glyphs for. - assert_eq!(families(&super::embedded_ui_faces(&faces, "ar")), ["BIZ UDPGothic", "Han Test Face", "Noto Sans Arabic"]); + assert_eq!(families(&super::embedded_ui_faces(&faces, "ar")), ["BIZ UDPGothic", "Han Test Face", "Noto Sans Georgian", "Noto Sans Arabic"]); + assert_eq!(families(&super::embedded_ui_faces(&faces, "ka")), ["BIZ UDPGothic", "Han Test Face", "Noto Sans Georgian"]); // Another weight is a style of a face, not an interface face of its own. let bold = CraftFont { family: "BIZ UDPGothic", style: "Bold", scripts: &["Jpan"], bytes: &[] }; assert!(super::embedded_ui_faces(&[&bold], "en").is_empty()); @@ -755,13 +763,39 @@ mod tests { /// leaving the installed-font answer the gate had before. #[test] fn embedded_faces_answer_for_their_scripts() { - let faces = [face("BIZ UDPGothic", &["Jpan", "Latn"]), face("Noto Sans Arabic", &["Arab"])]; - assert!(super::any_script(&faces, "Jpan") && super::any_script(&faces, "Arab")); + let faces = [face("BIZ UDPGothic", &["Jpan", "Latn"]), face("Noto Sans Arabic", &["Arab"]), face("Noto Sans Georgian", &["Geor"])]; + assert!(super::any_script(&faces, "Jpan") && super::any_script(&faces, "Arab") && super::any_script(&faces, "Geor")); assert!(!super::any_script(&faces, "Hans") && !super::any_script(&faces, "Hant")); // A `Bold`-only face is not the interface's, and a script code is matched whole. let bold = CraftFont { family: "Some Han Bold", style: "Bold", scripts: &["Hans"], bytes: &[] }; assert!(!super::any_script(&[bold], "Hans") && !super::any_script(&faces, "Ara")); assert!(!super::embedded_script("Hans") || super::can_show("zh")); + // ქართული rides on the embedded Georgian face alone. + assert_eq!(super::can_show("ka"), super::embedded_script("Geor")); assert!(super::can_show("en") && super::can_show("uk")); } + + /// With the craft-fonts Georgian face (release and web builds), every Mkhedruli letter and the + /// picker's ქართული render in both families, in a Georgian and in an English interface. + #[test] + fn embedded_georgian_face_covers_the_alphabet_in_every_interface() { + if !super::embedded_script("Geor") { + return; + } + let letters: Vec = ('ა'..='ჰ').chain("ქართული".chars()).collect(); + for language in ["ka", "en"] { + let ctx = egui::Context::default(); + super::install_fonts(&ctx, language); + let mut output = ctx.run_ui(Default::default(), |_| {}); + output.textures_delta.clear(); + ctx.fonts_mut(|view| { + for family in [egui::FontFamily::Proportional, egui::FontFamily::Monospace] { + let mut font = view.fonts.font(&family); + for c in &letters { + assert!(font.characters().contains_key(c), "{language}: missing Georgian glyph {c} in {family:?}"); + } + } + }); + } + } } diff --git a/docs/control-protocol.md b/docs/control-protocol.md index b1e91a52c..168e34b24 100644 --- a/docs/control-protocol.md +++ b/docs/control-protocol.md @@ -182,9 +182,9 @@ 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`, `sv`, `ar` and `hu`. +Supported values are `auto`, `en`, `uk`, `pt-BR`, `de`, `es`, `cs`, `ru`, `fr`, `zh`, `it`, `ko`, `sv`, `ar`, `hu`, `tr`, `el` and `ka`. 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 +optional craft-fonts input or the operating system; Georgian needs the craft-fonts Georgian (`Geor`) face. 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. Invalid choices leave the current language unchanged. Menus, command labels and prompt text diff --git a/docs/localization.md b/docs/localization.md index d3c6cc4e1..ec198bd02 100644 --- a/docs/localization.md +++ b/docs/localization.md @@ -98,6 +98,13 @@ catalog, the saved `ko` preference is kept but the interface falls back to Engli command reports that a font is needed, and the picker uses the readable label **Korean** wherever Hangul can't be shown. This change does not fix platform IME issues or localize engine output. +The bundled egui fonts have no Georgian letters. Georgian is drawn with the Noto Sans Georgian face +(`Geor`) of the craft-fonts build input, which release builds embed (`craft-fonts-ref` in the +workflows, and `web-craft-fonts` for the web build, whose embedded faces include it). The face loads +in every interface language, so the picker shows **ქართული**. A build without craft-fonts keeps the +saved `ka` choice but shows the interface in English, names the language **Georgian** in the picker, +and the language command reports that a Georgian font is needed. + ## Greek (`el`) interface The Greek translation covers all **1,330** distinct source keys collected from the existing From 096e20629e348361d8944a00a4935447eab45ec2 Mon Sep 17 00:00:00 2001 From: Davit Matchakhelidze Date: Fri, 23 Oct 2026 12:28:32 +0400 Subject: [PATCH 03/25] i18n(ka): apply the native speaker's terminology review MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Draw = ხატვა, Bind = მიბმა, Elevation = დონე, zoom In/Out = მოახლოება/დაშორება, Latin ViewCube compass letters, and the other decided terms; credit the review. Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01YMTAbGNRxnMEzRvYnQGphF --- ATTRIBUTION.md | 2 +- ROADMAP.md | 2 +- crates/ui-egui/src/i18n/ka.tsv | 64 ++++++++++++++++---------------- crates/ui-egui/src/i18n/tests.rs | 4 +- docs/localization-parity.md | 4 +- docs/localization.md | 10 ++--- 6 files changed, 43 insertions(+), 43 deletions(-) diff --git a/ATTRIBUTION.md b/ATTRIBUTION.md index 3779b71bc..e876c198c 100644 --- a/ATTRIBUTION.md +++ b/ATTRIBUTION.md @@ -71,4 +71,4 @@ Generated-in-code assets are original and have no file to list: | `crates/ui-egui/src/i18n/hu.tsv` | @Skaywalker | Original Hungarian translations of CADCraft English strings | MIT OR Apache-2.0 (`LICENSE-MIT`, `LICENSE-APACHE`) | No proprietary localization resources copied | | `crates/ui-egui/src/i18n/tr.tsv` | @ogzhnklvz (AI-assisted) | Original Turkish translations of CADCraft English strings | MIT OR Apache-2.0 (`LICENSE-MIT`, `LICENSE-APACHE`) | No proprietary localization resources copied; written from the English strings, no other catalog used as a source; the running app reviewed by a native speaker | | `crates/ui-egui/src/i18n/el.tsv` | @Camthalion77 with ChatGPT (AI-assisted) | Original Greek translations of CADCraft English strings | MIT OR Apache-2.0 (`LICENSE-MIT`, `LICENSE-APACHE`) | No proprietary localization resources copied; independent native proofreading pending | -| `crates/ui-egui/src/i18n/ka.tsv` | @devius with Claude (AI-assisted) | Original Georgian translations of CADCraft English strings | MIT OR Apache-2.0 (`LICENSE-MIT`, `LICENSE-APACHE`) | No proprietary localization resources copied; written from the English strings, no other catalog used as a source; no font assets added (the Georgian face comes from craft-fonts) | +| `crates/ui-egui/src/i18n/ka.tsv` | Davit Matchakhelidze (@devius), native speaker, with Claude Code | Original Georgian translations of CADCraft English strings | MIT OR Apache-2.0 (`LICENSE-MIT`, `LICENSE-APACHE`) | No proprietary localization resources copied; written from the English strings, no other catalog used as a source; terminology and doubtful strings decided by a native Georgian speaker; no font assets added (the Georgian face comes from craft-fonts) | diff --git a/ROADMAP.md b/ROADMAP.md index 93b3a701e..b093a478a 100644 --- a/ROADMAP.md +++ b/ROADMAP.md @@ -95,7 +95,7 @@ Ukrainian and German. Detail: [localization-parity.md](docs/localization-parity. | Indonesian | none | 0% | | Japanese | none | 0% | | Greek | complete current catalog | 1,330 current source keys; independent proofreading pending | -| Georgian | complete current catalog | 1,383 rows; native proofreading pending | +| Georgian | complete current catalog | 1,383 rows; terminology decided by a native speaker | | German | partial | ≈ 100% of the catalog (989 rows) | | Korean | none | 0% | | Vietnamese | none | 0% | diff --git a/crates/ui-egui/src/i18n/ka.tsv b/crates/ui-egui/src/i18n/ka.tsv index 25512c91f..5a4d7b4bb 100644 --- a/crates/ui-egui/src/i18n/ka.tsv +++ b/crates/ui-egui/src/i18n/ka.tsv @@ -16,7 +16,7 @@ Apply გამოყენება Attach DWG... DWG-ის მიმაგრება... - Bind ჩაშენება + Bind მიბმა Detach მოხსნა Loaded ჩატვირთულია Make it a block of this drawing, keeping its layer names ამ ნახაზის ბლოკად ქცევა, შრეების სახელების შენარჩუნებით @@ -94,12 +94,12 @@ Auto Constrain ავტომატური შეზღუდვა AutoConstrain ავტოშეზღუდვა Axis, End ღერძი, ბოლო - Base საბაზო წერტილი + Base ბაზა Baseline საბაზისო ხაზი Batch Publish პაკეტური გამოქვეყნება Binary assets added დამატებული ბინარული ფაილები Binary assets removed წაშლილი ბინარული ფაილები - Bind... ჩაშენება... + Bind... მიბმა... Blend გადასვლა Block ბლოკი Block Attribute Manager... ბლოკის ატრიბუტების მენეჯერი... @@ -256,8 +256,8 @@ Drafting ხაზვა Drafting Settings ხაზვის პარამეტრები Drafting Settings... ხაზვის პარამეტრები... - Draw ხაზვა - Draw Order ხაზვის რიგი + Draw ხატვა + Draw Order ხატვის რიგი Drawing (DWG) ნახაზი (DWG) Drawing (DXF) ნახაზი (DXF) Drawing Limits ნახაზის ზღვრები @@ -269,12 +269,12 @@ Dynamic Dimensions დინამიკური ზომები Dynamic Input დინამიკური შეყვანა Dynamic Input (F12) დინამიკური შეყვანა (F12) - E ა + E E Edit რედაქტირება Edit Attributes... ატრიბუტების რედაქტირება... Edit Text... ტექსტის რედაქტირება... Edit Table Cell ცხრილის უჯრის რედაქტირება - Elevation ნიშნული + Elevation დონე Ellipse ელიფსი Elliptical Arc ელიფსური რკალი Enable Dynamic Input (F12) დინამიკური შეყვანის ჩართვა (F12) @@ -340,7 +340,7 @@ Export Table ცხრილის ექსპორტი Export to PDF... PDF-ად ექსპორტი... Express Tools Express Tools - Expression ექსპრესია + Expression გამოსახულება Extend გაგრძელება Extension გაგრძელება Extents საზღვრები @@ -358,7 +358,7 @@ First commit პირველი კომიტი Fit Points მისადაგების წერტილები Fix ფიქსაცია - Flatten Objects ობიექტების გაბრტყელება + Flatten Objects ობიექტების სიბრტყეზე დაგეგმილება Format ფორმატი Freehand ხელით ხაზვა Freeze გაყინვა @@ -367,7 +367,7 @@ Freeze/Thaw გაყინვა/გალღობა Freeze/Thaw in all viewports გაყინვა/გალღობა ყველა ხედვის არეში Freeze/Thaw in the current viewport გაყინვა/გალღობა მიმდინარე ხედვის არეში - From ათვლის წერტილიდან + From წერტილიდან From Template... შაბლონიდან... General ზოგადი Geometric Center გეომეტრიული ცენტრი @@ -423,14 +423,14 @@ Collect შეგროვება Collect Multileaders მულტიმიმთითებლების შეგროვება Edit Multileader მულტიმიმთითებლის რედაქტირება - In გადიდება + In მოახლოება In-window Menu Bar მენიუს ზოლი ფანჯარაში Include in new selection set ახალ მონიშნულ ნაკრებში ჩართვა Increment angle კუთხის ბიჯი Index Color ინდექსური ფერი Index color: {index} ინდექსური ფერი: {index} Infer Constraints შეზღუდვების ავტომატური დადგენა - Inquiry ინფორმაცია + Inquiry მოთხოვნა Insert ჩასმა Insert Block ბლოკის ჩასმა Insert Column სვეტის ჩასმა @@ -510,7 +510,7 @@ List Groups ჯგუფების სია List Layer States შრის მდგომარეობების სია List Layouts განლაგებების სია - List System Variables სისტემური ცვლადების სია + List System Variables სისტემის ცვლადების სია List Text Styles ტექსტის სტილების სია Load all ყველას ჩატვირთვა Load... ჩატვირთვა... @@ -525,7 +525,7 @@ MODEL მოდელი MText MText Magenta მეწამული - Major line every მთავარი ხაზის ბიჯი + Major line every ყოველი N-ე ხაზი მთავარია Make Current მიმდინარედ დაყენება Make Object's Layer Current ობიექტის შრის მიმდინარედ დაყენება Make... შექმნა... @@ -556,7 +556,7 @@ Multiple Point რამდენიმე წერტილი My ჩემი My properties: not available yet ჩემი თვისებები: ჯერ ხელმისაწვდომი არ არის - N ჩ + N N Name სახელი Name (A–Z) სახელი (ა–ჰ) Named Views... დასახელებული ხედები... @@ -616,7 +616,7 @@ Ortho Mode ორთო რეჟიმი Ortho Mode (F8) ორთო რეჟიმი (F8) Osnap Settings... ობიექტზე მიბმის პარამეტრები... - Out დაპატარავება + Out დაშორება Over-constrained ზედმეტად შეზღუდული Override გადაფარვა PAPER ფურცელი @@ -646,7 +646,7 @@ Plot Preview ნახვა ამობეჭდვამდე Plot Window ბეჭდვის ფანჯარა Plot style ბეჭდვის სტილი - Plot style attached to მიმაგრებული ბეჭდვის სტილი + Plot style attached to ბეჭდვის სტილი მიმაგრებულია Plot style table ბეჭდვის სტილების ცხრილი Plot Style... ბეჭდვის სტილი... Plot Style Manager ბეჭდვის სტილების მენეჯერი @@ -710,7 +710,7 @@ Purge გაწმენდა Pyramid პირამიდა Quadrant კვადრანტი - Query Entities ობიექტების მოთხოვნა + Query Entities ობიექტების გამოთხოვნა Quick სწრაფი Quick Dimension სწრაფი ზომა Quick Properties სწრაფი თვისებები @@ -726,7 +726,7 @@ Read-only მხოლოდ წასაკითხი Real name ნამდვილი სახელი Realtime რეალურ დროში - Reassociate Dimensions ზომების ხელახლა მიბმა + Reassociate Dimensions ზომების ხელახლა ასოცირება Recent ბოლოდროინდელი Recent Commands ბოლოდროინდელი ბრძანებები Recent Input ბოლოდროინდელი შეყვანა @@ -767,7 +767,7 @@ Right მარჯვნივ Rotate შემობრუნება Rotation შემობრუნება - S ს + S S Save შენახვა Save (⌘S) შენახვა (⌘S) Save As შენახვა როგორც @@ -878,7 +878,7 @@ Single Line Text ერთსტრიქონიანი ტექსტი Single Point ერთი წერტილი Single... ცალკეული... - Smooth გლუვი შეერთება + Smooth დაგლუვება Snap მიბმა Snap Mode მიბმის რეჟიმი Snap Mode (F9) მიბმის რეჟიმი (F9) @@ -969,7 +969,7 @@ Indicate selection area მიუთითეთ მონიშვნის არე Interface language ინტერფეისის ენა Interface theme ინტერფეისის თემა - Keep the system cursor visible over the drawing area სისტემური კურსორი ნახაზის არეზე ხილული დარჩეს + Keep the system cursor visible over the drawing area სისტემის კურსორი ნახაზის არეზე ხილული დარჩეს Largest array ყველაზე დიდი მასივი Layout paper განლაგების ფურცელი Model background მოდელის ფონი @@ -988,7 +988,7 @@ Reset keeps the interface language. ჩამოყრის შემდეგ ინტერფეისის ენა უცვლელი რჩება. Reset to Defaults ნაგულისხმევზე დაბრუნება Save new drawings as ახალი ნახაზების შენახვა როგორც - Screen magnifiers, screen readers and recorders follow the system cursor. ეკრანის გამადიდებლები, ეკრანის წამკითხველები და ჩამწერები სისტემურ კურსორს მიჰყვება. + Screen magnifiers, screen readers and recorders follow the system cursor. ეკრანის გამადიდებლები, ეკრანის წამკითხველები და ჩამწერები სისტემის კურსორს მიჰყვება. Select objects first, then choose a command ჯერ მონიშნეთ ობიექტები, შემდეგ აირჩიეთ ბრძანება Selection მონიშვნა Selection Area Effect მონიშვნის არის ეფექტი @@ -1079,7 +1079,7 @@ Sphere სფერო Spline სპლაინი Spline Edit სპლაინის რედაქტირება - Stack (type 1/2 then select) წილადი (აკრიფეთ 1/2 და მონიშნეთ) + Stack (type 1/2 then select) დასტად დალაგება (აკრიფეთ 1/2 და მონიშნეთ) Standard სტანდარტული Start დასაწყისი Start Width საწყისი სიგანე @@ -1191,12 +1191,12 @@ Viewport scale ხედვის არის მასშტაბი Viewport {id} ხედვის არე {id} Viewports ხედვის არეები - W დ + W W WCS WCS White თეთრი Width factor სიგანის კოეფიციენტი Window ფანჯარა - Wipeout დამფარავი არე + Wipeout მასკირება Workspace Switching სამუშაო სივრცის გადართვა Write Block ბლოკის ჩაწერა Xline დამხმარე ხაზი @@ -1206,9 +1206,9 @@ Zoom All მასშტაბი: ყველაფერი Zoom Dynamic მასშტაბი: დინამიკური Zoom Extents მასშტაბი: საზღვრები - Zoom In გადიდება + Zoom In მოახლოება Zoom Object მასშტაბი: ობიექტი - Zoom Out დაპატარავება + Zoom Out დაშორება Zoom Previous მასშტაბი: წინა Zoom Realtime მასშტაბი: რეალურ დროში Zoom Window მასშტაბი: ფანჯარა @@ -1229,7 +1229,7 @@ Hide CADCraft CADCraft-ის დამალვა Hide Others სხვების დამალვა Accessibility ხელმისაწვდომობა - Show System Cursor სისტემური კურსორის ჩვენება + Show System Cursor სისტემის კურსორის ჩვენება Animation Effects ანიმაციის ეფექტები Animation effects ანიმაციის ეფექტები Interface scale ინტერფეისის მასშტაბი @@ -1242,7 +1242,7 @@ Delete Current Scale მიმდინარე მასშტაბის წაშლა Add/Delete Scales... მასშტაბების დამატება/წაშლა... Synchronize Multiple-scale Positions მრავალმასშტაბიანი პოზიციების სინქრონიზაცია - Annotative Update ანოტაციურის განახლება + Annotative Update ანოტაციური განახლება Show Annotative Objects ანოტაციური ობიექტების ჩვენება Current Scale Only მხოლოდ მიმდინარე მასშტაბი All Scales ყველა მასშტაბი @@ -1287,7 +1287,7 @@ Hatch Pattern დაშტრიხვის ნიმუში Search for pattern ნიმუშის ძიება Run Script... სკრიპტის გაშვება... - Query Texts ტექსტების მოთხოვნა + Query Texts ტექსტების გამოთხოვნა Analyze Shapes ფიგურების ანალიზი Hatch Pick დაშტრიხვის არჩევა Hatch and Gradient დაშტრიხვა და გრადიენტი @@ -1369,7 +1369,7 @@ X X Y Y menu Dimension ზომების დატანა -menu Draw ხაზვა +menu Draw ხატვა menu Modify შეცვლა menu View ხედი Arrow size ისრის ზომა diff --git a/crates/ui-egui/src/i18n/tests.rs b/crates/ui-egui/src/i18n/tests.rs index 052cae5fb..9455b716b 100644 --- a/crates/ui-egui/src/i18n/tests.rs +++ b/crates/ui-egui/src/i18n/tests.rs @@ -1203,7 +1203,7 @@ fn georgian_locales_preferences_and_single_count_form() { assert_eq!(t("Open"), "გახსნა"); assert_eq!(menu("Dimension"), "ზომების დატანა"); assert_eq!(t("Dimension"), "ზომა"); - assert_eq!(menu("Draw"), "ხაზვა"); + assert_eq!(menu("Draw"), "ხატვა"); assert_eq!(menu("File"), "ფაილი"); }); assert_eq!(t("Open"), "Open", "language must not leak outside a render scope"); @@ -1237,7 +1237,7 @@ fn georgian_live_switch_keeps_drawing_and_falls_back_without_font() { assert_eq!(app.fonts_language, Some(app.language())); let text = render(&mut app, &ctx); if supported { - for label in ["თვისებები", "ფაილი", "ხედი", "ხაზვა", "ზომების დატანა", "მიუთითეთ პირველი წერტილი"] + for label in ["თვისებები", "ფაილი", "ხედი", "ხატვა", "ზომების დატანა", "მიუთითეთ პირველი წერტილი"] { assert!(text.contains(label), "missing {label}: {text}"); } diff --git a/docs/localization-parity.md b/docs/localization-parity.md index a4ededd9b..0b2ae3745 100644 --- a/docs/localization-parity.md +++ b/docs/localization-parity.md @@ -70,7 +70,7 @@ plus native review by a human; extending the catalog to the remaining English-on | Swedish | sv | 1,330 catalog rows; reference catalog, marked UI literals and menu headings covered (no gaps reported) | dialogs and tooltips yes; contextual menu headings; command reference searchable in Swedish | Latin: yes (bundled egui proportional and monospace fonts; å ä ö é and Swedish quotes tested) | AI-assisted (Claude Code) by @holmbom; terminology and the running app reviewed by a native speaker | complete current catalog; English-only interface gaps remain | line-by-line proofreading + shared English-only UI work | | Italian | it | 1,227 catalog rows; reference catalog and marked UI literals covered | dialogs and tooltips yes; contextual menu headings (Visualizza / Vista, Edita / Modifica); command reference searchable in Italian | Latin: yes (bundled egui fonts; accented letters tested) | AI-assisted by Emanuele Bottelli (Claude), written from the English strings with Italian desktop-CAD vocabulary; no native proofreading pass yet | complete current catalog; English-only interface gaps remain | native review + shared English-only UI work | | Hungarian | hu | 1,326 catalog rows; reference catalog, marked UI literals and menu headings covered (no gaps reported) | dialogs and tooltips yes; contextual menu headings; command reference searchable in Hungarian | Latin: yes (bundled egui proportional and monospace fonts; ő ű Ő Ű and the other accented letters tested) | translated by @Skaywalker from the English strings; independent native proofreading pending | complete current catalog; English-only interface gaps remain | native proofreading + shared English-only UI work | -| Georgian | ka | 1,383 catalog rows (1,377 ordinary, 4 menu, 2 count); the existing catalog union, marked UI literals and menu headings covered (no gaps reported) | dialogs and tooltips yes; contextual menu headings (ზომების დატანა / ზომა); command reference searchable in Georgian | Georgian (Mkhedruli): the craft-fonts Noto Sans Georgian (`Geor`) face, embedded in release and web builds; English fallback without it; Mtavruli never used (tested) | AI-assisted (Claude), written from the English strings with Georgian technical-drawing vocabulary; native proofreading pending | complete current catalog; English-only interface gaps remain | native proofreading + shared English-only UI work | +| Georgian | ka | 1,383 catalog rows (1,377 ordinary, 4 menu, 2 count); the existing catalog union, marked UI literals and menu headings covered (no gaps reported) | dialogs and tooltips yes; contextual menu headings (ზომების დატანა / ზომა); command reference searchable in Georgian | Georgian (Mkhedruli): the craft-fonts Noto Sans Georgian (`Geor`) face, embedded in release and web builds; English fallback without it; Mtavruli never used (tested) | Written with Claude Code from the meaning of each English string; terminology and doubtful strings decided by a native Georgian speaker (@devius) | complete current catalog; English-only interface gaps remain | shared English-only UI work | | Turkish | tr | 1,330 catalog rows; reference catalog, marked UI literals and menu headings covered (no gaps reported) | dialogs and tooltips yes; contextual menu headings (Ölçülendirme / Ölçü); command reference searchable in Turkish | Latin: yes (bundled egui proportional and monospace fonts; Ç Ğ İ Ö Ş Ü ç ğ ı ö ş ü tested) | AI-assisted by @ogzhnklvz, written from the English strings with Turkish desktop-CAD vocabulary; the running app reviewed by a native speaker | complete current catalog; English-only interface gaps remain | line-by-line proofreading + shared English-only UI work | Other languages shipped: Ukrainian, Brazilian Portuguese, German, Czech, Russian, French, Italian, Korean, Swedish, Hungarian, Turkish, Greek and Georgian. @@ -87,7 +87,7 @@ each language, which needs humans. Translations parallelise fully once the catal | Date | Change | Summary | |---|---|---| -| 2026-10-23 | minor | Georgian (`ka`) added: 1,383 rows (the existing catalog union), single count form, four menu headings, prompt keywords kept in English; the craft-fonts `Geor` face in release and web builds (pin a71c20e3); locale/preferences/menu/live-switch/dialog/font/no-Mtavruli tests; native proofreading pending | +| 2026-10-23 | minor | Georgian (`ka`) added: 1,383 rows (the existing catalog union), single count form, four menu headings, prompt keywords kept in English; the craft-fonts `Geor` face in release and web builds (pin a71c20e3); locale/preferences/menu/live-switch/dialog/font/no-Mtavruli tests; terminology decided by a native speaker | | 2026-10-15 | minor | Greek (`el`) catalog: 1,330 rows, context/plural/locale/font tests; review pending | | 2026-10-14 | minor | Swedish completed: 95 rows for strings added since (Hatch and Gradient dialog, Block Editor, REFEDIT, multileader editing, Options selection settings, MTEXT editor, recent files); 1,330 rows, every key of the Ukrainian reference catalog | | 2026-10-18 | minor | Turkish added: 1,330 rows (the existing catalog union), single count form, four menu headings, prompt keywords kept in English; locale/preferences/menu/live-switch/dialog/font tests; no gaps in the marked UI literals; AI-assisted, the running app reviewed by a native speaker | diff --git a/docs/localization.md b/docs/localization.md index 03af02bfb..7ebdea1a7 100644 --- a/docs/localization.md +++ b/docs/localization.md @@ -118,16 +118,16 @@ follow-up work. ## Georgian (`ka`) interface Georgian has **1,383 rows**: 1,377 ordinary labels, four contextual menu headings (**ზომების -დატანა** for the Dimension menu, **ზომა** for the object; **ხაზვა** for Draw) and two single-form +დატანა** for the Dimension menu, **ზომა** for the object; **ხატვა** for Draw) and two single-form count templates, since a Georgian noun stays singular after a numeral ("5 კომიტი"). It covers the union of the existing catalogs, and no marked UI literal falls back to English. Commands are verbal nouns (**შენახვა**, **შემობრუნება**); prompts read "მიუთითეთ …" for Specify, "შეიყვანეთ …" for Enter and "მონიშნეთ …" for Select, and clickable keywords keep the spelling the engine accepts. Georgian has no letter case, so nothing is capitalised, and Mtavruli (a display style, not upper -case) never appears; a test checks that. The translation is original, AI-assisted work written from -the English strings with Georgian technical-drawing vocabulary (შრე, დაშტრიხვა, მომრგვალება, ფასკა, -წანაცვლება, ობიექტზე მიბმა, ხედვის არე); no other product's localization was consulted. Native -proofreading of the running app is still to do. +case) never appears; a test checks that. The translation is original: written with Claude Code from +the meaning of each English string, with Georgian technical-drawing vocabulary (შრე, დაშტრიხვა, +მომრგვალება, ფასკა, წანაცვლება, ობიექტზე მიბმა, ხედვის არე); terminology and doubtful strings +were decided by a native Georgian speaker (@devius). No other product's localization was consulted. ## Adding translations From 85df54b88c098b2d9b7b7596b366d11b3af71b5b Mon Sep 17 00:00:00 2001 From: Davit Matchakhelidze Date: Fri, 23 Oct 2026 13:33:34 +0400 Subject: [PATCH 04/25] i18n(ka): apply the second terminology review Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01YMTAbGNRxnMEzRvYnQGphF --- crates/ui-egui/src/i18n/ka.tsv | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/crates/ui-egui/src/i18n/ka.tsv b/crates/ui-egui/src/i18n/ka.tsv index 5a4d7b4bb..d30ace406 100644 --- a/crates/ui-egui/src/i18n/ka.tsv +++ b/crates/ui-egui/src/i18n/ka.tsv @@ -35,7 +35,7 @@ Unload განტვირთვა Unloaded განტვირთულია Unreferenced მიმართვის გარეშე - Unresolved დაუდგენელი + Unresolved გადაუჭრელი Cancel გაუქმება OK OK or [ ან [ @@ -238,7 +238,7 @@ Dimension ზომა Dimension Objects Only მხოლოდ ზომის ობიექტები Dimension Space ზომების დაშორება - Dimension Style Override ზომის სტილის გადაფარვა + Dimension Style Override ზომის სტილის ლოკალური ცვლილება Dimension Style... ზომის სტილი... Dimension Text Edit ზომის ტექსტის რედაქტირება Dimension style ზომის სტილი @@ -413,7 +413,7 @@ Hide Objects ობიექტების დამალვა Hide Palettes პალიტრების დამალვა History ისტორია - Home საწყისი პოზიცია + Home საწყისი ხედი Horizontal ჰორიზონტალური HorizontalDistance ჰორიზონტალური მანძილი How to apply: გამოყენების წესი: @@ -611,7 +611,7 @@ Clear Recent Files ბოლოს გახსნილი ფაილების სიის გასუფთავება Operator: ოპერატორი: Orbit ორბიტა - Ordinate კოორდინატული + Ordinate ორდინატა Ortho (F8) ორთო (F8) Ortho Mode ორთო რეჟიმი Ortho Mode (F8) ორთო რეჟიმი (F8) @@ -668,7 +668,7 @@ Keep an editable copy of this table in the drawing ამ ცხრილის რედაქტირებადი ასლის ნახაზში შენახვა Layout {name}: {table} განლაგება {name}: {table} Grayscale ნაცრისფერი ტონები - Screening ფერის ინტენსივობა + Screening ტონირება Use object linetype ობიექტის ხაზის ტიპის გამოყენება Use object lineweight ობიექტის ხაზის სისქის გამოყენება Remove წაშლა From a5391d6ebb6a7e9319dd8f0e0ebb13be722b6aa9 Mon Sep 17 00:00:00 2001 From: Davit Matchakhelidze Date: Sat, 24 Oct 2026 00:12:13 +0400 Subject: [PATCH 05/25] fonts: load the embedded Georgian face where can_show accepts it; parity status line The same embedded_ui_faces lines as #1971, so a build whose craft-fonts has the Geor face draws Georgian instead of boxes whichever PR lands first (CodeRabbit). Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01YMTAbGNRxnMEzRvYnQGphF --- crates/ui-egui/src/theme.rs | 7 +++++-- docs/localization-parity.md | 2 +- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/crates/ui-egui/src/theme.rs b/crates/ui-egui/src/theme.rs index 7f93d43c2..47aaa3c67 100644 --- a/crates/ui-egui/src/theme.rs +++ b/crates/ui-egui/src/theme.rs @@ -307,7 +307,8 @@ pub fn mono() -> FontId { /// 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; in an Arabic interface an installed -/// Arabic font follows. A font embedded from craft-fonts comes +/// Arabic font follows. The embedded Georgian face loads in every language, so the language +/// picker can show ქართული. 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`]). @@ -391,7 +392,8 @@ pub fn install_fonts(ctx: &egui::Context, language: &str) { /// shows (#513), with the interface's own face leading. A sans-serif face reads best, and a /// Chinese interface takes the face with its own glyphs ahead of a Japanese one — a Japanese face /// shares most ideographs but lacks the simplified-only ones (图 园 测), which would be tofu. -/// العربية adds its Arabic face after those, egui's bundled faces carrying no Arabic glyphs. +/// The Georgian face follows in every language (egui's bundled faces carry no Georgian glyphs, and +/// the picker names the language ქართული); العربية adds its Arabic face after those. fn embedded_ui_faces<'a>(faces: &[&'a cadcraft_fonts::CraftFont], language: &str) -> Vec<&'a cadcraft_fonts::CraftFont> { let cjk = |f: &&cadcraft_fonts::CraftFont| f.style == "Regular" && f.scripts.iter().any(|s| matches!(*s, "Jpan" | "Hans" | "Hant")); let mut out: Vec<_> = faces.iter().copied().filter(cjk).collect(); @@ -399,6 +401,7 @@ fn embedded_ui_faces<'a>(faces: &[&'a cadcraft_fonts::CraftFont], language: &str if language.starts_with("zh") { out.sort_by_key(|f| !f.scripts.contains(&"Hans")); } + out.extend(faces.iter().copied().filter(|f| f.style == "Regular" && f.scripts.contains(&"Geor"))); if language == "ar" { out.extend(faces.iter().copied().filter(|f| f.style == "Regular" && f.scripts.contains(&"Arab"))); } diff --git a/docs/localization-parity.md b/docs/localization-parity.md index 0b2ae3745..d34add571 100644 --- a/docs/localization-parity.md +++ b/docs/localization-parity.md @@ -1,6 +1,6 @@ # Localization parity -> **Last reviewed:** 2026-10-10 · **Last updated:** 2026-10-14 · **Change:** minor (Swedish catalog completed with the 95 strings added since; previously: Swedish catalog added: complete catalog, menu headings, native-speaker terminology review; previously: complete current Korean catalog with Hangul font coverage) · **Target:** Autodesk AutoCAD 2027 for Mac (26.0) +> **Last reviewed:** 2026-10-10 · **Last updated:** 2026-10-23 · **Change:** minor (Georgian catalog added: complete catalog, menu headings, single count form; previously: Swedish catalog completed with the 95 strings added since; previously: Swedish catalog added: complete catalog, menu headings, native-speaker terminology review; previously: complete current Korean catalog with Hangul font coverage) · **Target:** Autodesk AutoCAD 2027 for Mac (26.0) How far CADCraft's interface and drawing text are from AutoCAD's languages. Summarised in [ROADMAP.md](../ROADMAP.md#languages); work items in [gaps.md](gaps.md#localization). From 6a5e8eda3576a2eac375b190fd4fc8d75b5abbbb Mon Sep 17 00:00:00 2001 From: Davit Matchakhelidze Date: Sat, 24 Oct 2026 13:16:07 +0400 Subject: [PATCH 06/25] fonts: test the Georgian face in the face order and its glyphs in a ka and an en interface MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Same tests as #1971: embedded_ui_faces yields the Geor face for ka (and for every interface, which names the language ქართული in the picker), can_show("ka") follows the embedded face, and with a craft-fonts that carries Geor every Mkhedruli letter renders in both families. Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01YMTAbGNRxnMEzRvYnQGphF --- crates/ui-egui/src/theme.rs | 41 +++++++++++++++++++++++++++++++------ 1 file changed, 35 insertions(+), 6 deletions(-) diff --git a/crates/ui-egui/src/theme.rs b/crates/ui-egui/src/theme.rs index 47aaa3c67..9105423c1 100644 --- a/crates/ui-egui/src/theme.rs +++ b/crates/ui-egui/src/theme.rs @@ -743,13 +743,16 @@ mod tests { let japanese = face("BIZ UDPGothic", &["Jpan", "Latn"]); let chinese = face("Han Test Face", &["Hans", "Latn"]); let arabic = face("Noto Sans Arabic", &["Arab"]); - let faces = [&japanese, &chinese, &arabic]; + let georgian = face("Noto Sans Georgian", &["Geor"]); + let faces = [&japanese, &chinese, &arabic, &georgian]; // Every interface reads CJK names, so both CJK faces load, the sans-serif face first. - assert_eq!(families(&super::embedded_ui_faces(&faces, "en")), ["BIZ UDPGothic", "Han Test Face"]); + // The Georgian face loads in every interface too, after them: the picker shows ქართული. + assert_eq!(families(&super::embedded_ui_faces(&faces, "en")), ["BIZ UDPGothic", "Han Test Face", "Noto Sans Georgian"]); // A Chinese interface takes the Han face first: a Japanese face lacks 图 园 测. - assert_eq!(families(&super::embedded_ui_faces(&faces, "zh")), ["Han Test Face", "BIZ UDPGothic"]); + assert_eq!(families(&super::embedded_ui_faces(&faces, "zh")), ["Han Test Face", "BIZ UDPGothic", "Noto Sans Georgian"]); // العربية adds the Arabic face, after the CJK ones egui's bundled faces have no glyphs for. - assert_eq!(families(&super::embedded_ui_faces(&faces, "ar")), ["BIZ UDPGothic", "Han Test Face", "Noto Sans Arabic"]); + assert_eq!(families(&super::embedded_ui_faces(&faces, "ar")), ["BIZ UDPGothic", "Han Test Face", "Noto Sans Georgian", "Noto Sans Arabic"]); + assert_eq!(families(&super::embedded_ui_faces(&faces, "ka")), ["BIZ UDPGothic", "Han Test Face", "Noto Sans Georgian"]); // Another weight is a style of a face, not an interface face of its own. let bold = CraftFont { family: "BIZ UDPGothic", style: "Bold", scripts: &["Jpan"], bytes: &[] }; assert!(super::embedded_ui_faces(&[&bold], "en").is_empty()); @@ -760,13 +763,39 @@ mod tests { /// leaving the installed-font answer the gate had before. #[test] fn embedded_faces_answer_for_their_scripts() { - let faces = [face("BIZ UDPGothic", &["Jpan", "Latn"]), face("Noto Sans Arabic", &["Arab"])]; - assert!(super::any_script(&faces, "Jpan") && super::any_script(&faces, "Arab")); + let faces = [face("BIZ UDPGothic", &["Jpan", "Latn"]), face("Noto Sans Arabic", &["Arab"]), face("Noto Sans Georgian", &["Geor"])]; + assert!(super::any_script(&faces, "Jpan") && super::any_script(&faces, "Arab") && super::any_script(&faces, "Geor")); assert!(!super::any_script(&faces, "Hans") && !super::any_script(&faces, "Hant")); // A `Bold`-only face is not the interface's, and a script code is matched whole. let bold = CraftFont { family: "Some Han Bold", style: "Bold", scripts: &["Hans"], bytes: &[] }; assert!(!super::any_script(&[bold], "Hans") && !super::any_script(&faces, "Ara")); assert!(!super::embedded_script("Hans") || super::can_show("zh")); + // ქართული rides on the embedded Georgian face alone. + assert_eq!(super::can_show("ka"), super::embedded_script("Geor")); assert!(super::can_show("en") && super::can_show("uk")); } + + /// With the craft-fonts Georgian face (release and web builds), every Mkhedruli letter and the + /// picker's ქართული render in both families, in a Georgian and in an English interface. + #[test] + fn embedded_georgian_face_covers_the_alphabet_in_every_interface() { + if !super::embedded_script("Geor") { + return; + } + let letters: Vec = ('ა'..='ჰ').chain("ქართული".chars()).collect(); + for language in ["ka", "en"] { + let ctx = egui::Context::default(); + super::install_fonts(&ctx, language); + let mut output = ctx.run_ui(Default::default(), |_| {}); + output.textures_delta.clear(); + ctx.fonts_mut(|view| { + for family in [egui::FontFamily::Proportional, egui::FontFamily::Monospace] { + let mut font = view.fonts.font(&family); + for c in &letters { + assert!(font.characters().contains_key(c), "{language}: missing Georgian glyph {c} in {family:?}"); + } + } + }); + } + } } From 2409afe7f00de47def4c3ce7bc7a05e52553a8c0 Mon Sep 17 00:00:00 2001 From: Davit Matchakhelidze Date: Sat, 24 Oct 2026 14:15:14 +0400 Subject: [PATCH 07/25] i18n(ka): translate the six strings main added (Analyze Usage, Implied Loops, units of new drawings) Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01YMTAbGNRxnMEzRvYnQGphF --- crates/ui-egui/src/i18n/ka.tsv | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/crates/ui-egui/src/i18n/ka.tsv b/crates/ui-egui/src/i18n/ka.tsv index d30ace406..3db7c923a 100644 --- a/crates/ui-egui/src/i18n/ka.tsv +++ b/crates/ui-egui/src/i18n/ka.tsv @@ -988,6 +988,10 @@ Reset keeps the interface language. ჩამოყრის შემდეგ ინტერფეისის ენა უცვლელი რჩება. Reset to Defaults ნაგულისხმევზე დაბრუნება Save new drawings as ახალი ნახაზების შენახვა როგორც + Units of new drawings ახალი ნახაზების ერთეულები + Imperial (inches) იმპერიული (დუიმები) + Metric (millimetres) მეტრული (მილიმეტრები) + New and the first drawing at startup use these units unless a default template is set (QNEWTEMPLATE). ახალი ნახაზი და გაშვებისას გახსნილი პირველი ნახაზი ამ ერთეულებს იყენებს, თუ ნაგულისხმევი შაბლონი არ არის მითითებული (QNEWTEMPLATE). Screen magnifiers, screen readers and recorders follow the system cursor. ეკრანის გამადიდებლები, ეკრანის წამკითხველები და ჩამწერები სისტემის კურსორს მიჰყვება. Select objects first, then choose a command ჯერ მონიშნეთ ობიექტები, შემდეგ აირჩიეთ ბრძანება Selection მონიშვნა @@ -1289,6 +1293,8 @@ Run Script... სკრიპტის გაშვება... Query Texts ტექსტების გამოთხოვნა Analyze Shapes ფიგურების ანალიზი + Analyze Usage გამოყენების ანალიზი + Implied Loops არაცხადი შეკრული კონტურები Hatch Pick დაშტრიხვის არჩევა Hatch and Gradient დაშტრიხვა და გრადიენტი Color 1 ფერი 1 From d11c418fe608def4d28d8783c075ac8cc2336b4a Mon Sep 17 00:00:00 2001 From: Davit Matchakhelidze Date: Sun, 25 Oct 2026 19:17:07 +0400 Subject: [PATCH 08/25] theme: the Georgian glyph test asks FontsView::has_glyph (egui 0.37 made its fonts field private) Co-Authored-By: Claude Opus 5.5 --- crates/ui-egui/src/theme.rs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/crates/ui-egui/src/theme.rs b/crates/ui-egui/src/theme.rs index 9627becb4..75dd4f6ac 100644 --- a/crates/ui-egui/src/theme.rs +++ b/crates/ui-egui/src/theme.rs @@ -813,9 +813,8 @@ mod tests { output.textures_delta.clear(); ctx.fonts_mut(|view| { for family in [egui::FontFamily::Proportional, egui::FontFamily::Monospace] { - let mut font = view.fonts.font(&family); for c in &letters { - assert!(font.characters().contains_key(c), "{language}: missing Georgian glyph {c} in {family:?}"); + assert!(view.has_glyph(&egui::FontId::new(12.0, family.clone()), *c), "{language}: missing Georgian glyph {c} in {family:?}"); } } }); From 8e84e57ac8e3712edcb26b03988f87c74c56add5 Mon Sep 17 00:00:00 2001 From: Davit Matchakhelidze Date: Sun, 25 Oct 2026 19:17:17 +0400 Subject: [PATCH 09/25] theme: the Georgian glyph test asks FontsView::has_glyph (egui 0.37 made its fonts field private) Co-Authored-By: Claude Opus 5.5 --- crates/ui-egui/src/theme.rs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/crates/ui-egui/src/theme.rs b/crates/ui-egui/src/theme.rs index 9627becb4..75dd4f6ac 100644 --- a/crates/ui-egui/src/theme.rs +++ b/crates/ui-egui/src/theme.rs @@ -813,9 +813,8 @@ mod tests { output.textures_delta.clear(); ctx.fonts_mut(|view| { for family in [egui::FontFamily::Proportional, egui::FontFamily::Monospace] { - let mut font = view.fonts.font(&family); for c in &letters { - assert!(font.characters().contains_key(c), "{language}: missing Georgian glyph {c} in {family:?}"); + assert!(view.has_glyph(&egui::FontId::new(12.0, family.clone()), *c), "{language}: missing Georgian glyph {c} in {family:?}"); } } }); From 9c8519da2f6675c30fdd81277697caedc938ba64 Mon Sep 17 00:00:00 2001 From: Davit Matchakhelidze Date: Sun, 25 Oct 2026 19:57:06 +0400 Subject: [PATCH 10/25] docs: ka among the supported ui.language values Co-Authored-By: Claude Opus 5.5 --- docs/control-protocol.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/control-protocol.md b/docs/control-protocol.md index 1c3f30626..f7fa57e4e 100644 --- a/docs/control-protocol.md +++ b/docs/control-protocol.md @@ -188,7 +188,7 @@ 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`, `sv`, `ar` and `hu`. +Supported values are `auto`, `en`, `uk`, `pt-BR`, `de`, `es`, `cs`, `ru`, `fr`, `zh`, `it`, `ko`, `sv`, `ar`, `hu` and `ka`. 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 From 4cd88a3815009417e159a27dc614a588d55739a9 Mon Sep 17 00:00:00 2001 From: Davit Matchakhelidze Date: Sun, 25 Oct 2026 19:57:06 +0400 Subject: [PATCH 11/25] docs: ka joins the supported ui.language values with the language PR, not this one (CodeRabbit) Co-Authored-By: Claude Opus 5.5 --- docs/control-protocol.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/control-protocol.md b/docs/control-protocol.md index 6e642497a..46e2d379d 100644 --- a/docs/control-protocol.md +++ b/docs/control-protocol.md @@ -188,7 +188,7 @@ 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`, `sv`, `ar`, `hu`, `tr`, `el` and `ka`. +Supported values are `auto`, `en`, `uk`, `pt-BR`, `de`, `es`, `cs`, `ru`, `fr`, `zh`, `it`, `ko`, `sv`, `ar`, `hu`, `tr` and `el`. 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; Georgian needs the craft-fonts Georgian (`Geor`) face. Without a suitable font, the saved choice is retained and the result's `shown` is `en`. `ui.set` also accepts From 963267abe856c39d11dcfecdc4857df645078eac Mon Sep 17 00:00:00 2001 From: Davit Matchakhelidze Date: Sun, 25 Oct 2026 21:30:23 +0400 Subject: [PATCH 12/25] docs: list tr and el among the ui.language values Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01YMTAbGNRxnMEzRvYnQGphF --- docs/control-protocol.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/control-protocol.md b/docs/control-protocol.md index f7fa57e4e..5bbd4b083 100644 --- a/docs/control-protocol.md +++ b/docs/control-protocol.md @@ -188,7 +188,7 @@ 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`, `sv`, `ar`, `hu` and `ka`. +Supported values are `auto`, `en`, `uk`, `pt-BR`, `de`, `es`, `cs`, `ru`, `fr`, `zh`, `it`, `ko`, `sv`, `ar`, `hu`, `tr`, `el` and `ka`. 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 From 1fba38238f67ee97392d110468e7449e7e7bf6fb Mon Sep 17 00:00:00 2001 From: Davit Matchakhelidze Date: Sun, 25 Oct 2026 22:09:24 +0400 Subject: [PATCH 13/25] i18n(ka): shorter wording for labels that were cut off Decided in the native-speaker review of the screens (all-t01). Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01YMTAbGNRxnMEzRvYnQGphF --- crates/ui-egui/src/i18n/ka.tsv | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/ui-egui/src/i18n/ka.tsv b/crates/ui-egui/src/i18n/ka.tsv index 3db7c923a..716a01417 100644 --- a/crates/ui-egui/src/i18n/ka.tsv +++ b/crates/ui-egui/src/i18n/ka.tsv @@ -572,7 +572,7 @@ New Viewports... ახალი ხედვის არეები... New from Template... ახალი შაბლონიდან... New layout ახალი განლაგება - New state name მდგომარეობის ახალი სახელი + New state name ახალი მდგომარეობა Next Change შემდეგი ცვლილება No არა No blocks defined in this drawing. ამ ნახაზში ბლოკები არ არის განსაზღვრული. From 53c7d25ee04b98c12db17bf2424880f9ac9a8998 Mon Sep 17 00:00:00 2001 From: Davit Matchakhelidze Date: Tue, 27 Oct 2026 15:43:32 +0400 Subject: [PATCH 14/25] i18n(ka): bring the Georgian catalog up to date Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01YMTAbGNRxnMEzRvYnQGphF --- crates/ui-egui/src/i18n/ka.tsv | 54 ++++++++++++++++++++++++++++++++-- 1 file changed, 52 insertions(+), 2 deletions(-) diff --git a/crates/ui-egui/src/i18n/ka.tsv b/crates/ui-egui/src/i18n/ka.tsv index 716a01417..1bd5d65fd 100644 --- a/crates/ui-egui/src/i18n/ka.tsv +++ b/crates/ui-egui/src/i18n/ka.tsv @@ -153,6 +153,7 @@ Close All Other Drawings ყველა სხვა ნახაზის დახურვა Closed შეკრული Close Comparison შედარების დახურვა + Export Comparison შედარების ექსპორტი Coincident დამთხვევა Collapse Palettes პალიტრების ჩაკეცვა Collapse Tool Sets ხელსაწყოთა ნაკრებების ჩაკეცვა @@ -200,6 +201,7 @@ Current selection მიმდინარე მონიშნული Current: {color} მიმდინარე: {color} Cut ამოჭრა + Cut with Base Point ამოჭრა საბაზო წერტილით Cyan ცისფერი Cylinder ცილინდრი DWG DWG @@ -264,6 +266,7 @@ Drawing Template (DWT) ნახაზის შაბლონი (DWT) Drawing Utilities ნახაზის უტილიტები Drawings (DWG, DXF) ნახაზები (DWG, DXF) + AutoLISP (LSP) AutoLISP (LSP) SVG drawings (SVG, SVGZ) SVG ნახაზები (SVG, SVGZ) Dynamic დინამიკური Dynamic Dimensions დინამიკური ზომები @@ -572,7 +575,7 @@ New Viewports... ახალი ხედვის არეები... New from Template... ახალი შაბლონიდან... New layout ახალი განლაგება - New state name ახალი მდგომარეობა + New state name მდგომარეობის ახალი სახელი Next Change შემდეგი ცვლილება No არა No blocks defined in this drawing. ამ ნახაზში ბლოკები არ არის განსაზღვრული. @@ -756,6 +759,7 @@ Rename Text Style ტექსტის სტილის სახელის შეცვლა Rename... სახელის შეცვლა... Repeat {command} გამეორება: {command} + Replace Block... ბლოკის ჩანაცვლება... Requires a point (x,y, @dx,dy or @d Date: Tue, 27 Oct 2026 16:09:18 +0400 Subject: [PATCH 15/25] i18n(ka): translate Font (the text editor's font field) Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01YMTAbGNRxnMEzRvYnQGphF --- crates/ui-egui/src/i18n/ka.tsv | 1 + 1 file changed, 1 insertion(+) diff --git a/crates/ui-egui/src/i18n/ka.tsv b/crates/ui-egui/src/i18n/ka.tsv index 1bd5d65fd..205f5e821 100644 --- a/crates/ui-egui/src/i18n/ka.tsv +++ b/crates/ui-egui/src/i18n/ka.tsv @@ -362,6 +362,7 @@ Fit Points მისადაგების წერტილები Fix ფიქსაცია Flatten Objects ობიექტების სიბრტყეზე დაგეგმილება + Font შრიფტი Format ფორმატი Freehand ხელით ხაზვა Freeze გაყინვა From f948acd30b52e01826c85d7033e03485cca4a236 Mon Sep 17 00:00:00 2001 From: Davit Matchakhelidze Date: Tue, 27 Oct 2026 23:32:16 +0400 Subject: [PATCH 16/25] i18n(ka): bring the Georgian catalog up to date Co-Authored-By: Claude Opus 5.5 --- crates/ui-egui/src/i18n/ka.tsv | 3 +++ 1 file changed, 3 insertions(+) diff --git a/crates/ui-egui/src/i18n/ka.tsv b/crates/ui-egui/src/i18n/ka.tsv index 205f5e821..2126b7cd1 100644 --- a/crates/ui-egui/src/i18n/ka.tsv +++ b/crates/ui-egui/src/i18n/ka.tsv @@ -103,6 +103,7 @@ Blend გადასვლა Block ბლოკი Block Attribute Manager... ბლოკის ატრიბუტების მენეჯერი... + Block Description... ბლოკის აღწერა... Block Editor ბლოკის რედაქტორი Block Reference ბლოკის ჩასმა Block... ბლოკი... @@ -563,6 +564,7 @@ N N Name სახელი Name (A–Z) სახელი (ა–ჰ) + Named Viewports... დასახელებული ხედვის არეები... Named Views... დასახელებული ხედები... Nearest უახლოესი New ახალი @@ -777,6 +779,7 @@ Save (⌘S) შენახვა (⌘S) Save As შენახვა როგორც Save As... შენახვა როგორც... + Save Layout as Template განლაგების შაბლონად შენახვა Save Layer State შრეების მდგომარეობის შენახვა Save State მდგომარეობის შენახვა Scale მასშტაბირება From b5f0890b95dcda79ab4f8e27ac017ab96da4a52a Mon Sep 17 00:00:00 2001 From: Davit Matchakhelidze Date: Thu, 29 Oct 2026 00:58:26 +0400 Subject: [PATCH 17/25] Docs: Georgian needs the embedded craft-fonts Geor face --- docs/control-protocol.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/control-protocol.md b/docs/control-protocol.md index 5bbd4b083..dc23517d6 100644 --- a/docs/control-protocol.md +++ b/docs/control-protocol.md @@ -190,7 +190,8 @@ Select a language with `engine.execute` and the UI command `ui.language`: Supported values are `auto`, `en`, `uk`, `pt-BR`, `de`, `es`, `cs`, `ru`, `fr`, `zh`, `it`, `ko`, `sv`, `ar`, `hu`, `tr`, `el` and `ka`. 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 +optional craft-fonts input or the operating system; Georgian needs the `Geor` face from craft-fonts (an installed font +does not count). 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. Invalid choices leave the current language unchanged. Menus, command labels and prompt text From 66f65b763e579502ca61cf8e913d8e2f263487ba Mon Sep 17 00:00:00 2001 From: Davit Matchakhelidze Date: Sat, 31 Oct 2026 04:38:42 +0400 Subject: [PATCH 18/25] docs: list bs beside ka in the supported interface languages Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01YMTAbGNRxnMEzRvYnQGphF --- docs/control-protocol.md | 2 +- docs/localization.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/control-protocol.md b/docs/control-protocol.md index 51b912b05..5e6ac3f87 100644 --- a/docs/control-protocol.md +++ b/docs/control-protocol.md @@ -188,7 +188,7 @@ 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`, `sv`, `ar`, `hu`, `tr`, `el` and `ka`. +Supported values are `auto`, `en`, `uk`, `pt-BR`, `de`, `es`, `cs`, `ru`, `fr`, `zh`, `it`, `ko`, `sv`, `ar`, `hu`, `tr`, `bs`, `el` and `ka`. 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; Georgian needs the `Geor` face from craft-fonts (an installed font does not count). Without a suitable font, the saved choice is diff --git a/docs/localization.md b/docs/localization.md index 8925e21be..3e8090993 100644 --- a/docs/localization.md +++ b/docs/localization.md @@ -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`, `sv`, `ar`, `hu`, `tr`, `el`, and `ka`; invalid values are rejected without changing the current +`en`, `uk`, `pt-BR`, `de`, `es`, `cs`, `ru`, `fr`, `zh`, `it`, `ko`, `sv`, `ar`, `hu`, `tr`, `bs`, `el`, and `ka`; invalid values are rejected without changing the current selection. Resetting palettes keeps the language choice. ## Translation coverage From 651615e5c2837760e7a2811e50dd1f59b922b7e7 Mon Sep 17 00:00:00 2001 From: Davit Matchakhelidze Date: Sat, 31 Oct 2026 05:00:18 +0400 Subject: [PATCH 19/25] docs: Greek and Bosnian in the language lists; Georgian on the web comes with #1971 Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01YMTAbGNRxnMEzRvYnQGphF --- README.md | 2 +- docs/localization-parity.md | 2 +- docs/localization.md | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 1752ac3a4..078c53511 100644 --- a/README.md +++ b/README.md @@ -118,7 +118,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), Swedish (Svenska), Arabic (العربية, with an installed Arabic font), Hungarian (Magyar), Turkish (Türkçe) and Georgian (ქართული), 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), Arabic (العربية, with an installed Arabic font), Hungarian (Magyar), Turkish (Türkçe), Greek (Ελληνικά), Bosnian (Bosanski) and Georgian (ქართული), 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/docs/localization-parity.md b/docs/localization-parity.md index 637a156f2..884cc3389 100644 --- a/docs/localization-parity.md +++ b/docs/localization-parity.md @@ -73,7 +73,7 @@ plus native review by a human; extending the catalog to the remaining English-on | Swedish | sv | 1,330 catalog rows; reference catalog, marked UI literals and menu headings covered (no gaps reported) | dialogs and tooltips yes; contextual menu headings; command reference searchable in Swedish | Latin: yes (bundled egui proportional and monospace fonts; å ä ö é and Swedish quotes tested) | AI-assisted (Claude Code) by @holmbom; terminology and the running app reviewed by a native speaker | complete current catalog; English-only interface gaps remain | line-by-line proofreading + shared English-only UI work | | Italian | it | 1,227 catalog rows; reference catalog and marked UI literals covered | dialogs and tooltips yes; contextual menu headings (Visualizza / Vista, Edita / Modifica); command reference searchable in Italian | Latin: yes (bundled egui fonts; accented letters tested) | AI-assisted by Emanuele Bottelli (Claude), written from the English strings with Italian desktop-CAD vocabulary; no native proofreading pass yet | complete current catalog; English-only interface gaps remain | native review + shared English-only UI work | | Hungarian | hu | 1,326 catalog rows; reference catalog, marked UI literals and menu headings covered (no gaps reported) | dialogs and tooltips yes; contextual menu headings; command reference searchable in Hungarian | Latin: yes (bundled egui proportional and monospace fonts; ő ű Ő Ű and the other accented letters tested) | translated by @Skaywalker from the English strings; independent native proofreading pending | complete current catalog; English-only interface gaps remain | native proofreading + shared English-only UI work | -| Georgian | ka | 1,383 catalog rows (1,377 ordinary, 4 menu, 2 count); the existing catalog union, marked UI literals and menu headings covered (no gaps reported) | dialogs and tooltips yes; contextual menu headings (ზომების დატანა / ზომა); command reference searchable in Georgian | Georgian (Mkhedruli): the craft-fonts Noto Sans Georgian (`Geor`) face, embedded in release and web builds; English fallback without it; Mtavruli never used (tested) | Written with Claude Code from the meaning of each English string; terminology and doubtful strings decided by a native Georgian speaker (@devius) | complete current catalog; English-only interface gaps remain | shared English-only UI work | +| Georgian | ka | 1,383 catalog rows (1,377 ordinary, 4 menu, 2 count); the existing catalog union, marked UI literals and menu headings covered (no gaps reported) | dialogs and tooltips yes; contextual menu headings (ზომების დატანა / ზომა); command reference searchable in Georgian | Georgian (Mkhedruli): the craft-fonts Noto Sans Georgian (`Geor`) face, embedded in release builds (web builds too once #1971 adds it to the web faces); English fallback without it; Mtavruli never used (tested) | Written with Claude Code from the meaning of each English string; terminology and doubtful strings decided by a native Georgian speaker (@devius) | complete current catalog; English-only interface gaps remain | shared English-only UI work | | Turkish | tr | 1,330 catalog rows; reference catalog, marked UI literals and menu headings covered (no gaps reported) | dialogs and tooltips yes; contextual menu headings (Ölçülendirme / Ölçü); command reference searchable in Turkish | Latin: yes (bundled egui proportional and monospace fonts; Ç Ğ İ Ö Ş Ü ç ğ ı ö ş ü tested) | AI-assisted by @ogzhnklvz, written from the English strings with Turkish desktop-CAD vocabulary; the running app reviewed by a native speaker | complete current catalog; English-only interface gaps remain | line-by-line proofreading + shared English-only UI work | | Bosnian | bs | 1,442 catalog rows; reference catalog and marked UI literals covered | dialogs and tooltips yes | Latin: yes (bundled egui fonts) | AI-assisted; independent native proofreading pending | complete current catalog; English-only interface gaps remain | native proofreading + shared English-only UI work | diff --git a/docs/localization.md b/docs/localization.md index 3e8090993..a916c00e6 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), **Svenska** (Swedish), **العربية** (Arabic), **Magyar** (Hungarian), **Türkçe** (Turkish), **Ελληνικά** (Greek), or **ქართული** (Georgian). +**Українська**, **Português (Brasil)**, **Deutsch**, **Español**, **Čeština** (Czech), **Русский**, **Français**, **简体中文**, **Italiano**, **한국어** (Korean), **Svenska** (Swedish), **العربية** (Arabic), **Magyar** (Hungarian), **Türkçe** (Turkish), **Ελληνικά** (Greek), **Bosanski** (Bosnian), or **ქართული** (Georgian). 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 From 5f6dbede5ca24082119edf164286b500519e7cea Mon Sep 17 00:00:00 2001 From: Davit Matchakhelidze Date: Sat, 31 Oct 2026 06:00:43 +0400 Subject: [PATCH 20/25] docs: Georgian row count after the block-editor prompt Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01YMTAbGNRxnMEzRvYnQGphF --- docs/localization-parity.md | 4 ++-- docs/localization.md | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/localization-parity.md b/docs/localization-parity.md index 884cc3389..25d66c7bc 100644 --- a/docs/localization-parity.md +++ b/docs/localization-parity.md @@ -73,7 +73,7 @@ plus native review by a human; extending the catalog to the remaining English-on | Swedish | sv | 1,330 catalog rows; reference catalog, marked UI literals and menu headings covered (no gaps reported) | dialogs and tooltips yes; contextual menu headings; command reference searchable in Swedish | Latin: yes (bundled egui proportional and monospace fonts; å ä ö é and Swedish quotes tested) | AI-assisted (Claude Code) by @holmbom; terminology and the running app reviewed by a native speaker | complete current catalog; English-only interface gaps remain | line-by-line proofreading + shared English-only UI work | | Italian | it | 1,227 catalog rows; reference catalog and marked UI literals covered | dialogs and tooltips yes; contextual menu headings (Visualizza / Vista, Edita / Modifica); command reference searchable in Italian | Latin: yes (bundled egui fonts; accented letters tested) | AI-assisted by Emanuele Bottelli (Claude), written from the English strings with Italian desktop-CAD vocabulary; no native proofreading pass yet | complete current catalog; English-only interface gaps remain | native review + shared English-only UI work | | Hungarian | hu | 1,326 catalog rows; reference catalog, marked UI literals and menu headings covered (no gaps reported) | dialogs and tooltips yes; contextual menu headings; command reference searchable in Hungarian | Latin: yes (bundled egui proportional and monospace fonts; ő ű Ő Ű and the other accented letters tested) | translated by @Skaywalker from the English strings; independent native proofreading pending | complete current catalog; English-only interface gaps remain | native proofreading + shared English-only UI work | -| Georgian | ka | 1,383 catalog rows (1,377 ordinary, 4 menu, 2 count); the existing catalog union, marked UI literals and menu headings covered (no gaps reported) | dialogs and tooltips yes; contextual menu headings (ზომების დატანა / ზომა); command reference searchable in Georgian | Georgian (Mkhedruli): the craft-fonts Noto Sans Georgian (`Geor`) face, embedded in release builds (web builds too once #1971 adds it to the web faces); English fallback without it; Mtavruli never used (tested) | Written with Claude Code from the meaning of each English string; terminology and doubtful strings decided by a native Georgian speaker (@devius) | complete current catalog; English-only interface gaps remain | shared English-only UI work | +| Georgian | ka | 1,384 catalog rows (1,378 ordinary, 4 menu, 2 count); the existing catalog union, marked UI literals and menu headings covered (no gaps reported) | dialogs and tooltips yes; contextual menu headings (ზომების დატანა / ზომა); command reference searchable in Georgian | Georgian (Mkhedruli): the craft-fonts Noto Sans Georgian (`Geor`) face, embedded in release builds (web builds too once #1971 adds it to the web faces); English fallback without it; Mtavruli never used (tested) | Written with Claude Code from the meaning of each English string; terminology and doubtful strings decided by a native Georgian speaker (@devius) | complete current catalog; English-only interface gaps remain | shared English-only UI work | | Turkish | tr | 1,330 catalog rows; reference catalog, marked UI literals and menu headings covered (no gaps reported) | dialogs and tooltips yes; contextual menu headings (Ölçülendirme / Ölçü); command reference searchable in Turkish | Latin: yes (bundled egui proportional and monospace fonts; Ç Ğ İ Ö Ş Ü ç ğ ı ö ş ü tested) | AI-assisted by @ogzhnklvz, written from the English strings with Turkish desktop-CAD vocabulary; the running app reviewed by a native speaker | complete current catalog; English-only interface gaps remain | line-by-line proofreading + shared English-only UI work | | Bosnian | bs | 1,442 catalog rows; reference catalog and marked UI literals covered | dialogs and tooltips yes | Latin: yes (bundled egui fonts) | AI-assisted; independent native proofreading pending | complete current catalog; English-only interface gaps remain | native proofreading + shared English-only UI work | @@ -92,7 +92,7 @@ each language, which needs humans. Translations parallelise fully once the catal | Date | Change | Summary | |---|---|---| | 2026-10-30 | minor | Bosnian (`bs`, Latin, Ijekavian) added: 1,442 rows, one/few/other plurals, `bs-*` locales; AI-assisted, native proofreading pending | -| 2026-10-23 | minor | Georgian (`ka`) added: 1,383 rows (the existing catalog union), single count form, four menu headings, prompt keywords kept in English; the embedded craft-fonts `Geor` face loaded when a build has it (the pin is #1971); locale/preferences/menu/live-switch/dialog/font/no-Mtavruli tests; terminology decided by a native speaker | +| 2026-10-23 | minor | Georgian (`ka`) added: 1,384 rows (the existing catalog union), single count form, four menu headings, prompt keywords kept in English; the embedded craft-fonts `Geor` face loaded when a build has it (the pin is #1971); locale/preferences/menu/live-switch/dialog/font/no-Mtavruli tests; terminology decided by a native speaker | | 2026-10-22 | minor | Command line IME: enabled while a prompt collects text, composition shown but not saved, commit inserted once; single-line TEXT edits accept CJK input (#1761) | | 2026-10-19 | minor | Brazilian Portuguese: row brought up to date (it still read 0%); native-speaker terminology pass on 69 rows (Bind as Integrar, prompt keywords and SPDX kept in English, Thaw Layer, Snap type, Revolve fixed; snap, viewport, grip, offset, layer on/off and multiline wording made consistent with Brazilian usage) | | 2026-10-15 | minor | Greek (`el`) catalog: 1,330 rows, context/plural/locale/font tests; review pending | diff --git a/docs/localization.md b/docs/localization.md index a916c00e6..f84e7c035 100644 --- a/docs/localization.md +++ b/docs/localization.md @@ -120,7 +120,7 @@ follow-up work. ## Georgian (`ka`) interface -Georgian has **1,383 rows**: 1,377 ordinary labels, four contextual menu headings (**ზომების +Georgian has **1,384 rows**: 1,378 ordinary labels, four contextual menu headings (**ზომების დატანა** for the Dimension menu, **ზომა** for the object; **ხატვა** for Draw) and two single-form count templates, since a Georgian noun stays singular after a numeral ("5 კომიტი"). It covers the union of the existing catalogs, and no marked UI literal falls back to English. Commands are verbal From 4b532f6c24208b3bc481ca385f304f05c52527cc Mon Sep 17 00:00:00 2001 From: Davit Matchakhelidze Date: Tue, 3 Nov 2026 08:01:13 +0400 Subject: [PATCH 21/25] i18n(ka): translate the strings added upstream; prompts without the trailing "or" Co-Authored-By: Claude Opus 5.5 --- ROADMAP.md | 2 +- crates/ui-egui/src/i18n/ka.tsv | 44 ++++++++++++++++++++++------------ docs/localization-parity.md | 4 ++-- docs/localization.md | 2 +- 4 files changed, 33 insertions(+), 19 deletions(-) diff --git a/ROADMAP.md b/ROADMAP.md index 13ed80ef8..a731731f0 100644 --- a/ROADMAP.md +++ b/ROADMAP.md @@ -95,7 +95,7 @@ Ukrainian and German. Detail: [localization-parity.md](docs/localization-parity. | Indonesian | none | 0% | | Japanese | none | 0% | | Greek | complete current catalog | 1,330 current source keys; independent proofreading pending | -| Georgian | complete current catalog | 1,383 rows; terminology decided by a native speaker | +| Georgian | complete current catalog | 1,458 rows; terminology decided by a native speaker | | German | partial | ≈ 100% of the catalog (989 rows) | | Korean | none | 0% | | Vietnamese | none | 0% | diff --git a/crates/ui-egui/src/i18n/ka.tsv b/crates/ui-egui/src/i18n/ka.tsv index 843a8ff8a..e40f492c7 100644 --- a/crates/ui-egui/src/i18n/ka.tsv +++ b/crates/ui-egui/src/i18n/ka.tsv @@ -295,7 +295,7 @@ Enter a vertex editing option შეიყვანეთ წვეროს რედაქტირების ვარიანტი Enter an option შეიყვანეთ ვარიანტი Enter angle of xline შეიყვანეთ დამხმარე ხაზის კუთხე - Enter angle of xline (0) or შეიყვანეთ დამხმარე ხაზის კუთხე (0) ან + Enter angle of xline (0) შეიყვანეთ დამხმარე ხაზის კუთხე (0) Enter area of rectangle in current units შეიყვანეთ მართკუთხედის ფართობი მიმდინარე ერთეულებში Enter attribute prompt შეიყვანეთ ატრიბუტის მოთხოვნა Enter attribute tag name შეიყვანეთ ატრიბუტის ტეგის სახელი @@ -306,7 +306,7 @@ Enter default attribute value შეიყვანეთ ატრიბუტის ნაგულისხმევი მნიშვნელობა Enter degree of spline შეიყვანეთ სპლაინის ხარისხი Enter delta angle შეიყვანეთ კუთხის ნამატი - Enter delta length or შეიყვანეთ სიგრძის ნამატი ან + Enter delta length შეიყვანეთ სიგრძის ნამატი Enter dimension text შეიყვანეთ ზომის ტექსტი Enter dimension text (<> = measurement) შეიყვანეთ ზომის ტექსტი (<> = გაზომილი მნიშვნელობა) Enter dimension value or [name=expression] შეიყვანეთ ზომის მნიშვნელობა ან [name=expression] @@ -813,8 +813,8 @@ Select an arc or circle მონიშნეთ რკალი ან წრე Select an arc. მონიშნეთ რკალი. Select an object მონიშნეთ ობიექტი - Select an object to change or მონიშნეთ შესაცვლელი ობიექტი ან - Select an object to measure or მონიშნეთ გასაზომი ობიექტი ან + Select an object to change მონიშნეთ შესაცვლელი ობიექტი + Select an object to measure მონიშნეთ გასაზომი ობიექტი Select an object. მონიშნეთ ობიექტი. Select an open curve. მონიშნეთ ღია მრუდი. Select an open line, arc, polyline, ellipse arc or spline. მონიშნეთ ღია ხაზი, რკალი, ტეხილი, ელიფსური რკალი ან სპლაინი. @@ -828,9 +828,8 @@ Select first line მონიშნეთ პირველი ხაზი Select first line or arc მონიშნეთ პირველი ხაზი ან რკალი Select first object მონიშნეთ პირველი ობიექტი - Select first object or მონიშნეთ პირველი ობიექტი ან Select first point მონიშნეთ პირველი წერტილი - Select nested objects to copy or მონიშნეთ ჩადგმული ობიექტები კოპირებისთვის ან + Select nested objects to copy მონიშნეთ ჩადგმული ობიექტები კოპირებისთვის Select object მონიშნეთ ობიექტი Select object to dimension მონიშნეთ ობიექტი ზომის დასატანად Select object to divide მონიშნეთ დასაყოფი ობიექტი @@ -851,7 +850,7 @@ Select one polyline (Multiple is available through the JSON form). მონიშნეთ ერთი ტეხილი (Multiple ხელმისაწვდომია JSON ფორმით). Select path curve მონიშნეთ ტრაექტორიის მრუდი Select point or object მონიშნეთ წერტილი ან ობიექტი - Select polyline or მონიშნეთ ტეხილი ან + Select polyline მონიშნეთ ტეხილი Select second line მონიშნეთ მეორე ხაზი Select second line or shift-select to apply corner მონიშნეთ მეორე ხაზი, ან Shift-ით მონიშნეთ კუთხის შესაქმნელად Select second object მონიშნეთ მეორე ობიექტი @@ -911,9 +910,8 @@ Specify axis endpoint of ellipse მიუთითეთ ელიფსის ღერძის ბოლო წერტილი Specify base diameter მიუთითეთ ფუძის დიამეტრი Specify base point მიუთითეთ საბაზო წერტილი - Specify base point or მიუთითეთ საბაზო წერტილი ან Specify base point or displacement (drag with the middle mouse button for realtime pan) მიუთითეთ საბაზო წერტილი ან წანაცვლება (რეალურ დროში პანორამისთვის გადაათრიეთ მაუსის შუა ღილაკით) - Specify base radius or მიუთითეთ ფუძის რადიუსი ან + Specify base radius მიუთითეთ ფუძის რადიუსი Specify center of donut მიუთითეთ რგოლის ცენტრი Specify center of ellipse მიუთითეთ ელიფსის ცენტრი Specify center of polygon მიუთითეთ მრავალკუთხედის ცენტრი @@ -955,7 +953,7 @@ Specify first point on circle: _tan to მიუთითეთ პირველი წერტილი წრეზე: _tan to Specify first source point მიუთითეთ პირველი საწყისი წერტილი Specify height მიუთითეთ სიმაღლე - Specify helix height or მიუთითეთ სპირალის სიმაღლე ან + Specify helix height მიუთითეთ სპირალის სიმაღლე Specify included angle მიუთითეთ შიგა კუთხე Specify insertion base point მიუთითეთ ჩასმის საბაზო წერტილი Specify insertion point მიუთითეთ ჩასმის წერტილი @@ -1038,7 +1036,6 @@ Specify new width for all segments მიუთითეთ ახალი სიგანე ყველა სეგმენტისთვის Specify next point მიუთითეთ შემდეგი წერტილი Specify offset distance მიუთითეთ წანაცვლების მანძილი - Specify offset distance or მიუთითეთ წანაცვლების მანძილი ან Specify opposite corner მიუთითეთ მოპირდაპირე კუთხე Specify other corner point მიუთითეთ მეორე კუთხის წერტილი Specify other endpoint of axis მიუთითეთ ღერძის მეორე ბოლო წერტილი @@ -1051,7 +1048,6 @@ Specify radius of circle მიუთითეთ წრის რადიუსი Specify rotation angle მიუთითეთ შემობრუნების კუთხე Specify rotation angle of text მიუთითეთ ტექსტის შემობრუნების კუთხე - Specify rotation angle or მიუთითეთ შემობრუნების კუთხე ან Specify scale factor მიუთითეთ მასშტაბის კოეფიციენტი Specify second angle endpoint მიუთითეთ კუთხის მეორე ბოლო წერტილი Specify second break point მიუთითეთ გაწყვეტის მეორე წერტილი @@ -1084,9 +1080,9 @@ Specify third source point or მიუთითეთ მესამე საწყისი წერტილი ან <გაგრძელება> Specify through point მიუთითეთ გავლის წერტილი Specify top diameter მიუთითეთ ზედა დიამეტრი - Specify top radius or მიუთითეთ ზედა რადიუსი ან + Specify top radius მიუთითეთ ზედა რადიუსი Specify total angle მიუთითეთ სრული კუთხე - Specify total length or მიუთითეთ სრული სიგრძე ან + Specify total length მიუთითეთ სრული სიგრძე Specify width for rectangles მიუთითეთ მართკუთხედების სიგანე Sphere სფერო Spline სპლაინი @@ -1267,8 +1263,8 @@ Stretch Vertex წვეროს გაწელვა Edit Array მასივის რედაქტირება Save changes to {name}? შევინახო ცვლილებები ნახაზში {name}? - Save changes to block "{name}"? შევინახო ცვლილებები ბლოკში „{name}“? Your changes will be lost if you don't save them. თუ ცვლილებებს არ შეინახავთ, ისინი დაიკარგება. + Save changes to block "{name}"? შევინახო ცვლილებები ბლოკში „{name}“? Don't Save არ შეინახო Close Array Editing მასივის რედაქტირების დახურვა Multiline... მულტიხაზი... @@ -1297,6 +1293,8 @@ Automatic save every ავტომატური შენახვა ყოველ min წთ Automatic save file location ავტომატური შენახვის ფაილის მდებარეობა + Backup copy სარეზერვო ასლი + Create backup copy with each save სარეზერვო ასლის შექმნა ყოველი შენახვისას Drawings with no file yet are saved in the default version. 0 minutes turns automatic save off. ჯერ ფაილის არმქონე ნახაზები ნაგულისხმევ ვერსიაში ინახება. 0 წუთი ავტომატურ შენახვას გამორთავს. Time-sensitive right-click: a quick click is Enter, holding opens the menu დროზე დამოკიდებული მარჯვენა დაწკაპება: მოკლე დაწკაპება Enter-ია, დაჭერით გაიხსნება მენიუ Turned off, a right-click while a command runs always opens the shortcut menu. გამორთვისას ბრძანების შესრულების დროს მარჯვენა დაწკაპება ყოველთვის კონტექსტურ მენიუს ხსნის. @@ -1458,3 +1456,19 @@ menu View ხედი First corner პირველი კუთხე Opposite corner საპირისპირო კუთხე Window < ფანჯარა < + Oops წაშლილის აღდგენა + Change შეცვლა + Change Properties თვისებების შეცვლა + Units ერთეულები + Find All ყველას ძებნა + Find what: რა მოიძებნოს: + Match case რეგისტრის გათვალისწინება + Replace ჩანაცვლება + Replace All ყველას ჩანაცვლება + Replace with: ჩანაცვლება: + Replacement text ჩამნაცვლებელი ტექსტი + Results შედეგები + Searches the current space. ძიება მიმდინარე სივრცეში. + Text to find მოსაძებნი ტექსტი + Whole words მთლიანი სიტყვები + Nothing found ვერაფერი მოიძებნა diff --git a/docs/localization-parity.md b/docs/localization-parity.md index 4a7c13e7a..c41162eff 100644 --- a/docs/localization-parity.md +++ b/docs/localization-parity.md @@ -73,7 +73,7 @@ plus native review by a human; extending the catalog to the remaining English-on | Swedish | sv | 1,330 catalog rows; reference catalog, marked UI literals and menu headings covered (no gaps reported) | dialogs and tooltips yes; contextual menu headings; command reference searchable in Swedish | Latin: yes (bundled egui proportional and monospace fonts; å ä ö é and Swedish quotes tested) | AI-assisted (Claude Code) by @holmbom; terminology and the running app reviewed by a native speaker | complete current catalog; English-only interface gaps remain | line-by-line proofreading + shared English-only UI work | | Italian | it | 1,227 catalog rows; reference catalog and marked UI literals covered | dialogs and tooltips yes; contextual menu headings (Visualizza / Vista, Edita / Modifica); command reference searchable in Italian | Latin: yes (bundled egui fonts; accented letters tested) | AI-assisted by Emanuele Bottelli (Claude), written from the English strings with Italian desktop-CAD vocabulary; no native proofreading pass yet | complete current catalog; English-only interface gaps remain | native review + shared English-only UI work | | Hungarian | hu | 1,326 catalog rows; reference catalog, marked UI literals and menu headings covered (no gaps reported) | dialogs and tooltips yes; contextual menu headings; command reference searchable in Hungarian | Latin: yes (bundled egui proportional and monospace fonts; ő ű Ő Ű and the other accented letters tested) | translated by @Skaywalker from the English strings; independent native proofreading pending | complete current catalog; English-only interface gaps remain | native proofreading + shared English-only UI work | -| Georgian | ka | 1,384 catalog rows (1,378 ordinary, 4 menu, 2 count); the existing catalog union, marked UI literals and menu headings covered (no gaps reported) | dialogs and tooltips yes; contextual menu headings (ზომების დატანა / ზომა); command reference searchable in Georgian | Georgian (Mkhedruli): the craft-fonts Noto Sans Georgian (`Geor`) face, embedded in release builds (web builds too once #1971 adds it to the web faces); English fallback without it; Mtavruli never used (tested) | Written with Claude Code from the meaning of each English string; terminology and doubtful strings decided by a native Georgian speaker (@devius) | complete current catalog; English-only interface gaps remain | shared English-only UI work | +| Georgian | ka | 1,458 catalog rows (1,452 ordinary, 4 menu, 2 count); the existing catalog union, marked UI literals and menu headings covered (no gaps reported) | dialogs and tooltips yes; contextual menu headings (ზომების დატანა / ზომა); command reference searchable in Georgian | Georgian (Mkhedruli): the craft-fonts Noto Sans Georgian (`Geor`) face, embedded in release builds (web builds too once #1971 adds it to the web faces); English fallback without it; Mtavruli never used (tested) | Written with Claude Code from the meaning of each English string; terminology and doubtful strings decided by a native Georgian speaker (@devius) | complete current catalog; English-only interface gaps remain | shared English-only UI work | | Turkish | tr | 1,330 catalog rows; reference catalog, marked UI literals and menu headings covered (no gaps reported) | dialogs and tooltips yes; contextual menu headings (Ölçülendirme / Ölçü); command reference searchable in Turkish | Latin: yes (bundled egui proportional and monospace fonts; Ç Ğ İ Ö Ş Ü ç ğ ı ö ş ü tested) | AI-assisted by @ogzhnklvz, written from the English strings with Turkish desktop-CAD vocabulary; the running app reviewed by a native speaker | complete current catalog; English-only interface gaps remain | line-by-line proofreading + shared English-only UI work | | Bosnian | bs | 1,442 catalog rows; reference catalog and marked UI literals covered | dialogs and tooltips yes | Latin: yes (bundled egui fonts) | AI-assisted; independent native proofreading pending | complete current catalog; English-only interface gaps remain | native proofreading + shared English-only UI work | @@ -92,7 +92,7 @@ each language, which needs humans. Translations parallelise fully once the catal | Date | Change | Summary | |---|---|---| | 2026-10-30 | minor | Bosnian (`bs`, Latin, Ijekavian) added: 1,442 rows, one/few/other plurals, `bs-*` locales; AI-assisted, native proofreading pending | -| 2026-10-23 | minor | Georgian (`ka`) added: 1,384 rows (the existing catalog union), single count form, four menu headings, prompt keywords kept in English; the embedded craft-fonts `Geor` face loaded when a build has it (the pin is #1971); locale/preferences/menu/live-switch/dialog/font/no-Mtavruli tests; terminology decided by a native speaker | +| 2026-10-23 | minor | Georgian (`ka`) added: 1,458 rows (the existing catalog union), single count form, four menu headings, prompt keywords kept in English; the embedded craft-fonts `Geor` face loaded when a build has it (the pin is #1971); locale/preferences/menu/live-switch/dialog/font/no-Mtavruli tests; terminology decided by a native speaker | | 2026-10-22 | minor | Command line IME: enabled while a prompt collects text, composition shown but not saved, commit inserted once; single-line TEXT edits accept CJK input (#1761) | | 2026-10-19 | minor | Brazilian Portuguese: row brought up to date (it still read 0%); native-speaker terminology pass on 69 rows (Bind as Integrar, prompt keywords and SPDX kept in English, Thaw Layer, Snap type, Revolve fixed; snap, viewport, grip, offset, layer on/off and multiline wording made consistent with Brazilian usage) | | 2026-10-15 | minor | Greek (`el`) catalog: 1,330 rows, context/plural/locale/font tests; review pending | diff --git a/docs/localization.md b/docs/localization.md index 0d97cdfb7..ee6b1fc0b 100644 --- a/docs/localization.md +++ b/docs/localization.md @@ -120,7 +120,7 @@ follow-up work. ## Georgian (`ka`) interface -Georgian has **1,384 rows**: 1,378 ordinary labels, four contextual menu headings (**ზომების +Georgian has **1,458 rows**: 1,452 ordinary labels, four contextual menu headings (**ზომების დატანა** for the Dimension menu, **ზომა** for the object; **ხატვა** for Draw) and two single-form count templates, since a Georgian noun stays singular after a numeral ("5 კომიტი"). It covers the union of the existing catalogs, and no marked UI literal falls back to English. Commands are verbal From e8408851cddf7e5ef94d69344a77c52e4f4dcde9 Mon Sep 17 00:00:00 2001 From: Davit Matchakhelidze Date: Tue, 3 Nov 2026 11:17:59 +0400 Subject: [PATCH 22/25] docs: the Georgian face paragraph describes glyph support only Choosing ka, its English fallback and the picker name come with the language PR (#2016), which registers ka; this PR alone doesn't. Co-Authored-By: Claude Opus 5.5 --- docs/control-protocol.md | 4 ++-- docs/localization.md | 5 ++--- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/docs/control-protocol.md b/docs/control-protocol.md index 91c2982f9..d10d43abb 100644 --- a/docs/control-protocol.md +++ b/docs/control-protocol.md @@ -188,9 +188,9 @@ 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`, `sv`, `ar`, `hu`, `tr` and `el`. +Supported values are `auto`, `en`, `uk`, `pt-BR`, `de`, `es`, `cs`, `ru`, `fr`, `zh`, `it`, `ko`, `sv`, `ar` and `hu`. 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; Georgian needs the craft-fonts Georgian (`Geor`) face. Without a suitable font, the saved choice is +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. Invalid choices leave the current language unchanged. Menus, command labels and prompt text diff --git a/docs/localization.md b/docs/localization.md index 1d6a71ae6..4c9baef0c 100644 --- a/docs/localization.md +++ b/docs/localization.md @@ -104,9 +104,8 @@ Hangul can't be shown. This change does not fix platform IME issues or localize The bundled egui fonts have no Georgian letters. Georgian is drawn with the Noto Sans Georgian face (`Geor`) of the craft-fonts build input, which release builds embed (`craft-fonts-ref` in the workflows, and `web-craft-fonts` for the web build, whose embedded faces include it). The face loads -in every interface language, so the picker shows **ქართული**. A build without craft-fonts keeps the -saved `ka` choice but shows the interface in English, names the language **Georgian** in the picker, -and the language command reports that a Georgian font is needed. +in every interface language, so Georgian text (file, layout and layer names, labels) draws. A build +without craft-fonts has no Georgian face. ## Greek (`el`) interface From f9cb70500dd0a189690f6bc475e38e0d03104290 Mon Sep 17 00:00:00 2001 From: Davit Matchakhelidze Date: Tue, 3 Nov 2026 11:17:59 +0400 Subject: [PATCH 23/25] docs: Georgian font fallback in the Georgian section Co-Authored-By: Claude Opus 5.5 --- docs/localization.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/docs/localization.md b/docs/localization.md index ee6b1fc0b..cb175cba9 100644 --- a/docs/localization.md +++ b/docs/localization.md @@ -132,6 +132,12 @@ the meaning of each English string, with Georgian technical-drawing vocabulary ( მომრგვალება, ფასკა, წანაცვლება, ობიექტზე მიბმა, ხედვის არე); terminology and doubtful strings were decided by a native Georgian speaker (@devius). No other product's localization was consulted. +egui's bundled faces have no Georgian letters, so Georgian is drawn with the craft-fonts Noto Sans +Georgian (`Geor`) face, which loads in every interface language when a build embeds it; the picker +then shows **ქართული**. A build without that face keeps the saved `ka` choice but shows the interface +in English, names the language **Georgian** in the picker, and the language command reports that a +Georgian font is needed. + ## Adding translations The implementation follows the display-time catalog pattern used by From 40f060018ddac180c762e368c2d90f3a370a952b Mon Sep 17 00:00:00 2001 From: Davit Matchakhelidze Date: Thu, 5 Nov 2026 09:01:04 +0400 Subject: [PATCH 24/25] Leave .github/workflows/release.yml to a maintainer CLAUDE.md: no CI changes in a feature or fix PR. The web-craft-fonts line is described in the PR description. Co-Authored-By: Claude Sonnet 5.5 Claude-Session: https://claude.ai/code/session_01YMTAbGNRxnMEzRvYnQGphF --- .github/workflows/release.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 4bfc4ffec..c2cf475e8 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -69,7 +69,6 @@ jobs: app-name: cadcraft app-title: CADCraft craft-fonts-ref: b076417b5880bd4154bd22f00695b1d28c6bea83 - web-craft-fonts: true version: ${{ inputs.version }} secrets: APPLE_CERTIFICATE: ${{ secrets.APPLE_CERTIFICATE }} From fe67c048ec3639d892ae1ceaf019f2e9b0f58636 Mon Sep 17 00:00:00 2001 From: Davit Matchakhelidze Date: Thu, 5 Nov 2026 09:01:04 +0400 Subject: [PATCH 25/25] Leave ROADMAP.md and docs/localization-parity.md to maintainers CLAUDE.md: PRs don't edit these docs. The affected rows are named in the PR description. Co-Authored-By: Claude Sonnet 5.5 Claude-Session: https://claude.ai/code/session_01YMTAbGNRxnMEzRvYnQGphF --- ROADMAP.md | 1 - docs/localization-parity.md | 6 ++---- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/ROADMAP.md b/ROADMAP.md index a731731f0..48bd33032 100644 --- a/ROADMAP.md +++ b/ROADMAP.md @@ -95,7 +95,6 @@ Ukrainian and German. Detail: [localization-parity.md](docs/localization-parity. | Indonesian | none | 0% | | Japanese | none | 0% | | Greek | complete current catalog | 1,330 current source keys; independent proofreading pending | -| Georgian | complete current catalog | 1,458 rows; terminology decided by a native speaker | | German | partial | ≈ 100% of the catalog (989 rows) | | Korean | none | 0% | | Vietnamese | none | 0% | diff --git a/docs/localization-parity.md b/docs/localization-parity.md index c41162eff..c6f43ee4a 100644 --- a/docs/localization-parity.md +++ b/docs/localization-parity.md @@ -1,6 +1,6 @@ # Localization parity -> **Last reviewed:** 2026-10-10 · **Last updated:** 2026-10-30 · **Change:** minor (Bosnian added; previously: Georgian catalog added: complete catalog, menu headings, single count form; previously minor: the command line enables the OS IME and handles composition/commit, so single-line TEXT edits accept CJK input; previously: Brazilian Portuguese row updated and terminology reviewed; previously: Swedish catalog completed with the 95 strings added since; previously: Swedish catalog added: complete catalog, menu headings, native-speaker terminology review; previously: complete current Korean catalog with Hangul font coverage) · **Target:** Autodesk AutoCAD 2027 for Mac (26.0) +> **Last reviewed:** 2026-10-10 · **Last updated:** 2026-10-30 · **Change:** minor (Bosnian added; previously minor: the command line enables the OS IME and handles composition/commit, so single-line TEXT edits accept CJK input; previously: Brazilian Portuguese row updated and terminology reviewed; previously: Swedish catalog completed with the 95 strings added since; previously: Swedish catalog added: complete catalog, menu headings, native-speaker terminology review; previously: complete current Korean catalog with Hangul font coverage) · **Target:** Autodesk AutoCAD 2027 for Mac (26.0) How far CADCraft's interface and drawing text are from AutoCAD's languages. Summarised in [ROADMAP.md](../ROADMAP.md#languages); work items in [gaps.md](gaps.md#localization). @@ -73,11 +73,10 @@ plus native review by a human; extending the catalog to the remaining English-on | Swedish | sv | 1,330 catalog rows; reference catalog, marked UI literals and menu headings covered (no gaps reported) | dialogs and tooltips yes; contextual menu headings; command reference searchable in Swedish | Latin: yes (bundled egui proportional and monospace fonts; å ä ö é and Swedish quotes tested) | AI-assisted (Claude Code) by @holmbom; terminology and the running app reviewed by a native speaker | complete current catalog; English-only interface gaps remain | line-by-line proofreading + shared English-only UI work | | Italian | it | 1,227 catalog rows; reference catalog and marked UI literals covered | dialogs and tooltips yes; contextual menu headings (Visualizza / Vista, Edita / Modifica); command reference searchable in Italian | Latin: yes (bundled egui fonts; accented letters tested) | AI-assisted by Emanuele Bottelli (Claude), written from the English strings with Italian desktop-CAD vocabulary; no native proofreading pass yet | complete current catalog; English-only interface gaps remain | native review + shared English-only UI work | | Hungarian | hu | 1,326 catalog rows; reference catalog, marked UI literals and menu headings covered (no gaps reported) | dialogs and tooltips yes; contextual menu headings; command reference searchable in Hungarian | Latin: yes (bundled egui proportional and monospace fonts; ő ű Ő Ű and the other accented letters tested) | translated by @Skaywalker from the English strings; independent native proofreading pending | complete current catalog; English-only interface gaps remain | native proofreading + shared English-only UI work | -| Georgian | ka | 1,458 catalog rows (1,452 ordinary, 4 menu, 2 count); the existing catalog union, marked UI literals and menu headings covered (no gaps reported) | dialogs and tooltips yes; contextual menu headings (ზომების დატანა / ზომა); command reference searchable in Georgian | Georgian (Mkhedruli): the craft-fonts Noto Sans Georgian (`Geor`) face, embedded in release builds (web builds too once #1971 adds it to the web faces); English fallback without it; Mtavruli never used (tested) | Written with Claude Code from the meaning of each English string; terminology and doubtful strings decided by a native Georgian speaker (@devius) | complete current catalog; English-only interface gaps remain | shared English-only UI work | | Turkish | tr | 1,330 catalog rows; reference catalog, marked UI literals and menu headings covered (no gaps reported) | dialogs and tooltips yes; contextual menu headings (Ölçülendirme / Ölçü); command reference searchable in Turkish | Latin: yes (bundled egui proportional and monospace fonts; Ç Ğ İ Ö Ş Ü ç ğ ı ö ş ü tested) | AI-assisted by @ogzhnklvz, written from the English strings with Turkish desktop-CAD vocabulary; the running app reviewed by a native speaker | complete current catalog; English-only interface gaps remain | line-by-line proofreading + shared English-only UI work | | Bosnian | bs | 1,442 catalog rows; reference catalog and marked UI literals covered | dialogs and tooltips yes | Latin: yes (bundled egui fonts) | AI-assisted; independent native proofreading pending | complete current catalog; English-only interface gaps remain | native proofreading + shared English-only UI work | -Other languages shipped: Ukrainian, Brazilian Portuguese, German, Czech, Russian, French, Italian, Korean, Swedish, Hungarian, Turkish, Bosnian and Georgian. +Other languages shipped: Ukrainian, Brazilian Portuguese, German, Czech, Russian, French, Italian, Korean, Swedish, Hungarian, Turkish and Bosnian. Czech, Swedish, Hungarian, Brazilian Portuguese and Bosnian (1,442 rows, AI-assisted, not yet native-reviewed) cover the reference catalog and every marked UI literal; engine diagnostics and uncatalogued text remain English. AutoCAD for Mac ships 7 non-English languages (zh-Hans, es, fr, ja, de, ko, it); of those, CADCraft now ships German and Korean, @@ -92,7 +91,6 @@ each language, which needs humans. Translations parallelise fully once the catal | Date | Change | Summary | |---|---|---| | 2026-10-30 | minor | Bosnian (`bs`, Latin, Ijekavian) added: 1,442 rows, one/few/other plurals, `bs-*` locales; AI-assisted, native proofreading pending | -| 2026-10-23 | minor | Georgian (`ka`) added: 1,458 rows (the existing catalog union), single count form, four menu headings, prompt keywords kept in English; the embedded craft-fonts `Geor` face loaded when a build has it (the pin is #1971); locale/preferences/menu/live-switch/dialog/font/no-Mtavruli tests; terminology decided by a native speaker | | 2026-10-22 | minor | Command line IME: enabled while a prompt collects text, composition shown but not saved, commit inserted once; single-line TEXT edits accept CJK input (#1761) | | 2026-10-19 | minor | Brazilian Portuguese: row brought up to date (it still read 0%); native-speaker terminology pass on 69 rows (Bind as Integrar, prompt keywords and SPDX kept in English, Thaw Layer, Snap type, Revolve fixed; snap, viewport, grip, offset, layer on/off and multiline wording made consistent with Brazilian usage) | | 2026-10-15 | minor | Greek (`el`) catalog: 1,330 rows, context/plural/locale/font tests; review pending |