From 861ab027b6f935778d85a0a1db206fd7f9c36d59 Mon Sep 17 00:00:00 2001 From: Igor Bronovskyi Date: Thu, 15 Oct 2026 03:10:45 +0300 Subject: [PATCH] Add Ukrainian localization (uk) (#1196) Ukrainian UI catalog; untranslated keys fall back to English. --- ATTRIBUTION.md | 1 + assets/locales/uk.json | 1015 ++++++++++++++++++++++ crates/ui-egui/src/i18n.rs | 37 +- crates/ui-egui/src/i18n_ui_tests.rs | 4 +- crates/ui-egui/src/thin_extrude_tests.rs | 9 +- docs/control-protocol.md | 2 +- docs/localization.md | 11 +- 7 files changed, 1063 insertions(+), 16 deletions(-) create mode 100644 assets/locales/uk.json diff --git a/ATTRIBUTION.md b/ATTRIBUTION.md index f62ef04e..047d10d0 100644 --- a/ATTRIBUTION.md +++ b/ATTRIBUTION.md @@ -96,6 +96,7 @@ Editable drawing code, native projects and shipped exports are collected under ` | assets/locales/ja.json | SolidCraft contributors | Original SolidCraft resource data or drawing code, collected without redesign | MIT OR Apache-2.0 | | assets/locales/ko.json | SolidCraft contributors | Original SolidCraft resource data or drawing code, collected without redesign | MIT OR Apache-2.0 | | assets/locales/ru.json | Alex Pro (del000) | Russian translation of the English catalog, contributed upstream | MIT OR Apache-2.0 | +| assets/locales/uk.json | Igor Bronovskyi (BrunIF) | Ukrainian translation of the English catalog, contributed upstream | MIT OR Apache-2.0 | | assets/locales/zh.json | SolidCraft contributors | Original SolidCraft resource data or drawing code, collected without redesign | MIT OR Apache-2.0 | | assets/materials/library.rs | SolidCraft contributors | Original SolidCraft resource data or drawing code, collected without redesign | MIT OR Apache-2.0 | | assets/platforms/linux/ai.storyteller.solidcraft.desktop | PhotoCraft / SolidCraft contributors | PhotoCraft packaging templates (https://github.com/storytold/photocraft), adapted for SolidCraft | Apache-2.0 | diff --git a/assets/locales/uk.json b/assets/locales/uk.json new file mode 100644 index 00000000..ff222635 --- /dev/null +++ b/assets/locales/uk.json @@ -0,0 +1,1015 @@ +{ + "Send your report on GitHub": "Надіслати звіт на GitHub", + "1. Open GitHub draft below, then paste the report copied to your clipboard.": "1. Відкрийте чернетку GitHub нижче, а потім вставте звіт, скопійований у буфер обміну.", + "1. Open GitHub draft below. Your title and report will be filled in.": "1. Відкрийте чернетку GitHub нижче. Заголовок і звіт буде заповнено.", + "2. Attach your screenshot: copy and paste it, or save and upload the PNG.": "2. Додайте знімок екрана: скопіюйте й вставте його або збережіть і завантажте PNG.", + "3. Click Submit new issue on GitHub to send your report.": "3. Натисніть Submit new issue на GitHub, щоб надіслати звіт.", + "browser.body_name": "Тіло{number}", + "browser.component_name": "Компонент{number}", + "browser.parameters": "Параметри ({count})", + "browser.precision": "Точність: {precision}", + "browser.sketch_name": "Ескіз{number}", + "browser.units": "Одиниці: {units}", + "cmd.appearance_assign": "Вигляд", + "cmd.appearance_library": "Бібліотека виглядів", + "cmd.appearance_list": "Список виглядів", + "cmd.body_rename": "Перейменувати тіло", + "cmd.browser_group": "Нова група", + "cmd.browser_move": "Перемістити елементи браузера", + "cmd.browser_order": "Упорядкувати елементи браузера", + "cmd.browser_rename_group": "Перейменувати групу", + "cmd.browser_ungroup": "Розгрупувати", + "cmd.browser_visibility": "Показати/приховати", + "cmd.canvas_calibrate": "Калібрувати полотно", + "cmd.canvas_decal": "Декаль", + "cmd.canvas_delete": "Видалити полотно", + "cmd.canvas_edit": "Редагувати полотно", + "cmd.canvas_insert": "Полотно", + "cmd.component_activate": "Активувати компонент", + "cmd.component_break_link": "Розірвати зв'язок", + "cmd.component_capture_position": "Зафіксувати положення", + "cmd.component_create": "Новий компонент", + "cmd.component_delete": "Видалити компонент", + "cmd.component_from_bodies": "Створити компоненти з тіл", + "cmd.component_insert_design": "Вставити проєкт", + "cmd.component_links": "Список зв'язків", + "cmd.component_list": "Список компонентів", + "cmd.component_move_bodies": "Перемістити тіла до компонента", + "cmd.component_move_sketches": "Перемістити ескізи до компонента", + "cmd.component_paste_new": "Вставити як новий", + "cmd.component_properties": "Фізичні властивості компонента", + "cmd.component_rename": "Перейменувати компонент", + "cmd.component_revert_position": "Відновити положення", + "cmd.component_update_links": "Оновити зв'язки", + "cmd.config_activate": "Активувати конфігурацію", + "cmd.config_column": "Стовпець конфігурації", + "cmd.config_configure": "Налаштувати", + "cmd.config_preview": "Перегляд конфігурації", + "cmd.config_row": "Рядок конфігурації", + "cmd.config_rule": "Правило конфігурації", + "cmd.config_rules": "Правила конфігурації", + "cmd.config_table": "Показати таблицю конфігурацій", + "cmd.construct_axis_edge": "Вісь через ребро", + "cmd.construct_axis_normal_to_face": "Вісь перпендикулярно до грані", + "cmd.construct_axis_through_cylinder": "Вісь через циліндр/конус/тор", + "cmd.construct_axis_two_planes": "Вісь через дві площини", + "cmd.construct_axis_two_points": "Вісь через дві точки", + "cmd.construct_plane_along_path": "Площина вздовж траєкторії", + "cmd.construct_plane_midplane": "Середня площина", + "cmd.construct_plane_perpendicular": "Перпендикулярна площина", + "cmd.construct_plane_tangent": "Дотична площина", + "cmd.construct_plane_three_points": "Площина через три точки", + "cmd.construct_plane_two_edges": "Площина через два ребра", + "cmd.construct_point_along_path": "Точка вздовж траєкторії", + "cmd.construct_point_center": "Точка в центрі кола/кулі/тора", + "cmd.construct_point_edge_plane": "Точка на ребрі та площині", + "cmd.construct_point_three_planes": "Точка через три площини", + "cmd.construct_point_two_edges": "Точка через два ребра", + "cmd.construct_point_vertex": "Точка у вершині", + "cmd.contact_check": "Перевірити контакт", + "cmd.contact_create": "Новий набір контактів", + "cmd.contact_disable_all": "Вимкнути контакт", + "cmd.contact_edit": "Редагувати набір контактів", + "cmd.contact_enable_all": "Увімкнути всі контакти", + "cmd.contact_enable_sets": "Увімкнути набори контактів", + "cmd.contact_list": "Список наборів контактів", + "cmd.diagnostics_crash_report": "Звіт про збій", + "cmd.diagnostics_crash_reports": "Звіти про збої", + "cmd.diagnostics_crash_reports_clear": "Видалити звіти про збої", + "cmd.diagnostics_crash_test": "Перевірка збоїв", + "cmd.doc_recover": "Відновити проєкт", + "cmd.doc_recovery_discard": "Відхилити відновлений проєкт", + "cmd.doc_recovery_list": "Проєкти для відновлення", + "cmd.document_inspect": "Перевірити проєкт", + "cmd.document_units": "Змінити одиниці проєкту", + "cmd.edit_checkpoint": "Контрольна точка", + "cmd.edit_restore_checkpoint": "Відновити контрольну точку", + "cmd.engine_commands": "Список команд", + "cmd.explode_create": "Рознесений вид", + "cmd.explode_delete": "Видалити рознесений вид", + "cmd.explode_list": "Список рознесених видів", + "cmd.explode_show": "Показати рознесений вид", + "cmd.expr_evaluate": "Обчислити вираз", + "cmd.face_delete": "Видалити грань", + "cmd.file_export": "Експорт", + "cmd.file_insert_mesh": "Вставити сітку", + "cmd.file_insert_step": "Вставити STEP", + "cmd.file_save_mesh": "Зберегти як сітку", + "cmd.inspect_accessibility": "Аналіз доступності", + "cmd.inspect_center_of_mass": "Центр мас", + "cmd.inspect_curvature_comb": "Аналіз гребеня кривизни", + "cmd.inspect_curvature_map": "Аналіз карти кривизни", + "cmd.inspect_draft": "Аналіз ухилу", + "cmd.inspect_environment_map": "Аналіз карти оточення", + "cmd.inspect_interference": "Перевірка перетинів", + "cmd.inspect_isocurve": "Аналіз ізокривих", + "cmd.inspect_minimum_radius": "Аналіз мінімального радіуса", + "cmd.inspect_zebra": "Зебра-аналіз", + "cmd.joint_as_built": "З'єднання за поточним положенням", + "cmd.joint_create": "З'єднання", + "cmd.joint_delete": "Видалити з'єднання", + "cmd.joint_drive": "Керувати з'єднаннями", + "cmd.joint_edit": "Редагувати з'єднання", + "cmd.joint_limits": "Обмеження з'єднання", + "cmd.joint_list": "Список з'єднань", + "cmd.joint_motion_link": "Зв'язок руху", + "cmd.joint_origin": "Початок з'єднання", + "cmd.joint_rigid_group": "Жорстка група", + "cmd.joint_solve": "Розв'язати з'єднання", + "cmd.material_assign": "Фізичний матеріал", + "cmd.material_create": "Новий фізичний матеріал", + "cmd.material_delete": "Видалити фізичний матеріал", + "cmd.material_edit": "Редагувати фізичний матеріал", + "cmd.material_list": "Список матеріалів", + "cmd.mesh_convert": "Перетворити сітку", + "cmd.model_edges": "Список ребер", + "cmd.model_faces": "Список граней", + "cmd.model_threads": "Список різьб", + "cmd.motion_delete": "Видалити дослідження руху", + "cmd.motion_export": "Експортувати дослідження руху", + "cmd.motion_list": "Список досліджень руху", + "cmd.motion_play": "Відтворити дослідження руху", + "cmd.motion_study": "Дослідження руху", + "cmd.occurrence_copy": "Вставити (екземпляр)", + "cmd.occurrence_ground": "Закріпити", + "cmd.occurrence_move": "Перемістити екземпляр", + "cmd.occurrence_properties": "Фізичні властивості екземпляра", + "cmd.parameters_add": "Додати користувацький параметр", + "cmd.parameters_change": "Змінити параметри", + "cmd.parameters_comment": "Коментувати параметр", + "cmd.parameters_complete": "Доповнити вираз", + "cmd.parameters_delete": "Видалити параметр", + "cmd.parameters_export": "Експортувати параметри", + "cmd.parameters_favorite": "Обраний параметр", + "cmd.parameters_graph": "Граф параметрів", + "cmd.parameters_import": "Імпортувати параметри", + "cmd.parameters_list": "Список параметрів", + "cmd.parameters_rename": "Перейменувати параметр", + "cmd.parameters_users": "Користувачі параметра", + "cmd.parts_fastener": "Вставити кріплення", + "cmd.parts_insert": "Вставити деталь", + "cmd.parts_library": "Стандартні деталі", + "cmd.parts_resize": "Змінити розмір деталі", + "cmd.plastic_assign_rule": "Призначити правило пластику", + "cmd.plastic_boss": "Бобишка", + "cmd.plastic_lip": "Губка", + "cmd.plastic_manage_rules": "Керувати правилами пластику", + "cmd.plastic_rest": "Упор", + "cmd.plastic_rules": "Список правил пластику", + "cmd.plastic_snap_fit": "Клацкове з'єднання", + "cmd.select_clear": "Зняти виділення", + "cmd.sheet_convert": "Перетворити на листовий метал", + "cmd.sheet_export_bend_table": "Експортувати таблицю згинів", + "cmd.sheet_export_dxf": "Експортувати розгортку як DXF", + "cmd.sheet_flange": "Фланець", + "cmd.sheet_flat_pattern": "Створити розгортку", + "cmd.sheet_fold": "Зігнути", + "cmd.sheet_hem": "Загин", + "cmd.sheet_manage_rules": "Правила листового металу", + "cmd.sheet_perforate": "Перфорація", + "cmd.sheet_refold": "Зігнути назад", + "cmd.sheet_rules": "Список правил листового металу", + "cmd.sheet_unfold": "Розгорнути", + "cmd.sketch_arc_center_point": "Дуга за центром", + "cmd.sketch_arc_tangent": "Дотична дуга", + "cmd.sketch_arc_three_point": "Дуга за трьома точками", + "cmd.sketch_auto_constrain": "Автообмеження", + "cmd.sketch_auto_constrain_from_datum": "Автообмеження від базової геометрії", + "cmd.sketch_auto_project": "Автопроєкція ребер на опору", + "cmd.sketch_blend_curve": "Сполучна крива", + "cmd.sketch_chain": "Ланцюг", + "cmd.sketch_chamfer_distance_angle": "Фаска за відстанню та кутом", + "cmd.sketch_chamfer_equal_distance": "Фаска з рівними відстанями", + "cmd.sketch_chamfer_two_distance": "Фаска за двома відстанями", + "cmd.sketch_circle_center": "Коло за центром і діаметром", + "cmd.sketch_circle_three_point": "Коло за трьома точками", + "cmd.sketch_circle_three_tangent": "Коло за трьома дотичними", + "cmd.sketch_circle_two_point": "Коло за двома точками", + "cmd.sketch_circle_two_tangent": "Коло за двома дотичними", + "cmd.sketch_constrainer": "Обмежувач ескізу", + "cmd.sketch_constraint_fix": "Закріпити/розкріпити", + "cmd.sketch_constraint_midpoint": "Середня точка", + "cmd.sketch_construction": "Звичайна/конструкційна", + "cmd.sketch_delete": "Видалити елементи ескізу", + "cmd.sketch_dimension_text": "Перемістити текст розміру", + "cmd.sketch_drag": "Перетягнути геометрію ескізу", + "cmd.sketch_drag_end": "Завершити перетягування", + "cmd.sketch_draw_dimensioned": "Накреслити елементи ескізу з розмірами", + "cmd.sketch_edit": "Редагувати ескіз", + "cmd.sketch_edit_text": "Редагувати текст", + "cmd.sketch_export_dxf": "Зберегти як DXF", + "cmd.sketch_finish_auto_constrain": "Завершити з автообмеженням", + "cmd.sketch_fit_curves_to_section": "Підігнати криві до перерізу сітки", + "cmd.sketch_glyphs": "Позначки обмежень", + "cmd.sketch_include_3d": "Включити 3D-геометрію", + "cmd.sketch_insert_dxf": "Вставити DXF", + "cmd.sketch_insert_svg": "Вставити SVG", + "cmd.sketch_inspect": "Перевірити ескіз", + "cmd.sketch_intersection_curve": "Крива перетину", + "cmd.sketch_isoparametric_curve": "Ізопараметрична крива", + "cmd.sketch_line3d": "3D-пряма", + "cmd.sketch_line_midpoint": "Пряма за середньою точкою", + "cmd.sketch_move": "Перемістити/копіювати елементи ескізу", + "cmd.sketch_move3d": "Перемістити 3D-точку", + "cmd.sketch_move_point": "Перетягнути точку ескізу", + "cmd.sketch_offset_break": "Розірвати зв'язок зсуву", + "cmd.sketch_options": "Параметри палітри ескізу", + "cmd.sketch_point3d": "3D-точка", + "cmd.sketch_polygon_circumscribed": "Описаний багатокутник", + "cmd.sketch_polygon_edge": "Багатокутник за ребром", + "cmd.sketch_polygon_inscribed": "Вписаний багатокутник", + "cmd.sketch_project_to_surface": "Спроєктувати на поверхню", + "cmd.sketch_rectangle_center": "Прямокутник за центром", + "cmd.sketch_rectangle_rounded": "Заокруглений прямокутник", + "cmd.sketch_rectangle_three_point": "Прямокутник за трьома точками", + "cmd.sketch_rectangle_two_point": "Прямокутник за двома точками", + "cmd.sketch_redefine": "Перевизначити площину ескізу", + "cmd.sketch_slot_arc_center": "Дуговий паз за центром", + "cmd.sketch_slot_arc_three_point": "Дуговий паз за трьома точками", + "cmd.sketch_slot_center_point": "Паз за центром", + "cmd.sketch_slot_center_to_center": "Паз від центру до центру", + "cmd.sketch_slot_overall": "Паз за загальною довжиною", + "cmd.sketch_snap": "Прив'язка", + "cmd.sketch_solve": "Розв'язати ескіз", + "cmd.sketch_spline3d": "3D-сплайн", + "cmd.sketch_spline_control_point": "Сплайн за контрольними точками", + "cmd.sketch_spline_control_point_5": "Сплайн за контрольними точками (5-й степінь)", + "cmd.sketch_spline_fit_point": "Сплайн за точками проходження", + "cmd.sketch_spun_profile": "Профіль обертання", + "cmd.sketch_toggle_driven": "Перемкнути ведений розмір", + "cmd.solid_align": "Вирівняти", + "cmd.solid_boundary_fill": "Заповнення за межами", + "cmd.solid_bounding_solid": "Охопне тіло", + "cmd.solid_emboss": "Тиснення", + "cmd.solid_move": "Перемістити/копіювати", + "cmd.solid_offset_face": "Зсунути грань", + "cmd.solid_press_pull": "Натиснути/витягнути", + "cmd.solid_remove": "Видалити", + "cmd.solid_replace_face": "Замінити грань", + "cmd.solid_rib": "Ребро", + "cmd.solid_split_face": "Розділити грань", + "cmd.solid_web": "Перемичка", + "cmd.surface_patch": "Латка", + "cmd.surface_stitch": "Зшити", + "cmd.surface_thicken": "Потовщити", + "cmd.surface_extrude": "Видавлювання поверхні", + "cmd.surface_revolve": "Обертання поверхні", + "cmd.surface_sweep": "Протягування поверхні", + "cmd.surface_loft": "Лофт поверхні", + "cmd.surface_ruled": "Лінійчаста поверхня", + "cmd.surface_boundary": "Поверхня за межами", + "cmd.surface_offset": "Зсунута поверхня", + "cmd.surface_blend": "Сполучна поверхня", + "cmd.surface_fillet": "Заокруглення поверхні", + "cmd.surface_untrim": "Зняти обрізання", + "cmd.surface_unstitch": "Розшити", + "cmd.surface_reverse_normal": "Обернути нормаль", + "cmd.inspect_continuity": "Аналіз неперервності", + "cmd.timeline_add": "Додати записану операцію", + "cmd.timeline_compute_all": "Обчислити все", + "cmd.timeline_copy": "Копіювати операції", + "cmd.timeline_dependents": "Залежні операції", + "cmd.timeline_export_script": "Експортувати сценарій команд", + "cmd.timeline_inspect": "Перевірити операцію", + "cmd.timeline_paste": "Вставити операції", + "cmd.timeline_redefine": "Редагувати операцію", + "cmd.timeline_rename": "Перейменувати", + "cmd.timeline_reorder": "Перевпорядкувати операцію", + "cmd.timeline_roll_to": "Перемістити маркер історії", + "cmd.timeline_rollback": "Перемістити маркер часового ланцюжка", + "cmd.timeline_suppress": "Придушити операцію", + "cmd.view_apply": "Відновити іменований вид", + "cmd.view_delete": "Видалити іменований вид", + "cmd.view_list": "Список іменованих видів", + "cmd.view_rename": "Перейменувати іменований вид", + "cmd.view_save": "Новий іменований вид", + "dialog.custom_axis": "↖ Власна вісь", + "dialog.edit_title": "РЕДАГУВАННЯ {title}", + "dialog.select": "↖ Вибрати", + "dialog.selected_count": "↖ Вибрано: {count}", + "dialog.step": "Крок", + "dialog.selection_step": "Крок {step} з {total}: виберіть {input}", + "dialog.selection_guidance": "Виберіть вхідні дані, щоб змінити їх. Клацніть вибрані об'єкти, щоб прибрати їх; натискання з Ctrl/Cmd також перемикає їх. Перегляньте попередній перегляд, а потім натисніть OK.", + "document.save_changes": "Зберегти зміни в {name}?", + "document.unsaved_changes": "У {name} є незбережені зміни. Якщо не зберегти, вони будуть втрачені.", + "settings.msaa_applies_on_restart": "Згладжування застосується під час наступного запуску SolidCraft", + "settings.msaa_reset": "{setting}: {requested}× не підтримується цим графічним пристроєм; тепер це {reset}× (підтримується: {supported}).", + "settings.msaa_unsupported": "Не підтримується цим графічним пристроєм", + "settings.reset_intro": "Ці налаштування не працюють на цьому комп'ютері й не давали б SolidCraft запуститися, тому їх змінено:", + "settings.reset_title": "Налаштування було змінено", + "sketch.degrees_of_freedom": "{count} ступенів вільності", + "sketch.draw_curves": "Малювати як {linetype}", + "sketch.make_selection": "Перетворити виділене на {linetype}", + "ui.1_degree_of_freedom": "1 ступінь вільності", + "ui.3d_mouse_speed": "Швидкість 3D-миші", + "ui.3d_mouse_windows": "3D-миша (Windows)", + "ui.3d_sketch": "3D-ескіз", + "ui.about": "Про програму", + "ui.activate": "Активувати", + "ui.active_component": "Активний компонент", + "ui.agent_cursor": "Курсор агента", + "ui.agent_cursor_speed": "Швидкість курсора агента", + "ui.all": "Усі", + "ui.analysis": "Аналіз", + "ui.angle": "Кут", + "ui.angle_decimals": "Знаки після коми для кутів", + "ui.animate_view_changes": "Анімувати зміни виду", + "ui.animation": "Анімація", + "ui.animation_speed": "Швидкість анімації", + "ui.anti_aliasing": "Згладжування", + "ui.apply": "Застосувати", + "ui.arc": "Дуга", + "ui.assemble": "Скласти", + "ui.autosave_every": "Автозбереження кожні", + "ui.axes": "Осі", + "ui.axis": "Вісь", + "ui.base_point": "Базова точка", + "ui.bodies": "Тіла", + "ui.box": "Куб", + "ui.break": "Розірвати", + "ui.cancel": "Скасувати", + "ui.canvases": "Полотна", + "ui.center": "Центр", + "ui.centerline": "Осьова лінія", + "ui.chain": "Ланцюг", + "ui.chamfer": "Фаска", + "ui.chamfer_type": "Тип фаски", + "ui.change_workspace": "Змінити робочу область", + "ui.chord_length": "Довжина хорди", + "ui.curvature_g2": "Кривизна (G2)", + "ui.equivalent_radius": "Еквівалентний радіус", + "ui.circle": "Коло", + "ui.circular_pattern": "Круговий масив", + "ui.clear": "Очистити", + "ui.clear_recent": "Очистити недавні", + "ui.clear_the_selection": "Зняти виділення", + "ui.click_selects_whole_bodies": "Клацання виділяє тіла цілком", + "ui.click_then_press_key": "Клацніть, а потім натисніть нову клавішу", + "ui.close": "Закрити", + "ui.coil": "Спіраль", + "ui.coincident": "Співпадання", + "ui.collapse": "Згорнути", + "ui.collinear": "Колінеарність", + "ui.combine": "Об'єднати", + "ui.coming_later": "з'явиться пізніше", + "ui.concentric": "Концентричність", + "ui.configurations": "Конфігурації", + "ui.conic_curve": "Конічна крива", + "ui.constant": "Стала", + "ui.constraints_conflict": "Конфлікт обмежень", + "ui.construct": "Побудувати", + "ui.construction": "Конструкційна", + "ui.context_menu": "Контекстне меню", + "ui.copy": "Копіювати", + "ui.corner": "Кут", + "ui.corners": "Кути", + "ui.counterbore": "Циліндричне розширення", + "ui.countersink": "Зенкування", + "ui.create": "Створити", + "ui.create_copy": "Створити копію", + "ui.create_sketch": "Створити ескіз", + "ui.current": "поточний", + "ui.curvature": "Кривизна", + "ui.curves": "Криві", + "ui.cut": "Вирізати", + "ui.cylinder": "Циліндр", + "ui.dark": "Темна", + "ui.default_modelling_orientation": "Типова орієнтація моделювання", + "ui.degrees_of_freedom": "ступенів вільності", + "ui.delete": "Видалити", + "ui.depth": "Глибина", + "ui.design": "Проєкт", + "ui.diameter": "Діаметр", + "ui.dimension": "Розмір", + "ui.direction": "Напрямок", + "ui.distance": "Відстань", + "ui.distance_1": "Відстань 1", + "ui.distance_2": "Відстань 2", + "ui.document_settings": "Налаштування документа", + "ui.don_t_save": "Не зберігати", + "ui.draft": "Ухил", + "ui.drawing": "Креслення", + "ui.drill_point": "Вістря свердла", + "ui.edit": "Редагувати", + "ui.edit_section_analysis": "Редагувати аналіз перерізу", + "ui.ellipse": "Еліпс", + "ui.end_radius": "Кінцевий радіус", + "ui.entities": "Елементи", + "ui.equal": "Рівність", + "ui.expand": "Розгорнути", + "ui.export_ellipsis": "Експорт...", + "ui.export_ellipsis_keymap": "Експорт…", + "ui.export_keymap_tip": "Клавіші, обрані в полі S і панель інструментів як файл", + "ui.extend": "Подовжити", + "ui.extent_type": "Тип меж", + "ui.extrude": "Видавлювання", + "ui.factor": "Коефіцієнт", + "ui.feature_history": "Історія операцій", + "ui.feature_options": "Параметри операції", + "ui.features": "Операції", + "ui.file": "Файл", + "ui.fillet": "Заокруглення", + "ui.filter_commands_or_keys": "Фільтрувати команди або клавіші", + "ui.finish_sketch": "Завершити ескіз", + "ui.fix_unfix": "Закріпити/розкріпити", + "ui.flat": "Плоска", + "ui.flip": "Перевернути", + "ui.front": "Спереду", + "ui.fully_constrained": "Повністю визначений", + "ui.general": "Загальні", + "ui.graphics": "Графіка", + "ui.ground_shadow": "Тінь на землі", + "ui.heading_add_ins": "НАДБУДОВИ", + "ui.heading_assemble": "СКЛАДАННЯ", + "ui.heading_box": "КУБ", + "ui.heading_chamfer": "ФАСКА", + "ui.heading_circular_pattern": "КРУГОВИЙ МАСИВ", + "ui.heading_coil": "СПІРАЛЬ", + "ui.heading_combine": "ОБ'ЄДНАТИ", + "ui.heading_configure": "НАЛАШТУВАТИ", + "ui.heading_constraints": "ОБМЕЖЕННЯ", + "ui.heading_construct": "ПОБУДОВА", + "ui.heading_create": "СТВОРИТИ", + "ui.heading_create_sketch": "СТВОРИТИ ЕСКІЗ", + "ui.heading_cylinder": "ЦИЛІНДР", + "ui.heading_design": "ПРОЄКТ", + "ui.heading_draft": "УХИЛ", + "ui.heading_edit": "РЕДАГУВАТИ", + "ui.heading_extrude": "ВИДАВЛЮВАННЯ", + "ui.heading_fillet": "ЗАОКРУГЛЕННЯ", + "ui.heading_finish_sketch": "ЗАВЕРШИТИ ЕСКІЗ", + "ui.heading_front": "СПЕРЕДУ", + "ui.heading_hole": "ОТВІР", + "ui.heading_home": "ГОЛОВНА", + "ui.heading_insert": "ВСТАВИТИ", + "ui.heading_inspect": "ПЕРЕВІРКА", + "ui.heading_loft": "ЛОФТ", + "ui.heading_make": "ВИГОТОВЛЕННЯ", + "ui.heading_measure": "ВИМІРЮВАННЯ", + "ui.heading_mesh": "СІТКА", + "ui.heading_mirror": "ДЗЕРКАЛО", + "ui.heading_modify": "ЗМІНИТИ", + "ui.heading_move": "ПЕРЕМІСТИТИ", + "ui.heading_offset": "ЗСУВ", + "ui.heading_move_copy": "ПЕРЕМІСТИТИ/КОПІЮВАТИ", + "ui.heading_offset_plane": "ЗСУНУТА ПЛОЩИНА", + "ui.heading_ok": "OK", + "ui.heading_parameters": "ПАРАМЕТРИ", + "ui.heading_pattern_on_path": "МАСИВ НА ТРАЄКТОРІЇ", + "ui.heading_pipe": "ТРУБА", + "ui.heading_plane_at_angle": "ПЛОЩИНА ПІД КУТОМ", + "ui.heading_plastic": "ПЛАСТИК", + "ui.heading_prepare": "ПІДГОТУВАТИ", + "ui.heading_rectangular_pattern": "ПРЯМОКУТНИЙ МАСИВ", + "ui.heading_revolve": "ОБЕРТАННЯ", + "ui.heading_right": "СПРАВА", + "ui.heading_scale": "МАСШТАБ", + "ui.heading_section_analysis": "АНАЛІЗ ПЕРЕРІЗУ", + "ui.heading_select": "ВИБІР", + "ui.heading_sheet_metal": "ЛИСТОВИЙ МЕТАЛ", + "ui.heading_shell": "ОБОЛОНКА", + "ui.heading_sketch": "ЕСКІЗ", + "ui.heading_sketch_palette": "ПАЛІТРА ЕСКІЗУ", + "ui.heading_sketch_scale": "МАСШТАБ ЕСКІЗУ", + "ui.heading_solid": "ТІЛО", + "ui.heading_sphere": "КУЛЯ", + "ui.heading_split_body": "РОЗДІЛИТИ ТІЛО", + "ui.heading_surface": "ПОВЕРХНЯ", + "ui.heading_sweep": "ПРОТЯГУВАННЯ", + "ui.heading_thread": "РІЗЬБА", + "ui.heading_top": "ЗВЕРХУ", + "ui.heading_torus": "ТОР", + "ui.heading_utilities": "УТИЛІТИ", + "ui.heading_utility": "УТИЛІТА", + "ui.help": "Довідка", + "ui.hide": "Приховати", + "ui.hole": "Отвір", + "ui.hole_tap_type": "Тип різьби отвору", + "ui.hole_type": "Тип отвору", + "ui.home": "Головна", + "ui.horizontal_vertical": "Горизонталь/вертикаль", + "ui.import_ellipsis": "Імпорт…", + "ui.insert": "Вставити", + "ui.inspect": "Перевірити", + "ui.intersect": "Перетин", + "ui.join": "З'єднати", + "ui.joints": "З'єднання", + "ui.keyboard_shortcuts": "Комбінації клавіш", + "ui.language": "Мова", + "ui.length_decimals": "Знаки після коми для довжин", + "ui.light": "Світла", + "ui.line": "Пряма", + "ui.linetype": "Тип лінії", + "ui.loft": "Лофт", + "ui.look_at": "Наведення", + "ui.look_at_anim_desc": "Вид осі, наведення, головний і вписування", + "ui.manufacture": "Виготовлення", + "ui.measure": "Вимірювання", + "ui.midpoint": "Середня точка", + "ui.mirror": "Дзеркало", + "ui.mirror_line": "Вісь дзеркала", + "ui.modify": "Змінити", + "ui.move": "Перемістити", + "ui.multiple": "Кілька", + "ui.named_views": "Іменовані види", + "ui.navigation": "Навігація", + "ui.needs_design": "{command}: спершу відкрийте проєкт", + "ui.new_body": "Нове тіло", + "ui.new_design": "Новий проєкт", + "ui.normal": "Звичайна", + "ui.object_type": "Тип об'єкта", + "ui.objects": "Об'єкти", + "ui.offer_to_stand_up_y_up_files": "Пропонувати вирівнювати файли з напрямком Y вгору", + "ui.offset": "Зсув", + "ui.offset_plane": "Зсунута площина", + "ui.one_side": "Один бік", + "ui.open": "Відкрити", + "ui.open_ellipsis": "Відкрити...", + "ui.open_preferences": "Відкрити налаштування", + "ui.open_recent": "Відкрити недавні", + "ui.operation": "Операція", + "ui.options": "Параметри", + "ui.orbit_around": "Обертати навколо", + "ui.origin": "Початок координат", + "ui.palette_points": "Точки", + "ui.palette_profile": "Профіль", + "ui.pan_zoom_orbit": "Панорамування, масштаб, обертання", + "ui.parallel": "Паралельність", + "ui.parameters": "Параметри", + "ui.paste": "Вставити", + "ui.path": "Траєкторія", + "ui.pattern_on_path": "Масив на траєкторії", + "ui.perpendicular": "Перпендикулярність", + "ui.perspective_view": "Перспективний вид", + "ui.pipe": "Труба", + "ui.placement": "Розміщення", + "ui.plane": "Площина", + "ui.plane_at_angle": "Площина під кутом", + "ui.point": "Точка", + "ui.point_under_the_cursor": "Точка під курсором", + "ui.points": "Точки", + "ui.polygon": "Багатокутник", + "ui.preferences": "Налаштування", + "ui.press_a_key": "натисніть клавішу…", + "ui.profile": "Профіль", + "ui.profile_plane": "Площина профілю", + "ui.profiles": "Профілі", + "ui.project": "Проєктувати", + "ui.project_face_edges_sketch": "Проєктувати ребра граней у нові ескізи", + "ui.quantity": "Кількість", + "ui.quantity_2": "Кількість 2", + "ui.quit": "Вихід", + "ui.radial_context_menu": "Кругове контекстне меню", + "ui.radius": "Радіус", + "ui.radius_type": "Тип радіуса", + "ui.rectangle": "Прямокутник", + "ui.rectangular_pattern": "Прямокутний масив", + "ui.redo": "Повторити", + "ui.render": "Візуалізувати", + "ui.renderer": "Рендерер", + "ui.reset": "Скинути", + "ui.reset_all": "Скинути все", + "ui.reset_the_settings_on_this_page": "Скинути налаштування на цій сторінці", + "ui.restore_defaults": "Відновити типові", + "ui.reverse_zoom_direction": "Змінити напрямок масштабування", + "ui.revolve": "Обертання", + "ui.right": "Справа", + "ui.save": "Зберегти", + "ui.save_as": "Зберегти як", + "ui.save_as_ellipsis": "Зберегти як...", + "ui.scale": "Масштаб", + "ui.section_analysis": "Аналіз перерізу", + "ui.select": "Вибрати", + "ui.select_other_hint": "Вибір іншого: утримуйте ліву кнопку нерухомо на моделі (або клацніть правою › Вибрати інше…), щоб побачити список усього під курсором; клацніть ще раз у тому ж місці, щоб вибрати наступний об'єкт там.", + "ui.selection": "Виділення", + "ui.shell": "Оболонка", + "ui.show": "Показати", + "ui.show_constraints": "Обмеження", + "ui.show_dimensions": "Розміри", + "ui.show_points": "Показати точки", + "ui.show_profile": "Показати профіль", + "ui.show_projected_geometries": "Проєкційна геометрія", + "ui.simple": "Простий", + "ui.simulation": "Симуляція", + "ui.single": "Один", + "ui.sketch": "Ескіз", + "ui.sketch_dimension": "Розмір ескізу", + "ui.sketch_grid": "Сітка ескізу", + "ui.sketch_scale": "Масштаб ескізу", + "ui.sketch_status": "Стан ескізу", + "ui.sketches": "Ескізи", + "ui.slice": "Розріз", + "ui.slot": "Паз", + "ui.smooth": "Плавний", + "ui.smooth_wheel_zoom": "Плавне масштабування колесом", + "ui.smooth_wheel_zoom_tip": "Вимкніть, щоб застосовувати кожну подію колеса негайно, без плавного завершення", + "ui.snap": "Прив'язка", + "ui.space_mouse_hint": "Переміщуйте й обертайте вид разом; в ескізах доступні лише панорамування та масштаб.", + "ui.space_mouse_navigate": "Навігація за допомогою SpaceNavigator / SpaceMouse", + "ui.spacing": "Крок", + "ui.spacing_2": "Крок 2", + "ui.sphere": "Куля", + "ui.spline": "Сплайн", + "ui.split_body": "Розділити тіло", + "ui.stand_up_tip": "Після відкриття файлу STEP або IGES з напрямком Z вгору пропонувати поворот на чверть оберту навколо X", + "ui.start": "Початок", + "ui.start_radius": "Початковий радіус", + "ui.sweep": "Протягування", + "ui.symmetric": "Симетричний", + "ui.symmetry": "Симетрія", + "ui.system": "Системна", + "ui.tangent": "Дотична", + "ui.taper_angle": "Кут звуження", + "ui.tapped": "З різьбою", + "ui.text": "Текст", + "ui.theme": "Тема", + "ui.thickness": "Товщина", + "ui.thread": "Різьба", + "ui.timeline_bottom": "Часовий ланцюжок знизу", + "ui.timeline_left_note": "Ліве компонування показує смугу відкату над браузером деталей і сцени.", + "ui.timeline_left_sidebar": "Ліва бічна панель", + "ui.tip_angle": "Кут вістря", + "ui.to_object": "До об'єкта", + "ui.top": "Зверху", + "ui.torus": "Тор", + "ui.trackpad_pan_tip": "Жести трекпада виконують панорамування (вимкнено: масштабують, як колесо); колесо миші масштабує, бічне колесо панорамує вбік, стискання завжди масштабує", + "ui.trim": "Обрізати", + "ui.two_finger_scroll_pans": "Прокрутка двома пальцями виконує панорамування", + "ui.two_sides": "Два боки", + "ui.ui_scale": "Масштаб інтерфейсу", + "ui.undo": "Скасувати", + "ui.units": "Одиниці", + "ui.units_of_new_designs": "Одиниці нових проєктів", + "ui.untitled": "Без назви", + "ui.up_axis_note": "Яка вісь спрямована вгору у видах (вид осі, головний, наведення). Проєкти не змінюються.", + "ui.variable": "Змінна", + "ui.view_centre": "Центр виду", + "ui.visual_shaded_hidden_edges": "Затінений із прихованими ребрами", + "ui.visual_shaded_with_edges": "Затінений із ребрами", + "ui.visual_style": "Стиль відображення", + "ui.visual_wireframe": "Каркас", + "ui.workspace": "робоча область", + "ui.x_distance": "Відстань X", + "ui.y_distance": "Відстань Y", + "ui.y_up": "Y вгору", + "ui.z_up": "Z вгору", + "ui.zoom_to_cursor_tip": "Колесо масштабує до точки під курсором (вимкнено: до центру виду)", + "ui.zoom_to_the_cursor": "Масштабувати до курсора", + "A new configuration, a copy of the active one": "Нова конфігурація, копія активної", + "About SolidCraft": "Про SolidCraft", + "Active": "Активна", + "Active rule": "Активне правило", + "Add": "Додати", + "Add Key": "Додати клавішу", + "Add Mid Radius": "Додати середній радіус", + "Add Row": "Додати рядок", + "All Sketch Points": "Усі точки ескізу", + "All open designs": "Усі відкриті проєкти", + "Allowed expressions, separated by semicolons": "Дозволені вирази, розділені крапками з комою", + "Also deletes": "Також видаляє", + "Angle 2": "Кут 2", + "Animate": "Анімувати", + "Appearance name": "Назва вигляду", + "Applied Radius": "Застосований радіус", + "Apply To": "Застосувати до", + "Area": "Площа", + "Attachment": "Прив'язка", + "BROWSER": "БРАУЗЕР", + "Bend Line Position": "Положення лінії згину", + "Bend Position": "Положення згину", + "Bend Radius": "Радіус згину", + "Bends": "Згини", + "Body": "Тіло", + "Bounding box": "Обмежувальна рамка", + "CSV or JSON: updates existing parameters, adds new ones": "CSV або JSON: оновлює наявні параметри, додає нові", + "Capture All Positions": "Зафіксувати всі положення", + "Catch Direction": "Напрямок зачеплення", + "Cells": "Комірки", + "Center X": "Центр X", + "Center Y": "Центр Y", + "Center of mass": "Центр мас", + "Chamfer Type": "Тип фаски", + "Check collisions": "Перевіряти зіткнення", + "Checked": "Перевірено", + "Choose a new plane. Sketch geometry and dimensions stay unchanged in its two-dimensional coordinates.": "Виберіть нову площину. Геометрія та розміри ескізу залишаються незмінними у своїх двовимірних координатах.", + "Close draft": "Закрити чернетку", + "Collisions": "Зіткнення", + "Colour": "Колір", + "Component1": "Компонент1", + "Configuration": "Конфігурація", + "Configuration rules": "Правила конфігурації", + "Contact": "Контакт", + "Copy all licences": "Копіювати всі ліцензії", + "Copy diagnostic information": "Копіювати діагностичну інформацію", + "Copy report": "Копіювати звіт", + "Corner Relief Shape": "Форма полегшення кута", + "Counterbore depth": "Глибина циліндричного розширення", + "Countersink angle": "Кут зенкування", + "Create Issue — review draft": "Створити повідомлення про проблему — перегляд чернетки", + "Customize Toolbar": "Налаштувати панель інструментів", + "Delete all": "Видалити все", + "Delete rule": "Видалити правило", + "Delete the row": "Видалити рядок", + "Delete the set": "Видалити набір", + "Delete this parameter": "Видалити цей параметр", + "Density": "Густина", + "Designs you open or save appear here.": "Проєкти, які ви відкриваєте чи зберігаєте, з'являються тут.", + "Determined by To Object. Choose Angle to edit the angular extent.": "Визначається об'єктом призначення. Виберіть «Кут», щоб редагувати кутову протяжність.", + "Discard": "Відхилити", + "Double-click to rename": "Двічі клацніть, щоб перейменувати", + "Drive Joint": "Керувати з'єднанням", + "Edit Profile Sketch": "Редагувати ескіз профілю", + "Enable rule": "Увімкнути правило", + "Enabled": "Увімкнено", + "Explode": "Рознести", + "Extents": "Межі", + "Face attachment lost": "Втрачено прив'язку до грані", + "Faces / edges / vertices": "Грані / ребра / вершини", + "Favourite": "Обране", + "Files from many CAD programs have Y up, so they open lying on their back here (Z up).": "Файли з багатьох CAD-програм мають напрямок Y вгору, тому тут вони відкриваються лежачи на спині (Z вгору).", + "Filter": "Фільтр", + "Find in Browser": "Знайти в браузері", + "Flat size": "Розмір розгортки", + "Follow camera (Look At sketches)": "Стежити за камерою (ескізи наведення)", + "Font": "Шрифт", + "Full Length": "Повна довжина", + "Gap": "Проміжок", + "Grid": "Сітка", + "Height": "Висота", + "Home view": "Головний вид", + "In This Design": "У цьому проєкті", + "Interferes": "Перетинається", + "Issue title": "Заголовок повідомлення", + "Joint Origin1": "Початок з'єднання1", + "Keep Tools": "Зберегти інструменти", + "Later": "Пізніше", + "Leave it": "Залишити як є", + "Legacy face attachment. Rebinding to a certified face creates an exact attachment.": "Застаріла прив'язка до грані. Повторна прив'язка до перевіреної грані створює точну прив'язку.", + "Length": "Довжина", + "Length units": "Одиниці довжини", + "Library": "Бібліотека", + "Loop": "Контур", + "Margin": "Відступ", + "Mass": "Маса", + "Material": "Матеріал", + "Mid Radius": "Середній радіус", + "Modeled": "Змодельовано", + "More toolbar panels": "Більше панелей інструментів", + "Motion": "Рух", + "Move Type": "Тип переміщення", + "Move earlier": "Перемістити раніше", + "Move later": "Перемістити пізніше", + "Name": "Назва", + "No crash reports.": "Немає звітів про збої.", + "No matching appearances": "Немає відповідних виглядів", + "Not available yet": "Ще недоступно", + "Opacity": "Непрозорість", + "Open GitHub draft": "Відкрити чернетку GitHub", + "Open-source parametric 3D CAD in Rust. Licensed MIT OR Apache-2.0.": "Параметричний 3D-CAD з відкритим вихідним кодом на Rust. Ліцензовано за MIT OR Apache-2.0.", + "Other side": "Інший бік", + "Parameter values": "Значення параметрів", + "Per Edge": "На кожне ребро", + "Pick the tool bodies": "Виберіть тіла інструмента", + "Place at the origin instead": "Натомість розмістити в початку координат", + "Playback": "Відтворення", + "Position": "Положення", + "Position (0 to 1)": "Положення (від 0 до 1)", + "Position along the edge, 0 at the start end, 1 at the other": "Положення вздовж ребра: 0 на початку, 1 на іншому кінці", + "Preview leaves the current design unchanged.": "Попередній перегляд не змінює поточний проєкт.", + "RECENT": "НЕДАВНІ", + "Radius Fit": "Підгонка за радіусом", + "Ratio": "Співвідношення", + "Recover": "Відновити", + "Recover unsaved design?": "Відновити незбережений проєкт?", + "Remove Tools": "Прибрати інструменти", + "Remove from list": "Прибрати зі списку", + "Remove private design details or paths before sharing.": "Перед публікацією приберіть приватні дані проєкту або шляхи.", + "Remove the column": "Прибрати стовпець", + "Remove the track": "Прибрати доріжку", + "Remove this point": "Прибрати цю точку", + "Report a bug — review a screenshot and open a GitHub draft": "Повідомити про помилку — переглянути знімок екрана й відкрити чернетку GitHub", + "Reset Toolbar": "Скинути панель інструментів", + "Restore the inherited component or physical material appearance": "Відновити успадкований вигляд компонента або фізичного матеріалу", + "Result": "Результат", + "Retake screenshot": "Повторити знімок екрана", + "Reverse": "Обернути", + "Reverse Direction": "Обернути напрямок", + "Revert": "Повернути", + "Revert All Positions": "Повернути всі положення", + "Review the report and screenshot before opening GitHub.": "Перегляньте звіт і знімок екрана перед відкриттям GitHub.", + "Rim Edge": "Крайове ребро", + "Roll History Marker Here": "Перемістити маркер історії сюди", + "Rule": "Правило", + "Saved preview. Geometry is being checked before editing.": "Збережений перегляд. Геометрію перевіряють перед редагуванням.", + "Scale factor": "Коефіцієнт масштабу", + "Search": "Пошук", + "Search commands": "Пошук команд", + "Select bodies (a face picks its body)": "Виділяти тіла (грань виділяє своє тіло)", + "Select bodies or faces instead": "Натомість виділіть тіла або грані", + "Selection filter": "Фільтр виділення", + "Semantic faces share their appearance across instances.": "Семантичні грані спільно використовують свій вигляд між екземплярами.", + "Shape": "Форма", + "Show Agent Cursor": "Показати курсор агента", + "Show in folder": "Показати в теці", + "Size": "Розмір", + "Sketch plane has no body-face attachment.": "Площина ескізу не має прив'язки до грані тіла.", + "SolidCraft closed before these designs were saved. Their last autosave can be opened.": "SolidCraft закрився до того, як ці проєкти було збережено. Можна відкрити їхнє останнє автозбереження.", + "Speed": "Швидкість", + "Stand it up": "Вирівняти", + "Stand it up: a quarter turn about X, as one Move feature you can undo.": "Вирівняти: поворот на чверть оберту навколо X як одна операція переміщення, яку можна скасувати.", + "Stand this part up?": "Вирівняти цю деталь?", + "Step": "Крок", + "Steps": "Кроки", + "Suppressed": "Придушено", + "Swap Ends": "Поміняти кінці місцями", + "Tangent Chain": "Дотичний ланцюг", + "The dashed sketch is a saved plane guide. Select a new face to repair the attachment.": "Штриховий ескіз — це збережений орієнтир площини. Виберіть нову грань, щоб відновити прив'язку.", + "The saved author occurrence is missing. Select a valid author placement before rebinding.": "Збережений вихідний екземпляр відсутній. Перед повторною прив'язкою виберіть дійсне вихідне розміщення.", + "Then": "Потім", + "These features will be deleted:": "Ці операції буде видалено:", + "These features will fail:": "Ці операції зазнають невдачі:", + "This child is shared. Deleting it removes it from every copy of its parent.": "Цей дочірній об'єкт спільний. Його видалення прибирає його з кожної копії батьківського.", + "This child is shared. Position changes apply to every copy of its parent.": "Цей дочірній об'єкт спільний. Зміни положення застосовуються до кожної копії батьківського.", + "This face cannot provide a durable attachment. Choose another face or explicitly use a fixed plane.": "Ця грань не може забезпечити надійну прив'язку. Виберіть іншу грань або явно використайте фіксовану площину.", + "To Offset": "До зсуву", + "Tolerance": "Допуск", + "Type": "Тип", + "Updating the preview": "Оновлення попереднього перегляду", + "Use fixed plane": "Використати фіксовану площину", + "VIEW": "ВИД", + "Value": "Значення", + "Volume": "Об'єм", + "Wall": "Стінка", + "When": "Коли", + "Width": "Ширина", + "Will fail": "Зазнає невдачі", + "angle, height": "кут, висота", + "command name": "назва команди", + "expression, e.g. 25 mm": "вираз, напр. 25 mm", + "fits the face, e.g. M8": "відповідає грані, напр. M8", + "from the rule": "з правила", + "needs two joints": "потрібні два з'єднання", + "new configuration": "нова конфігурація", + "new name": "нова назва", + "new parameter": "новий параметр", + "no interference": "немає перетинів", + "no joint that moves yet": "ще немає рухомого з'єднання", + "no picture": "немає зображення", + "pick a hole to seat it, or OK places it at the origin": "виберіть отвір для посадки, або OK розмістить його в початку координат", + "pick one or two vertices, edges or faces": "виберіть одну-дві вершини, ребра або грані", + "the parts library is not available": "бібліотека деталей недоступна", + "to the next face": "до наступної грані", + "Revert Position": "Повернути положення", + "Construction": "Конструкційна", + "Faces": "Грані", + "Edges": "Ребра", + "Vertices": "Вершини", + "Sketch geometry and profiles": "Геометрія та профілі ескізу", + "Sketch curves": "Криві ескізу", + "Sketch points": "Точки ескізу", + "Sketch dimensions": "Розміри ескізу", + "Sketch constraints": "Обмеження ескізу", + "0 turns it off": "0 вимикає це", + "Show the pointer an AI agent moves (#35)": "Показувати вказівник, яким рухає ШІ-агент (#35)", + "Follow the camera (Look At sketches)": "Стежити за камерою (ескізи наведення)", + "Flat": "Плоска", + "Save Rule": "Зберегти правило", + "Preview Row": "Рядок перегляду", + "Add condition": "Додати умову", + "Apply to selection": "Застосувати до виділення", + "Remove override": "Прибрати перевизначення", + "Copy screenshot": "Копіювати знімок екрана", + "Remove screenshot": "Прибрати знімок екрана", + "Use active author placement": "Використати активне вихідне розміщення", + "Reattach selected face": "Повторно приєднати вибрану грань", + "Use saved fixed plane": "Використати збережену фіксовану площину", + "Use selected face as fixed plane": "Використати вибрану грань як фіксовану площину", + "View navigator": "Навігатор виду", + "Signed axes": "Підписані осі", + "Cube": "Куб", + "Middle double-click": "Подвійне клацання середньою кнопкою", + "Double-clicking the middle button in the view: Home (the home view, framing what is shown), Fit (frame what is shown, keeping the orientation) or nothing": "Подвійне клацання середньою кнопкою у виді: головний (головний вид, що охоплює показане), вписування (охопити показане, зберігаючи орієнтацію) або нічого", + "Select Other: hold the left button still on the model (or right-click › Select Other…) to list everything under the cursor; click again on the same spot to select the next thing there. Double-click the middle button to go Home (Preferences › Navigation).": "Вибір іншого: утримуйте ліву кнопку нерухомо на моделі (або клацніть правою › Вибрати інше…), щоб побачити список усього під курсором; клацніть ще раз у тому ж місці, щоб вибрати наступний об'єкт там. Двічі клацніть середньою кнопкою, щоб перейти до головного виду (Налаштування › Навігація).", + "cmd.render_backends": "Рендер-бекенди", + "cmd.view_navigate": "Навігація видом", + "ui.animateJoint": "Анімувати з'єднання", + "ui.calibrate": "Калібрувати", + "ui.customizeToolbar": "Налаштувати панель інструментів…", + "ui.editJointLimits": "Редагувати обмеження з'єднання", + "ui.exportDxf": "Експорт DXF…", + "ui.findInTimeline": "Знайти в часовому ланцюжку", + "ui.findInWindow": "Знайти у вікні", + "ui.fit": "Вписати", + "ui.groupSelected": "Згрупувати виділене", + "ui.hideAxes": "Приховати осі", + "ui.hideDimension": "Приховати розмір", + "ui.hideOrigin": "Приховати початок координат", + "ui.hidePlanes": "Приховати площини", + "ui.hideProfile": "Приховати профіль", + "ui.homeView": "Головний вид", + "ui.isolate": "Ізолювати", + "ui.lock": "Заблокувати", + "ui.newSketchGroup": "Нова група ескізів", + "ui.normalConstruction": "Звичайна / конструкційна", + "ui.orbit": "Обертати", + "ui.heading_position": "ПОЛОЖЕННЯ", + "ui.pan": "Панорамувати", + "ui.pinToShortcuts": "Закріпити в комбінаціях клавіш", + "ui.pinToToolbar": "Закріпити на панелі інструментів", + "ui.properties": "Властивості", + "ui.removeSection": "Прибрати розріз", + "ui.removeFromToolbar": "Прибрати з панелі інструментів", + "ui.repeat": "Повторити", + "ui.report_a_bug": "Повідомити про помилку", + "ui.restore": "Відновити", + "ui.heading_setup": "НАЛАШТУВАННЯ", + "ui.selectOther": "Вибрати інше…", + "ui.selectTangentChain": "Вибрати дотичний ланцюг", + "ui.showAll": "Показати все", + "ui.showAllBodies": "Показати всі тіла", + "ui.showAxes": "Показати осі", + "ui.showDimension": "Показати розмір", + "ui.showOrigin": "Показати початок координат", + "ui.showPlanes": "Показати площини", + "ui.suppress": "Придушити", + "ui.command_palette_hint": "Введіть команду, напр. {example} — або натисніть S для пошуку", + "ui.unground": "Розкріпити", + "ui.unisolate": "Зняти ізоляцію", + "ui.unlock": "Розблокувати", + "ui.unsuppress": "Скасувати придушення", + "ui.updateToCurrentView": "Оновити до поточного виду", + "ui.zoom": "Масштабувати", + "ui.command_done": "{command} виконано", + "timeline.group": "Нова тека операцій", + "timeline.ungroup": "Прибрати теки операцій", + "timeline.rename_group": "Перейменувати теку операцій", + "timeline.move_to_group": "Перемістити операції до теки", + "timeline.move_many": "Перемістити елементи часового ланцюжка", + "timeline.reorder_many": "Перевпорядкувати операції", + "ui.show_construction_geometries": "Конструкційна геометрія", + "ui.total_angle": "Загальний кут", + "sketch_text.builtin_font": "{family} (вбудований)", + "sketch_text.font_search": "Пошук шрифтів", + "sketch_text.loading_fonts": "Пошук встановлених шрифтів…", + "sketch_text.use_font_file": "Використати файл шрифту {path}", + "sketch_text.bold": "Жирний", + "sketch_text.italic": "Курсив", + "sketch_text.align_left": "Ліворуч", + "sketch_text.align_center": "По центру", + "sketch_text.align_right": "Праворуч", + "sketch_text.path_hint": "Крива ескізу, якої дотримується текст: клацніть тут, а потім на кривій", + "sketch_text.path_clear": "Зняти текст з його кривої", + "Style": "Стиль", + "Alignment": "Вирівнювання", + "Letter Spacing": "Міжлітерний інтервал", + "Line Spacing": "Міжрядковий інтервал", + "Path": "Траєкторія", + "sketch_text.on_path": "Текст дотримується своєї траєкторії: крива його розміщує", + "cmd.library_inspect": "Перевірити локальну бібліотеку", + "cmd.library_export": "Експортувати бібліотеку проєкту", + "cmd.library_apply": "Застосувати елемент локальної бібліотеки", + "Thin": "Тонкий", + "Thin Extrude": "Тонке видавлювання", + "Wall Location": "Розташування стінки", + "Wall Thickness": "Товщина стінки", + "Thickness Outside": "Товщина назовні", + "Inside": "Усередину", + "Outside": "Назовні", + "Profiles/Curves": "Профілі/криві", + "cmd.material_properties_validate": "Перевірити дані фізичного матеріалу", + "cmd.material_properties_directional": "Спрямований модуль пружності", + "update.button": "Оновити", + "update.button_tip": "Доступна версія SolidCraft {version}", + "update.title": "Доступне оновлення", + "update.available": "Доступна версія SolidCraft {version}", + "update.you_have": "У вас версія {version}.", + "update.no_notes": "Цей випуск не має приміток.", + "update.system_hint": "Ця копія — {kind}. Оновіть її за допомогою:", + "update.package_hint": "Ця копія походить з {kind}. Завантажте новий пакет, а потім установіть його за допомогою:", + "update.copy": "Копіювати", + "update.file": "Завантаження отримає {file}.", + "update.download": "Завантажити", + "update.release_page": "Відкрити сторінку випуску", + "update.skip": "Пропустити цю версію", + "update.later": "Нагадати пізніше", + "update.prefs_label": "Оновлення", + "update.check_automatically": "Автоматично перевіряти оновлення", + "update.check_now": "Перевірити зараз", + "update.checking": "Перевірка…", + "update.failed": "Не вдалося перевірити: {error}", + "update.up_to_date": "SolidCraft оновлено.", + "update.prefs_note": "Це SolidCraft {version} ({kind}). Перевірка запитує в GitHub останній випуск і більше нічого не надсилає.", + "update.prefs_dev": "Це збірка для розробки ({version}): вона не перевіряє оновлення.", + "update.show": "Показати оновлення до {version}", + "update.prefs_flatpak": "Flatpak оновлює цю копію ({version}): виконайте {command} або скористайтеся центром програм. SolidCraft не перевіряє.", + "update.update_now": "Оновити зараз", + "update.install_msi": "Установити (закриє SolidCraft)", + "update.download_open": "Завантажити й відкрити", + "update.downloading": "Завантаження та перевірка… {done} з {total} МБ", + "update.installed": "SolidCraft {version} установлено. Перезапустіть, щоб скористатися.", + "update.restart": "Перезапустити зараз", + "update.restart_later": "Пізніше", + "update.installer_started": "Інсталятор запуститься, коли SolidCraft закриється.", + "update.dmg_opened": "Образ диска відкрито й перевірено: перетягніть SolidCraft до Applications, замінивши стару копію, а потім перезапустіть SolidCraft.", + "update.install_failed": "Оновлення не встановлено: {error}. Нічого не змінено; натомість «Завантажити» отримає пакет." +} diff --git a/crates/ui-egui/src/i18n.rs b/crates/ui-egui/src/i18n.rs index 782f401c..6ba7ef6b 100644 --- a/crates/ui-egui/src/i18n.rs +++ b/crates/ui-egui/src/i18n.rs @@ -37,8 +37,9 @@ static GERMAN: Catalog = Catalog::new("de", "Deutsch", include_str!(concat!(env! static FRENCH: Catalog = Catalog::new("fr", "Français", include_str!(concat!(env!("CARGO_MANIFEST_DIR"), "/../../assets/locales/fr.json"))); static KOREAN: Catalog = Catalog::new("ko", "한국어", include_str!(concat!(env!("CARGO_MANIFEST_DIR"), "/../../assets/locales/ko.json"))); static RUSSIAN: Catalog = Catalog::new("ru", "Русский", include_str!(concat!(env!("CARGO_MANIFEST_DIR"), "/../../assets/locales/ru.json"))); +static UKRAINIAN: Catalog = Catalog::new("uk", "Українська", include_str!(concat!(env!("CARGO_MANIFEST_DIR"), "/../../assets/locales/uk.json"))); static CHINESE: Catalog = Catalog::new("zh", "中文", include_str!(concat!(env!("CARGO_MANIFEST_DIR"), "/../../assets/locales/zh.json"))); -pub const LOCALES: &[&Catalog] = &[&ENGLISH, &JAPANESE, &GERMAN, &FRENCH, &KOREAN, &RUSSIAN, &CHINESE]; +pub const LOCALES: &[&Catalog] = &[&ENGLISH, &JAPANESE, &GERMAN, &FRENCH, &KOREAN, &RUSSIAN, &UKRAINIAN, &CHINESE]; pub fn is_supported(id: &str) -> bool { LOCALES.iter().any(|catalog| catalog.id == id) @@ -189,11 +190,11 @@ mod tests { } /// Catalogs delivered complete. English is the source catalog; Japanese was completed - /// upstream and Chinese lands complete here. German, Korean, Russian and French are partial - /// (German and Korean predate the coverage guards; Russian and French are kept partial so a - /// new label doesn't need more translations), so their gaps fall back to English and are reported by - /// `cargo xtask i18n` without failing the build, while nothing in the complete catalogs may - /// regress. + /// upstream and Chinese lands complete here. German, Korean, Russian, French and Ukrainian + /// are partial (German and Korean predate the coverage guards; Russian, French and Ukrainian + /// are kept partial so a new label doesn't need more translations), so their gaps fall back + /// to English and are reported by `cargo xtask i18n` without failing the build, while + /// nothing in the complete catalogs may regress. const COMPLETE: &[&str] = &["ja", "zh"]; /// `text()` falls back to English silently, so a message a complete locale never received is @@ -262,6 +263,7 @@ mod tests { ("ko", "플랜지", "얼룩말줄무늬 분석", "운동 연구"), ("ru", "Фланец", "Зебра-анализ", "Исследование движения"), ("fr", "Bord tombé", "Analyse zébrée", "Étude de mouvement"), + ("uk", "Фланець", "Зебра-аналіз", "Дослідження руху"), ]; for (lang, flange, zebra, motion) in cases { let locale = Locale::for_language(lang); @@ -343,6 +345,7 @@ mod tests { ("ko", "프로파일", "점"), ("ru", "Профиль", "Точки"), ("fr", "Profil", "Points"), + ("uk", "Профіль", "Точки"), ] { let locale = Locale::for_language(lang); assert_eq!(locale.label("ui.palette_profile"), profile, "{lang}"); @@ -367,6 +370,7 @@ mod tests { ("ko", "구성 형상"), ("ru", "Вспомогательная геометрия"), ("fr", "Géométries de construction"), + ("uk", "Конструкційна геометрія"), ]; for (lang, want) in rows { let locale = Locale::for_language(lang); @@ -463,6 +467,27 @@ mod tests { assert_eq!(fr.dynamic("Sketch of bracket"), "Sketch of bracket"); } + #[test] + fn ukrainian_catalog_translates_keys_labels_and_browser_patterns() { + let uk = Locale::for_language("uk"); + assert_eq!(uk.name(), "Українська"); + assert!(is_supported("uk")); + assert_eq!(uk.text("ui.preferences"), "Налаштування"); + assert_eq!(uk.label("Extrude"), "Видавлювання"); + assert_eq!(uk.label("CREATE SKETCH"), "СТВОРИТИ ЕСКІЗ"); + assert_eq!(uk.label("NonExistentKey"), "NonExistentKey"); + assert_eq!(uk.format("document.save_changes", &[("name", "My {design}")]), "Зберегти зміни в My {design}?"); + assert_eq!(uk.format("dialog.selected_count", &[("count", "2")]), "↖ Вибрано: 2"); + assert_eq!(uk.dynamic("Sketch1"), "Ескіз1"); + assert_eq!(uk.dynamic("Body2"), "Тіло2"); + assert_eq!(uk.dynamic("Component12"), "Компонент12"); + assert_eq!(uk.dynamic("Units: mm"), "Одиниці: mm"); + assert_eq!(uk.dynamic("Precision: 3"), "Точність: 3"); + assert_eq!(uk.dynamic("Parameters (5)"), "Параметри (5)"); + assert_eq!(uk.dynamic("4 degrees of freedom"), "4 ступенів вільності"); + assert_eq!(uk.dynamic("Sketch of bracket"), "Sketch of bracket"); + } + #[test] fn render_scopes_restore_the_previous_language() { let _english = scope("en"); diff --git a/crates/ui-egui/src/i18n_ui_tests.rs b/crates/ui-egui/src/i18n_ui_tests.rs index 46d7d0d6..6a477010 100644 --- a/crates/ui-egui/src/i18n_ui_tests.rs +++ b/crates/ui-egui/src/i18n_ui_tests.rs @@ -28,7 +28,8 @@ fn sketch_palette_profile_and_points_rows_show_their_own_translation() { // i18n::tests::id_labels_resolve_to_their_own_translation_not_an_english_fallback for the // lookup itself). A broken id falls back to English silently rather than failing loudly, so // check the word actually on screen in each locale, not just that something renders. - for (lang, profile, points) in [("de", "Profil", "Punkte"), ("ja", "プロファイル", "点"), ("ko", "프로파일", "점")] { + for (lang, profile, points) in [("de", "Profil", "Punkte"), ("ja", "プロファイル", "点"), ("ko", "프로파일", "점"), ("uk", "Профіль", "Точки")] + { let mut h = Harness::new(); h.app.preferences.language = lang.into(); h.app.home.open = false; @@ -66,6 +67,7 @@ fn window_chrome_renders_in_the_active_language() { ("ko", "브라우저", "선택 필터", "면"), ("ru", "БРАУЗЕР", "Фильтр выделения", "Грани"), ("fr", "NAVIGATEUR", "Filtre de sélection", "Faces"), + ("uk", "БРАУЗЕР", "Фільтр виділення", "Грані"), ] { let mut h = Harness::new(); h.app.preferences.language = lang.into(); diff --git a/crates/ui-egui/src/thin_extrude_tests.rs b/crates/ui-egui/src/thin_extrude_tests.rs index 513c03ed..df47c9dd 100644 --- a/crates/ui-egui/src/thin_extrude_tests.rs +++ b/crates/ui-egui/src/thin_extrude_tests.rs @@ -62,9 +62,12 @@ fn editing_a_thin_extrude_keeps_its_wall() { #[test] fn the_thin_rows_are_translated() { - for (lang, thin, location, outside) in - [("ja", "薄肉押し出し", "壁の位置", "外側の厚さ"), ("de", "Dünnwandig extrudieren", "Wandlage", "Dicke außen")] - { + let cases = [ + ("ja", "薄肉押し出し", "壁の位置", "外側の厚さ"), + ("de", "Dünnwandig extrudieren", "Wandlage", "Dicke außen"), + ("uk", "Тонке видавлювання", "Розташування стінки", "Товщина назовні"), + ]; + for (lang, thin, location, outside) in cases { let mut h = Harness::new(); h.app.preferences.language = lang.into(); rectangle(&mut h); diff --git a/docs/control-protocol.md b/docs/control-protocol.md index 8c8e60dc..68a811c6 100644 --- a/docs/control-protocol.md +++ b/docs/control-protocol.md @@ -131,7 +131,7 @@ unit regardless of the design, pass an expression with one: `"value": "50 mm"` o | `ui.home` | `open?`: bool; `sample?`: index | the start page: show or hide it, open a built-in sample (once built); returns `open` and the recent designs | | `ui.shortcut` | `command`, `key?`, `replace?` | a command's key, or rebinds it (`""` clears; a key another command uses is refused unless `replace`) | | `ui.help` | `item?`: `about`, `shortcuts` (read only), `report` (opens a report draft for review), `crashes` (the Crash Reports window) | the version, commit, build date and diagnostic text | -| `ui.prefs` | any of `default_units`, `nav` (`fusion`, `solidworks`, `inventor`, `alias`, `tinkercad`, `openscad`), `zoom_reverse`, `zoom_to_cursor`, `smooth_wheel_zoom` (default true), `trackpad_pan` (default true: two-finger scroll pans, pinch zooms), `orbit_cursor`, `look_at_anim`, `look_at_speed`, `middle_double_click` (`home` (default), `fit`, `off`), `msaa`, `length_decimals`, `angle_decimals`, `theme` (`dark`, `light`, `system`), `language` (`en`, `ja`, `de`, `fr`, `ko`, `ru`, `zh`; see [localization](localization.md)), `ui_scale`, `up_axis` (`z`, `y`), `offer_stand_up`, `color_vision` (`off` (default), `protan`, `deutan`, `tritan`: colour vision modes, #778), `check_updates` (default true; [updates](book/src/guide/updates.md)); `open` (a page: General, Navigation, Keyboard Shortcuts, Design, Graphics, Sketch, Selection) opens the Preferences dialog there; `button`: `ok`, `cancel`, `apply`, `defaults`; `stand_up: true` stands up a just-opened Y-up file | sets preferences (kept between runs), returns them all plus `dialog` (the open page or null), `dark` and `stand_up_offer` | +| `ui.prefs` | any of `default_units`, `nav` (`fusion`, `solidworks`, `inventor`, `alias`, `tinkercad`, `openscad`), `zoom_reverse`, `zoom_to_cursor`, `smooth_wheel_zoom` (default true), `trackpad_pan` (default true: two-finger scroll pans, pinch zooms), `orbit_cursor`, `look_at_anim`, `look_at_speed`, `middle_double_click` (`home` (default), `fit`, `off`), `msaa`, `length_decimals`, `angle_decimals`, `theme` (`dark`, `light`, `system`), `language` (`en`, `ja`, `de`, `fr`, `ko`, `ru`, `uk`, `zh`; see [localization](localization.md)), `ui_scale`, `up_axis` (`z`, `y`), `offer_stand_up`, `color_vision` (`off` (default), `protan`, `deutan`, `tritan`: colour vision modes, #778), `check_updates` (default true; [updates](book/src/guide/updates.md)); `open` (a page: General, Navigation, Keyboard Shortcuts, Design, Graphics, Sketch, Selection) opens the Preferences dialog there; `button`: `ok`, `cancel`, `apply`, `defaults`; `stand_up: true` stands up a just-opened Y-up file | sets preferences (kept between runs), returns them all plus `dialog` (the open page or null), `dark` and `stand_up_offer` | | `ui.capture` | `action?`: `capture`, `revert`, `cancel` | answers the Capture Position question (asked when a command starts or the design is saved while components were moved without capturing); without `action`, what waits | | `ui.window` | `action`: minimize, maximize, restore, toggle, close | what the title bar's caption buttons do (on Windows and Linux the application bar is the title bar); close asks about unsaved designs first | | `ui.agent_cursor` | `show` (bool), `speed`: a number from 1 to 5 (times the normal speed) or `"instant"` (no animation: the command runs at once and the pointer jumps to where it acted), `follow_camera` (bool); all optional | the settings. While the cursor is shown, `engine.execute` first glides to the command's toolbar button and to each pick, then runs and replies; later requests wait their turn. `"animate": false` on a call skips it | diff --git a/docs/localization.md b/docs/localization.md index 54347b36..35a512b4 100644 --- a/docs/localization.md +++ b/docs/localization.md @@ -1,7 +1,7 @@ # UI localization -SolidCraft embeds its translations and works offline. English, Japanese, German, French, Korean, Russian -and Chinese are currently registered in `crates/ui-egui/src/i18n.rs`. Adding a language requires an +SolidCraft embeds its translations and works offline. English, Japanese, German, French, Korean, +Russian, Ukrainian and Chinese are currently registered in `crates/ui-egui/src/i18n.rs`. Adding a language requires an embedded catalog and one registration there; the preferences selector and validation use the same registry. @@ -31,9 +31,10 @@ that looks untranslated. Two guards catch that in the build: - `every_complete_catalog_carries_every_english_message` — adding a key to `en.json` without giving it to a complete catalog fails the tests. English is the source catalog, - Japanese and Chinese are delivered complete; German, Korean, Russian and French are partial — their - gaps fall back to English and are reported by `cargo xtask i18n` without failing the build. A - new label needs en, ja, zh, de and ko; Russian and French may follow later. + Japanese and Chinese are delivered complete; German, Korean, Russian, French and Ukrainian are + partial — their gaps fall back to English and are reported by `cargo xtask i18n` without + failing the build. A new label needs en, ja, zh, de and ko; Russian, French and Ukrainian may + follow later. - `every_toolbar_tab_and_panel_is_in_the_english_catalog` — tabs and panels reach the UI as bare source strings, resolved only by the English-label adapter, so a heading missing from `en.json` can never translate.