From 8ea1fd643fb70cb17f8e335c57de23f03a3415a4 Mon Sep 17 00:00:00 2001 From: Alex Pro <95146026+del000@users.noreply.github.com> Date: Wed, 14 Oct 2026 23:11:25 +0700 Subject: [PATCH] feat: add Russian (ru) UI localization (#1043) Adds a Russian (ru) UI locale. It's partial: anything not yet translated falls back to English. --- ATTRIBUTION.md | 1 + assets/locales/ru.json | 961 ++++++++++++++++++++++++++++ crates/ui-egui/src/i18n.rs | 39 +- crates/ui-egui/src/i18n_ui_tests.rs | 1 + docs/control-protocol.md | 2 +- docs/localization.md | 7 +- 6 files changed, 1001 insertions(+), 10 deletions(-) create mode 100644 assets/locales/ru.json diff --git a/ATTRIBUTION.md b/ATTRIBUTION.md index b315f198..c801d39d 100644 --- a/ATTRIBUTION.md +++ b/ATTRIBUTION.md @@ -91,6 +91,7 @@ Editable drawing code, native projects and shipped exports are collected under ` | assets/locales/en.json | SolidCraft contributors | Original SolidCraft resource data or drawing code, collected without redesign | MIT OR Apache-2.0 | | 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/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/ru.json b/assets/locales/ru.json new file mode 100644 index 00000000..35bf5de8 --- /dev/null +++ b/assets/locales/ru.json @@ -0,0 +1,961 @@ +{ + "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_refold": "Повторный гиб", + "cmd.sheet_rules": "Список правил листового металла", + "cmd.sheet_unfold": "Разогнуть", + "cmd.sketch_arc_center_point": "Дуга из центра", + "cmd.sketch_arc_tangent": "Касательная дуга", + "cmd.sketch_arc_three_point": "Дуга по 3 точкам", + "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": "Окружность по 3 точкам", + "cmd.sketch_circle_three_tangent": "Окружность по 3 касательным", + "cmd.sketch_circle_two_point": "Окружность по 2 точкам", + "cmd.sketch_circle_two_tangent": "Окружность по 2 касательным", + "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": "Прямоугольник по 3 точкам", + "cmd.sketch_rectangle_two_point": "Прямоугольник по 2 точкам", + "cmd.sketch_redefine": "Переопределить плоскость эскиза", + "cmd.sketch_slot_arc_center": "Дуговой паз из центра", + "cmd.sketch_slot_arc_three_point": "Дуговой паз по 3 точкам", + "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_compute_all": "Пересчитать всё", + "cmd.timeline_copy": "Копировать операции", + "cmd.timeline_dependents": "Зависимые операции", + "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-up файлы вертикально", + "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": "Создать Issue — проверить черновик", + "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": "Заголовок Issue", + "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 мм", + "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.material_properties_validate": "Проверить данные физического материала" +} diff --git a/crates/ui-egui/src/i18n.rs b/crates/ui-egui/src/i18n.rs index 708e37be..01ed149e 100644 --- a/crates/ui-egui/src/i18n.rs +++ b/crates/ui-egui/src/i18n.rs @@ -35,8 +35,9 @@ static ENGLISH: Catalog = Catalog::new("en", "English", include_str!(concat!(env static JAPANESE: Catalog = Catalog::new("ja", "日本語", include_str!(concat!(env!("CARGO_MANIFEST_DIR"), "/../../assets/locales/ja.json"))); static GERMAN: Catalog = Catalog::new("de", "Deutsch", include_str!(concat!(env!("CARGO_MANIFEST_DIR"), "/../../assets/locales/de.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 CHINESE: Catalog = Catalog::new("zh", "中文", include_str!(concat!(env!("CARGO_MANIFEST_DIR"), "/../../assets/locales/zh.json"))); -pub const LOCALES: &[&Catalog] = &[&ENGLISH, &JAPANESE, &GERMAN, &KOREAN, &CHINESE]; +pub const LOCALES: &[&Catalog] = &[&ENGLISH, &JAPANESE, &GERMAN, &KOREAN, &RUSSIAN, &CHINESE]; pub fn is_supported(id: &str) -> bool { LOCALES.iter().any(|catalog| catalog.id == id) @@ -187,9 +188,11 @@ mod tests { } /// Catalogs delivered complete. English is the source catalog; Japanese was completed - /// upstream and Chinese lands complete here. German and Korean are still partial (they - /// predate the coverage guards), so their gaps are reported by `cargo xtask i18n` - /// without failing the build, while nothing in the two complete catalogs may regress. + /// upstream and Chinese lands complete here. German, Korean and Russian are partial + /// (German and Korean predate the coverage guards; Russian is kept partial so a new label + /// doesn't need a sixth translation), 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 @@ -256,6 +259,7 @@ mod tests { ("ja", "フランジ", "ゼブラ解析", "モーション スタディ"), ("de", "Flansch", "Zebra-Analyse", "Bewegungsuntersuchung"), ("ko", "플랜지", "얼룩말줄무늬 분석", "운동 연구"), + ("ru", "Фланец", "Зебра-анализ", "Исследование движения"), ]; for (lang, flange, zebra, motion) in cases { let locale = Locale::for_language(lang); @@ -330,7 +334,9 @@ mod tests { /// non-empty string" would not catch that. #[test] fn id_labels_resolve_to_their_own_translation_not_an_english_fallback() { - for (lang, profile, points) in [("de", "Profil", "Punkte"), ("ja", "プロファイル", "点"), ("ko", "프로파일", "점")] { + for (lang, profile, points) in + [("de", "Profil", "Punkte"), ("ja", "プロファイル", "点"), ("ko", "프로파일", "점"), ("ru", "Профиль", "Точки")] + { let locale = Locale::for_language(lang); assert_eq!(locale.label("ui.palette_profile"), profile, "{lang}"); assert_eq!(locale.label("ui.palette_points"), points, "{lang}"); @@ -348,7 +354,7 @@ mod tests { /// the row's two-word text must reach its own entry rather than that one. #[test] fn the_construction_geometries_row_reaches_its_own_entry_not_the_line_type() { - let rows = [("de", "Konstruktionsgeometrien"), ("ja", "構築ジオメトリ"), ("ko", "구성 형상")]; + let rows = [("de", "Konstruktionsgeometrien"), ("ja", "構築ジオメトリ"), ("ko", "구성 형상"), ("ru", "Вспомогательная геометрия")]; for (lang, want) in rows { let locale = Locale::for_language(lang); assert_eq!(locale.label("Construction Geometries"), want, "{lang}"); @@ -400,6 +406,27 @@ mod tests { assert_eq!(ko.dynamic("Sketch of bracket"), "Sketch of bracket"); } + #[test] + fn russian_catalog_translates_keys_labels_and_browser_patterns() { + let ru = Locale::for_language("ru"); + assert_eq!(ru.name(), "Русский"); + assert!(is_supported("ru")); + assert_eq!(ru.text("ui.preferences"), "Настройки"); + assert_eq!(ru.label("Extrude"), "Выдавливание"); + assert_eq!(ru.label("CREATE SKETCH"), "СОЗДАТЬ ЭСКИЗ"); + assert_eq!(ru.label("NonExistentKey"), "NonExistentKey"); + assert_eq!(ru.format("document.save_changes", &[("name", "My {design}")]), "Сохранить изменения в My {design}?"); + assert_eq!(ru.format("dialog.selected_count", &[("count", "2")]), "↖ Выбрано: 2"); + assert_eq!(ru.dynamic("Sketch1"), "Эскиз1"); + assert_eq!(ru.dynamic("Body2"), "Тело2"); + assert_eq!(ru.dynamic("Component12"), "Компонент12"); + assert_eq!(ru.dynamic("Units: mm"), "Единицы: mm"); + assert_eq!(ru.dynamic("Precision: 3"), "Точность: 3"); + assert_eq!(ru.dynamic("Parameters (5)"), "Параметры (5)"); + assert_eq!(ru.dynamic("4 degrees of freedom"), "Степеней свободы: 4"); + assert_eq!(ru.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 52858441..210cc879 100644 --- a/crates/ui-egui/src/i18n_ui_tests.rs +++ b/crates/ui-egui/src/i18n_ui_tests.rs @@ -64,6 +64,7 @@ fn window_chrome_renders_in_the_active_language() { ("ja", "ブラウザ", "選択フィルター", "面"), ("de", "BROWSER", "Auswahlfilter", "Flächen"), ("ko", "브라우저", "선택 필터", "면"), + ("ru", "БРАУЗЕР", "Фильтр выделения", "Грани"), ] { let mut h = Harness::new(); h.app.preferences.language = lang.into(); diff --git a/docs/control-protocol.md b/docs/control-protocol.md index f0be4f3a..4bf6f03e 100644 --- a/docs/control-protocol.md +++ b/docs/control-protocol.md @@ -123,7 +123,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` (copies diagnostics), `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`, `ko`, `zh`; see [localization](localization.md)), `ui_scale`, `up_axis` (`z`, `y`), `offer_stand_up`, `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`, `ko`, `ru`, `zh`; see [localization](localization.md)), `ui_scale`, `up_axis` (`z`, `y`), `offer_stand_up`, `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 b55e93f7..5f069de9 100644 --- a/docs/localization.md +++ b/docs/localization.md @@ -1,6 +1,6 @@ # UI localization -SolidCraft embeds its translations and works offline. English, Japanese, German, Korean and +SolidCraft embeds its translations and works offline. English, Japanese, German, Korean, Russian 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,8 +31,9 @@ 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 and Korean are still partial — their - gaps are reported by `cargo xtask i18n` without failing the build. + Japanese and Chinese are delivered complete; German, Korean and Russian 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 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.