diff --git a/.github/workflows/pr.yml b/.github/workflows/pr.yml index 5ed21a1..c756c52 100644 --- a/.github/workflows/pr.yml +++ b/.github/workflows/pr.yml @@ -38,6 +38,38 @@ jobs: - name: Test core run: cargo test --locked -p benchup-core + app: + name: Test settings and estimate PDF export + runs-on: ubuntu-24.04 + timeout-minutes: 60 + steps: + - name: Check out repository + uses: actions/checkout@v7 + with: + persist-credentials: false + + - name: Install Linux dependencies + run: | + sudo python3 scripts/install_linux_dependencies.py \ + build-essential pkg-config libx11-dev libxcb1-dev \ + libxkbcommon-dev libwayland-dev libegl1-mesa-dev libudev-dev + + - name: Install Rust + uses: dtolnay/rust-toolchain@1.97.1 + + - name: Set up compiler cache + uses: ./.github/actions/setup-compiler-cache + + - name: Cache Rust dependencies + uses: Swatinem/rust-cache@v2 + with: + key: pr-app + + - name: Test Vietnamese language settings and estimate PDF export + run: | + bash scripts/ci_cargo.sh test -p benchup-app --lib --profile ci-test --locked -- \ + settings::tests::supported_languages_include_vietnamese estimate_pdf::tests:: + io: name: Test geometry import and export runs-on: ubuntu-24.04 diff --git a/assets/fonts/Roboto-OFL.txt b/assets/fonts/Roboto-OFL.txt new file mode 100644 index 0000000..9c48e05 --- /dev/null +++ b/assets/fonts/Roboto-OFL.txt @@ -0,0 +1,93 @@ +Copyright 2011 The Roboto Project Authors (https://github.com/googlefonts/roboto-classic) + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +https://openfontlicense.org + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/assets/fonts/Roboto[wdth,wght].ttf b/assets/fonts/Roboto[wdth,wght].ttf new file mode 100644 index 0000000..5522a36 Binary files /dev/null and b/assets/fonts/Roboto[wdth,wght].ttf differ diff --git a/assets/i18n/en.json b/assets/i18n/en.json index 9647d8a..e060115 100644 --- a/assets/i18n/en.json +++ b/assets/i18n/en.json @@ -2069,6 +2069,7 @@ "settings.invert_zoom": "Invert zoom", "settings.language_simplified_chinese": "Simplified Chinese", "settings.language_brazilian_portuguese": "Brazilian Portuguese", + "settings.language_vietnamese": "Vietnamese", "settings.look_sensitivity": "Look sensitivity", "settings.mouse_trackpad": "Mouse/Trackpad", "settings.navigation_type": "Navigation type", diff --git a/assets/i18n/pt_BR.json b/assets/i18n/pt_BR.json index 0cf32b7..95f77fd 100644 --- a/assets/i18n/pt_BR.json +++ b/assets/i18n/pt_BR.json @@ -2067,6 +2067,7 @@ "settings.invert_zoom": "Inverter zoom", "settings.language_simplified_chinese": "简体中文", "settings.language_brazilian_portuguese": "Português (Brasil)", + "settings.language_vietnamese": "Vietnamita", "settings.look_sensitivity": "Sensibilidade do olhar", "settings.mouse_trackpad": "Mouse/trackpad", "settings.navigation_type": "Tipo de navegação", diff --git a/assets/i18n/vi.json b/assets/i18n/vi.json new file mode 100644 index 0000000..20d5269 --- /dev/null +++ b/assets/i18n/vi.json @@ -0,0 +1,2184 @@ +{ + "account.account": "Tài khoản", + "account.are_you_sure_you_want_to_log_out": "Bạn có chắc chắn muốn đăng xuất không?", + "account.cannot_connect_to_server": "Không thể kết nối với máy chủ", + "account.cannot_connect_to_the_configured_server_please_retry": "Không thể kết nối với máy chủ đã định cấu hình. Vui lòng thử lại.", + "account.cannot_contact_project_server": "Không thể liên hệ với máy chủ dự án", + "account.cannot_load_account_picture": "Không thể tải ảnh tài khoản", + "account.cannot_locate_account_storage": "Không thể định vị bộ nhớ tài khoản", + "account.cannot_read_account_picture": "Không thể đọc ảnh tài khoản", + "account.cannot_read_server_response": "Không thể đọc phản hồi của máy chủ", + "account.cannot_save_guest_identity": "Không thể lưu danh tính khách", + "account.complete_login_and_authorize_benchup_in_your_browser": "Hoàn tất đăng nhập và ủy quyền BenchUp trong trình duyệt của bạn…", + "account.config_cannot_read_file": "Không thể đọc {path}: {error}", + "account.config_file_error": "{path}: {error}", + "account.config_invalid_unicode": "{key} phải là UTF-8", + "account.config_invalid_value": "{key} phải chứa URL máy chủ", + "account.config_missing": "Chưa cấu hình máy chủ tài khoản. Hãy đặt {key} trong .env, khi xây dựng ứng dụng hoặc khởi chạy với --server-url URL.", + "account.config_missing_argument": "--server-url cần có một URL", + "account.config_missing_equals": "Thiếu dấu '=' sau {key} ở dòng {line}", + "account.config_trailing_text": "Văn bản không mong đợi sau {key} trên dòng {line}", + "account.config_unclosed_quote": "Dấu ngoặc kép chưa được đóng cho {key} ở dòng {line}", + "account.connect_your_account_using_google_in_your_browser": "Kết nối tài khoản của bạn bằng Google trong trình duyệt của bạn.", + "account.continue_with_google": "Tiếp tục với Google", + "account.invalid_account_server_configuration_use_https_or_http": "Cấu hình máy chủ tài khoản không hợp lệ: sử dụng HTTPS hoặc HTTP trên localhost.", + "account.invalid_login_address": "Địa chỉ đăng nhập không hợp lệ", + "account.invalid_logout_response": "Phản hồi đăng xuất không hợp lệ", + "account.invalid_project_response": "Phản hồi dự án không hợp lệ", + "account.invalid_project_server_configuration": "Cấu hình máy chủ dự án không hợp lệ", + "account.invalid_server_address": "Địa chỉ máy chủ không hợp lệ", + "account.invalid_server_login_response": "Phản hồi đăng nhập máy chủ không hợp lệ", + "account.invalid_server_profile": "Cấu hình máy chủ không hợp lệ", + "account.invalid_server_session_response": "Phản hồi phiên máy chủ không hợp lệ", + "account.log_in_to_benchup": "Đăng nhập vào BenchUp", + "account.log_out": "Đăng xuất", + "account.logging_out": "Đăng xuất…", + "account.login_timed_out_continue_with_google_to_try": "Đã hết thời gian đăng nhập. Tiếp tục với Google để thử lại.", + "account.missing_http_status": "Thiếu trạng thái HTTP", + "account.no_browser": "Không có trình duyệt", + "account.project_server_unavailable": "Máy chủ dự án không khả dụng: {e}", + "account.signed_out_but_could_not_remove_the_saved": "Đã đăng xuất nhưng không thể xóa thông tin xác thực đã lưu.", + "account.storage_unavailable": "Không có bộ nhớ", + "account.the_server_did_not_sign_out": "Máy chủ không đăng xuất.", + "account.use_https_or_http_on_localhost_for_development": "Sử dụng HTTPS hoặc HTTP trên localhost để phát triển.", + "app.about_benchup": "Giới thiệu BenchUp", + "app.account": "Tài khoản", + "app.account_not_connected": "Tài khoản · Chưa kết nối", + "app.aligned": " · {} căn chỉnh", + "app.angle": "Góc", + "app.appearance": "Giao diện", + "app.ascii_or_binary_geometry_only_coordinates_interpreted_as": "ASCII hoặc nhị phân; chỉ gồm hình học. Tọa độ tính bằng milimét, trục Z hướng lên.", + "app.assign_stock_material": "Gán vật liệu phôi", + "app.automatically_align_drawing_with_the_red_green_and": "Tự động căn chỉnh bản vẽ theo các trục đỏ, xanh lá và xanh dương. Di chuột qua điểm cuối, trung điểm hoặc cạnh để căn theo trục đi qua vị trí đó. Khi tắt tính năng này, bạn vẫn có thể dùng phím mũi tên để khóa trục.", + "app.autosaved_on_this_device_use_file_save_to": "Tự động lưu trên thiết bị này. Sử dụng Tệp → Lưu để cập nhật tệp dự án của bạn.", + "app.binary_stl_of_visible_faces_in_millimetres_z": "STL nhị phân gồm các mặt đang hiển thị, đơn vị milimét, trục Z hướng lên. Không xuất cạnh hoặc vật liệu. Hãy bảo đảm khối kín trước khi in; không tự động sửa lỗi.", + "app.cannot_paste_this_geometry_here_a_component_cannot": "Không thể dán hình học này vào đây; một thành phần không thể chứa định nghĩa của chính nó.", + "app.center_view_on_axis_origin_0_0_0": "Căn giữa khung nhìn tại gốc tọa độ (0, 0, 0)", + "app.check_for_updates": "Kiểm tra bản cập nhật…", + "app.choose_a_modeling_tool": "Chọn công cụ tạo hình", + "app.clean_aligned_vertices": "Xóa đỉnh thẳng hàng dư thừa", + "app.clear_color": "Xóa màu", + "app.clear_color_2": "Xóa màu", + "app.click_a_face_in_a_group_or_component": "Nhấp vào một mặt trong nhóm hoặc thành phần để tô màu tất cả các mặt của đối tượng đó.", + "app.click_a_face_to_apply_this_color": "Nhấp vào một mặt để áp dụng màu này.", + "app.click_a_filled_face_first": "Trước tiên, hãy nhấp vào một mặt đã tô.", + "app.click_a_reference_point_away_from_the_pivot": "Nhấp vào điểm tham chiếu cách xa trục trước", + "app.click_a_reference_point_away_from_the_pivot_2": "Nhấp vào điểm tham chiếu cách xa trục quay · Esc để hủy", + "app.click_the_opposite_corner_type_width_height_5m": "Nhấp vào góc đối diện · Nhập chiều rộng,chiều cao (5m,50mm) rồi nhấn Enter", + "app.click_to_confirm_esc_to_cancel": "{} · Nhấp để xác nhận · Esc để hủy", + "app.click_to_confirm_esc_to_cancel_2": "{value:.3} × · Nhấp để xác nhận · Esc để hủy", + "app.click_to_confirm_esc_to_cancel_3": "{}{}{alignment} · Nhấp để xác nhận · Esc để hủy", + "app.click_to_finish_type_length_enter_esc_to": "Nhấp để hoàn tất · Nhập chiều dài rồi nhấn Enter · Esc để dừng", + "app.click_to_place_the_copy_escape_to_cancel": "Nhấp để đặt bản sao · Escape để hủy", + "app.click_to_set_the_radius_type_a_radius": "Nhấp để đặt bán kính · Nhập bán kính (5cm) rồi nhấn Enter · Esc để hủy", + "app.close_level_esc": "Đóng cấp chỉnh sửa (Esc)", + "app.component": "Thành phần", + "app.configure_edge_face_face_center_axis_and_grid": "Định cấu hình chụp nhanh cạnh, mặt, tâm mặt, trục và lưới", + "app.copies": "Bản sao", + "app.copy": "Sao chép · ", + "app.copy_ctrl_toggles_move_click_to_place_type": "Sao chép · Ctrl bật/tắt chế độ Di chuyển · Nhấp để đặt · Nhập khoảng cách rồi nhấn Enter", + "app.copy_option_toggles_move_click_to_place_type": "Sao chép · Option bật/tắt chế độ Di chuyển · Nhấp để đặt · Nhập khoảng cách rồi nhấn Enter", + "app.copy_placed_type_3_to_divide_the_span": "Sao chép đã đặt · Nhập /3 để chia nhịp hoặc 3x để lặp lại · Enter để áp dụng", + "app.could_not_restore_the_project_file_location_after": "Không thể khôi phục vị trí tệp dự án sau khi cập nhật: {error}", + "app.could_not_restore_your_model_a_new_workspace": "Không thể khôi phục mô hình: {e}. Không gian làm việc mới đã sẵn sàng.", + "app.create_a_printable_label_for_each_piece_in": "Tạo nhãn có thể in cho từng chi tiết trong vùng chọn hoặc trong toàn bộ dự án.", + "app.create_component": "Tạo thành phần", + "app.create_component_2": "Tạo thành phần", + "app.delete_guides": "Xóa đường dẫn", + "app.dimension": "kích thước", + "app.distance": "Khoảng cách", + "app.download_desktop_app": "Tải xuống ứng dụng máy tính để bàn", + "app.arc_choose_end": "Nhấp vào điểm cuối thứ hai · Nhập độ dài hợp âm + Enter · Esc để hủy", + "app.arc_choose_through_point": "Nhấp vào một điểm trên cung · Nhập chiều cao cung + Enter · Esc để hủy", + "app.arc_chord": "Độ dài hợp âm", + "app.arc_distinct_endpoints": "Chọn điểm cuối thứ hai khác.", + "app.arc_height": "Chiều cao cung", + "app.arc_lock_must_contain_endpoints": "Mặt phẳng bị khóa phải chứa cả hai điểm cuối cung.", + "app.arc_point_off_chord": "Chọn một điểm cách xa đường thẳng giữa các điểm cuối.", + "app.draw_arc": "Vẽ cung", + "app.draw_circle": "Vẽ hình tròn", + "app.draw_freehand": "Vẽ tự do", + "app.draw_line": "Vẽ đường", + "app.draw_polygon": "Vẽ đa giác", + "app.draw_rectangle": "Vẽ hình chữ nhật", + "app.dxf_2d_dxf": "DXF 2D (.dxf)…", + "app.edge_and_face_selection": "{} · {}", + "app.edit": "Chỉnh sửa", + "app.editable_groups_holes_and_solid_colors_no_textures": "Các nhóm, lỗ và màu đồng nhất có thể chỉnh sửa. Không có kết cấu hoặc chú thích.", + "app.enter_an_angle_or_formula_such_as_90": "Nhập một góc hoặc công thức, chẳng hạn như 90 hoặc (45 + 45) / 2. Số đơn giản sử dụng {}. Thêm độ, °, rad hoặc gon sau công thức để ghi đè đơn vị.", + "app.erase_geometry": "Tẩy hình học", + "app.erase_selection": "Xóa vùng chọn", + "app.export": "Xuất", + "app.export_time_and_cost_estimates_as_pdf": "Xuất ước tính thời gian và chi phí dưới dạng PDF", + "app.faces_and_lines_including_negative_vertex_indices_metres": "Các mặt và đường thẳng, bao gồm cả chỉ số đỉnh âm. Mét, Z tăng lên. Không có vật liệu, kết cấu hoặc phân cấp nhóm.", + "app.factor": "Hệ số", + "app.file": "Tệp", + "app.fit_model_to_view": "Căn mô hình vừa khung nhìn", + "app.fit_selection_to_view": "Lựa chọn phù hợp để xem", + "app.generate_time_cost_estimates": "Tạo ước tính thời gian và chi phí…", + "app.github": "GitHub", + "app.give_your_selection_a_name": "Đặt tên cho lựa chọn của bạn.", + "app.group": "Nhóm", + "app.help": "Trợ giúp", + "app.history_menu_action": "{action} {label}", + "app.hole_side_lengths": "Chiều dài các cạnh của lỗ {index}", + "app.import": "Nhập", + "app.inspector": "Bảng thuộc tính", + "app.benchup": "{} - BenchUp", + "app.benchup_is_a_3d_modeling_app_for_turning": "BenchUp là một ứng dụng lập mô hình 3D để biến ý tưởng thành hình dạng. Vẽ hình học chính xác, tạo hình bề mặt và sắp xếp mô hình của bạn theo nhóm và thành phần.", + "app.keyboard_shortcuts": "Phím tắt", + "app.length": "Chiều dài", + "app.locked": "Đã khóa", + "app.locked_2": "{} · Đã khóa", + "app.make_group": "Tạo nhóm", + "app.make_group_2": "Tạo nhóm", + "app.maximize": "Tối đa hóa", + "app.minimize": "Thu nhỏ", + "app.missing_material": "Thiếu vật liệu", + "app.mixed": "Hỗn hợp", + "app.model": "Mô hình", + "app.modified_saved_locally": "Đã sửa đổi · được lưu cục bộ", + "app.move": "Di chuyển · ", + "app.move_copy": "Di chuyển bản sao", + "app.move_ctrl_toggles_copy_click_base_point_and": "Di chuyển · Ctrl chuyển sang Sao chép · Nhấp điểm gốc và điểm đích", + "app.move_option_toggles_copy_click_base_point_and": "Di chuyển · Option chuyển sang Sao chép · Nhấp điểm gốc và điểm đích", + "app.move_over_the_drawing_plane_to_set_a": "Di chuyển trên mặt phẳng vẽ để đặt hướng", + "app.move_the_cursor_to_orbit_hold_shift_to": "Di chuyển con trỏ để xoay quanh · Giữ Shift để dịch chuyển khung nhìn · Thả Ctrl / ⌘ để tiếp tục vẽ", + "app.move_the_pointer_to_choose_a_direction_first": "Di chuyển con trỏ để chọn hướng trước", + "app.move_the_pointer_to_give_the_shape_some": "Di chuyển con trỏ để tạo hình dạng có kích thước nào đó", + "app.new_faces": "Mặt mới · ", + "app.new_project": "Dự án mới", + "app.new_project_ready": "Dự án mới đã sẵn sàng", + "app.new_workspace": "Không gian làm việc mới", + "app.no_group_open": "Không có nhóm mở", + "app.no_objects_selected": "Chưa chọn đối tượng nào", + "app.nothing_selected": "Chưa chọn gì", + "app.object_selection": "{kind}: {}", + "app.offset": "Dịch song song", + "app.orbiting_hold_shift_to_pan": "Đang xoay quanh · Giữ Shift để dịch chuyển khung nhìn", + "app.paint_face": "Tô màu mặt", + "app.paint_group": "Tô màu nhóm", + "app.panning_release_shift_to_orbit": "Đang dịch chuyển khung nhìn · Thả Shift để xoay quanh", + "app.panning_hold_shift_to_orbit": "Đang dịch chuyển khung nhìn · Giữ Shift để xoay quanh", + "app.orbiting_release_shift_to_pan": "Đang xoay quanh · Thả Shift để dịch chuyển khung nhìn", + "app.paste": "Dán", + "app.perimeter": "Chu vi", + "app.plane_locked": "{} · Đã khóa", + "app.plane_locked_2": "{} · Mặt phẳng bị khóa", + "app.polygon_sides": "Các cạnh đa giác", + "app.prepare_cutting_plan": "Chuẩn bị kế hoạch cắt…", + "app.print_workshop_labels": "In nhãn xưởng…", + "app.push_pull_new_faces_status": "Đẩy/Kéo · Mặt mới · Ctrl bật/tắt chế độ pháp tuyến · Nhấp vào mặt hoặc xác nhận thao tác đẩy/kéo", + "app.quit": "Thoát", + "app.radius": "Bán kính", + "app.release_notes": "Ghi chú phát hành", + "app.release_to_finish_type_total_length_enter_esc": "Thả chuột để hoàn tất · Nhập tổng chiều dài rồi nhấn Enter · Esc để hủy", + "app.remove_color_from_the_selected_items_and_all": "Xóa màu khỏi các mục đã chọn và tất cả các mục con của chúng", + "app.report_a_bug": "Báo cáo lỗi", + "app.restore": "Khôi phục", + "app.save_as": "Lưu thành…", + "app.saved_locally": "Đã lưu trên thiết bị", + "app.saving": "Đang lưu…", + "app.scale_factor_symbol": "×", + "app.screenshot": "Ảnh chụp màn hình", + "app.select_a_group_or_component_to_edit_its": "Chọn một nhóm hoặc thành phần để chỉnh sửa vật liệu, chà nhám và hoàn thiện.", + "app.select_an_entity_to_see_its_details": "Chọn một thực thể để xem thông tin chi tiết về nó.", + "app.select_or_click_an_edge_or_face_first": "Chọn hoặc nhấp vào một cạnh hoặc bề mặt trước", + "app.selected": "{selection} đã chọn", + "app.selection_dimensions": { + "one": "{count} kích thước", + "other": "{count} kích thước" + }, + "app.selection_edges": { + "one": "{count} cạnh", + "other": "{count} cạnh" + }, + "app.selection_entities": { + "one": "{count} thực thể", + "other": "{count} thực thể" + }, + "app.selection_faces": { + "one": "{count} mặt", + "other": "{count} mặt" + }, + "app.selection_guides": { + "one": "{count} đường dẫn", + "other": "{count} đường dẫn" + }, + "app.selection_separator": " · ", + "app.selection_text_labels": { + "one": "{count} nhãn văn bản", + "other": "{count} nhãn văn bản" + }, + "app.settings": "Cài đặt…", + "app.side_lengths": "Độ dài cạnh", + "app.sketchup_skp": "SketchUp (.skp)…", + "app.snap_points_and_moves_to_the_grid_spacing": "Bắt điểm và thao tác di chuyển theo khoảng cách lưới ở mức thu phóng hiện tại. Điểm bắt trên đối tượng và khóa trục được ưu tiên.", + "app.snap_to_axes": "Bắt theo trục", + "app.snap_to_edge": "Bắt theo cạnh", + "app.snap_to_face": "Bắt theo mặt", + "app.snap_to_face_center": "Bắt theo tâm mặt", + "app.snap_to_grid": "Bắt theo lưới", + "app.snap_only_visible": "Chỉ bắt vào phần tử đang hiển thị", + "app.snap_only_visible_tooltip": "Chỉ bắt vào cạnh hoặc mặt ngay dưới con trỏ, không bắt vào hình học bị che khuất bởi đối tượng khác. Bắt theo trục và lưới vẫn hoạt động độc lập.", + "app.snap_to_object_edges_including_their_endpoints_and": "Bắt vào cạnh của đối tượng, bao gồm cả đầu mút và trung điểm.", + "app.snap_to_object_surfaces_independently_of_edge_and": "Bắt vào bề mặt đối tượng, độc lập với việc bắt cạnh và tâm mặt.", + "app.snap_to_the_area_center_of_a_visible": "Bắt vào tâm diện tích của mặt đang hiển thị, độc lập với việc bắt cạnh và bề mặt.", + "app.snapping": "Bắt điểm", + "app.stl_stl_millimetres": "STL (.stl; milimét)…", + "app.stock_material": "Vật liệu tồn kho", + "app.suggest_a_feature": "Đề xuất tính năng", + "app.suggest_a_feature_on_github": "Đề xuất một tính năng trên GitHub", + "app.summarize_matching_parts_and_export_finished_cutting_dimensions": "Tóm tắt các bộ phận phù hợp và xuất kích thước cắt hoàn thiện cho vùng chọn hoặc toàn bộ dự án.", + "app.surface_area": "Diện tích bề mặt", + "app.switch_to_dark_mode": "Chuyển sang chế độ tối", + "app.switch_to_light_mode": "Chuyển sang chế độ sáng", + "app.system_information": "Thông tin hệ thống", + "app.tape": "Thước dây", + "app.text_dxf_line_straight_lwpolyline_arc_and_circle": "Văn bản DXF: LINE, LWPOLYLINE thẳng, ARC và CIRCLE trong mặt phẳng XY. Đường cong được xấp xỉ tối đa 96 đoạn mỗi vòng tròn. Không hỗ trợ khối, cung đa tuyến hoặc độ rộng. Dùng đơn vị khai báo; nếu tệp không khai báo đơn vị thì mặc định là milimét.", + "app.the_clipboard_geometry_could_not_be_read": "Không thể đọc hình học trong bộ nhớ tạm.", + "app.the_reference_lies_on_the_rotation_axis_clear": "Tham chiếu nằm trên trục quay; xóa khóa hoặc khởi động lại bằng tham chiếu khác", + "app.toggle_model_inspector_tab": "Bật/tắt bảng thuộc tính mô hình (Tab)", + "app.toggle_x_axis_lock_select_up_to_two": "Bật/tắt khóa trục X (→). Chọn tối đa hai trục để khóa mặt phẳng; nhấn ↓ để bỏ tất cả khóa. Công cụ Vẽ hình và Xoay dùng một khóa trục làm pháp tuyến của mặt phẳng.", + "app.toggle_y_axis_lock_select_up_to_two": "Bật/tắt khóa trục Y (←). Chọn tối đa hai trục để khóa mặt phẳng; nhấn ↓ để bỏ tất cả khóa. Công cụ Vẽ hình và Xoay dùng một khóa trục làm pháp tuyến của mặt phẳng.", + "app.toggle_z_axis_lock_select_up_to_two": "Bật/tắt khóa trục Z (↑). Chọn tối đa hai trục để khóa mặt phẳng; nhấn ↓ để bỏ tất cả khóa. Công cụ Vẽ hình và Xoay dùng một khóa trục làm pháp tuyến của mặt phẳng.", + "app.tool_with_shortcut": "{tool} ({shortcut})", + "app.tools": "Công cụ", + "app.total_edge_length": "Tổng chiều dài cạnh", + "app.total_perimeter": "Tổng chu vi", + "app.unassigned": "Chưa gán", + "app.unlock_an_axis_before_locking_another_maximum_two": "Mở khóa một trục trước khi khóa trục khác (tối đa hai)", + "app.unlock_the_face_before_editing_it": "Mở khóa mặt trước khi chỉnh sửa.", + "app.unlock_the_object_before_opening_it": "Mở khóa đối tượng trước khi mở", + "app.unlock_the_selection_before_editing_it": "Mở khóa vùng chọn trước khi chỉnh sửa", + "app.unsaved": "Chưa lưu", + "app.update_ready": "Sẵn sàng cập nhật", + "app.use_lengths_or_formulas_60cm_89mm_1m_20cm": "Sử dụng độ dài hoặc công thức: 60cm - 89mm, (1m + 20cm) / 2. Toán tử: + - * / và dấu ngoặc đơn. Số đơn giản mặc định là {}; số nhân không có đơn vị. Đơn vị: mm, cm, m, km, in, ft, yd. Hình chữ nhật chấp nhận một công thức cho mỗi chiều, được phân tách bằng dấu phẩy. Thang đo sử dụng số không có đơn vị.", + "app.version": "Phiên bản {}", + "app.view": "Xem", + "app.visible_edges_and_triangulated_faces_in_metres_z": "Các cạnh nhìn thấy được và các mặt tam giác tính bằng mét, Z trở lên. Chỉ hình học.", + "app.volume": "Thể tích", + "app.wavefront_obj_obj": "Wavefront OBJ (.obj)…", + "app.wavefront_obj_obj_metres": "Wavefront OBJ (.obj; mét)…", + "app.width_height": "Chiều rộng, chiều cao", + "app.wood_joinery": "Mối nối gỗ", + "app.your_model_stays_on_this_device": "Mô hình của bạn vẫn ở trên thiết bị này", + "app.your_work_is_saved_automatically_on_this_device": "Công việc của bạn được lưu tự động trên thiết bị này. Lưu dự án .bup để giữ một bản sao di động. Các tệp .bup cũ cũng được hỗ trợ.", + "app_updates.automatic_checks_run_at_most_once_a_day": "Kiểm tra tự động chạy tối đa một lần mỗi ngày. Các bản cập nhật đã tải xuống sẽ cài đặt vào lần khởi chạy tiếp theo. Việc tắt tính năng này sẽ dừng việc kiểm tra và tải xuống tự động trong tương lai.", + "app_updates.automatically_check_and_download_updates": "Tự động kiểm tra và tải xuống các bản cập nhật", + "app_updates.check_now": "Kiểm tra ngay", + "app_updates.could_not_save_your_workspace_for_restart": "Không thể lưu không gian làm việc của bạn để khởi động lại: {e}", + "app_updates.finish_the_current_file_operation_or_modeling_preview": "Hoàn tất thao tác tệp hiện tại hoặc xem trước mô hình trước khi khởi động lại.", + "app_updates.benchup": "BenchUp {}", + "app_updates.release_notes": "Ghi chú phát hành", + "app_updates.restart_now": "Khởi động lại ngay", + "app_updates.restarting_saves_your_model_locally_and_restores_it": "Restarting lưu mô hình của bạn cục bộ và khôi phục mô hình đó sau khi cập nhật. Trước tiên hãy hoàn thành mọi bản xem trước bản vẽ hoặc mô hình.", + "app_updates.software_updates": "Cập nhật phần mềm", + "app_updates.your_model_could_not_be_saved_benchup_will": "Không thể lưu mô hình của bạn. BenchUp sẽ vẫn mở: {error}", + "app_updates.your_previous_workspace_could_not_be_restored_make": "Không thể khôi phục không gian làm việc trước đây của bạn. Thực hiện chỉnh sửa và đợi tính năng tự động lưu cục bộ để giữ lại không gian làm việc này trước khi khởi động lại.", + "common.add": "Thêm", + "common.apply": "Áp dụng", + "common.cancel": "Hủy", + "common.clear": "Xóa", + "common.close": "Đóng", + "common.create": "Tạo", + "common.delete": "Xóa", + "common.name": "Tên", + "common.none": "Không có", + "common.open": "Mở…", + "common.pieces": { + "one": "{count} chi tiết", + "other": "{count} chi tiết" + }, + "common.redo": "Làm lại", + "common.remove": "Gỡ bỏ", + "common.save": "Lưu", + "common.undo": "Hoàn tác", + "construction_guides.delete_guides": "Xóa hướng dẫn", + "context_menu.automatic_fasteners": "Phụ kiện liên kết tự động", + "context_menu.choose_a_name_for_this_object": "Đặt tên cho đối tượng này.", + "context_menu.clean_aligned_vertices": "Xóa đỉnh thẳng hàng dư thừa", + "context_menu.click_to_place_the_copy_escape_to_cancel": "Nhấp để đặt bản sao · Esc để hủy", + "context_menu.close_editing_context": "Đóng ngữ cảnh chỉnh sửa", + "context_menu.copy": "Sao chép", + "context_menu.create_component": "Tạo thành phần…", + "context_menu.cut": "Cắt", + "context_menu.duplicate": "Nhân bản", + "context_menu.edit_component": "Chỉnh sửa thành phần", + "context_menu.edit_group": "Chỉnh sửa nhóm", + "context_menu.edit_text": "Chỉnh sửa văn bản…", + "context_menu.explode": "Tách rời", + "context_menu.hide": "Ẩn", + "context_menu.lock": "Khóa", + "context_menu.make_group": "Tạo nhóm…", + "context_menu.no_redundant_aligned_vertices_in_the_selection": "Không có đỉnh thẳng hàng dư thừa trong vùng chọn", + "context_menu.paste": "Dán", + "context_menu.paste_in_place": "Dán tại chỗ", + "context_menu.removed_redundant_vertices": { + "one": "Đã xóa {count} đỉnh thẳng hàng dư thừa", + "other": "Đã xóa {count} đỉnh thẳng hàng dư thừa" + }, + "context_menu.rename": "Đổi tên…", + "context_menu.rename_2": "Đổi tên", + "context_menu.ungroup": "Bỏ nhóm", + "context_menu.unhide": "Hiện", + "context_menu.unlock": "Mở khóa", + "core.annotations.enter_text_between_1_and_4096_bytes": "Nhập văn bản từ 1 đến 4096 byte", + "core.annotations.invalid_text_annotation": "Chú thích văn bản không hợp lệ", + "core.annotations.text_coordinates_must_be_finite_and_within_the": "Tọa độ văn bản phải hữu hạn và nằm trong giới hạn của mô hình.", + "core.annotations.text_is_outside_the_model_limits": "Văn bản nằm ngoài giới hạn của mô hình.", + "core.annotations.text_no_longer_exists": "Văn bản không còn tồn tại", + "core.annotations.unlock_the_text_before_editing_it": "Mở khóa văn bản trước khi chỉnh sửa", + "core.camera.back": "Phía sau", + "core.camera.bottom": "Dưới", + "core.camera.front": "Mặt trước", + "core.camera.iso": "Đẳng trục", + "core.camera.left": "Trái", + "core.camera.right": "Phải", + "core.camera.top": "Trên", + "core.cleanup.unlock_the_selection_before_cleaning_it": "Mở khóa vùng chọn trước khi làm sạch nó", + "core.connections.angled_screw": "Vít bắt xiên", + "core.connections.close_to_an_edge_check_the_geometric_clearance": "Gần cạnh: kiểm tra khoảng hở hình học", + "core.connections.degenerate_face": "Mặt suy biến", + "core.connections.fastener_is_outside_the_entry_face": "Chi tiết liên kết {} nằm ngoài mặt bắt đầu.", + "core.connections.fastener_is_outside_the_second_part": "Chi tiết liên kết nằm ngoài bộ phận thứ hai.", + "core.connections.fasteners_overlap_or_there_is_not_enough_space": "Các chi tiết liên kết bị chồng lấn hoặc không đủ chỗ cho cách bố trí này.", + "core.connections.format": " · ", + "core.connections.invalid_settings_or_pair_of_parts": "Cài đặt hoặc cặp bộ phận không hợp lệ", + "core.connections.invalid_vertices": "Đỉnh không hợp lệ", + "core.connections.maximum_of_1_000_fasteners_per_connection": "Tối đa 1.000 chi tiết liên kết cho mỗi mối nối.", + "core.connections.nail": "Đinh", + "core.connections.no_penetration_into_the_second_part": "Không xâm nhập vào phần thứ hai", + "core.connections.no_shared_area_on_this_face": "Không có vùng tiếp xúc chung trên mặt này.", + "core.connections.only_planar_faces_are_supported": "Chỉ hỗ trợ các mặt phẳng", + "core.connections.part_is_missing": "Thiếu một phần", + "core.connections.part_is_missing_or_has_been_deleted": "Phần bị thiếu hoặc đã bị xóa", + "core.connections.screw": "Vít", + "core.connections.select_two_visible_editable_boards_in_the_current": "Chọn hai tấm ván đang hiển thị và có thể chỉnh sửa trong ngữ cảnh hiện tại.", + "core.connections.the_entry_face_is_missing_or_does_not": "Thiếu mặt bắt đầu hoặc mặt này không thuộc bộ phận thứ nhất.", + "core.connections.the_part_must_be_a_closed_solid": "Bộ phận phải là một khối đặc kín.", + "core.connections.the_parts_have_no_usable_contact_in_this": "Các bộ phận không tiếp xúc phù hợp theo hướng này.", + "core.connections.the_tip_protrudes_beyond_the_second_part": "Đầu vít nhô ra khỏi bộ phận thứ hai.", + "core.connections.these_pieces_already_have_a_wood_joint_edit": "Các chi tiết này đã có mối nối gỗ. Hãy chỉnh sửa hoặc xóa mối nối hiện tại trước.", + "core.csg.these_solids_are_too_complex_for_this_operation": "Các chất rắn này quá phức tạp cho hoạt động này", + "core.csg.these_solids_need_too_many_clipping_planes": "Những vật rắn này cần quá nhiều mặt phẳng cắt", + "core.display.hidden_line": "Nét khuất", + "core.display.monochrome": "Đơn sắc", + "core.display.shaded": "Đổ bóng", + "core.display.shaded_with_materials": "Được tô bóng bằng vật liệu", + "core.display.wireframe": "Khung dây", + "core.document.a_map_or_an_empty_legacy_array": "một đối tượng hoặc một mảng cũ rỗng", + "core.document.coordinates_must_be_finite": " Tọa độ phải là hữu hạn", + "core.document.coordinates_must_be_within_ten_billion_meters_of": " Tọa độ phải cách điểm gốc trong vòng 10 tỷ mét", + "core.document.expected_a_map_only_empty_legacy_arrays_are": " mong đợi một bản đồ; chỉ hỗ trợ các mảng kế thừa trống", + "core.document.face_boundary_is_missing_an_edge": "Ranh giới mặt thiếu cạnh", + "core.document.give_your_line_a_little_length": "Hãy kéo dài dòng của bạn một chút", + "core.document.invalid_camera": "Máy ảnh không hợp lệ", + "core.document.invalid_connection_parameters": "Tham số kết nối không hợp lệ", + "core.document.invalid_construction_guide": "Hướng dẫn xây dựng không hợp lệ", + "core.document.invalid_display_settings": "Cài đặt hiển thị không hợp lệ", + "core.document.invalid_edge": "Cạnh không hợp lệ", + "core.document.invalid_face_boundary": "Ranh giới mặt không hợp lệ", + "core.document.invalid_face_id": "ID mặt không hợp lệ.", + "core.document.invalid_face_surface": "Bề mặt không hợp lệ", + "core.document.invalid_model_ids": "ID mô hình không hợp lệ.", + "core.document.invalid_vertex": "Đỉnh không hợp lệ", + "core.document.model_is_too_large": "Mô hình quá lớn", + "core.document.paint_refers_to_a_missing_face": "Màu tô tham chiếu đến một mặt không tồn tại", + "core.document.that_edge_already_exists": "Cạnh đó đã tồn tại", + "core.document.unsupported_document_version": "Phiên bản tài liệu không được hỗ trợ", + "core.document.untitled_model": "Mô hình chưa đặt tên", + "core.edit_context.a_component_cannot_contain_its_own_definition": "Một thành phần không thể chứa định nghĩa của chính nó", + "core.edit_context.cannot_move_objects_between_instances_of_the_same": "Không thể di chuyển các đối tượng giữa các phiên bản của cùng một thành phần", + "core.edit_context.cyclic_component_definitions": "Định nghĩa thành phần tuần hoàn", + "core.edit_context.missing_component": "Thiếu thành phần", + "core.edit_context.missing_component_definition": "Thiếu định nghĩa thành phần", + "core.edit_context.missing_editing_context": "Thiếu bối cảnh chỉnh sửa", + "core.edit_context.missing_object": "Thiếu vật thể", + "core.edit_context.no_object_is_open_for_editing": "Không có đối tượng nào được mở để chỉnh sửa", + "core.edit_context.the_editing_context_no_longer_exists": "Ngữ cảnh chỉnh sửa không còn tồn tại", + "core.edit_context.unlock_the_object_before_editing_it": "Mở khóa đối tượng trước khi chỉnh sửa", + "core.guides.choose_a_direction_for_the_guide": "Chọn hướng cho đường dẫn", + "core.guides.invalid_guide_coordinates": "Tọa độ hướng dẫn không hợp lệ", + "core.inference.aligned_axes": "Trục thẳng hàng", + "core.inference.blue_axis": "Trục xanh dương", + "core.inference.endpoint": "Đầu mút", + "core.inference.face_center": "Tâm mặt", + "core.inference.green_axis": "Trục xanh lá", + "core.inference.guide_point": "Điểm dẫn hướng", + "core.inference.midpoint": "Trung điểm", + "core.inference.on_blue_axis": "Trên trục màu xanh", + "core.inference.on_edge": "Trên cạnh", + "core.inference.on_face": "Trên mặt", + "core.inference.on_green_axis": "Trên trục màu xanh lá cây", + "core.inference.on_guide": "Trên đường dẫn", + "core.inference.on_plane": "Trên mặt phẳng", + "core.inference.on_red_axis": "Trên trục màu đỏ", + "core.inference.origin": "Gốc tọa độ", + "core.inference.red_axis": "Trục đỏ", + "core.joinery.boards_must_have_finite_positive_dimensions": "Tấm ván phải có kích thước hữu hạn và lớn hơn 0.", + "core.joinery.cannot_read_joint_result": "Không thể đọc kết quả mối nối.", + "core.joinery.choose_a_tail_width_that_fits_the_overlap": "Chọn chiều rộng đuôi mộng phù hợp với phần chồng lấn và tạo không quá 64 đuôi mộng.", + "core.joinery.choose_boards_with_positive_solid_volume": "Chọn các tấm ván có thể tích khối đặc lớn hơn 0.", + "core.joinery.choose_two_different_boards": "Chọn hai tấm ván khác nhau.", + "core.joinery.choose_two_groups_or_components": "Chọn hai nhóm hoặc thành phần", + "core.joinery.clearance_is_too_large_for_this_joint": "Khoảng cách quá lớn đối với mối nối này", + "core.joinery.dovetail": "Mộng đuôi én", + "core.joinery.dovetail_angle_or_depth_leaves_no_material_at": "Góc hoặc độ sâu mộng đuôi én không chừa lại vật liệu ở cổ mộng.", + "core.joinery.each_part_must_contain_only_board_geometry_select": "Mỗi bộ phận chỉ được chứa hình học của tấm ván; hãy chọn từng tấm riêng lẻ, không chọn cụm lắp ráp.", + "core.joinery.finger_joint": "Mối ghép ngón", + "core.joinery.first_board": "Tấm ván thứ nhất", + "core.joinery.half_lap": "Mộng chồng nửa", + "core.joinery.invalid_wood_joint_settings_or_pair_of_boards": "Cài đặt mối nối gỗ hoặc cặp tấm ván không hợp lệ.", + "core.joinery.joint_cut": "Đường cắt mối nối", + "core.joinery.joint_details_are_too_small_for_the_model": "Các chi tiết khớp quá nhỏ so với độ chính xác của mô hình", + "core.joinery.joint_result": "Kết quả mối nối", + "core.joinery.lower_end": "Đầu dưới", + "core.joinery.mortise_and_tenon": "Mộng âm và mộng dương", + "core.joinery.position_the_boards_with_a_shared_volume_their": "Đặt hai tấm ván sao cho chúng chồng lấn về thể tích; phần chồng lấn xác định độ sâu mối nối.", + "core.joinery.rabbet": "Mộng bậc", + "core.joinery.second_board": "Tấm ván thứ hai", + "core.joinery.the_board_has_no_geometry": "Tấm ván không có hình học.", + "core.joinery.the_clearance_is_too_small_for_the_model": "Khoảng hở quá nhỏ so với độ chính xác của mẫu", + "core.joinery.the_joint_cannot_be_represented_as_valid_solid": "Không thể biểu diễn mối nối dưới dạng hình học khối đặc hợp lệ.", + "core.joinery.the_joint_would_remove_an_entire_board": "Mối nối sẽ loại bỏ toàn bộ tấm ván.", + "core.joinery.the_profile_does_not_divide_the_shared_material": "Biên dạng không chia được phần vật liệu chung; hãy chọn hướng hoặc kích thước biên dạng khác.", + "core.joinery.tongue_and_groove": "Mộng lưỡi và rãnh", + "core.joinery.upper_end": "Đầu trên", + "core.joinery_frame.choose_two_groups_or_components": "Chọn hai nhóm hoặc thành phần", + "core.joinery_frame.each_part_must_contain_only_board_geometry_select": "Mỗi bộ phận chỉ được chứa hình học của tấm ván; hãy chọn từng tấm riêng lẻ, không chọn cụm lắp ráp.", + "core.joinery_frame.the_board_has_no_geometry": "Tấm ván không có hình học.", + "core.joinery_frame.the_board_has_no_planar_faces": "Tấm ván không có mặt phẳng.", + "core.joinery_trim.missing_board_geometry": "Thiếu hình học tấm ván.", + "core.joinery_trim.the_joint_would_remove_an_entire_board": "Mối nối sẽ loại bỏ toàn bộ tấm ván.", + "core.joinery_trim.trimming_would_remove_an_entire_board_keep_the": "Cắt xén sẽ loại bỏ toàn bộ tấm ván; hãy giữ lại đầu còn lại.", + "core.measurements.choose_angle_points_away_from_vertex": "Chọn hai điểm góc cách đỉnh", + "core.measurements.choose_two_different_dimension_endpoints": "Chọn hai điểm cuối thứ nguyên khác nhau", + "core.measurements.dimension_coordinates_must_be_finite_and_within_the": "Tọa độ kích thước phải hữu hạn và nằm trong giới hạn mô hình", + "core.measurements.dimension_is_outside_the_model_limits": "Kích thước nằm ngoài giới hạn của mô hình.", + "core.measurements.invalid_dimension": "Kích thước không hợp lệ", + "core.measurements.invalid_dimension_attachment": "Tệp đính kèm kích thước không hợp lệ", + "core.measurements.invalid_dimension_attachment_weights": "Trọng số đính kèm kích thước không hợp lệ", + "core.measurements.invalid_dimension_position": "Vị trí kích thước không hợp lệ", + "core.modeling.cannot_offset_a_folded_boundary": "Không thể bù đắp ranh giới gấp", + "core.modeling.cannot_offset_this_corner": "Không thể bù góc này", + "core.modeling.choose_a_rotation_axis_first": "Chọn trục quay trước", + "core.modeling.choose_an_axis_that_is_not_parallel_to": "Chọn trục không song song với mặt hoặc xóa khóa trục", + "core.modeling.click_a_face_in_a_group_or_component": "Nhấp vào mặt trong nhóm hoặc thành phần để tô màu.", + "core.modeling.click_a_filled_face_first": "Trước tiên, hãy nhấp vào một mặt đã tô.", + "core.modeling.click_a_filled_face_to_paint_it": "Nhấp vào mặt đã tô để đổi màu.", + "core.modeling.double_click_the_object_to_edit_its_faces": "Nhấp đúp vào đối tượng để chỉnh sửa các mặt.", + "core.modeling.enter_a_finite_displacement": "Nhập một chuyển vị hữu hạn", + "core.modeling.enter_a_finite_rotation_and_pivot": "Nhập một phép quay và trục quay hữu hạn", + "core.modeling.enter_a_nonzero_distance_in_meters": "Nhập khoảng cách khác 0 tính bằng mét", + "core.modeling.enter_a_nonzero_offset_in_meters": "Nhập độ lệch khác 0 tính bằng mét", + "core.modeling.enter_a_positive_scale_factor_such_as_2": "Nhập hệ số tỷ lệ dương, chẳng hạn như 2 hoặc 0,5", + "core.modeling.offset_boundaries_would_overlap": "Các ranh giới lệch nhau sẽ chồng lên nhau", + "core.modeling.offset_is_too_large_for_this_face": "Độ lệch quá lớn so với mặt này.", + "core.modeling.offset_is_too_large_or_crosses_itself": "Độ lệch quá lớn hoặc tự giao nhau.", + "core.modeling.scoped_moves_require_component_synchronization": "Di chuyển trong phạm vi yêu cầu đồng bộ hóa thành phần", + "core.modeling.select_geometry_a_dimension_text_or_a_guide": "Trước tiên, hãy chọn hình học, kích thước, văn bản hoặc đường dẫn.", + "core.modeling.select_geometry_to_flip_first": "Trước tiên, hãy chọn hình học cần lật.", + "core.modeling.the_face_must_be_planar": "Mặt phải phẳng", + "core.modeling.the_group_or_component_has_no_faces_to": "Nhóm hoặc thành phần không có mặt nào để tô màu.", + "core.modeling.this_change_would_collapse_a_guide": "Thay đổi này sẽ thu gọn hướng dẫn", + "core.modeling.this_change_would_collapse_an_edge_or_bend": "Sự thay đổi này sẽ làm thu gọn một cạnh hoặc làm cong một mặt; chọn hình học được kết nối của nó", + "core.modeling.unlock_all_faces_in_the_group_or_component": "Mở khóa tất cả các mặt trong nhóm hoặc thành phần trước khi tô màu.", + "core.modeling.unlock_the_connected_geometry_before_editing_it": "Mở khóa hình học được kết nối trước khi chỉnh sửa nó", + "core.modeling.unlock_the_face_before_painting_it": "Mở khóa mặt trước khi tô màu.", + "core.modeling.unlock_the_group_or_component_before_painting_it": "Mở khóa nhóm hoặc thành phần trước khi tô màu.", + "core.modeling.unlock_the_object_before_editing_it": "Mở khóa đối tượng trước khi chỉnh sửa", + "core.modeling.unlock_the_selected_items_and_their_children_before": "Mở khóa các mục đã chọn và các mục con của chúng trước khi xóa màu", + "core.modeling.unlock_the_selection_before_editing_it": "Mở khóa vùng chọn trước khi chỉnh sửa", + "core.objects.a_group_cannot_have_a_component_mapping": "Nhóm không thể có ánh xạ thành phần", + "core.objects.component": "Thành phần", + "core.objects.cyclic_object_membership": "Thành viên đối tượng tuần hoàn", + "core.objects.duplicate_entity_id": "ID thực thể trùng lặp", + "core.objects.group": "Nhóm", + "core.objects.invalid_grain_direction": "Hướng vân gỗ không hợp lệ.", + "core.objects.select_an_unlocked_part": "Chọn một bộ phận đã mở khóa.", + "core.objects.incomplete_component_instance_mapping": "Ánh xạ phiên bản thành phần chưa hoàn chỉnh", + "core.objects.invalid_component_definition": "Định nghĩa thành phần không hợp lệ", + "core.objects.invalid_component_instance_mapping": "Ánh xạ phiên bản thành phần không hợp lệ", + "core.objects.invalid_entity_state": "Trạng thái thực thể không hợp lệ", + "core.objects.invalid_object": "Đối tượng không hợp lệ", + "core.objects.invalid_object_membership": "Thành viên đối tượng không hợp lệ", + "core.objects.mismatched_component_instances": "Các bản thể thành phần không khớp.", + "core.reparent.an_object_cannot_be_moved_into_itself_or": "Không thể di chuyển đối tượng vào chính nó hoặc các đối tượng con của nó", + "core.reparent.choose_an_insertion_point_outside_the_dragged_objects": "Chọn điểm chèn bên ngoài đối tượng được kéo", + "core.reparent.drag_groups_or_components_to_move_them_in": "Kéo các nhóm hoặc thành phần để di chuyển chúng trong Outliner", + "core.reparent.drop_inside_a_group_or_between_sibling_objects": "Thả vào trong một nhóm hoặc giữa các đối tượng anh em", + "core.reparent.show_and_unlock_the_destination_group_before_moving": "Hiển thị và mở khóa nhóm đích trước khi di chuyển đối tượng vào đó", + "core.reparent.show_the_parent_object_before_moving_its_contents": "Hiển thị đối tượng gốc trước khi di chuyển nội dung của nó", + "core.reparent.unlock_the_objects_and_their_contents_before_moving": "Mở khóa các đối tượng và nội dung của chúng trước khi di chuyển chúng", + "core.solids.cannot_join_the_clipped_face_boundaries": "Không thể nối các ranh giới mặt bị cắt bớt", + "core.solids.cannot_orient_the_clipped_face_boundaries": "Không thể định hướng các ranh giới mặt bị cắt", + "core.solids.choose_a_body_in_the_current_editing_context": "Chọn một khối trong ngữ cảnh chỉnh sửa hiện tại.", + "core.solids.choose_a_closed_solid_group_component_or_connected": "Chọn nhóm, thành phần hoặc khối liên kết tạo thành khối đặc kín.", + "core.solids.choose_a_closed_solid_with_filled_faces": "Chọn một khối đặc kín có các mặt được lấp đầy.", + "core.solids.choose_geometry_with_filled_faces": "Chọn hình học có các mặt được lấp đầy.", + "core.solids.choose_overlapping_solids_for_this_operation": "Chọn các khối đặc chồng lấn cho thao tác này.", + "core.solids.choose_two_different_solids": "Chọn hai khối đặc khác nhau.", + "core.solids.combine": "Kết hợp", + "core.solids.each_body_must_be_a_closed_solid_fill": "Mỗi vật thể phải là một khối đặc kín; hãy lấp các mặt còn thiếu và xóa hình học bên trong hoặc rời rạc.", + "core.solids.intersect": "Giao nhau", + "core.solids.intersection": "Phần giao", + "core.solids.missing_object_contents": "Thiếu nội dung đối tượng", + "core.solids.open_bodies_must_lie_in_the_same_plane": "Các vật thể hở phải nằm trên cùng một mặt phẳng để giao nhau.", + "core.solids.remove_overlapping_faces_inside_the_planar_body": "Xóa các mặt chồng lên nhau bên trong thân phẳng", + "core.solids.remove_stray_edges_before_using_a_solid_tool": "Xóa các cạnh rời rạc trước khi dùng công cụ khối đặc.", + "core.solids.show_both_solids_before_editing_them": "Hiển thị cả hai khối trước khi chỉnh sửa chúng", + "core.solids.split": "Tách", + "core.solids.split_a": "Chia A", + "core.solids.split_b": "Chia B", + "core.solids.split_overlap": "Tách chồng chéo", + "core.solids.the_bodies_have_no_shared_surface": "Các vật thể không có bề mặt chung.", + "core.solids.the_body_has_no_enclosed_volume": "Vật thể không có thể tích kín.", + "core.solids.the_body_needs_filled_faces_to_form_a": "Vật thể cần có các mặt được lấp đầy để tạo thành khối đặc kín.", + "core.solids.the_clipped_boundary_crosses_itself": "Ranh giới bị cắt đi qua chính nó", + "core.solids.the_result_cannot_be_represented_as_valid_planar": "Kết quả không thể được biểu diễn dưới dạng hình học phẳng hợp lệ", + "core.solids.the_result_cannot_form_a_closed_solid_at": "Kết quả không thể tạo thành khối đặc kín với độ chính xác này.", + "core.solids.the_result_cannot_form_a_valid_closed_solid": "Kết quả không thể tạo thành khối đặc kín hợp lệ với độ chính xác này.", + "core.solids.the_result_contains_a_collapsed_face": "Kết quả chứa một mặt bị thu gọn", + "core.solids.the_result_contains_details_smaller_than_the_model": "Kết quả chứa các chi tiết nhỏ hơn độ chính xác của mô hình", + "core.solids.the_result_has_too_many_surface_fragments": "Kết quả có quá nhiều mảnh bề mặt", + "core.solids.the_solid_contains_a_collapsed_face": "Khối đặc chứa một mặt bị suy biến.", + "core.solids.the_solid_has_inconsistent_surface_topology": "Tô pô bề mặt của khối đặc không nhất quán.", + "core.solids.the_solid_is_too_small": "Khối đặc quá nhỏ.", + "core.solids.the_solids_have_no_shared_volume": "Các khối đặc không có thể tích chung.", + "core.solids.these_solids_have_too_many_vertices_for_this": "Các khối đặc này có quá nhiều đỉnh cho phép toán này", + "core.solids.this_solid_has_too_many_faces_for_this": "Khối đặc này có quá nhiều mặt cho thao tác đó.", + "core.solids.trim": "Cắt xén", + "core.solids.trimmed": "Đã cắt xén", + "core.solids.union": "Hợp nhất", + "core.solids.unlock_both_solids_before_editing_them": "Mở khóa cả hai khối trước khi chỉnh sửa chúng", + "core.surface_treatment.a_list_or_legacy_tuple_of_sanding_settings": "a danh sách hoặc bộ cài đặt chà nhám cũ", + "core.surface_treatment.grit": "{grit} nhám", + "core.surface_treatment.grit_after_coat": "{grit} (lớp phủ sau {coat})", + "core.surface_treatment.pre_stain_coat": "Pre-stain · sơn phủ {coat}", + "core.surface_treatment.sanding_grit": "Chà nhám · {grit} hạt sạn", + "core.surface_treatment.sanding_grit_after_coat": " Chà nhám · Hạt nhám {grit} (lớp phủ sau {coat})", + "core.surface_treatment.stain_coat": "Stain · lớp phủ {coat}", + "core.surface_treatment.varnish_coat": "Varnish · lớp phủ {coat}", + "core.tags.a_tag_with_that_name_already_exists": "Thẻ có tên đó đã tồn tại", + "core.tags.choose_a_tag_name_of_1128_characters_other": "Chọn tên thẻ gồm 1-128 ký tự ngoài Untagged", + "core.tags.invalid_tags": "Thẻ không hợp lệ", + "core.tags.missing_tag": "Thiếu thẻ", + "core.tags.unlock_the_selection_before_assigning_a_tag": "Mở khóa lựa chọn trước khi gán thẻ", + "core.units.acres_ac": "Mẫu Anh (ac)", + "core.units.centimeters_cm": "Xentimét (cm)", + "core.units.cubic_centimeters_cm3": "Xentimét khối (cm³)", + "core.units.cubic_feet_ft3": "Feet khối (ft³)", + "core.units.cubic_inches_in3": "Inch khối (in³)", + "core.units.cubic_meters_m3": "Mét khối (m³)", + "core.units.cubic_millimeters_mm3": "Milimét khối (mm³)", + "core.units.cubic_yards_yd3": "Thước Anh khối (yd³)", + "core.units.degrees": "Độ (°)", + "core.units.feet_ft": "Feet (ft)", + "core.units.gradians_gon": "Độ grad (gon)", + "core.units.hectares_ha": "Héc-ta (ha)", + "core.units.inches_in": "Inch (in)", + "core.units.kilometers_km": "Kilômét (km)", + "core.units.liters_l": "Lít (L)", + "core.units.meters_m": "Mét (m)", + "core.units.milliliters_ml": "Mililít (mL)", + "core.units.millimeters_mm": "Milimét (mm)", + "core.units.radians_rad": "Radian (rad)", + "core.units.square_centimeters_cm2": "Xentimét vuông (cm²)", + "core.units.square_feet_ft2": "Feet vuông (ft²)", + "core.units.square_inches_in2": "Inch vuông (in²)", + "core.units.square_kilometers_km2": "Kilômét vuông (km²)", + "core.units.square_meters_m2": "Mét vuông (m²)", + "core.units.square_millimeters_mm2": "Milimét vuông (mm²)", + "core.units.square_yards_yd2": "Thước Anh vuông (yd²)", + "core.units.yards_yd": "Thước Anh (yd)", + "currency.australian_dollar": "Đô la Úc", + "currency.brazilian_real": "Đồng real Brazil", + "currency.british_pound": "Bảng Anh", + "currency.canadian_dollar": "Đô la Canada", + "currency.chilean_peso": "Peso Chile", + "currency.chinese_yuan": "Nhân dân tệ", + "currency.code_and_name": "{code} — {name}", + "currency.colombian_peso": "Đồng peso Colombia", + "currency.czech_koruna": "Đồng koruna Séc", + "currency.danish_krone": "Đồng krone Đan Mạch", + "currency.euro": "Đồng euro", + "currency.hong_kong_dollar": "Đô la Hồng Kông", + "currency.hungarian_forint": "Đồng forint Hungary", + "currency.indian_rupee": "Rupee Ấn Độ", + "currency.indonesian_rupiah": "Rupiah Indonesia", + "currency.israeli_shekel": "Đồng shekel Israel", + "currency.japanese_yen": "Yên Nhật", + "currency.malaysian_ringgit": "Ringgit Malaysia", + "currency.mexican_peso": "Peso Mexico", + "currency.new_zealand_dollar": "Đô la New Zealand", + "currency.no_currencies_match_your_search": "Không có loại tiền tệ nào phù hợp với tìm kiếm của bạn.", + "currency.norwegian_krone": "Krone Na Uy", + "currency.philippine_peso": "Đồng peso Philippines", + "currency.polish_zloty": "Đồng zloty Ba Lan", + "currency.romanian_leu": "Đồng leu Romania", + "currency.saudi_riyal": "Đồng riyal Ả Rập Xê Út", + "currency.search_code_or_name": "Mã tìm kiếm hoặc tên…", + "currency.singapore_dollar": "Đô la Singapore", + "currency.south_african_rand": "Rand Nam Phi", + "currency.south_korean_won": "Won Hàn Quốc", + "currency.swedish_krona": "Krona Thụy Điển", + "currency.swiss_franc": "Franc Thụy Sĩ", + "currency.taiwan_dollar": "Đô la Đài Loan", + "currency.thai_baht": "Đồng baht Thái Lan", + "currency.turkish_lira": "Đồng lira Thổ Nhĩ Kỳ", + "currency.uae_dirham": "Dirham Các Tiểu vương quốc Ả Rập Thống nhất", + "currency.us_dollar": "Đô la Mỹ", + "currency.vietnamese_dong": "Việt Nam Đồng", + "cutting_layout.stock_dimensions_must_be_1_1_000_000": "Kích thước phôi phải từ 1 đến 1.000.000 mm; độ rộng mạch cưa phải từ 0 đến 100 mm.", + "cutting_plan.approx_nominal": "Kích thước danh nghĩa xấp xỉ: {stock}", + "cutting_plan.board": "VÁN", + "cutting_plan.boards_required": { + "one": "Cần {count} tấm ván | Mạch cưa: {kerf}", + "other": "Cần {count} tấm ván | Mạch cưa: {kerf}" + }, + "cutting_plan.check_shape_bounding_blank_only": "KIỂM TRA HÌNH DẠNG — chỉ tính theo bao phôi", + "cutting_plan.cm": "{} cm", + "cutting_plan.continued": "{title} (tiếp theo)", + "cutting_plan.continued_2": "(tiếp theo)", + "cutting_plan.cut_length": "CHIỀU DÀI CẮT", + "cutting_plan.cut_list": "DANH SÁCH CẮT", + "cutting_plan.cut_list_summary": "{pieces} | {sizes} | Kích thước tính bằng mm hoặc cm", + "cutting_plan.cutting_plan": "Kế hoạch cắt", + "cutting_plan.date_unavailable": "Không có ngày", + "cutting_plan.does_not_fit_selected_stock": "KHÔNG VỪA VỚI PHÔI ĐÃ CHỌN", + "cutting_plan.footer_note": "Kích thước hoàn thiện - xác minh trước khi cắt", + "cutting_plan.group": "NHÓM", + "cutting_plan.mark": "KÝ HIỆU", + "cutting_plan.material_x_x": "Vật liệu: {} ({} x {} x {})", + "cutting_plan.mm": "{} mm", + "cutting_plan.mm_2": "{}.{:01} mm", + "cutting_plan.net_cut_area_m2": "{pieces} | Diện tích cắt thực: {area:.2} m²", + "cutting_plan.no_visible_three_dimensional_parts_with_assigned_stock": "Không tìm thấy bộ phận 3D nào đang hiển thị và đã được gán vật liệu phôi. Hãy gán vật liệu trong bảng giá vật liệu thuộc Thông tin đối tượng. Mô hình hóa mỗi tấm ván thành một nhóm/thành phần riêng hoặc một khối đặc rời. Chọn tấm ván/cụm lắp ráp hoặc dùng toàn bộ dự án.", + "cutting_plan.omitted_items": { + "one": "Bỏ qua {count} mục vì chưa gán vật liệu phôi hoặc độ dày không phù hợp.", + "other": "Bỏ qua {count} mục vì chưa gán vật liệu phôi hoặc độ dày không phù hợp." + }, + "cutting_plan.oversized_cut": { + "one": "{mark}: {count} chi tiết, {width} x {length} · Chọn phôi lớn hơn", + "other": "{mark}: {count} chi tiết, {width} x {length} · Chọn phôi lớn hơn" + }, + "cutting_plan.page_number": "Trang {page} / {count}", + "cutting_plan.qty": "SL", + "cutting_plan.rotation_used": " (đã xoay)", + "cutting_plan.section_t_x_w": "TIẾT DIỆN (DÀY x RỘNG)", + "cutting_plan.selected_parts_visible_only": "Các bộ phận được chọn (chỉ hiển thị)", + "cutting_plan.sizes": { + "one": "{count} kích thước", + "other": "{count} kích thước" + }, + "cutting_plan.stock": "PHÔI", + "cutting_plan.stock_count_covers_fitting_cuts_only_oversized_cuts": "Số lượng phôi chỉ tính các đường cắt vừa khổ; các đường cắt quá khổ được liệt kê riêng.", + "cutting_plan.stock_page_heading": "{} {} của {}", + "cutting_plan.stock_required": { + "one": "Vật liệu phôi cần dùng: {count} tấm | Mạch cưa: {kerf}", + "other": "Vật liệu phôi cần dùng: {count} tấm | Mạch cưa: {kerf}" + }, + "cutting_plan.stock_x_kerf_gray_offcut_kerf": "Phôi: {} x {} | Mạch cưa: {} | Màu xám: phần thừa / mạch cưa", + "cutting_plan.the_project_name_is_too_long_to_fit": "Tên dự án quá dài để vừa với nhãn xưởng.", + "cutting_plan.unnamed_part": "Chi tiết chưa đặt tên", + "cutting_plan.workshop_labels": "Nhãn xưởng", + "desktop_files.missing_project_output_path": "Thiếu đường dẫn đầu ra của dự án BenchUp", + "desktop_files.missing_sketchup_file_path": "Thiếu đường dẫn tệp SketchUp", + "drawing_groups.the_drawing_could_not_be_grouped": "Không thể nhóm bản vẽ", + "entity_gizmo.axis_lengths": "Độ dài trục: {}. {}. {}.", + "entity_gizmo.object_lenghts": "Chiều dài đối tượng", + "entity_gizmo.solid_lengths_along_world_axes_orientation_follows_the": "Độ dài rắn dọc theo trục thế giới. Định hướng theo chế độ xem đang hoạt động.", + "environment.background": "Nền", + "environment.environment": "Môi trường", + "environment.ground": "Mặt đất", + "environment.horizon": "Đường chân trời", + "environment.reset_environment_colors": "Đặt lại màu môi trường", + "environment.sky": "Bầu trời", + "estimate_pdf.amount": "Thành tiền ({})", + "estimate_pdf.april": "Tháng 4", + "estimate_pdf.august": "Tháng 8", + "estimate_pdf.continued": "{group} (tiếp theo)", + "estimate_pdf.cost_estimate": "Dự toán chi phí", + "estimate_pdf.could_not_load_report_font": "Không thể tải phông chữ báo cáo: {error}", + "estimate_pdf.could_not_load_report_symbol_font": "Không thể tải phông chữ biểu tượng báo cáo: {error}", + "estimate_pdf.could_not_read_the_generation_date": "Không thể đọc ngày tạo: {error}", + "estimate_pdf.count": "Số lượng", + "estimate_pdf.december": "Tháng 12", + "estimate_pdf.drying_waiting": "Thời gian chờ/sấy", + "estimate_pdf.february": "Tháng 2", + "estimate_pdf.generated_utc": "Đã tạo: {day} {} {year} (UTC)", + "estimate_pdf.hands_on": "Thời gian làm", + "estimate_pdf.hands_on_work": "Thời gian làm việc", + "estimate_pdf.includes_final_drying_objects_dry_together_between_steps": "Đã tính thời gian khô cuối cùng. Các đối tượng khô đồng thời giữa các công đoạn.", + "estimate_pdf.item": "Hạng mục", + "estimate_pdf.january": "Tháng 1", + "estimate_pdf.joinery_whole_project": "Mối nối gỗ (toàn bộ dự án)", + "estimate_pdf.joint": "Mối nối", + "estimate_pdf.july": "Tháng 7", + "estimate_pdf.june": "Tháng 6", + "estimate_pdf.benchup_planning_estimate_verify_before_purchasing": "BenchUp — Ước tính để lập kế hoạch; hãy kiểm tra trước khi mua", + "estimate_pdf.march": "Tháng 3", + "estimate_pdf.materials": "Vật liệu", + "estimate_pdf.may": "Tháng 5", + "estimate_pdf.minutes_joint": "Phút / mối nối", + "estimate_pdf.no_configured_wood_joints": "Chưa cấu hình mối nối gỗ.", + "estimate_pdf.november": "Tháng 11", + "estimate_pdf.october": "Tháng 10", + "estimate_pdf.page_number": "{} / {count}", + "estimate_pdf.quantity": "Số lượng", + "estimate_pdf.september": "Tháng 9", + "estimate_pdf.sequential_total": "Tổng thời gian theo trình tự", + "estimate_pdf.summary": "Tóm tắt", + "estimate_pdf.task": "Công việc", + "estimate_pdf.the_pdf_font_cannot_display_u_replace_this": "Phông chữ PDF không thể hiển thị '{ch}' (U+{:04X}). Thay thế ký tự này trước khi xuất; báo cáo không bị cắt bớt.", + "estimate_pdf.time_cost_estimates": "Ước tính thời gian và chi phí", + "estimate_pdf.too_many_distinct_characters_for_one_estimate_pdf": "Quá nhiều ký tự riêng biệt cho một bản PDF ước tính.", + "estimate_pdf.total": "Tổng cộng", + "estimate_pdf.unit_price": "Đơn giá ({})", + "fasteners.angle_from_face_normal": "Góc so với pháp tuyến của mặt", + "fasteners.angled_axis_only_the_pocket_recess_and_kreg": "Chỉ trục bắt vít được đặt góc; hốc chìm và thông số đồ gá Kreg không được mô phỏng.", + "fasteners.angled_screw": "Vít bắt xiên", + "fasteners.auto_face": "Tự động chọn mặt", + "fasteners.automatic": "Tự động", + "fasteners.automatic_entry_face": "Tự động chọn mặt bắt đầu", + "fasteners.automatic_face": "Tự động chọn mặt", + "fasteners.automatic_fasteners": "Phụ kiện liên kết tự động", + "fasteners.back_to_automatic_fasteners": "Quay lại Phụ kiện liên kết tự động", + "fasteners.both_objects_must_be_visible_and_selectable_in": "Cả hai đối tượng phải hiển thị và có thể chọn được trong ngữ cảnh chỉnh sửa hiện tại.", + "fasteners.changes_apply_immediately_change_the_selection_to_return": "Thay đổi có hiệu lực ngay. Đổi vùng chọn để quay lại bảng thuộc tính.", + "fasteners.click_a_numbered_entry_face_handle_in_the": "Nhấp vào tay nắm được đánh số của mặt bắt đầu trên khung nhìn.", + "fasteners.connection_direction": "#{id}: {} → {}", + "fasteners.count_per_row": "Số lượng mỗi hàng", + "fasteners.create_fasteners": "Tạo chi tiết liên kết", + "fasteners.dimensions_shown_for_the_first_eight_fasteners": "Hiển thị kích thước của tám chi tiết liên kết đầu tiên.", + "fasteners.edit_fasteners": "Chỉnh sửa chi tiết liên kết", + "fasteners.entry_face": "Mặt bắt đầu #{face}", + "fasteners.face": "Mặt #{id}", + "fasteners.fastener": "Chi tiết liên kết", + "fasteners.finish_the_current_dialog_or_history_preview_before": "Hoàn tất hộp thoại hiện tại hoặc bản xem trước lịch sử trước khi chỉnh sửa mối nối này.", + "fasteners.for_cut_joints_choose_wood_joinery_from_the": "Với mối nối dạng cắt, chọn Mối nối gỗ trong menu Công cụ. Phụ kiện liên kết không làm thay đổi hình học.", + "fasteners.geometric_clearance": "Khoảng hở hình học", + "fasteners.geometric_sizing_automatic_length_passes_through_the_first": "Kích thước hình học: chiều dài tự động xuyên qua bộ phận thứ nhất và đi đến nửa độ sâu khả dụng của bộ phận thứ hai. Đường kính ban đầu chỉ là giá trị mẫu có thể chỉnh sửa. Tính phù hợp với vật liệu, khoan mồi, loại ren và độ bền chưa được xác định; hãy tham khảo nhà sản xuất.", + "fasteners.grid": "Lưới", + "fasteners.hardware_dimensions": "{kind} · {:.1} x {:.1}", + "fasteners.hardware_list_preview_dimensions": "Danh sách phụ kiện (kích thước xem trước)", + "fasteners.hardware_mm": "Phụ kiện: {} x {}, Ø {:.1} mm", + "fasteners.invalid_connections": { + "one": "{count} mối nối không hợp lệ: số lượng chưa đầy đủ. Hãy sửa lỗi trước khi mua.", + "other": "{count} mối nối không hợp lệ: số lượng chưa đầy đủ. Hãy sửa lỗi trước khi mua." + }, + "fasteners.invalid_fastener_connection": "Mối nối phụ kiện không hợp lệ", + "fasteners.kreg_screw_selector_thicknesses_and_materials": "Bộ chọn vít Kreg (độ dày và vật liệu)", + "fasteners.length_0_geometry": "Chiều dài (0 = hình học)", + "fasteners.length_first_part_penetration_mm": "{}: chiều dài {:.1} · phần thứ nhất {:.1} · độ xuyên {:.1} mm", + "fasteners.missing_part": "Thiếu bộ phận #{id}", + "fasteners.nail": "Đinh", + "fasteners.no_material_assigned": "Chưa gán vật liệu", + "fasteners.part": "Chi tiết {}: {} · {material}", + "fasteners.pattern": "Cách bố trí", + "fasteners.pick_entry_face_in_viewport": "Chọn mặt bắt đầu trên khung nhìn…", + "fasteners.preview_before_creating": "Xem trước khi tạo", + "fasteners.preview_diameter": "Đường kính xem trước", + "fasteners.preview_fasteners": { + "one": "Xem trước: {count} chi tiết liên kết", + "other": "Xem trước: {count} chi tiết liên kết" + }, + "fasteners.quantity": "Số lượng", + "fasteners.reverse_direction": "Đảo hướng", + "fasteners.review_geometric_warnings_before_purchasing_structural_strength_has": "Hãy xem lại cảnh báo hình học trước khi mua. Độ bền kết cấu chưa được kiểm chứng.", + "fasteners.row": "Hàng", + "fasteners.row_spacing_0_auto": "Khoảng cách hàng (0 = tự động)", + "fasteners.rows": "Số hàng", + "fasteners.screw": "Vít", + "fasteners.select_both_objects_belonging_to_this_joint_to": "Chọn cả hai đối tượng thuộc mối nối này để chỉnh sửa hoặc xóa mối nối.", + "fasteners.select_exactly_two_objects_and_reopen_automatic_fasteners": "Chọn đúng hai đối tượng rồi mở lại Phụ kiện liên kết tự động trong menu Chỉnh sửa.", + "fasteners.select_exactly_two_touching_closed_solid_parts_the": "Chọn đúng hai bộ phận khối đặc kín đang tiếp xúc. Đầu vít nằm trong bộ phận thứ nhất. Các đường trong suốt cho thấy thân và mũi vít bên trong mô hình.", + "fasteners.show_fasteners_through_the_model": "Hiển thị phụ kiện liên kết xuyên qua mô hình", + "fasteners.simpson_strong_tie_technical_guides": "Hướng dẫn kỹ thuật của Simpson Strong-Tie", + "fasteners.single": "Một hàng", + "fasteners.spacing_0_auto": "Khoảng cách (0 = tự động)", + "fasteners.swap_the_selected_parts": "Đổi chỗ các bộ phận đã chọn", + "fasteners.the_object_pair_is_no_longer_editable_no": "Không thể chỉnh sửa cặp đối tượng này nữa. Không có chi tiết liên kết nào được tạo.", + "fasteners.the_objects_permissions_or_connection_changed_reopen_automatic": "Đối tượng, quyền hoặc mối nối đã thay đổi. Hãy mở lại Phụ kiện liên kết tự động trước khi chỉnh sửa.", + "fasteners.two_rows": "Hai hàng", + "fasteners.type_length_mm": "Loại · Ø x chiều dài (mm)", + "fasteners.unlock_both_objects_before_editing_or_removing_their": "Mở khóa cả hai đối tượng trước khi chỉnh sửa hoặc xóa mối nối.", + "fasteners.use_this_entry_face": "Dùng mặt bắt đầu này", + "finish_settings.add_finishing_product": "+ Thêm sản phẩm hoàn thiện", + "finish_settings.area_covered_by_one_container_for_one_coat": "Diện tích được bao phủ bởi một thùng chứa cho một lớp sơn. Sử dụng nhãn sản phẩm; 0 có nghĩa là không rõ. Cập nhật thông tin này khi thay đổi kích thước hoặc đơn vị vùng chứa.", + "finish_settings.e_g_golden_oak_stain": "Ví dụ: màu nhuộm gỗ sồi vàng", + "finish_settings.finishing_product": "Sản phẩm hoàn thiện", + "finish_settings.appearance_color": "Màu hiển thị", + "finish_settings.reset_appearance_value": "Đặt lại về mặc định", + "finish_settings.clear_color": "Trong suốt", + "finish_settings.coat_strength": "Độ đậm của lớp phủ", + "finish_settings.coat_strength_help": "Điều chỉnh hiệu ứng hiển thị của từng lớp phủ; không ảnh hưởng đến độ phủ hoặc chi phí.", + "finish_settings.sheen": "Độ bóng", + "finish_settings.matte": "Mờ", + "finish_settings.satin": "Bán bóng", + "finish_settings.gloss": "Bóng", + "finish_settings.default_sheen": "Mặc định ({})", + "finish_settings.formula": "Công thức", + "finish_settings.standard_formula": "Tiêu chuẩn", + "finish_settings.dye": "Thuốc nhuộm", + "finish_settings.pigment": "Sắc tố", + "finish_settings.gel": "Keo gel", + "finish_settings.water_based": "Gốc nước", + "finish_settings.oil_based": "Gốc dầu", + "finish_settings.apply_step": "Áp dụng bước", + "finish_settings.move_sanding_up": "Di chuyển giấy nhám lên", + "finish_settings.move_sanding_down": "Di chuyển giấy nhám xuống", + "finish_settings.viewport_preview_help": "Xem trước gỗ và lớp hoàn thiện được chỉ định theo kiểu mặt Vật liệu. Thời gian làm việc và sấy khô chỉ ảnh hưởng đến ước tính.", + "finish_settings.finishing_products": "Sản phẩm hoàn thiện", + "finish_settings.format": "x", + "finish_settings.l": "L", + "finish_settings.lacquer": "Sơn mài", + "finish_settings.m2_container_coat": "m² / thùng chứa / lớp phủ", + "finish_settings.ml": "mL", + "finish_settings.no_finishing_products_yet_add_a_product_to": "Chưa có sản phẩm hoàn thiện. Thêm sản phẩm để lưu loại, kích thước hộp đựng và giá.", + "finish_settings.no_product": "Không có sản phẩm", + "finish_settings.no_products_match_your_search": "Không có sản phẩm nào phù hợp với tìm kiếm của bạn.", + "finish_settings.oil": "Dầu", + "finish_settings.other": "Khác", + "finish_settings.paint": "Sơn", + "finish_settings.per_container": "{currency} mỗi thùng", + "finish_settings.pre_stain": "Vết bẩn trước", + "finish_settings.pre_stain_conditioner_stain_paint_varnish_and_other": "Chất dưỡng trước vết ố, vết ố, sơn, véc-ni và các chất hoàn thiện khác. Nhập số lượng và giá một container.", + "finish_settings.price_container": "Giá / thùng", + "finish_settings.prices_in_per_container_coverage_in_m2_per": "Giá tính theo {currency} mỗi container · Độ phủ tính bằng m2 mỗi container cho một lớp · 0 nghĩa là không xác định", + "finish_settings.primer": "Sơn lót", + "finish_settings.product": "Sản phẩm", + "finish_settings.quantity": "Số lượng", + "finish_settings.remove": "Xóa {}", + "finish_settings.sealer": "Chất bịt kín", + "finish_settings.search_name_or_type": "Tìm kiếm tên hoặc loại…", + "finish_settings.stain": "Vết bẩn", + "finish_settings.type": "Loại", + "finish_settings.unavailable_product": "Sản phẩm không có sẵn", + "finish_settings.unit": "Đơn vị", + "finish_settings.us_fl_oz": "fl oz (Mỹ)", + "finish_settings.us_gal": "gal (Mỹ)", + "finish_settings.us_qt": "qt (Mỹ)", + "finish_settings.varnish": "Vecni", + "finish_settings.wax": "Sáp", + "grain_direction.assign": "Gán hướng vân gỗ", + "grain_direction.click_to_confirm": "Nhấp để đặt hướng vân gỗ. Dùng phím mũi tên để khóa trục hoặc nhấn Esc để hủy.", + "grain_direction.clear": "Xóa", + "grain_direction.clear_history": "Xóa hướng vân gỗ", + "grain_direction.set_direction": "Đặt hướng", + "grain_direction.show": "Hiển thị hướng hạt", + "frame_rate.fps": "— FPS", + "frame_rate.fps_2": "{fps:.0} FPS", + "inspector_docking.divider_gestures": "Kéo đường phân cách để đổi kích thước khu vực. Nhấp đúp để gộp các khu vực.", + "inspector_docking.drop_within_15px_inside_an_area_s_edge": "Thả cách mép khu vực tối đa 15 px để chia khu vực; kéo qua trung điểm theo chiều dọc để sắp xếp lại, hoặc thả vào giữa khu vực khác để gộp.", + "inspector_docking.export_time_and_cost_estimates_as_pdf": "Xuất ước tính thời gian và chi phí dưới dạng PDF", + "inspector_docking.generate_pdf": "Tạo PDF", + "inspector_docking.manage_available_stock_materials_sizes_and_prices": "Quản lý vật liệu, kích cỡ và giá cả trong kho có sẵn", + "inspector_docking.section_actions": "Các hành động của phần", + "inspector_docking.settings": "Cài đặt", + "interchange.could_not_read_sketchup_file": "Không thể đọc tệp SketchUp: {e}", + "interchange.not_enough_memory_to_read_this_sketchup_file": "Không đủ bộ nhớ để đọc tệp SketchUp này", + "interchange.sketchup_group": "Nhóm SketchUp", + "interchange.sketchup_import_is_limited_to_64_mib_per": "SketchUp được giới hạn ở 64 MiB mỗi tệp", + "interchange.sketchup_reader_failed": "Không thể đọc tệp SketchUp", + "interchange.sketchup_reader_returned_no_model": "Trình đọc SketchUp không trả về mô hình", + "interchange.skp_disconnected_boundary": "Mặt SketchUp có đường biên không liên thông", + "interchange.skp_incomplete_import": "Trình đọc SketchUp không thể hoàn thành quá trình nhập này", + "interchange.skp_instance_transform": "Phiên bản SketchUp không được hỗ trợ", + "interchange.skp_invalid_boundary": "SketchUp mặt có ranh giới không hợp lệ", + "interchange.skp_invalid_coordinates": "Tọa độ SketchUp không hợp lệ", + "interchange.skp_missing_definition": "SketchUp đề cập đến một định nghĩa bị thiếu", + "interchange.skp_missing_edge": "SketchUp đề cập đến cạnh bị thiếu", + "interchange.skp_missing_vertex": "SketchUp đề cập đến một đỉnh bị thiếu", + "interchange.skp_model_too_large": "Mô hình đã nhập quá lớn (tối đa một triệu thực thể)", + "interchange.skp_nested_components": "Các thành phần SketchUp đệ quy hoặc lồng nhau quá mức", + "interchange.skp_no_geometry": "Tệp SketchUp này không chứa các cạnh hoặc bề mặt có thể nhập được", + "interchange.skp_worker_failed": "SketchUp không thành công", + "interchange.skp_worker_message": "Không thể nhận mô hình SketchUp", + "interchange.there_is_no_visible_geometry_to_export": "Không có hình dạng hiển thị nào để xuất", + "joinery.automatic_longest_axis": "Tự động (trục dài nhất)", + "joinery.board": "Tấm ván ", + "joinery.board_x": "Tấm ván X", + "joinery.board_y": "Tấm ván Y", + "joinery.board_z": "Tấm ván Z", + "joinery.create_a_dynamic_relation_moving_either_board_updates": "Tạo quan hệ động. Di chuyển một trong hai tấm ván sẽ tự động cập nhật mối nối.", + "joinery.create_dynamic_wood_joint": "Tạo mối nối gỗ động", + "joinery.create_joinery": "Tạo mối nối gỗ", + "joinery.degree_symbol": "°", + "joinery.delete_joint": "Xóa mối nối", + "joinery.depth_width": "Độ sâu {axis_prefix}{} / Chiều rộng {axis_prefix}{}", + "joinery.diagnostic_separator": " · ", + "joinery.direction_in_the_selected_board_s_local_axes": "Hướng theo các trục cục bộ của tấm ván đã chọn.", + "joinery.dovetail_angle": "Góc mộng đuôi én", + "joinery.dynamic_wood_joint": "Mối nối gỗ động #{id}", + "joinery.edit_dynamic_wood_joint": "Chỉnh sửa khớp gỗ động", + "joinery.edit_wood_joint": "Chỉnh sửa khớp gỗ #{id}", + "joinery.fingers_on_first_part": "Số ngón trên bộ phận thứ nhất", + "joinery.fit_maximum_tails": "Tăng số đuôi mộng tối đa", + "joinery.keep_end": "Giữ đầu mút", + "joinery.keep_the_lower_or_upper_end_along_the": "Giữ đầu dưới hoặc đầu trên theo hướng cắt đã chọn.", + "joinery.keep_the_tail_width_and_fit_as_many": "Giữ nguyên chiều rộng đuôi mộng và bố trí nhiều đuôi nhất có thể theo khoảng cách chốt.", + "joinery.minimum_pin_width": "Chiều rộng chốt tối thiểu", + "joinery.minimum_wood_left_between_receiving_sockets_after_clearance": "Lượng gỗ tối thiểu còn lại giữa các hốc nhận mộng sau khi trừ khoảng hở. Chốt nhỏ hơn cho phép bố trí nhiều đuôi mộng hơn.", + "joinery.mm": " mm", + "joinery.no_supported_orientation": "Không có hướng nào được hỗ trợ", + "joinery.orientation": "Hướng", + "joinery.profile_width_of_overlap": "Chiều rộng biên dạng (% phần chồng lấn)", + "joinery.receiver_clearance_per_side": "Khoảng hở mỗi bên của hốc nhận mộng", + "joinery.review_sharing_status": "Xem lại trạng thái chia sẻ…", + "joinery.select_exactly_two_boards_and_reopen_wood_joinery": "Chọn đúng hai tấm ván rồi mở lại Mối nối gỗ trong menu Công cụ.", + "joinery.shorten_the_selected_board_past_the_joint_following": "Cắt ngắn tấm ván đã chọn qua vị trí mối nối; nếu có thể, hãy đi theo mặt ngoài nghiêng.", + "joinery.swap_first_and_second_boards": "Đổi chỗ tấm ván thứ nhất và thứ hai", + "joinery.swap_parts": "Đổi chỗ các bộ phận", + "joinery.tail_and_pin_widths_must_fit_the_joint": "Chiều rộng đuôi mộng và chốt phải vừa với mối nối và tạo từ 1 đến 64 đuôi.", + "joinery.tail_width": "Chiều rộng đuôi mộng", + "joinery.tails_fit_across_this_joint": { + "one": "Có thể bố trí {count} đuôi mộng trên mối nối này.", + "other": "Có thể bố trí {count} đuôi mộng trên mối nối này." + }, + "joinery.tails_in_the_saved_layout": { + "one": "{count} đuôi mộng trong bố cục đã lưu.", + "other": "{count} đuôi mộng trong bố cục đã lưu." + }, + "joinery.tenon_height_of_overlap": "Chiều cao mộng (% phần chồng lấn)", + "joinery.the_boards_or_permissions_changed_review_the_updated": "Tấm ván hoặc quyền truy cập đã thay đổi. Hãy xem lại bản xem trước mối nối trước khi áp dụng.", + "joinery.trim_direction": "Hướng cắt xén", + "joinery.trim_excess": "Cắt bỏ phần thừa", + "joinery.unlock_both_objects_before_editing_their_joint": "Mở khóa cả hai đối tượng trước khi chỉnh sửa mối nối.", + "joinery.wood_joinery": "Mối nối gỗ", + "joinery.wood_joint_click_to_edit": "Mối nối gỗ #{id}: {message}\nNhấp để chỉnh sửa", + "joinery.wood_joint_suspended": "Khớp gỗ #{id} bị đình chỉ: {error}", + "joinery_cards.a_continuous_thin_tongue_fits_into_a_matching": "Lưỡi mộng mỏng, liền mạch khớp với rãnh tương ứng.", + "joinery_cards.a_flared_tail_fits_into_a_matching_tapered": "Đuôi mộng loe khớp với hốc có độ côn tương ứng.", + "joinery_cards.a_stepped_edge_fits_against_the_complementary_rebate": "Cạnh bậc khớp với rãnh bậc tương ứng.", + "joinery_cards.a_tenon_with_shoulders_fits_into_a_rectangular": "Mộng có vai khớp với lỗ mộng hình chữ nhật.", + "joinery_cards.alternating_straight_fingers_interlock_across_the_joint": "Các ngón tay thẳng xen kẽ đan xen vào nhau trên khớp.", + "joinery_cards.opposing_half_depth_cuts_let_the_two_parts": "Cắt giảm nửa độ sâu để hai phần chồng lên nhau.", + "measurement_tools.add_angle_dimension": "Thêm kích thước góc", + "measurement_tools.add_dimension": "Thêm kích thước", + "measurement_tools.add_guide": "Thêm hướng dẫn", + "measurement_tools.adjust_angle_dimension": "Điều chỉnh kích thước góc", + "measurement_tools.adjust_guide": "Hướng dẫn điều chỉnh", + "measurement_tools.choose_a_point_away_from_the_measurement_origin": "Chọn một điểm cách gốc đo", + "measurement_tools.choose_a_starting_point_first": "Chọn điểm xuất phát trước", + "measurement_tools.click_a_baseline_point_arrow_keys_lock_axes": "Nhấp vào điểm cơ sở · Phím mũi tên khóa trục · Esc để hủy", + "measurement_tools.click_the_angle_point_arrow_keys_lock_axes": "Nhấp vào điểm góc · Phím mũi tên khóa trục · Esc để hủy", + "measurement_tools.click_the_second_endpoint_arrow_keys_align_x": "Nhấp vào điểm cuối thứ hai · Các phím mũi tên căn chỉnh X / Y / Z · Esc để hủy", + "measurement_tools.click_the_second_point_arrow_keys_lock_axes": "Nhấp vào điểm thứ hai · Phím mũi tên khóa trục · Esc để hủy", + "measurement_tools.create_guide_click_the_angle_point_or_type": "Tạo hướng dẫn · Nhấp vào điểm góc hoặc nhập góc + Enter · Ctrl/Chuyển đổi lệnh Measure", + "measurement_tools.create_guide_click_to_place_or_type_distance": "Tạo hướng dẫn · Nhấp để đặt hoặc nhập khoảng cách + Enter · Phím mũi tên khóa trục · Ctrl/Chuyển đổi lệnh Measure", + "measurement_tools.create_guides_click_a_reference_edge_or_point": "Tạo hướng dẫn · Nhấp vào cạnh hoặc điểm tham chiếu · Ctrl/Chuyển đổi lệnh Đo lường · Esc để hủy", + "measurement_tools.guide_created_type_a_value_enter_to_adjust": "Đã tạo hướng dẫn · Nhập một giá trị + Enter để điều chỉnh · Nhấp để bắt đầu một giá trị khác · Ctrl/Chuyển đổi lệnh Đo", + "measurement_tools.measure_only_click_measurement_points_ctrl_command_toggles": "Chỉ đo lường · Nhấp vào các điểm đo · Ctrl/Bật tắt lệnh Tạo hướng dẫn · Esc để hủy", + "measurement_tools.measurement_complete_click_to_start_another_ctrl_command": "Đo lường hoàn tất · Nhấp để bắt đầu một phép đo khác · Ctrl/Chuyển đổi lệnh Tạo hướng dẫn", + "measurement_tools.measurement_complete_click_to_start_another_esc_to": "Đo lường hoàn tất · Nhấp để bắt đầu lại · Esc để xóa", + "measurement_tools.move_over_the_model_or_drawing_plane_to": "Di chuyển qua mô hình hoặc mặt phẳng vẽ để chọn điểm", + "measurement_tools.move_the_pointer_to_choose_a_direction_first": "Di chuyển con trỏ để chọn hướng trước", + "measurement_tools.move_to_place_arrow_keys_align_x_y": "Di chuyển đến vị trí · Phím mũi tên căn chỉnh X / Y / Z · Xuống xóa khóa", + "measurement_tools.move_to_position_the_text_arrow_keys_lock": "Di chuyển đến vị trí văn bản · Phím mũi tên khóa trục · Nhấp để đặt · Esc để hủy", + "measurement_tools.undefined_angle": "Góc không xác định", + "mesh_exchange.cannot_export_degenerate_stl_triangle": "Không thể xuất tam giác STL suy biến", + "mesh_exchange.degenerate_edge": "Cạnh thoái hóa", + "mesh_exchange.degenerate_geometry": "Hình học suy biến", + "mesh_exchange.dxf_bulges_and_polyline_widths_are_unsupported": "DXF chỗ phình và chiều rộng đa tuyến không được hỗ trợ", + "mesh_exchange.dxf_must_end_with_eof": "DXF phải kết thúc bằng EOF", + "mesh_exchange.dxf_radius_must_be_positive": "DXF phải dương", + "mesh_exchange.dxf_units_unsupported_use_mm_cm_m_inches": "DXF không được hỗ trợ (sử dụng mm, cm, m, inch hoặc feet)", + "mesh_exchange.expected_ascii_stl_solid": "Dự kiến ASCII STL rắn", + "mesh_exchange.expected_dxf_entity": "Thực thể DXF dự kiến", + "mesh_exchange.expected_stl_facet_normal": "Dự kiến khía cạnh STL bình thường", + "mesh_exchange.expected_stl_outer_loop": "Vòng ngoài STL dự kiến", + "mesh_exchange.expected_stl_vertex": "Đỉnh STL dự kiến", + "mesh_exchange.import_exceeds_coordinate_or_200_000_vertex_limit": "Nhập vượt quá tọa độ hoặc giới hạn 200.000 đỉnh", + "mesh_exchange.import_exceeds_one_million_entities": "Nhập khẩu vượt quá một triệu thực thể", + "mesh_exchange.import_is_limited_to_64_mib": "Giới hạn kích thước nhập là 64 MiB.", + "mesh_exchange.invalid_binary_stl_length": "Độ dài STL nhị phân không hợp lệ", + "mesh_exchange.invalid_dxf_group_code": "Mã nhóm DXF không hợp lệ", + "mesh_exchange.invalid_dxf_polyline_vertex_count": "Số đỉnh đa tuyến DXF không hợp lệ", + "mesh_exchange.invalid_dxf_section": "Phần DXF không hợp lệ", + "mesh_exchange.invalid_dxf_units": "Đơn vị DXF không hợp lệ", + "mesh_exchange.invalid_number": "Số không hợp lệ: {s}", + "mesh_exchange.invalid_obj_vertex_index": "Chỉ số đỉnh OBJ không hợp lệ", + "mesh_exchange.invalid_stl_ending": "Kết thúc STL không hợp lệ", + "mesh_exchange.invalid_stl_facet_ending": "Kết thúc khía cạnh STL không hợp lệ", + "mesh_exchange.missing_dxf_field": "Thiếu trường DXF {code}", + "mesh_exchange.missing_dxf_polyline_x": "Thiếu đa tuyến DXF X", + "mesh_exchange.missing_dxf_polyline_y": "Thiếu đa tuyến DXF Y", + "mesh_exchange.missing_or_incomplete_dxf_entities_section": "Phần THỰC THỂ DXF bị thiếu hoặc không đầy đủ", + "mesh_exchange.no_supported_geometry_in_file": "Không có hình học nào được hỗ trợ trong tệp", + "mesh_exchange.non_finite_or_excessive_coordinate": "Tọa độ không hữu hạn hoặc quá mức", + "mesh_exchange.obj_must_be_utf_8_text": "OBJ phải là văn bản UTF-8", + "mesh_exchange.obj_polygon_exceeds_4096_vertices": "OBJ vượt quá 4096 đỉnh", + "mesh_exchange.obj_vertex_index_out_of_range_forward_references": "OBJ nằm ngoài phạm vi (tham chiếu chuyển tiếp không được hỗ trợ)", + "mesh_exchange.obj_vertices_must_have_exactly_xyz_coordinates": "OBJ phải có tọa độ XYZ chính xác", + "mesh_exchange.only_dxf_geometry_in_the_xy_plane_with": "Chỉ hỗ trợ hình học DXF trong mặt phẳng XY với tính năng ép đùn mặc định", + "mesh_exchange.only_text_dxf_is_supported": "Chỉ hỗ trợ văn bản DXF", + "mesh_exchange.stl_coordinate_overflow": "STL", + "mesh_exchange.stl_export_exceeds_200_000_triangles": "STL vượt quá 200.000 hình tam giác", + "mesh_exchange.there_are_no_visible_faces_to_export_as": "Không có mặt nào đang hiển thị để xuất dưới dạng STL", + "mesh_exchange.too_many_obj_primitives": "Quá nhiều OBJ nguyên thủy", + "mesh_exchange.truncated_dxf_code_value_pair": "Cặp mã/giá trị DXF bị cắt ngắn", + "mesh_exchange.truncated_stl": "Cắt ngắn STL", + "mesh_exchange.unsupported_dxf_entity_supported_line_lwpolyline_without_bulges": "Thực thể DXF không được hỗ trợ {kind}. Được hỗ trợ: LINE, LWPOLYLINE không có chỗ phình/chiều rộng, CIRCLE, ARC; Chỉ mặt phẳng XY.", + "mesh_exchange.unsupported_dxf_polyline_flags": "Cờ đa tuyến DXF không được hỗ trợ", + "mesh_exchange.unsupported_import_format": "Định dạng nhập không được hỗ trợ", + "mesh_exchange.unsupported_obj_statement": "Tuyên bố OBJ không được hỗ trợ: {}", + "modal.close_dialog": "Đóng hộp thoại", + "modal.close_esc": "Đóng (Esc)", + "move_tool.cannot_copy_this_geometry_here_check_the_distance": "Không thể sao chép hình học này ở đây; kiểm tra khoảng cách và lồng thành phần", + "move_tool.ctrl": "Ctrl", + "move_tool.enter_a_finite_displacement": "Nhập một chuyển vị hữu hạn", + "move_tool.enter_a_whole_array_count_from_1_to": "Nhập toàn bộ số mảng từ 1 đến 1000", + "move_tool.enter_an_array_count_such_as_3_or": "Nhập số lượng mảng, chẳng hạn như /3 hoặc 3x", + "move_tool.move_the_pointer_to_choose_a_direction_first": "Di chuyển con trỏ để chọn hướng trước", + "move_tool.option": "Tùy chọn", + "outliner.angle_dimension": "Kích thước góc", + "outliner.click_to_select_shift_click_to_select_a": "Nhấp để chọn · Shift-nhấp để chọn một khoảng · Ctrl/Cmd-nhấp để bật/tắt lựa chọn · Dùng nút con mắt để đổi trạng thái hiển thị; kiểm tra đối tượng cha và Thẻ để biết trạng thái hiển thị kế thừa", + "outliner.click_to_select_shift_click_to_select_a_2": "Nhấp để chọn · Shift-nhấp để chọn một khoảng · Ctrl/Cmd-nhấp để bật/tắt lựa chọn · Nhấp đúp để chỉnh sửa · Kéo vào nhóm để lồng, hoặc kéo giữa các hàng để sắp xếp lại", + "outliner.collapse_children": "Thu gọn đối tượng con", + "outliner.component": "Thành phần", + "outliner.dimension": "Kích thước", + "outliner.drag_move_objects": { + "one": "Di chuyển {count} đối tượng", + "other": "Di chuyển {count} đối tượng" + }, + "outliner.draw_geometry_or_import_a_model_to_see": "Vẽ hình học hoặc nhập mô hình để xem các đối tượng tại đây.", + "outliner.edge": "Cạnh", + "outliner.editing": " · Đang chỉnh sửa", + "outliner.empty_object": "Đối tượng trống", + "outliner.entity": "{kind}: {label}\nThực thể #{id}{}\n{}", + "outliner.entity_accessibility": "{kind}: {label}", + "outliner.entity_number": "#{id}", + "outliner.expand_children": "Mở rộng đối tượng con", + "outliner.face": "Mặt", + "outliner.find_groups_and_components_at_any_depth_by": "Tìm nhóm và thành phần ở mọi cấp theo tên hoặc #ID · Ctrl/Cmd+F", + "outliner.full_material_assignment": "Đã gán vật liệu đầy đủ", + "outliner.geometry": "Hình học ({count})", + "outliner.group": "Nhóm", + "outliner.hide": "Ẩn", + "outliner.locked": " · Đã khóa", + "outliner.material_accessibility": "{} — {kind}: {label}", + "outliner.move_objects": "Di chuyển đối tượng", + "outliner.no_matching_objects": "Không có đối tượng phù hợp", + "outliner.no_material_assigned": "Chưa gán vật liệu", + "outliner.no_objects_or_geometry_yet": "Chưa có đối tượng hoặc hình học", + "outliner.paint": "\nTô màu: #{r:02X}{g:02X}{b:02X}", + "outliner.paint_mixed_face_colors": "\nTô màu: các mặt có màu khác nhau", + "outliner.partial_material_assignment": "Đã gán một phần vật liệu", + "outliner.search_objects": "Tìm đối tượng", + "outliner.show": "Hiện", + "outliner.text": "Văn bản", + "outliner.try_another_name_or_clear_the_search_to": "Thử tên khác hoặc xóa nội dung tìm kiếm để xem tất cả đối tượng.", + "outliner.unhide": "Hiện lại", + "outliner.unhide_the_parent_object_before_selecting_its_contents": "Hiện đối tượng cha trước khi chọn nội dung bên trong", + "outliner.unlock_the_parent_object_before_selecting_its_contents": "Mở khóa đối tượng cha trước khi chọn nội dung bên trong", + "outliner.visibility_accessibility": "{} {kind}: {label}", + "outliner.visibility_is_also_controlled_by_the_parent_object": "{name}\nTrạng thái hiển thị cũng do đối tượng cha và thẻ kiểm soát", + "precision.add_or_subtract_quantities_with_matching_units": " Cộng hoặc trừ số lượng với đơn vị phù hợp", + "precision.cannot_divide_by_zero": "Không thể chia cho 0", + "precision.close_each_opening_parenthesis": "Đóng từng dấu ngoặc đơn mở", + "precision.draw_a_stroke_before_setting_its_total_length": "Vẽ một nét trước khi thiết lập tổng chiều dài của nó", + "precision.enter_a_finite_angle": "Nhập một góc hữu hạn", + "precision.enter_a_formula_such_as_60cm_89mm_or": "Nhập công thức như 60cm - 89mm hoặc (1m + 20cm) / 2", + "precision.enter_a_positive_length_between_0_0000001_m": "Nhập độ dài dương trong khoảng từ 0,0000001 m đến 10000000 m", + "precision.enter_width_height_such_as_5m_50mm": "Nhập chiều rộng, chiều cao, chẳng hạn như 5m,50mm", + "precision.scale_factors_must_use_numbers_without_units": "Hệ số tỷ lệ phải sử dụng số không có đơn vị", + "precision.the_formula_is_too_long": "Công thức quá dài", + "precision.the_formula_must_produce_a_finite_value": "Công thức phải tạo ra giá trị hữu hạn", + "precision.the_formula_must_produce_a_length_not_an": "Công thức phải tạo ra chiều dài, không phải diện tích hoặc thể tích", + "precision.use_fewer_nested_parentheses": "Sử dụng ít dấu ngoặc đơn lồng nhau", + "precision.use_length_units_mm_cm_m_km_in": "Sử dụng đơn vị chiều dài mm, cm, m, km, in, ft hoặc yd", + "project_files.preparing_pdf": "Đang chuẩn bị PDF…", + "project_files.allow_pop_ups_for_benchup_then_generate_the": "Cho phép cửa sổ bật lên cho BenchUp, sau đó tạo lại tệp PDF.", + "project_files.already_exists_select_that_file_in_the_save": "{} đã tồn tại. Chọn tệp .{extension} đó trong hộp thoại lưu để thay thế nó.", + "project_files.could_not_compress_project": "Không thể nén dự án: {error}", + "project_files.could_not_decompress_project": "Không thể giải nén dự án: {error}", + "project_files.cutting_plan": "kế hoạch cắt", + "project_files.estimates": "{name} - ước tính", + "project_files.export_geometry": "Xuất hình học", + "project_files.export_screenshot": "Xuất ảnh chụp màn hình", + "project_files.export_time_and_cost_estimates": "Ước tính chi phí và thời gian xuất khẩu", + "project_files.export_woodworking_cutting_plan": "Kế hoạch cắt chế biến gỗ xuất khẩu", + "project_files.export_workshop_labels": "Nhãn xưởng xuất khẩu", + "project_files.geometry": "Hình học", + "project_files.geometry_import_is_limited_to_64_mib_per": "Geometry được giới hạn ở 64 MiB mỗi tệp", + "project_files.import_geometry_stl_mm_obj_metres_dxf_declared": "Nhập hình học (STL: mm; OBJ: mét; DXF: đơn vị khai báo hoặc mm)", + "project_files.benchup_project": "BenchUp", + "project_files.no_browser_document": "Không có tài liệu trình duyệt", + "project_files.no_browser_document_body": "Không có nội dung tài liệu trình duyệt", + "project_files.no_browser_window": "Không có cửa sổ trình duyệt", + "project_files.open_benchup_project": "Dự án BenchUp mở", + "project_files.pdf_document": "Tài liệu PDF", + "project_files.pdf_saved_to_but_its_viewer_could_not": "PDF đã được lưu vào {}, nhưng không thể mở được trình xem của nó: {error}", + "project_files.report_name": "{name} - {suffix}", + "project_files.save_benchup_project_as": "Lưu dự án BenchUp thành", + "project_files.screenshot": "Ảnh chụp màn hình", + "project_files.screenshot_2": "{name} - ảnh chụp màn hình", + "project_files.sketchup_import": "SketchUp nhập", + "project_files.the_browser_could_not_download_this_obj_file": "Trình duyệt không thể tải xuống tệp OBJ này", + "project_files.the_browser_could_not_download_this_screenshot": "Trình duyệt không thể tải xuống ảnh chụp màn hình này", + "project_files.the_browser_could_not_open_this_pdf": "Trình duyệt không thể mở tệp PDF", + "project_files.the_browser_could_not_read_this_geometry_file": "Trình duyệt không thể đọc được tệp hình học này", + "project_files.the_browser_could_not_read_this_project": "Trình duyệt không thể đọc dự án này", + "project_files.the_browser_could_not_save_this_project": "Trình duyệt không thể lưu dự án này", + "project_files.the_imported_geometry_cannot_be_inserted_in_this": "Không thể chèn hình học đã nhập vào ngữ cảnh chỉnh sửa này", + "project_files.the_project_is_not_utf_8_text": "Dự án không phải là văn bản UTF-8", + "project_files.untitled_model": "Mẫu máy chưa có tiêu đề", + "project_files.workshop_labels": "nhãn hội thảo", + "projects.allow_rotating_pieces_90_degrees": "Cho phép xoay các mảnh 90 độ", + "projects.browser_file_browser_hides_the_full_path_reselect": "Tệp trình duyệt: {file} (trình duyệt ẩn đường dẫn đầy đủ; chọn lại để mở)", + "projects.could_not_complete_file_operation": "Không thể hoàn tất thao tác với tệp: {error}", + "projects.could_not_save_project": "Không thể lưu dự án: {error}", + "projects.create_a_pdf_with_quantities_and_finished_cut": "Tạo tệp PDF với số lượng và kích thước cắt hoàn thiện.", + "projects.create_one_label_per_piece_with_its_cutting": "Tạo một nhãn cho mỗi sản phẩm có dấu kế hoạch cắt, tên và độ dày, chiều rộng và chiều dài hoàn thiện. In ở khổ giấy A4.", + "projects.cutting_plan_pdf_opened_in_a_new_tab": "Kế hoạch cắt PDF được mở trong tab mới", + "projects.cutting_plan_pdf_saved_and_opened": "Kế hoạch cắt PDF đã được lưu và mở", + "projects.discard_changes": "Hủy các thay đổi", + "projects.exporting_geometry": "Đang xuất hình học…", + "projects.exporting_screenshot": "Đang xuất ảnh chụp màn hình…", + "projects.generate_pdf": "Tạo PDF…", + "projects.estimates_pdf_opened": "Bản PDF ước tính thời gian và chi phí được mở trong tab mới", + "projects.estimates_pdf_saved": "Ước tính thời gian và chi phí PDF đã được lưu và mở", + "projects.geometry_download_started": "Đã bắt đầu tải xuống hình học", + "projects.geometry_exported": "Geometry đã xuất", + "projects.geometry_imported_as_editable_groups": "Hình học được nhập dưới dạng nhóm có thể chỉnh sửa", + "projects.geometry_recovered_from_a_damaged_sketchup_archive": "Geometry được khôi phục từ kho lưu trữ SketchUp bị hỏng. Một số tài liệu có thể bị thiếu.", + "projects.respect_wood_grain_direction": "Tôn trọng hướng thớ gỗ", + "projects.align_part_grain_with_stock_length": "Căn chỉnh thớ được chỉ định của từng bộ phận với chiều dài của phôi.", + "projects.show_wood_joinery": "Trưng bày đồ mộc", + "projects.show_joinery_as_dashed_outlines": "Hiển thị các đường cắt mộc dưới dạng đường nét đứt nét trên mỗi mảnh.", + "cutting_plan.joinery_dashed_outlines": "Đường nét đứt biểu thị mối nối được chiếu lên mặt phôi.", + "cutting_plan.grain_along_stock_length": "Hướng vân gỗ đã gán chạy dọc theo chiều dài phôi.", + "cutting_plan.grain_through_thickness": "Vân gỗ chạy xuyên qua chiều dày, không thể đặt dọc theo chiều dài phôi.", + "cutting_plan.joinery_omitted": "Các mối nối không thể đánh giá sẽ bị lược bỏ.", + "projects.import_geometry": "Nhập hình học", + "projects.import_sketchup": "Nhập SketchUp", + "projects.importing_geometry": "Đang nhập hình học…", + "projects.joint_error_separator": " · ", + "projects.layouts_use_assigned_stock_dimensions_and_saw_kerf": "Sơ đồ xếp phôi dùng kích thước phôi và mạch cưa đã gán. Hãy đối chiếu hướng vân gỗ, mối nối và các hình dạng không đều với mô hình; đây là phương án bố trí thực tế, không bảo đảm mức tối ưu tuyệt đối.", + "projects.leave_off_when_the_length_must_follow_the": "Tắt tùy chọn này nếu chiều dài phải theo hướng vân gỗ.", + "projects.location_and_share_link": "{location}\n{url}", + "projects.mm": " mm", + "projects.no_recent_projects": "Không có dự án nào gần đây", + "projects.only_visible_parts_with_assigned_stock_materials_are": "Chỉ tính các chi tiết đang hiển thị được gán vật liệu phôi. Gán vật liệu trong Thông tin thực thể bằng bảng giá phôi. Các chi tiết lồng nhau kế thừa vật liệu của cụm lắp ráp, trừ khi được gán riêng.", + "projects.opening_project": "Đang mở dự án…", + "projects.please_wait": "Vui lòng đợi…", + "projects.preparing_estimates_pdf": "Chuẩn bị ước tính thời gian và chi phí PDF…", + "projects.preparing_cutting_plan_pdf": "Đang chuẩn bị kế hoạch cắt PDF…", + "projects.preparing_workshop_labels_pdf": "Đang chuẩn bị PDF nhãn xưởng…", + "projects.project_download_started": "Đã bắt đầu tải xuống dự án", + "projects.project_file": "Tệp dự án", + "projects.project_opened": "Dự án đã mở", + "projects.project_saved": "Dự án đã lưu", + "projects.recent_project_detail": "\n{detail}", + "projects.recent_projects": "Dự án gần đây", + "projects.remove_from_recent_projects": "Xóa khỏi các dự án gần đây", + "projects.reselect_to_reopen_this_browser_file": "Chọn lại {} để mở lại tệp trình duyệt này", + "projects.restart_with_local_recovery": "Khởi động lại bằng khôi phục cục bộ", + "projects.save_changes_to_as_a_project_file_before": "Lưu các thay đổi đối với “{}” dưới dạng tệp dự án trước khi tiếp tục?", + "projects.save_project_changes": "Lưu các thay đổi của dự án?", + "projects.saving_project": "Đang lưu dự án…", + "projects.saw_kerf_cut_width": "Khe cưa (chiều rộng cắt)", + "projects.screenshot_download_started": "Đã bắt đầu tải xuống ảnh chụp màn hình", + "projects.screenshot_exported": "Ảnh chụp màn hình đã xuất", + "projects.select_at_least_one_part_or_choose_the": "Chọn ít nhất một phần hoặc chọn toàn bộ dự án.", + "projects.selected_parts_assemblies_visible_only": "Các bộ phận / cụm được chọn (chỉ hiển thị)", + "projects.the_file_operation_did_not_complete": "Thao tác với tệp không hoàn tất", + "projects.this_project_belongs_to_connect_to_that_server": "Dự án này thuộc về {server}. Kết nối với máy chủ đó trong Tài khoản trước khi mở nó.", + "projects.whole_project_visible_only": "Toàn bộ dự án (chỉ hiển thị)", + "projects.wood_joint": "Khớp gỗ #{id}: {error}", + "projects.woodworking_cutting_plan": "Kế hoạch cắt chế biến gỗ", + "projects.workshop_labels": "Nhãn xưởng", + "projects.workshop_labels_pdf_opened_in_a_new_tab": "PDF nhãn xưởng đã mở trong thẻ mới", + "projects.workshop_labels_pdf_saved_and_opened": "PDF nhãn xưởng đã được lưu và mở", + "realtime.invalid_websocket_event": "Sự kiện WebSocket không hợp lệ", + "realtime.unsupported_websocket_tls_stream": "Luồng TLS WebSocket không được hỗ trợ", + "realtime.url_ticket_connection_queue_wake": "url,vé,kết nối,hàng đợi,wake", + "realtime.websocket_connection_failed": "WebSocket kết nối không thành công", + "realtime.websocket_disconnected": "WebSocket đã bị ngắt kết nối", + "realtime.websocket_disconnected_2": "WebSocket đã bị ngắt kết nối: {e}", + "realtime.websocket_host_missing": "WebSocket", + "realtime.websocket_unavailable": "WebSocket không có sẵn", + "release_notes.format": "•", + "release_notes.latest": " · Mới nhất", + "release_notes.newer": "Mới hơn", + "release_notes.older": "Cũ", + "release_notes.release_notes": "Ghi chú phát hành", + "release_notes.v": "v{} · {}{latest}", + "release_notes.v_latest": "v{} · Mới nhất", + "release_notes.you_re_using_benchup": "Bạn đang sử dụng BenchUp {}", + "rotate_tool.click_a_reference_point_away_from_the_pivot": "Nhấp vào điểm tham chiếu cách xa trục quay · Các phím mũi tên khóa mặt phẳng quay · Esc để hủy", + "rotate_tool.click_a_reference_point_away_from_the_pivot_2": "Nhấp vào điểm tham chiếu cách xa trục trước", + "rotate_tool.click_to_rotate_type_an_angle_or_formula": "Nhấp để xoay · Nhập góc hoặc công thức rồi nhấn Enter · Phím mũi tên khóa mặt phẳng xoay · Esc để hủy", + "rotate_tool.select_geometry_click_a_pivot_on_or_offset": "Chọn hình học · Nhấp vào một trục xoay (trên hoặc lệch khỏi vùng chọn) · Phím mũi tên khóa mặt phẳng quay", + "rotate_tool.the_reference_lies_on_the_rotation_axis_clear": "Tham chiếu nằm trên trục quay; xóa khóa hoặc khởi động lại bằng tham chiếu khác", + "screenshot_dialog.a_compatible_gpu_renderer_is_required_for_screenshots": "A để chụp ảnh màn hình.", + "screenshot_dialog.all_views_in_one_image": "Tất cả lượt xem trong một hình ảnh", + "screenshot_dialog.choose_one_or_more_views": "Chọn một hoặc nhiều chế độ xem.", + "screenshot_dialog.choose_your_views_page_layout_and_export_format": "Chọn chế độ xem, bố cục trang và định dạng xuất của bạn.", + "screenshot_dialog.combined_sheet": "Tấm kết hợp", + "screenshot_dialog.could_not_read_screenshot": "Không thể đọc ảnh chụp màn hình: {e}", + "screenshot_dialog.dpi": "{}DPI", + "screenshot_dialog.dpi_2": "{dpi} PI", + "screenshot_dialog.export": "Xuất", + "screenshot_dialog.fit_the_visible_model_in_parallel_projection": "Điều chỉnh mô hình hiển thị trong phép chiếu song song.", + "screenshot_dialog.fit_visible_content_using_the_current_viewing_angle": "Điều chỉnh nội dung hiển thị bằng cách sử dụng góc xem và hình chiếu hiện tại.", + "screenshot_dialog.format": "Định dạng", + "screenshot_dialog.generate": "Tạo", + "screenshot_dialog.generate_screenshot": "Tạo ảnh chụp màn hình", + "screenshot_dialog.individual_views": "Quan điểm cá nhân", + "screenshot_dialog.landscape": "Phong cảnh", + "screenshot_dialog.light_mode_transparent_background": "Chế độ ánh sáng · Nền trong suốt", + "screenshot_dialog.mm": "{width:.0} × {height:.0} mm · {}", + "screenshot_dialog.model_views": "Chế độ xem mô hình", + "screenshot_dialog.one_image_per_view": "Một hình ảnh cho mỗi lượt xem", + "screenshot_dialog.one_pdf_page_per_view": "Một trang PDF cho mỗi lượt xem.", + "screenshot_dialog.page": "Trang", + "screenshot_dialog.paper_size": "Kích thước giấy", + "screenshot_dialog.pixels_per_sheet": "{w} × {h} pixel trên mỗi tờ", + "screenshot_dialog.portrait": "Chân dung", + "screenshot_dialog.preparing_preview": "Đang chuẩn bị xem trước…", + "screenshot_dialog.preview_unavailable": "Không có bản xem trước", + "screenshot_dialog.preview_viewport": "Cổng xem xem trước", + "screenshot_dialog.rendering_export": "Xuất kết xuất…", + "screenshot_dialog.resolution": "Độ phân giải", + "screenshot_dialog.screenshot_color": "Màu ảnh chụp màn hình", + "screenshot_dialog.screenshot_depth": "Độ sâu ảnh chụp màn hình", + "screenshot_dialog.screenshot_preview": "ảnh chụp màn hình-xem trước-{i}", + "screenshot_dialog.screenshot_readback": "Đọc lại ảnh chụp màn hình", + "screenshot_dialog.screenshot_readback_did_not_complete": "Việc đọc lại ảnh chụp màn hình không hoàn tất.", + "screenshot_dialog.screenshot_rendering_timed_out_try_fewer_views_or": "Hết thời gian hiển thị ảnh chụp màn hình. Hãy thử ít lượt xem hơn hoặc độ phân giải thấp hơn.", + "screenshot_dialog.screenshot_viewport": "Chế độ xem ảnh chụp màn hình", + "screenshot_dialog.select_a_view_to_preview": "Chọn chế độ xem để xem trước", + "screenshot_dialog.selected": "{count} đã chọn", + "screenshot_dialog.separate_images_packaged_in_a_zip_file": "Các hình ảnh riêng biệt được đóng gói trong tệp ZIP.", + "screenshot_dialog.this_image_exceeds_the_gpu_texture_size_choose": "Hình ảnh này vượt quá kích thước kết cấu GPU. Chọn giấy nhỏ hơn hoặc độ phân giải thấp hơn.", + "screenshot_dialog.views": "Lượt xem", + "screenshots.a3_297_420_mm": "A3 · 297 × 420 mm", + "screenshots.a4_210_297_mm": "A4 · 210 × 297 mm", + "screenshots.a5_148_210_mm": "A5 · 148 × 210 mm", + "screenshots.back": "Quay lại", + "screenshots.bottom": "Dưới", + "screenshots.current": "Hiện tại", + "screenshots.date_unavailable": "Ngày không có", + "screenshots.devicegray": "Thiết bịGray", + "screenshots.devicergb": "Thiết bịRGB", + "screenshots.front": "Mặt trước", + "screenshots.isometric": "Đẳng", + "screenshots.jpeg": "JPEG", + "screenshots.jpeg_cannot_preserve_transparency_choose_png_webp_or": "JPEG không thể duy trì tính minh bạch. Chọn PNG, WebP hoặc PDF.", + "screenshots.left": "Trái", + "screenshots.legal_8_5_14_in": "Legal · 8,5 × 14 in", + "screenshots.letter_8_5_11_in": "Thư · 8,5 × 11 in", + "screenshots.model_views": "Chế độ xem mẫu", + "screenshots.pdf": "PDF", + "screenshots.png": "PNG", + "screenshots.right": "Phải", + "screenshots.select_at_least_one_view": "Chọn ít nhất một chế độ xem.", + "screenshots.smask_0_r": " /SMask {id} 0 R", + "screenshots.some_screenshot_views_did_not_finish_rendering": "Một số chế độ xem ảnh chụp màn hình không hoàn tất hiển thị.", + "screenshots.tabloid_11_17_in": "Báo lá cải · 11 × 17 in", + "screenshots.this_export_is_too_large_choose_a_lower": "Bản xuất này quá lớn. Chọn độ phân giải thấp hơn, giấy nhỏ hơn hoặc ít lượt xem hơn.", + "screenshots.top": "Trên", + "screenshots.webp": "WebP", + "router.angle": "Góc vát", + "router.angle_does_not_fit": "Góc vát không khớp giữa hai mặt.", + "router.applied": "Các cạnh của tuyến đường", + "router.bead": "Gờ tròn", + "router.bevel": "Vát", + "router.chamfer": "Vát cạnh", + "router.click_edges": "Nhấp vào một cạnh để chọn nó, sau đó nhấp vào cấu hình để áp dụng định tuyến.", + "router.convex_edge_required": "Chọn một cạnh ranh giới lồi thẳng hoặc vẽ đường định tuyến trên một mặt khối.", + "router.cove": "Rãnh lõm", + "router.defaults": "Hồ sơ dành cho các cạnh mới", + "router.depth": "Độ sâu", + "router.edge": "Cạnh #{id}", + "router.edge_error": "Cạnh #{id}: {error}", + "router.edit": "Chỉnh sửa", + "router.groove": "Rãnh", + "router.invalid_settings": "Cài đặt định tuyến không hợp lệ.", + "router.none": "Không có", + "router.offset": "Thất bại", + "router.ogee": "Ogee La Mã", + "router.profile": "Hồ sơ", + "router.profile_does_not_fit": "Hồ sơ không phù hợp với hàng có sẵn.", + "router.profile_too_small": "Hồ sơ chứa các chi tiết quá nhỏ cho tác phẩm này.", + "router.protected": "Mở khóa mảnh và hiển thị các cạnh đã chọn để chỉnh sửa định tuyến.", + "router.rabbet": "Mộng bậc", + "router.radius": "Bán kính", + "router.remove": "Xóa", + "router.removed": "Xóa định tuyến cạnh", + "router.reverse": "Hoán đổi mặt tham chiếu", + "router.roundover": "Làm tròn", + "router.router": "Bộ định tuyến", + "router.saved": "Định tuyến đã lưu", + "router.select_edges": "Chọn một cạnh, sau đó nhấp vào cấu hình để áp dụng định tuyến. Chọn Không để xóa định tuyến.", + "router.shoulder": "Vai", + "router.size": "Kích thước", + "router.solid_piece_required": "Routing yêu cầu một vật rắn khép kín. Các cạnh được vẽ trên các mặt của nó và các cạnh ranh giới hiện có đều được hỗ trợ.", + "router.surface_path_required": "Vẽ một cạnh thẳng trên một mặt khối hoặc chọn một cạnh ranh giới khối hiện có.", + "router.square_edge_required": "Cấu hình này yêu cầu cạnh 90°.", + "router.suspended": "Định tuyến trên cạnh #{id} bị tạm dừng: {error}", + "router.width": "Chiều rộng", + "section_gizmo.drag_section_along_its_axis_esc_to_cancel": "Kéo mặt cắt {} dọc theo trục · Esc để hủy. Khi nhìn dọc theo trục, hãy kéo lên/xuống.", + "settings.adjust_mouse_and_trackpad_navigation_sensitivity": "Điều chỉnh độ nhạy điều hướng bằng chuột và bàn di chuột.", + "settings.automatically_group_new_shapes": "Tự động nhóm các hình mới", + "settings.automatically_size_grid_when_zooming": "Tự điều chỉnh kích thước lưới khi thu phóng", + "settings.axis_and_inference_colors": "Màu trục và điểm bắt", + "settings.axis_inferences_use_the_corresponding_axis_color": "Điểm bắt theo trục sử dụng màu tương ứng với trục đó.", + "settings.changes_are_saved_automatically_on_this_device": "Các thay đổi được tự động lưu trên thiết bị này.", + "settings.clear_both_axis_locks_after_completing_an_edit": "Xóa cả hai khóa trục sau khi hoàn tất chỉnh sửa hoặc đo đạc, hủy thao tác hoặc chuyển công cụ. Tắt tùy chọn này để giữ khóa cho đến khi bạn tự xóa.", + "settings.click_a_shortcut_then_press_a_letter_or": "Nhấp vào phím tắt rồi nhấn một chữ cái hoặc phím cách. Nhấn Esc để hủy. Gán lại phím sẽ hoán đổi các lệnh. Lệnh dự án và thao tác điều hướng giữ nguyên phím tắt tiêu chuẩn.", + "settings.controls": "Điều khiển", + "settings.default_units": "Đơn vị mặc định", + "settings.defaults_for_objects_in_all_projects_objects_use": "Giá trị mặc định cho đối tượng trong mọi dự án. Đối tượng dùng các giá trị này cho đến khi được tùy chỉnh trong Thông tin đối tượng.", + "settings.diagnostics": "Chẩn đoán", + "settings.display_the_rendering_frame_rate_in_the_lower": "Hiển thị tốc độ khung hình ở góc dưới bên trái của mỗi khung nhìn. Khi hiển thị, ứng dụng sẽ liên tục kết xuất.", + "settings.format": "×", + "settings.grid": "Lưới", + "settings.grid_spacing": "Khoảng cách lưới", + "settings.group_new_shapes_outside_existing_objects": "Tạo nhóm riêng cho mỗi hình mới được vẽ bên ngoài nhóm hoặc thành phần hiện có. Các đoạn thẳng nối tiếp dùng chung một nhóm. Vẽ bên trong một đối tượng sẽ chỉnh sửa đối tượng đó.", + "settings.inference_points": "Điểm bắt", + "settings.infinite_grid": "Lưới vô hạn", + "settings.language": "Ngôn ngữ", + "settings.language_english": "Tiếng Anh", + "settings.length_of_each_side_of_the_square_centered": "Chiều dài mỗi cạnh của hình vuông, lấy gốc mô hình làm tâm. Ranh giới giữ nguyên khi thu phóng hoặc xoay.", + "settings.material": "Vật liệu", + "settings.materials_estimates": "Vật liệu và dự toán", + "settings.maximum_length": "Chiều dài tối đa", + "settings.midpoints": "Trung điểm", + "settings.navigation": "Điều hướng", + "settings.no_tools_match_your_search": "Không có công cụ nào khớp với nội dung tìm kiếm.", + "settings.orbit_speed": "Tốc độ xoay quanh", + "settings.pan_speed": "Tốc độ dịch chuyển", + "settings.rendering": "Kết xuất", + "settings.reset_axis_locks_on_each_action": "Đặt lại khóa trục sau mỗi thao tác", + "settings.restore_default_colors": "Khôi phục màu mặc định", + "settings.restore_default_shortcuts": "Khôi phục phím tắt mặc định", + "settings.reverse_scroll_zoom": "Đảo chiều thu phóng bằng con lăn", + "settings.sanding_finishing": "Chà nhám và hoàn thiện", + "settings.search_tools": "Tìm công cụ…", + "settings.settings": "Cài đặt", + "settings.shadow_antialiasing": "Khử răng cưa bóng đổ", + "settings.shortcut": "Phím tắt", + "settings.shortcuts_management": "Quản lý phím tắt", + "settings.show_frames_per_second": "Hiển thị số khung hình mỗi giây", + "settings.show_grid": "Hiện lưới", + "settings.smooth_shadow_boundaries_with_4_multisampling_only_shadows": "Làm mịn đường biên bóng bằng khử răng cưa đa mẫu 4×. Chỉ ảnh hưởng đến bóng đổ. Thay đổi có hiệu lực ngay.", + "settings.snap_to_grid": "Bắt theo lưới", + "settings.spacing_controls_both_grid_lines_and_grid_snapping": "Khoảng cách điều khiển cả đường lưới và thao tác bắt lưới. Mỗi đường thứ năm được làm nổi bật.", + "settings.system": "Hệ thống", + "settings.tool": "Công cụ", + "settings.tools": "Công cụ", + "settings.tools_for_checking_performance_and_troubleshooting": "Công cụ kiểm tra hiệu năng và khắc phục sự cố.", + "settings.used_for_new_projects_change_the_current_project": "Dùng cho dự án mới. Đổi đơn vị của dự án hiện tại trong bảng Đơn vị.", + "settings.workspace": "Không gian làm việc", + "settings.x_axis": "Trục X", + "settings.y_axis": "Trục Y", + "settings.z_axis": "Trục Z", + "settings.zoom_speed": "Tốc độ thu phóng", + "sharing.access_approved": "Đã phê duyệt", + "sharing.access_denied": "bị từ chối", + "sharing.access_edit": "chỉnh sửa", + "sharing.access_is_awaiting_approval": "Quyền truy cập đang chờ phê duyệt", + "sharing.access_none": "không có quyền", + "sharing.access_notifications": { + "one": "Thông báo truy cập ({count})", + "other": "Truy cập thông báo ({count})" + }, + "sharing.access_owner": "chủ sở hữu", + "sharing.access_pending": "đang chờ", + "sharing.access_reference_revision": "Access: {} · bản sửa đổi tham khảo: {}", + "sharing.access_request": "{} · {} · {}", + "sharing.access_view": "xem", + "sharing.account": "Tài khoản", + "sharing.account_changed": "Tài khoản đã thay đổi", + "sharing.account_sharing_connection": "Tài khoản: {account} · Kết nối chia sẻ: {connection}", + "sharing.approve": "Phê duyệt", + "sharing.avatar_request_ended": "Yêu cầu hình đại diện đã kết thúc", + "sharing.avatar_unavailable": "Không có hình đại diện", + "sharing.being_edited_by": "Đang được chỉnh sửa bởi {name}{}", + "sharing.checking_server_revision_and_file_timestamp_before_saving": "Đang kiểm tra bản sửa đổi máy chủ và dấu thời gian của tệp trước khi lưu…", + "sharing.connected_server_identity_not_reported": "Đã kết nối; danh tính máy chủ không được báo cáo", + "sharing.copy_link": "Sao chép liên kết", + "sharing.create_invitation_link": "Tạo liên kết lời mời", + "sharing.deny": "Từ chối", + "sharing.editing_access_has_not_been_confirmed_check_your": "Quyền truy cập chỉnh sửa chưa được xác nhận. Kiểm tra tài khoản của bạn và Tệp → Chia sẻ.", + "sharing.guest": "Khách", + "sharing.guest_2": " · Guest", + "sharing.invalid_server_access_response": "Phản hồi truy cập máy chủ không hợp lệ", + "sharing.invalid_websocket_endpoint": "Điểm cuối WebSocket không hợp lệ", + "sharing.invalid_websocket_project_state": "Trạng thái dự án WebSocket không hợp lệ", + "sharing.keep_local_as_separate_project": "Giữ cục bộ dưới dạng dự án riêng", + "sharing.local_session": "Phiên cục bộ", + "sharing.missing_guest_identity": "Thiếu danh tính khách", + "sharing.new_project_access_notification_file_share": "Thông báo truy cập dự án mới — Tệp → Chia sẻ", + "sharing.not_connected": "Không được kết nối", + "sharing.not_signed_in": "Chưa đăng nhập", + "sharing.objects_occupied_by_file_share": "Đối tượng do {} sử dụng · Tệp → Chia sẻ", + "sharing.occupied_by": "Được chiếm giữ bởi {}: {:?}", + "sharing.open_an_invitation_link": "Mở liên kết lời mời", + "sharing.open_shared_project": "Mở dự án chia sẻ", + "sharing.original_project_author": "Tác giả dự án ban đầu: {}", + "sharing.persistent_invitation_link_author_approval_required_for_reading": "Liên kết lời mời liên tục · cần có sự chấp thuận của tác giả để đọc và chỉnh sửa", + "sharing.project_changed": "Dự án đã thay đổi", + "sharing.project_request_failed": "Yêu cầu dự án không thành công", + "sharing.project_request_interrupted": "Yêu cầu dự án bị gián đoạn", + "sharing.publish_local_version": "Xuất bản phiên bản địa phương", + "sharing.refresh_access": "Quyền truy cập làm mới", + "sharing.refreshing_sharing_identity": "Làm mới danh tính chia sẻ", + "sharing.request_editing_access": "Yêu cầu quyền chỉnh sửa", + "sharing.request_viewing_access": "Yêu cầu quyền truy cập xem", + "sharing.resolve_the_project_version_conflict_in_file_share": "Giải quyết xung đột phiên bản dự án trong Tệp → Chia sẻ trước khi chỉnh sửa.", + "sharing.review_project": "Đánh giá dự án", + "sharing.save_your_current_project_before_opening_an_invitation": "Lưu dự án hiện tại của bạn trước khi mở lời mời.", + "sharing.server_revision_differs_from_this_file_local_changes": "Bản sửa đổi máy chủ {} ({}) khác với tệp này. Những thay đổi cục bộ đã được giữ lại. Chọn một phiên bản; một bản cập nhật đồng thời khác sẽ được kiểm tra lại.", + "sharing.server_timestamp_file_timestamp_utc_epoch_seconds": "Dấu thời gian của máy chủ: {} · dấu thời gian của tệp: {} (giây kỷ nguyên UTC)", + "sharing.server_unavailable": "Máy chủ không có sẵn", + "sharing.share": "Chia sẻ…", + "sharing.share_2": "Chia sẻ… ({pending})", + "sharing.share_project": "Chia sẻ dự án", + "sharing.share_uploads_this_project_to_your_configured_benchup": "Chia sẻ sẽ tải dự án này lên Máy chủ BenchUp đã cấu hình. Khách truy cập phải yêu cầu quyền truy cập.", + "sharing.shared": "Đã chia sẻ · {}", + "sharing.sign_in_to_your_account": "Đăng nhập vào tài khoản của bạn", + "sharing.sync": "Đồng bộ: {error}", + "sharing.sync_conflict_file_share": "Đồng bộ · Tệp → Chia sẻ", + "sharing.the_access_response_belongs_to_another_project": "Phản hồi truy cập thuộc về một dự án khác", + "sharing.the_server_confirmed_access_but_did_not_provide": "Máy chủ đã xác nhận quyền truy cập {} nhưng không cung cấp dữ liệu dự án", + "sharing.the_server_confirmed_access_but_the_project_data": "Máy chủ đã xác nhận quyền truy cập {}, nhưng không thể tải dữ liệu dự án: {error}", + "sharing.the_server_confirmed_editing_access_but_project_data": "Máy chủ đã xác nhận quyền truy cập chỉnh sửa nhưng dữ liệu dự án không có sẵn. Xem lại lỗi trong Tệp → Chia sẻ.", + "sharing.the_sharing_connection_uses_a_different_identity_refresh": "Kết nối chia sẻ sử dụng danh tính khác. Làm mới quyền truy cập để kết nối lại với tài khoản hiện tại của bạn.", + "sharing.this_file_belongs_to_a_different_or_invalid": "Tệp này thuộc về một máy chủ khác hoặc không hợp lệ. Mở Chia sẻ để kiểm tra nó; thông tin xác thực chưa được gửi.", + "sharing.use_an_invitation_from_the_configured_server": "Sử dụng lời mời từ máy chủ đã định cấu hình.", + "sharing.use_server_version": "Sử dụng phiên bản máy chủ", + "sharing.waiting_for_exclusive_selection": "Đang chờ lựa chọn độc quyền…", + "sharing.waiting_for_server_confirmation": "Đang chờ xác nhận máy chủ", + "sharing.waiting_for_the_server_connection_before_editing_your": "Đang chờ kết nối máy chủ trước khi chỉnh sửa. Quyền chỉnh sửa của bạn không thay đổi.", + "sharing.waiting_for_the_server_to_confirm_the_object": "Đang chờ máy chủ xác nhận khóa lựa chọn của đối tượng.", + "sharing.websocket_connection_timed_out": "WebSocket đã hết thời gian kết nối", + "sharing.websocket_disconnected": "WebSocket đã bị ngắt kết nối", + "sharing.websocket_ticket_request_interrupted": "Yêu cầu vé WebSocket bị gián đoạn", + "sharing.websocket_unavailable": "WebSocket không có sẵn", + "shortcuts.acquire_reference_axes": "Nhận trục tham chiếu", + "shortcuts.axis_lock_hover": "Zkhóa trục + di chuột", + "shortcuts.axis_lock_keys": "→ / ← / ↑", + "shortcuts.c": "{command} + C", + "shortcuts.cancel_current_operation": "Hủy hoạt động hiện tại", + "shortcuts.circle": "Vòng tròn", + "shortcuts.clear_all_axis_locks": "Xóa tất cả các khóa trục", + "shortcuts.close_editing_level": "Đóng mức chỉnh sửa", + "shortcuts.connected_lines": "Đường kết nối", + "shortcuts.copy": "Sao chép", + "shortcuts.ctrl_a": "Ctrl + A", + "shortcuts.ctrl_f": "Ctrl + F", + "shortcuts.ctrl_move_pointer": "Ctrl + di chuyển con trỏ", + "shortcuts.cut": "Cắt", + "shortcuts.delete_backspace": "Xóa / Backspace", + "shortcuts.delete_selection": "Xóa lựa chọn", + "shortcuts.dimensions": "Kích thước", + "shortcuts.divide_a_copy_span": "Chia khoảng sao chép", + "shortcuts.double_click": "Nhấp đúp", + "shortcuts.drawing_measuring": "Vẽ và đo", + "shortcuts.edit_group_or_component": "Chỉnh sửa nhóm hoặc thành phần", + "shortcuts.erase_edges_or_faces": "Xóa các cạnh hoặc mặt", + "shortcuts.escape": "Esc", + "shortcuts.find_a_tool_command_or_gesture": "Tìm công cụ, lệnh hoặc cử chỉ.", + "shortcuts.flip_solid_operations": "Hoạt động lật và rắn", + "shortcuts.freehand": "Tự do", + "shortcuts.hover_geometry": "Htrên hình học", + "shortcuts.keyboard_shortcuts": "Phím tắt", + "shortcuts.lengths_accept_units_and_formulas_1m_20cm_2": "Độ dài chấp nhận đơn vị và công thức: (1m + 20cm) / 2", + "shortcuts.lock_a_plane": "Khóa máy bay", + "shortcuts.lock_shape_plane_normal_x_y_z": "Lock hình mặt phẳng bình thường X / Y / Z", + "shortcuts.lock_x_y_z_axis": "Lock Trục X / Y / Z", + "shortcuts.match_reference_coordinate": "Tọa độ tham chiếu trận đấu", + "shortcuts.middle_drag": "Kéo giữa", + "shortcuts.modeling": "Mô hình hóa", + "shortcuts.move_geometry": "Di chuyển hình học", + "shortcuts.move_pointer": "⌘ + di chuyển con trỏ", + "shortcuts.n": "{command} + N", + "shortcuts.n_enter": "/N + Enter", + "shortcuts.navigation": "Điều hướng", + "shortcuts.new_project": "Dự án mới", + "shortcuts.no_shortcuts_found": "Không tìm thấy phím tắt", + "shortcuts.nx_enter": "Nx + Enter", + "shortcuts.o": "{command} + O", + "shortcuts.object_clipboard_menu": "Menu đối tượng & khay nhớ tạm", + "shortcuts.offset_a_face": "Dịch mặt song song", + "shortcuts.open_project": "Mở dự án", + "shortcuts.orbit": "Xoay quanh", + "shortcuts.orbit_while_drawing": "Quỹ đạo trong khi vẽ", + "shortcuts.paint_faces": "Mặt sơn", + "shortcuts.pan_while_orbiting": "Pan khi quay quanh", + "shortcuts.paste": "Dán", + "shortcuts.paste_in_place": "Dán tại chỗ", + "shortcuts.polygon": "Đa giác", + "shortcuts.precision_inference": "Độ chính xác và suy luận", + "shortcuts.press_a_key": "Nhấn một phím…", + "shortcuts.project_clipboard": "Dự án & clipboard", + "shortcuts.protractor": "Thước đo góc", + "shortcuts.push_pull_a_face": "Đẩy/Kéo mặt", + "shortcuts.push_pull_new_faces": "Chuyển đổi các mặt Đẩy/Kéo mới", + "shortcuts.recorder_accessibility": "Phím tắt {key}. {action}", + "shortcuts.recorder_idle": "Nhấp để thay đổi", + "shortcuts.recorder_listening": "Nhấn một chữ cái hoặc Dấu cách; Hủy bỏ lối thoát", + "shortcuts.recorder_tooltip": "Nhấp vào, sau đó nhấn một chữ cái hoặc Dấu cách. Việc hủy bỏ lối thoát.", + "shortcuts.rectangle": "Hình chữ nhật", + "shortcuts.repeat_copies": "Sao chép lại", + "shortcuts.right_click": "Nhấp chuột phải", + "shortcuts.rotate_geometry": "Xoay hình học", + "shortcuts.s": "{command} + S", + "shortcuts.save_as": "Lưu dưới dạng", + "shortcuts.scale_geometry": "Tỷ lệ hình học", + "shortcuts.scroll": "Cuộn", + "shortcuts.search_outliner": "Tìm trong danh sách đối tượng", + "shortcuts.search_shortcuts": "Phím tắt tìm kiếm…", + "shortcuts.select": "Chọn", + "shortcuts.select_all": "Chọn tất cả", + "shortcuts.selection_objects": "Lựa chọn & đối tượng", + "shortcuts.set_length_or_radius": "Đặt chiều dài hoặc bán kính", + "shortcuts.set_rectangle_size": "Đặt kích thước hình chữ nhật", + "shortcuts.shift_click": "Shift + nhấp chuột", + "shortcuts.shift_drag": "Shift + kéo", + "shortcuts.shift_middle_drag": "Shift + kéo giữa", + "shortcuts.shift_s": "{command} + Shift + S", + "shortcuts.shift_v": "{command} + Shift + V", + "shortcuts.shift_z": "{command} + Shift + Z", + "shortcuts.space": "Phím cách", + "shortcuts.tab": "Tab", + "shortcuts.tape_measure": "Thước dây", + "shortcuts.temporary_orbit": "Quỹ đạo tạm thời", + "shortcuts.temporary_pan": "Chảo tạm thời", + "shortcuts.toggle_move_copy": "Chuyển đổi Di chuyển / Sao chép", + "shortcuts.toggle_selection": "Chuyển đổi lựa chọn", + "shortcuts.toggle_sidebar": "Chuyển đổi thanh bên", + "shortcuts.toggle_two_axis_locks": "Chuyển đổi khóa hai trục", + "shortcuts.try_a_tool_name_like_orbit_or_a": "Thử tên công cụ như “orbit” hoặc phím như “{command}”.", + "shortcuts.union_flyout": "Menu hợp nhất", + "shortcuts.v": "{command} + V", + "shortcuts.value_enter": "Giá trị + Enter", + "shortcuts.width_height_enter": "Chiều rộng,chiều cao + Enter", + "shortcuts.x": "{command} + X", + "shortcuts.z": "{command} + Z", + "shortcuts.zoom_to_pointer": "Thu phóng đến con trỏ", + "sidebar.angle": "Góc", + "sidebar.angle_precision": "Độ chính xác góc", + "sidebar.area": "Diện tích", + "sidebar.area_precision": "Ađộ chính xác diện tích", + "sidebar.automatic_fasteners": "Phụ kiện liên kết tự động", + "sidebar.axes": "Trục", + "sidebar.back_edges": "Cạnh phía sau", + "sidebar.background_fog_color": "Màu nền / sương mù", + "sidebar.changes_to_your_project_will_appear_here_make": "Các thay đổi trong dự án sẽ xuất hiện tại đây. Hãy chỉnh sửa để bắt đầu lịch sử.", + "sidebar.click_to_place_the_component_escape_to_cancel": "Nhấp để đặt thành phần · Escape để hủy", + "sidebar.color_by_tag": "Tô màu theo thẻ", + "sidebar.component_instances": { + "one": "{count} bản thể", + "other": "{count} bản thể" + }, + "sidebar.components": "Thành phần", + "sidebar.current": " · Hiện tại", + "sidebar.darkness": "Độ tối", + "sidebar.depth_cue": "Hiệu ứng chiều sâu", + "sidebar.dimensions": "Kích thước", + "sidebar.direction": "Hướng", + "sidebar.display": "Hiển thị", + "sidebar.display_fog": "Hiển thị sương mù", + "sidebar.display_shadows": "Hiển thị bóng đổ", + "sidebar.edge_style": "Kiểu cạnh", + "sidebar.edges": "Cạnh", + "sidebar.elevation": "Cao độ", + "sidebar.emphasize_group": "Làm nổi bật nhóm đang chỉnh sửa", + "sidebar.emphasize_the_group_component_currently_being_edited_and": "Làm nổi bật nhóm/thành phần đang chỉnh sửa và hiển thị các phần còn lại dưới dạng khung dây mờ. Không có hiệu ứng bên ngoài nhóm/thành phần.", + "sidebar.end": "Kết thúc", + "sidebar.endpoints": "Điểm đầu mút", + "sidebar.environment": "Môi trường", + "sidebar.extensions": "Phần mở rộng", + "sidebar.face_style": "Kiểu mặt", + "sidebar.fog": "Sương mù", + "sidebar.format": "×", + "sidebar.grid": "Lưới", + "sidebar.group_names": "Tên nhóm", + "sidebar.guest": "Khách", + "sidebar.guides": "Đường dẫn", + "sidebar.hidden_geometry": "Hình học bị ẩn", + "sidebar.hidden_objects": "Đối tượng bị ẩn", + "sidebar.history": "Lịch sử", + "sidebar.history_entry": "{}. {label}{suffix}", + "sidebar.history_entry_detail": "{label} · {who}{when}", + "sidebar.hover_to_preview_an_edit_click_to_restore": "Di chuột để xem trước một thao tác chỉnh sửa. Nhấp để khôi phục trạng thái đó.", + "sidebar.length": "Chiều dài", + "sidebar.length_precision": "Độ chính xác chiều dài", + "sidebar.make_component": "Tạo thành phần…", + "sidebar.materials": "Vật liệu", + "sidebar.no_components_yet": "Chưa có thành phần", + "sidebar.no_matching_components": "Không có thành phần phù hợp", + "sidebar.no_modifications_yet": "Chưa có chỉnh sửa nào.", + "sidebar.oldest_retained_state": "Trạng thái cũ nhất còn lưu", + "sidebar.outliner": "Danh sách đối tượng", + "sidebar.place_instance": "Đặt bản thể", + "sidebar.precision_controls_displayed_decimal_places_lengths_entered_without": "Độ chính xác quy định số chữ số thập phân được hiển thị. Chiều dài nhập không kèm đơn vị sẽ dùng đơn vị chiều dài đã chọn.", + "sidebar.profile_width": "Chiều rộng biên dạng", + "sidebar.profiles": "Biên dạng", + "sidebar.properties": "Thuộc tính", + "sidebar.remove_this_grit": "Xóa độ nhám này", + "sidebar.reset_display": "Đặt lại hiển thị", + "sidebar.search_components": "Tìm thành phần", + "sidebar.select_geometry_and_choose_create_component_from_the": "Chọn hình học rồi chọn Tạo thành phần trong menu Chỉnh sửa.", + "sidebar.server_verified_account": "Tài khoản đã được máy chủ xác minh", + "sidebar.shadows": "Bóng đổ", + "sidebar.start": "Bắt đầu", + "sidebar.tags": "Thẻ", + "sidebar.this_component_is_empty": "Thành phần này đang trống", + "sidebar.time_cost_estimates": "Ước tính thời gian và chi phí", + "sidebar.try_another_name_or_clear_the_search_to": "Thử tên khác hoặc xóa nội dung tìm kiếm để xem tất cả thành phần.", + "sidebar.undone": " · Đã hoàn tác", + "sidebar.units": "Đơn vị", + "sidebar.unknown_author": "Tác giả không xác định", + "sidebar.unknown_time": "Thời gian không xác định", + "sidebar.unverified": "Chưa xác minh", + "sidebar.up_to_100_edits_are_saved_with_this": "Tối đa 100 thao tác chỉnh sửa được lưu cùng dự án. Chỉnh sửa trạng thái cũ hơn sẽ thay thế các thao tác phía sau.", + "sidebar.utc": " · {t} UTC", + "sidebar.utc_2": "{} · {} · {} UTC", + "sidebar.view": "Chế độ xem", + "sidebar.volume": "Thể tích", + "sidebar.volume_precision": "Độ chính xác thể tích", + "sidebar.wood_joinery": "Mối nối gỗ", + "sidebar.x_ray": "Tia X", + "solid_tools.choose_first_body_again": "Chọn lại nội dung đầu tiên", + "solid_tools.choose_groups_components_or_connected_bodies_results_are": "Chọn nhóm, thành phần hoặc phần được kết nối. Kết quả là các nhóm có thể chỉnh sửa.", + "solid_tools.click_a_group_component_or_connected_body": "Nhấp vào một nhóm, thành phần hoặc nội dung được kết nối", + "solid_tools.connected_body": "Phần thân được kết nối", + "solid_tools.cutter_selected_click_the_target_solid_to_trim": "Cutter đã chọn · Nhấp vào khối mục tiêu để cắt · Esc để hủy", + "solid_tools.first_body_selected_click_the_second_body_esc": "Nội dung đầu tiên được chọn · Nhấp vào nội dung thứ hai · Esc để hủy", + "solid_tools.first_body_selected_click_the_second_body_or": "Đã chọn khối thứ nhất · Nhấp vào khối thứ hai hoặc nhấn Esc để hủy", + "solid_tools.flip_x": "Lật trục X", + "solid_tools.flip_y": "Lật Y", + "solid_tools.flip_z": "Lật Z", + "solid_tools.intersect_also_keeps_the_portion_of_a_face": "Phép giao cũng giữ lại phần mặt nằm bên trong một khối kín.", + "solid_tools.mirror_around_the_selection_center": "Gương xung quanh trung tâm lựa chọn:", + "solid_tools.the_first_click_chooses_the_cutter_it_stays": "Nhấp lần đầu để chọn dao cắt. Dao cắt vẫn được giữ lại trong mô hình.", + "solid_tools.the_target_was_entirely_removed_by_the_cutter": "Mục tiêu đã được loại bỏ hoàn toàn bởi máy cắt", + "solid_tools.unlock_the_body_before_editing_it": "Mở khóa nội dung trước khi chỉnh sửa", + "solid_tools.use_closed_bodies_with_no_stray_edges_or": "Sử dụng các vật thể khép kín không có cạnh lệch hoặc thiếu mặt.", + "solid_tools.volume": "Khối lượng", + "solid_tools.x_red": "X / đỏ", + "solid_tools.y_green": "Y / xanh", + "solid_tools.z_blue": "Z / xanh", + "startup.benchup_3d_workspace": "BenchUp — Không gian làm việc 3D", + "startup.benchup_could_not_start_its_gpu_renderer_enable": "BenchUp không thể khởi động trình kết xuất GPU của nó. Bật tăng tốc phần cứng hoặc thử trình duyệt có hỗ trợ WebGPU hoặc WebGL2.", + "startup.the_bundled_benchup_icon_must_be_a_valid": "Biểu tượng BenchUp đi kèm phải là PNG", + "stock_settings.add_wood_stock": "+ Thêm kho gỗ", + "stock_settings.assigned_objects": { + "one": "{project}{current} · {count} đối tượng được giao", + "other": "{project}{current} · {count} đối tượng được giao" + }, + "stock_settings.currency": "Tiền tệ", + "stock_settings.current_project": " (dự án hiện tại)", + "stock_settings.e_g_pine_2_4": "Ví dụ: gỗ thông 2 × 4", + "stock_settings.existing_projects_keep_their_material_definitions_and_assignments": "Các dự án hiện tại giữ nguyên các định nghĩa và nhiệm vụ quan trọng của chúng. Họ sẽ không còn nhận được cập nhật danh mục cho tài liệu này nữa.", + "stock_settings.format": "×", + "stock_settings.hardboard": "Ván sợi cứng", + "stock_settings.known_project_associations_on_this_device": "Các liên kết dự án đã biết trên thiết bị này", + "stock_settings.length": "Chiều dài", + "stock_settings.mm": "{} ({} × {} × {} mm)", + "stock_settings.no_known_project_associations": "Không có liên kết dự án nào được biết đến.", + "stock_settings.no_stock_materials_match_your_search": "Không có tài liệu trong kho nào phù hợp với tìm kiếm của bạn.", + "stock_settings.no_wood_stock_yet_add_a_board_or": "Chưa có kho gỗ. Thêm bảng hoặc trang tính, sau đó nhập kích thước và giá của nó.", + "stock_settings.no_wood_types_match_your_search": "Không có loại gỗ nào phù hợp với tìm kiếm của bạn.", + "stock_settings.other": "Khác", + "stock_settings.particleboard": "Bảng hạt", + "stock_settings.per_piece": "{} mỗi mảnh", + "stock_settings.plywood": "Ván ép", + "stock_settings.price_piece": "Giá/cái", + "stock_settings.project_material": "{} (tài liệu dự án)", + "stock_settings.remove": "Xóa {}", + "stock_settings.remove_from_settings_material": "Xóa “{name}” khỏi Cài đặt → Chất liệu?", + "stock_settings.remove_material": "Xóa tài liệu?", + "stock_settings.remove_material_2": "Xóa tài liệu", + "stock_settings.save_the_wood_stock_and_finishing_products_you": "Lưu trữ gỗ và các sản phẩm hoàn thiện mà bạn có thể mua với giá của nhà cung cấp. Sử dụng kích thước thực tế cho bảng hoặc tấm.", + "stock_settings.search_name_or_size": "Tìm kiếm tên hoặc kích thước…", + "stock_settings.search_wood_types": "Tìm kiếm loại gỗ…", + "stock_settings.sizes_in_prices_in_per_piece": "Kích thước tính bằng {} · Giá tính bằng {} mỗi chiếc", + "stock_settings.sizing_units": "Đơn vị định cỡ", + "stock_settings.solid_wood": "Gỗ nguyên khối", + "stock_settings.stock": "Phôi", + "stock_settings.thickness": "Độ dày", + "stock_settings.this_material_may_be_associated_with_objects_in": "Tài liệu này có thể được liên kết với các đối tượng trong các dự án khác.", + "stock_settings.type": "Loại", + "stock_settings.unassigned": "Chưa được chỉ định", + "stock_settings.unspecified": "Không xác định", + "stock_settings.usage_is_based_on_projects_opened_on_this": "Usage dựa trên các dự án được mở trên thiết bị này và có thể đã lỗi thời. Các dự án chưa mở cũng có thể tham khảo tài liệu này.", + "stock_settings.used_for_all_prices_and_cost_estimates_in": "Được sử dụng cho tất cả giá và ước tính chi phí trong ứng dụng. Việc thay đổi đơn vị tiền tệ không chuyển đổi giá đã nhập.", + "stock_settings.veneer": "Ván lạng", + "stock_settings.width": "Chiều rộng", + "stock_settings.wood": "Gỗ", + "stock_settings.wood_stock": "Phôi gỗ", + "storage.cannot_locate_the_application_data_directory": "Không thể định vị thư mục dữ liệu ứng dụng", + "storage.cannot_read_local_storage": "Không thể đọc bộ nhớ cục bộ", + "storage.invalid_storage_path": "Đường dẫn lưu trữ không hợp lệ", + "storage.local_storage_is_blocked": "Bộ nhớ cục bộ bị chặn", + "storage.local_storage_is_blocked_or_full": "Bộ nhớ cục bộ bị chặn hoặc đầy", + "storage.local_storage_is_unavailable": "Bộ nhớ cục bộ không khả dụng", + "storage.no_browser_window": "Không có cửa sổ trình duyệt", + "system_info.available_logical_cpus": "Các CPU logic hiện có: {threads}", + "system_info.copied": "Đã sao chép", + "system_info.copy_to_clipboard": "Sao chép vào khay nhớ tạm", + "system_info.dark": "Tối", + "system_info.debug": "Gỡ lỗi", + "system_info.describe_your_feature_suggestion_or_bug_here_system": "Mô tả đề xuất tính năng hoặc lỗi của bạn tại đây.\n\n---\n\n## Thông tin hệ thống\n\n{fence}văn bản\n{report}\n{fence}\n", + "system_info.graphics_adapter_information_unavailable": "Thông tin bộ điều hợp đồ họa: không có sẵn\n", + "system_info.include_these_details_when_reporting_a_bug": "Bao gồm các chi tiết này khi báo cáo lỗi.", + "system_info.benchup_build": "BenchUp {}\nBản dựng: {}\n", + "system_info.light": "Sáng", + "system_info.os_version": "OS: {}", + "system_info.platform": "Nền tảng: {:?}", + "system_info.release": "Phát hành", + "system_info.renderer_wgpu_graphics_backend_gpu_gpu_type_gpu": "Trình kết xuất: wgpu\nPhần phụ trợ đồ họa: {:?}\nGPU: {}\nLoại GPU: {:?}\nNhà cung cấp/thiết bị GPU: {:04x}/{:04x}\nNgười lái xe: {}\nChi tiết về trình điều khiển: {}\nĐịnh dạng bề mặt: {:?}", + "system_info.runtime_browser_webassembly_browser_os": "Runtime: Trình duyệt (WebAssembly)\nTrình duyệt/HĐH: {}", + "system_info.runtime_desktop_os_architecture": "Runtime: Máy tính để bàn\nHệ điều hành: {}\nKiến trúc: {}", + "system_info.system_information": "Thông tin hệ thống", + "system_info.window_pixels_ui_scale_pixels_point_ui_zoom": "Cửa sổ: {:.0} × {:.0} pixel\nTỷ lệ giao diện người dùng: {scale:.2} pixel/điểm\nThu phóng giao diện người dùng: {:.0}%\nChủ đề: {}", + "tag_menu.add_tag": "Thêm thẻ", + "tag_menu.assign": "Chỉ định: {}", + "tag_menu.assign_tag": "Thẻ gán", + "tag_menu.assign_this_tag_to_the_selection_untick_to": "Gán thẻ này cho vùng chọn; bỏ chọn để xóa nó", + "tag_menu.cancel_renaming": "Hủy đổi tên", + "tag_menu.click_to_edit_the_tag_color": "Nhấp để chỉnh sửa màu thẻ", + "tag_menu.close_color_editor": "Đóng trình chỉnh sửa màu", + "tag_menu.color": "Màu: {}", + "tag_menu.color_2": "Màu · {}", + "tag_menu.create_a_tag_above_to_organize_objects_and": "Tạo thẻ ở trên để sắp xếp các đối tượng và kiểm soát khả năng hiển thị của chúng.", + "tag_menu.delete": "Xóa: {}", + "tag_menu.delete_tag": "Xóa thẻ", + "tag_menu.delete_tag_its_entities_become_untagged": "Xóa thẻ; các thực thể của nó trở thành Untagged", + "tag_menu.edit_tags": "Chỉnh sửa thẻ", + "tag_menu.format": "×", + "tag_menu.hide": "Hẩn", + "tag_menu.hide_tag": "Ẩn thẻ", + "tag_menu.new_tag_name": "Tên thẻ mới", + "tag_menu.no_tags_yet": "Chưa có thẻ", + "tag_menu.rename": "Đổi tên: {}", + "tag_menu.rename_tag": "Đổi tên thẻ", + "tag_menu.save_name": "Lưu tên", + "tag_menu.show": "Hiện", + "tag_menu.show_tag": "Hiển thị thẻ", + "tag_menu.tag": "{}: {}", + "tag_menu.tag_color": "Màu thẻ", + "tag_menu.unassign_tag": "Bỏ gán thẻ", + "text_tools.add_a_label_to_your_model": "Thêm nhãn vào mô hình của bạn.", + "text_tools.add_text": "Thêm văn bản", + "text_tools.attach_text": "Đính kèm văn bản", + "text_tools.click_a_visible_edge_face_group_or_component": "Nhấp vào cạnh, mặt, nhóm hoặc thành phần hiển thị để đính kèm văn bản", + "text_tools.edit_text": "Chỉnh sửa văn bản", + "text_tools.edit_text_2": "Chỉnh sửa văn bản", + "text_tools.edit_text_3": "Chỉnh sửa văn bản…", + "text_tools.enter_label_text": "Nhập văn bản nhãn", + "text_tools.enter_to_save_shift_enter_for_a_new": "Enter để lưu · Shift+Enter để có dòng mới · Esc để hủy", + "text_tools.text": "Văn bản", + "time_estimates.add_finishing_products_in_settings_material": "Thêm sản phẩm hoàn thiện trong Cài đặt → Vật liệu.", + "time_estimates.add_grit": "Thêm cấp hạt nhám", + "time_estimates.allowances_cover_layout_cutting_and_fitting_both_parts": "Thời gian dự phòng bao gồm việc lấy dấu, cắt và lắp cả hai phần của mỗi mối nối. Mức mặc định giả định sử dụng máy móc và đồ gá trong xưởng. Thời gian thực tế thay đổi tùy theo dụng cụ và quy trình.", + "time_estimates.amount": "Thành tiền ({currency})", + "time_estimates.apply_materials_to_children": "Áp dụng vật liệu cho các đối tượng con", + "time_estimates.apply_to_all_children": "Áp dụng cho tất cả đối tượng con", + "time_estimates.assigned_items_omitted": { + "one": "{count}: không có độ dày sử dụng được.", + "other": "{count}: không có độ dày sử dụng được." + }, + "time_estimates.between_coats": "Giữa các lớp", + "time_estimates.between_coats_applies_to_varnish_only_enable_varnish": "Thời gian chờ giữa các lớp chỉ áp dụng cho sơn bóng. Bật sơn bóng và đặt ít nhất 2 lớp.", + "time_estimates.between_varnish_coats_sand_after_each_coat_except": "Giữa các lớp sơn bóng: chà nhám sau mỗi lớp, trừ lớp cuối cùng, thay vì chà nhám trước khi hoàn thiện.", + "time_estimates.change_sanding_and_finishing": "Thay đổi chà nhám và hoàn thiện", + "time_estimates.choose_a_product_for_each_enabled_finishing_step": "Chọn sản phẩm cho mỗi bước hoàn thiện đang bật.", + "time_estimates.choose_sanding_grits_or_finishes_for_objects_in": "Chọn cấp hạt nhám hoặc sản phẩm hoàn thiện cho các đối tượng trong mục Vật liệu.", + "time_estimates.coats": "Số lớp", + "time_estimates.container": "\nĐơn vị đóng gói: {} {}", + "time_estimates.container_count": "{value:.0}", + "time_estimates.containers": { + "one": "{count:.0}", + "other": "{count:.0}" + }, + "time_estimates.copy_each_selected_object_s_stock_material_sanding": "Sao chép cài đặt vật liệu phôi, chà nhám và hoàn thiện của từng đối tượng được chọn sang mọi nhóm và thành phần hậu duệ. Các đối tượng lồng nhau được chọn vẫn giữ cài đặt riêng.", + "time_estimates.cost_estimate": "Dự toán chi phí", + "time_estimates.cost_exceeds_estimate_range": "Chi phí vượt quá phạm vi ước tính.", + "time_estimates.count": "Số lượng", + "time_estimates.counts_all_configured_wood_joints_regardless_of_selection": "Tính tất cả mối nối gỗ đã cấu hình, bất kể trạng thái chọn, hiển thị hay ngữ cảnh chỉnh sửa.", + "time_estimates.coverage_m2_per_container_per_coat": "; độ phủ {coverage} m² cho mỗi đơn vị đóng gói, mỗi lớp", + "time_estimates.coverage_missing_set_m2_per_container_per_coat": "Chưa có độ phủ: hãy đặt diện tích m² cho mỗi đơn vị đóng gói, mỗi lớp trong Cài đặt → Vật liệu.", + "time_estimates.cuts_excluded_label": { + "one": "{count} chi tiết không vừa phôi · Không tính vào chi phí", + "other": "{count} chi tiết không vừa phôi · Không tính vào chi phí" + }, + "time_estimates.cuts_excluded_note": { + "one": "\n{count} chi tiết không vừa phôi — Không tính vào chi phí.", + "other": "\n{count} chi tiết không vừa phôi — Không tính vào chi phí." + }, + "time_estimates.default_allowance_is_minutes_per_joint": "Thời gian dự phòng mặc định là {} phút cho mỗi mối nối.", + "time_estimates.different_wait_after_final_coat": "Thời gian chờ sau lớp cuối cùng khác nhau", + "time_estimates.draw_or_import_parts_to_estimate_time_and": "Vẽ hoặc nhập các chi tiết để ước tính thời gian và chi phí.", + "time_estimates.drying_waiting": "Thời gian chờ/sấy", + "time_estimates.enter_any_positive_grit_number_including_values_above": "Nhập cấp hạt nhám lớn hơn 0, kể cả giá trị trên 320", + "time_estimates.estimate": "Ước tính", + "time_estimates.estimate_incomplete": "Ước tính chưa hoàn thành", + "time_estimates.estimate_incomplete_items_omitted": { + "one": "Ước tính chưa đầy đủ: đã bỏ qua {count} mục được gán vì không có độ dày phù hợp.", + "other": "Ước tính chưa đầy đủ: đã bỏ qua {count} mục được gán vì không có độ dày phù hợp." + }, + "time_estimates.estimate_incomplete_the_priced_subtotal_excludes_items_with": "Ước tính chưa đầy đủ: tổng phụ đã tính giá không bao gồm mục thiếu giá/độ phủ và các chi tiết không vừa phôi. Hãy xem lại mọi cảnh báo về mục.", + "time_estimates.exceeds_estimate_range": "Vượt quá phạm vi ước tính", + "time_estimates.final_wait": "Thời gian chờ cuối", + "time_estimates.finishes_whole_containers_needs_combined_across_objects_and": "Sản phẩm hoàn thiện: tính theo đơn vị đóng gói nguyên · Cộng gộp lượng dùng giữa các đối tượng và số lớp trước khi làm tròn.", + "time_estimates.finishes_whole_containers_purchased_surface_area_and_coats": "Sản phẩm hoàn thiện được mua theo đơn vị đóng gói nguyên. Diện tích bề mặt và số lớp được cộng gộp theo từng sản phẩm trên các đối tượng và công đoạn trước khi làm tròn. Độ phủ tính trên mỗi đơn vị đóng gói cho mỗi lớp. Giá chưa bao gồm nhân công.", + "time_estimates.finishing": "Hoàn thiện", + "time_estimates.finishing_applies_only_to_objects_assigned_a_material": "Công đoạn hoàn thiện chỉ áp dụng cho các đối tượng được gán vật liệu từ Cài đặt → Vật liệu → Gỗ.", + "time_estimates.grit_2": "Cấp hạt nhám {grit}", + "time_estimates.grit_3": "Cấp hạt nhám", + "time_estimates.h_min": "{} giờ {} phút", + "time_estimates.hands_on": "Thời gian làm", + "time_estimates.hands_on_work": "Thời gian thao tác", + "time_estimates.include_in_estimate": "Bao gồm trong ước tính", + "time_estimates.includes_final_drying_objects_dry_together_between_steps": "Đã tính thời gian khô cuối cùng · Các đối tượng khô đồng thời giữa các công đoạn", + "time_estimates.item": "Hạng mục", + "time_estimates.joinery_whole_project": "Mối nối gỗ · Toàn bộ dự án", + "time_estimates.joinery_whole_project_2": "Mối nối gỗ (toàn bộ dự án)", + "time_estimates.joinery_whole_project_3": "Mối nối gỗ (toàn bộ dự án). {JOINERY_SCOPE} {JOINERY_ALLOWANCE_NOTE}", + "time_estimates.joint": "Mối nối", + "time_estimates.kerf_rotation": "Mạch cắt {} · Xoay {}", + "time_estimates.kerf_rotation_stock_uses_each_part_s_full": "Mạch cắt {} — Xoay {}. Mỗi chi tiết dùng toàn bộ hộp bao của phôi, kể cả phần hao hụt khi cắt; rãnh và phần khoét không làm giảm kích thước phôi cần dùng.", + "time_estimates.materials_all_visible_parts": "Vật liệu · Tất cả chi tiết đang hiển thị", + "time_estimates.materials_selected_parts": "Vật liệu · Các chi tiết được chọn", + "time_estimates.min_joint": "Phút / mối nối", + "time_estimates.minutes_m2": "Phút / m²", + "time_estimates.mixed_sanding_and_finishing_settings_changes_apply_to": "Cài đặt chà nhám và hoàn thiện hỗn hợp. Các thay đổi áp dụng cho các đối tượng gỗ đã chọn, bao gồm cả các đối tượng gỗ lồng nhau.", + "time_estimates.no_estimates_yet": "Chưa có ước tính", + "time_estimates.no_finishing_tasks": "Không có nhiệm vụ hoàn thiện", + "time_estimates.no_stock_estimate_yet": "Chưa có ước tính phôi", + "time_estimates.no_stock_estimate_yet_assign_stock_materials_to": "Chưa có ước tính phôi: {message}. Hãy gán vật liệu phôi cho các chi tiết khối đặc và cấu hình kích thước/giá phôi trong Cài đặt → Vật liệu.", + "time_estimates.no_surfaces_to_estimate": "Không có bề mặt nào để ước tính", + "time_estimates.no_treatment_tasks_enabled_choose_sanding_grits_or": "Chưa bật công đoạn xử lý nào. Hãy chọn cấp hạt nhám hoặc sản phẩm hoàn thiện cho các đối tượng trong mục Vật liệu.", + "time_estimates.no_visible_surfaces_with_assigned_wood_materials": "Không có bề mặt đang hiển thị nào được gán vật liệu gỗ.", + "time_estimates.no_visible_surfaces_with_assigned_wood_materials_in": "Không có bề mặt đang hiển thị nào được gán vật liệu gỗ trong phạm vi hiện tại.", + "time_estimates.objects": { + "one": "{title} ({count} đối tượng)", + "other": "{title} ({count} đối tượng)" + }, + "time_estimates.partial": " (một phần)", + "time_estimates.partial_2": "{} {} (một phần)", + "time_estimates.pre_stain": "Xử lý trước khi nhuộm", + "time_estimates.price": "Giá", + "time_estimates.price_missing_set_the_price_per_container_in": "Chưa có giá: hãy đặt giá cho mỗi đơn vị đóng gói trong Cài đặt → Vật liệu.", + "time_estimates.price_unavailable": "Không có giá", + "time_estimates.price_unavailable_add_a_price_in_settings_material": "\nChưa có giá. Hãy thêm giá trong Cài đặt → Vật liệu.", + "time_estimates.product": "Sản phẩm", + "time_estimates.product_issue": "\n{issue}", + "time_estimates.quantity": "Số lượng", + "time_estimates.restore_sanding_and_finishing_defaults_from_settings_for": "Khôi phục mặc định chà nhám và hoàn thiện từ Cài đặt cho các đối tượng gỗ đã chọn.", + "time_estimates.revert_to_defaults": "Hoàn nguyên về mặc định", + "time_estimates.rotation_off": "tắt", + "time_estimates.rotation_on": "bật", + "time_estimates.router_allowance": "Thời gian dự phòng: thiết lập một lần cho mỗi cấu hình, cộng thời gian gia công theo mét. Điều chỉnh theo vật liệu, độ sâu và số lượt chạy.", + "time_estimates.router_empty": "Gán cấu hình máy phay cho một cạnh để ước tính thời gian gia công.", + "time_estimates.router_rate": "Thời gian gia công (phút/m)", + "time_estimates.router_report_note": "Máy phay (toàn bộ dự án): thiết lập {setup} phút cho mỗi cấu hình + {rate} phút/m. Tính các đường chạy dao đã lưu, bất kể trạng thái chọn hay hiển thị; hãy điều chỉnh theo vật liệu, độ sâu và số lượt chạy.", + "time_estimates.router_scope": "Tính các đường chạy dao đã lưu trong toàn dự án, bất kể trạng thái chọn hay hiển thị.", + "time_estimates.router_setup": "Thời gian thiết lập cho mỗi cấu hình (phút)", + "time_estimates.router_task": "Máy phay (toàn bộ dự án)", + "time_estimates.router_whole_project": "Máy phay · Toàn bộ dự án", + "time_estimates.sanding": "Chà nhám", + "time_estimates.select_faces_or_groups_with_assigned_wood_materials": "Chọn các mặt hoặc nhóm bằng vật liệu gỗ được chỉ định.", + "time_estimates.selected": "Đã chọn", + "time_estimates.selected_wood_surfaces": "Bề mặt gỗ được chọn", + "time_estimates.sequential_total": "Tổng thời gian theo trình tự", + "time_estimates.soak_per_coat": "Thời gian thấm mỗi lớp", + "time_estimates.some_cuts_need_larger_stock_their_cost_is": "Một số chi tiết cần phôi lớn hơn nên chi phí của chúng không được tính.", + "time_estimates.stain": "Nhuộm màu", + "time_estimates.stock_pieces_without_price": { + "one": "{count} phôi chưa có giá. Hãy thêm giá trong Cài đặt → Vật liệu.", + "other": "{count} phôi chưa có giá. Hãy thêm giá trong Cài đặt → Vật liệu." + }, + "time_estimates.task": "Công việc", + "time_estimates.the_selected_product_is_no_longer_in_settings": "Sản phẩm đã chọn không còn trong Cài đặt → Vật liệu. Hãy chọn sản phẩm thay thế hoặc xóa lựa chọn.", + "time_estimates.time_includes_whole_project_joinery_sanding_finishing_and": "Thời gian bao gồm mối nối gỗ và gia công bằng máy phay trên toàn dự án, chà nhám, hoàn thiện và thời gian khô cuối cùng.", + "time_estimates.total": "Tổng cộng", + "time_estimates.unassigned_finishing_product": "Sản phẩm hoàn thiện chưa được chỉ định", + "time_estimates.unavailable": "Không có sẵn", + "time_estimates.unavailable_finishing_product": "Sản phẩm hoàn thiện không có sẵn", + "time_estimates.unit_price": "Đơn giá ({currency})", + "time_estimates.unknown": "Không xác định", + "time_estimates.unresolved_finishing_products": "Sản phẩm hoàn thiện chưa được giải quyết", + "time_estimates.uses_each_part_s_full_bounding_box_with": "Dùng toàn bộ hộp bao của mỗi chi tiết cùng cách xếp phôi và thiết lập trong mục Chuẩn bị sơ đồ cắt. Rãnh và phần khoét không làm giảm kích thước phôi cần thiết. Giá tính theo vật liệu đã mua, kể cả phần hao hụt khi cắt; chưa bao gồm nhân công. Sản phẩm hoàn thiện được ước tính riêng dựa trên diện tích bề mặt, số lớp và độ phủ của mỗi đơn vị đóng gói.", + "time_estimates.value": "Giá trị", + "time_estimates.varnish": "Vecni", + "time_estimates.visible": "Có thể nhìn thấy", + "time_estimates.visible_wood_surfaces": "Bề mặt gỗ nhìn thấy được", + "time_estimates.wait_per_coat": "Đợi mỗi lớp", + "time_estimates.wood_stock": "Phôi gỗ", + "time_estimates.wood_surfaces_finishing_applies_only_to_objects_assigned": "{} - {} bề mặt gỗ. Hoàn thiện chỉ áp dụng cho các đối tượng được gán vật liệu từ Cài đặt > Chất liệu > Gỗ.", + "tools.arc": "Cung tròn", + "tools.arc_instructions": "Nhấp chọn hai đầu mút, sau đó chọn một điểm trên cung · Phím mũi tên khóa mặt phẳng vẽ", + "tools.choose_a_color_and_face_or_group_in": "Chọn màu và Mặt hoặc Nhóm trong bảng thuộc tính · Nhấp vào mặt để tô màu", + "tools.circle": "Đường tròn", + "tools.click_a_center_a_baseline_then_an_angle": "Nhấp chọn tâm, đường chuẩn rồi góc · Ctrl/Command chuyển đổi giữa Tạo đường dẫn và Đo", + "tools.click_a_face_move_along_its_normal_arrow": "Nhấp vào mặt · Di chuyển theo pháp tuyến · Ctrl bật/tắt mặt mới · Phím mũi tên khóa trục · Nhấp hoặc nhập khoảng cách rồi nhấn Enter", + "tools.click_a_face_near_its_boundary_move_inward": "Nhấp vào mặt gần đường biên · Di chuyển vào trong hoặc ra ngoài · Nhập khoảng cách rồi nhấn Enter", + "tools.click_a_reference_edge_or_point_ctrl_command": "Nhấp vào cạnh hoặc điểm tham chiếu · Ctrl/Command chuyển đổi giữa Tạo đường dẫn và Đo · Esc để xóa", + "tools.click_an_edge_or_face_drag_to_box": "Nhấp vào cạnh hoặc mặt · Nhấp đúp vào mặt để chọn các cạnh · Nhấp ba lần để chọn hình học liên kết · Kéo để chọn bằng khung · Shift để đổi vùng chọn", + "tools.click_an_object_then_click_to_place_its": "Nhấp vào đối tượng rồi nhấp để đặt nhãn văn bản · Esc để hủy", + "tools.click_groups_components_or_faces_to_keep_their": "Nhấp vào nhóm, thành phần hoặc mặt để giữ phần giao nhau của chúng", + "tools.click_or_drag_across_edges_or_faces_to": "Nhấp hoặc kéo qua cạnh hay mặt để tẩy · Ctrl/⌘ Z để hoàn tác", + "tools.click_the_center_then_a_point_on_the": "Nhấp chọn tâm rồi một điểm trên đường tròn · Phím mũi tên khóa mặt phẳng vẽ", + "tools.click_the_center_then_a_vertex_arrow_keys": "Nhấp chọn tâm rồi một đỉnh · Phím mũi tên khóa mặt phẳng vẽ", + "tools.click_the_cutter_first_then_the_solid_to": "Nhấp chọn dao cắt trước rồi khối đặc cần cắt xén · Dao cắt vẫn được giữ lại", + "tools.click_to_start_a_line_arrow_keys_lock": "Nhấp để bắt đầu vẽ đường thẳng · Phím mũi tên khóa trục · Nhập chiều dài để tăng độ chính xác", + "tools.click_two_closed_solids_to_combine_their_outer": "Nhấp chọn hai khối đặc kín để kết hợp các bề mặt bên ngoài", + "tools.click_two_closed_solids_to_combine_their_volumes": "Nhấp chọn hai khối đặc kín để kết hợp thể tích của chúng", + "tools.click_two_closed_solids_to_keep_the_overlap": "Nhấp chọn hai khối đặc kín để giữ phần giao nhau và các phần còn lại riêng biệt", + "tools.click_two_endpoints_then_click_to_place_the": "Nhấp chọn hai đầu mút rồi nhấp để đặt kích thước · Esc để hủy", + "tools.click_two_opposite_corners_arrow_keys_lock_the": "Nhấp chọn hai góc đối diện · Phím mũi tên khóa mặt phẳng vẽ", + "tools.combine": "Kết hợp", + "tools.dimensions": "Kích thước", + "tools.drag_to_draw_release_to_finish_arrow_keys": "Kéo để vẽ · Thả chuột để hoàn tất · Phím mũi tên khóa mặt phẳng vẽ", + "tools.drag_to_orbit_hold_shift_to_pan_scroll": "Kéo để xoay quanh · Giữ Shift để dịch chuyển · Cuộn để thu phóng", + "tools.erase": "Tẩy", + "tools.flip": "Lật", + "tools.freehand": "Vẽ tự do", + "tools.grain_direction": "Hướng vân gỗ", + "tools.place_the_grain_anchor": "Nhấp vào chi tiết, cạnh hoặc mặt để đặt điểm neo hướng vân gỗ.", + "tools.intersect": "Giao nhau", + "tools.line": "Đường thẳng", + "tools.move": "Di chuyển", + "tools.offset": "Dịch song song", + "tools.orbit": "Xoay quanh", + "tools.paint": "Tô màu", + "tools.polygon": "Đa giác", + "tools.protractor": "Thước đo góc", + "tools.push_pull": "Đẩy/Kéo", + "tools.rectangle": "Hình chữ nhật", + "tools.rotate": "Xoay", + "tools.scale": "Tỷ lệ", + "tools.select": "Chọn", + "tools.select_geometry_choose_a_red_green_or_blue": "Chọn hình học · Chọn mặt phẳng lật màu đỏ, xanh lá hoặc xanh dương · Phím mũi tên chọn X / Y / Z", + "tools.select_geometry_click_a_base_point_and_destination": "Chọn hình học · Nhấp chọn điểm gốc và điểm đích · Phím mũi tên khóa trục", + "tools.select_geometry_click_a_pivot_reference_point_then": "Chọn hình học · Nhấp chọn tâm xoay, điểm tham chiếu rồi góc · Phím mũi tên khóa mặt phẳng xoay", + "tools.select_geometry_click_a_reference_point_move_or": "Chọn hình học · Nhấp chọn điểm tham chiếu · Di chuyển hoặc nhập hệ số tỷ lệ rồi nhấn Enter", + "tools.split": "Chia tách", + "tools.tape_measure": "Thước đo", + "tools.text": "Văn bản", + "tools.trim": "Cắt xén", + "tools.union": "Hợp nhất", + "updates.automatic_updates_are_available_in_the_packaged_desktop": "Các bản cập nhật tự động có sẵn trong ứng dụng dành cho máy tính để bàn đóng gói. Tải xuống từ GitHub Releases.", + "updates.checking_for_updates": "Đang kiểm tra cập nhật…", + "updates.could_not_read_update_preferences": "Không thể đọc tùy chọn cập nhật: {error}", + "updates.could_not_save_update_preferences": "Không thể lưu tùy chọn cập nhật: {error}", + "updates.could_not_update_benchup": "Không thể cập nhật BenchUp: {error}", + "updates.downloading_benchup_you_can_keep_working": "Đang tải xuống BenchUp {version}… Bạn có thể tiếp tục làm việc.", + "updates.benchup_is_ready_it_will_install_on_your": "BenchUp {} đã sẵn sàng. Nó sẽ cài đặt vào lần khởi chạy tiếp theo của bạn hoặc bạn có thể khởi động lại ngay bây giờ.", + "updates.benchup_is_up_to_date": "BenchUp được cập nhật.", + "updates.no_downloaded_update_is_ready": "Không có bản cập nhật nào được tải xuống sẵn sàng.", + "updates.no_updates_have_been_published_for_this_platform": "Chưa có bản cập nhật nào được xuất bản cho nền tảng này.", + "updates.ready_to_check_for_updates": "Sẵn sàng kiểm tra các bản cập nhật.", + "updates.the_update_check_did_not_complete_please_try": "Việc kiểm tra cập nhật chưa hoàn tất. Vui lòng thử lại.", + "view_controls.camera": "Máy ảnh", + "view_controls.choose_color": "Chọn màu", + "view_controls.choose_how_to_paint_and_a_paint_color": "Chọn cách tô và màu cần dùng", + "view_controls.color": "Màu", + "view_controls.configure_section_planes_cuts_fill_and_axis_positions": "Cấu hình mặt phẳng mặt cắt, đường cắt, phần tô và vị trí trục", + "view_controls.degree_symbol": "°", + "view_controls.face": "Mặt", + "view_controls.field_of_view": "Trường nhìn", + "view_controls.fit_model": "Vừa khung mô hình", + "view_controls.fit_selection": "Vừa khung vùng chọn", + "view_controls.group": "Nhóm", + "view_controls.keeps_geometry_on_the_negative_side_of_this": "Giữ hình học ở phía âm của trục này.", + "view_controls.orthographic_projection_parallel_lines_stay_parallel": "Phép chiếu trực giao: các đường song song vẫn song song", + "view_controls.paint_by": "Tô màu theo", + "view_controls.parallel": "Song song", + "view_controls.perspective": "Phối cảnh", + "view_controls.preset_colors": "Màu đặt sẵn", + "view_controls.projection": "Phép chiếu", + "view_controls.reset_camera": "Đặt lại máy ảnh", + "view_controls.section_cuts": "Đường cắt mặt cắt", + "view_controls.section_fill": "Phần tô mặt cắt", + "view_controls.sections": "Mặt cắt", + "view_controls.standard_views": "Góc nhìn tiêu chuẩn", + "view_controls.view": "Góc nhìn {}", + "view_controls.x_vertical": "X · dọc", + "view_controls.y_vertical": "Y · dọc", + "view_controls.z_horizontal": "Z · ngang", + "viewports.a_compatible_gpu_renderer_is_required_try_updating": "A. Hãy thử cập nhật trình điều khiển đồ họa của bạn.", + "viewports.create_viewport": "Tạo khung nhìn", + "viewports.current": "Hiện tại", + "viewports.drag_to_a_viewport_edge_to_split_or": "Kéo đến cạnh khung nhìn để chia, hoặc vào giữa khung nhìn để ghép các thẻ. Nhấp chuột phải để đổi tên hoặc đóng.", + "viewports.rename": "Đổi tên…", + "viewports.rename_view": "Đổi tên chế độ xem", + "viewports.view": "Xem {id}", + "web.canvas_label": "BenchUp không gian làm việc mô hình hóa", + "web.initial_title": "Mẫu không có tiêu đề - BenchUp", + "web.loading.01": "Dành chỗ cho ý tưởng lớn tiếp theo của bạn…", + "web.loading.02": "Định hình ý tưởng của bạn với BenchUp…", + "web.loading.03": "Một chút cảm hứng…", + "web.loading.04": "Khởi động góc sáng tạo của bạn…", + "web.loading.05": "Những điều tốt đẹp đang hình thành…", + "web.loading.06": "Đổi mới mọi thứ…", + "web.loading.07": "Trí tưởng tượng của bạn được chào đón ở đây…", + "web.loading.08": "Phác thảo một chút, mơ mộng nhiều…", + "web.loading.09": "Tung ra lưới chào mừng…", + "web.loading.10": "Thêm một chút khả năng…", + "web.loading.11": "Kéo một chiếc ghế và một tấm bạt mới lên…", + "web.loading.12": "Gần như húng tây để tạo…", + "image_tools.add_reference_image": "Thêm hình ảnh tham khảo", + "image_tools.brightness": "Độ sáng", + "image_tools.choose_an_image_smaller_than_32_mb": "Chọn hình ảnh nhỏ hơn 32 MB.", + "image_tools.choose_reference_image": "Chọn hình ảnh tham khảo", + "image_tools.contrast": "Độ tương phản", + "image_tools.could_not_open_image": "Không thể mở hình ảnh: {e}", + "image_tools.draw_two_opposite_corners_then_choose_a_png_jpeg_or_webp_image_images_are_embedded_in_the_project": "Vẽ hai góc đối diện, sau đó chọn ảnh PNG, JPEG hoặc WebP. Hình ảnh được nhúng trong dự án.", + "image_tools.edit_reference_image": "Chỉnh sửa hình ảnh tham khảo", + "image_tools.finish_or_cancel_the_current_image_picker_first": "Hãy hoàn thành hoặc hủy bộ chọn hình ảnh hiện tại trước.", + "image_tools.flip_horizontal": "Lật ngang", + "image_tools.flip_vertical": "Lật dọc", + "image_tools.grayscale": "Thang xám", + "image_tools.image": "Hình ảnh", + "image_tools.image_defaults": "Mặc định hình ảnh", + "image_tools.image_import_cancelled_because_the_project_or_editing_context_changed": " bị hủy do bối cảnh dự án hoặc chỉnh sửa đã thay đổi.", + "image_tools.image_tool": "Công cụ hình ảnh", + "image_tools.images_png_jpeg_webp": "Hình ảnh (PNG, JPEG, WebP)", + "image_tools.opacity": "Độ mờ", + "image_tools.reference_image": "Hình ảnh tham khảo", + "image_tools.replace_reference_image": "Thay thế hình ảnh tham chiếu", + "image_tools.rotation": "Góc xoay", + "image_tools.the_decoded_image_is_too_large_choose_a_smaller_image": "Hình ảnh được giải mã quá lớn. Chọn hình ảnh nhỏ hơn.", + "image_tools.the_image_picker_could_not_finish": "Bộ chọn hình ảnh không thể hoàn tất.", + "image_tools.unlock_the_image_before_replacing_it": "Mở khóa hình ảnh trước khi thay thế.", + "image_tools.unlock_the_image_to_edit_its_properties": "Mở khóa hình ảnh để chỉnh sửa thuộc tính của nó.", + "image_tools.zoom": "Thu phóng", + "settings.3d_mouse": "Chuột 3D", + "settings.adjust_navigation_sensitivity_for_the_selected_device": "Điều chỉnh độ nhạy điều hướng cho thiết bị đã chọn.", + "settings.body_depth_length": "Độ sâu cơ thể (chiều dài)", + "settings.body_width": "Chiều rộng cơ thể", + "settings.connect_3d_mouse": "Kết nối chuột 3D", + "settings.connected": "Đã kết nối: {device}", + "settings.disabled": "Đã tắt", + "settings.enable_3d_mouse": "Bật chuột 3D", + "settings.eye_height": "Chiều cao mắt", + "settings.eye_height_is_measured_above_the_floor_body_width_and_depth_determine_obstacle_clearance_allow_12_cm_above_the_eyes_for_the_head": "Chiều cao mắt được tính từ sàn. Chiều rộng và độ sâu cơ thể quyết định khoảng hở khi tránh vật cản; chừa thêm 12 cm phía trên mắt cho phần đầu.", + "settings.invert_pan": "Đảo chiều dịch chuyển", + "settings.invert_tilt_and_twist": "Đảo chiều nghiêng và xoay", + "settings.invert_zoom": "Đảo chiều thu phóng", + "settings.language_simplified_chinese": "Tiếng Trung giản thể", + "settings.language_brazilian_portuguese": "Tiếng Bồ Đào Nha (Brazil)", + "settings.language_vietnamese": "Tiếng Việt", + "settings.look_sensitivity": "Độ nhạy nhìn", + "settings.mouse_trackpad": "Chuột/Bàn di chuột", + "settings.navigation_type": "Kiểu điều hướng", + "settings.middle_mouse_drag": "Kéo bằng nút chuột giữa", + "settings.orbit_shift_to_pan": "Xoay quanh (giữ Shift để dịch chuyển)", + "settings.pan_shift_to_orbit": "Dịch chuyển (giữ Shift để xoay quanh)", + "settings.no_device_detected": "Không phát hiện thiết bị", + "settings.scales_mouse_look_while_walking_100_matches_orbit_sensitivity": "Điều chỉnh độ nhạy nhìn bằng chuột khi đi bộ. 100% bằng độ nhạy xoay quanh.", + "settings.tilt_or_twist_the_cap_to_orbit_slide_it_to_pan_and_push_or_pull_it_to_zoom_the_fit_button_frames_the_model": "Nghiêng hoặc xoay núm để xoay quanh, trượt để dịch chuyển, đẩy hoặc kéo để thu phóng. Nút Vừa khung sẽ căn mô hình vào khung nhìn.", + "settings.walking_person": "Người đi bộ", + "settings.walking_speed": "Tốc độ đi bộ", + "settings.wasd_arrows_walk_shift_crouch_space_jump_alt_sit_stand_move_mouse_look_escape_exit": "WASD / phím mũi tên: đi bộ · Shift: cúi · Phím cách: nhảy · Alt: ngồi / đứng · Di chuyển chuột: nhìn · Esc: thoát", + "shortcuts.crouch_jump_sit_or_stand": "Nằm / Nhảy / Ngồi hoặc đứng", + "shortcuts.exit_walk": "Thoát đi", + "shortcuts.look_while_walking": "Nhìn khi đi", + "shortcuts.move_mouse": "Di chuyển chuột", + "shortcuts.move_while_walking": "Di chuyển trong khi đi bộ", + "shortcuts.walk_button_click_a_floor_face": "Nút đi bộ → nhấp vào mặt sàn", + "shortcuts.walk_through_model": "Xem qua mẫu", + "walk.cannot_change_posture_here_check_head_clearance_and_floor_support": "Không thể thay đổi tư thế ở đây: kiểm tra khoảng sáng đầu và hỗ trợ sàn.", + "walk.choose_a_floor_or_a_slope_of_45_or_less": "Chọn sàn hoặc độ dốc từ 45° trở xuống.", + "walk.click_a_floor_face_to_place_the_walking_person": "Nhấp vào mặt sàn để đặt người đi bộ.", + "walk.seated_move_mouse_to_look_180_alt_stand_tab_sidebar_escape_exit_walk": "Đang ngồi · Di chuyển chuột để nhìn (180°) · Alt: đứng lên · Tab: thanh bên · Esc: thoát chế độ đi bộ", + "walk.the_new_body_dimensions_do_not_fit_here_click_a_floor_face_to_reposition": "Kích thước thân máy mới không vừa ở đây. Nhấp vào mặt sàn để định vị lại.", + "walk.there_is_not_enough_space_here_for_the_configured_body_size_and_eye_height": "Không có đủ không gian ở đây cho kích thước cơ thể và chiều cao mắt được định cấu hình.", + "walk.walk": "Đi bộ", + "walk.walk_through_the_model_click_a_floor_face_to_place_yourself_at_eye_level": "Xem qua mô hình. Nhấp vào mặt sàn để đặt bạn ngang tầm mắt.", + "walk.walking_controls": "WASD / phím mũi tên: đi bộ · Di chuyển chuột để nhìn · Shift: cúi · Phím cách: nhảy · Alt: ngồi · Tab: thanh bên · Esc: thoát chế độ đi bộ", + "wood_glue.tool": "Keo dán gỗ", + "wood_glue.instructions": "Nhấp vào một mặt hiển thị, đã mở khóa để bật hoặc tắt keo dán gỗ.", + "wood_glue.automatic": "Keo dán các bề mặt tiếp xúc được chọn", + "wood_glue.automatic_hint": "Phủ các vùng tiếp xúc của các bề mặt và nhóm đã chọn trên cả hai mặt của mỗi khớp.", + "wood_glue.applied": "Bôi keo dán gỗ", + "wood_glue.removed": "Gỡ keo dán gỗ", + "wood_glue.contacts_applied": "Bề mặt tiếp xúc keo", + "wood_glue.no_new_contacts": "Không tìm thấy bề mặt tiếp xúc không được phủ nào trong phần lựa chọn.", + "wood_glue.invalid_coverage": "Keo dán gỗ dùng để chỉ bề mặt hoặc lớp phủ không hợp lệ.", + "wood_glue.estimate_label": "Độ phủ keo dán gỗ (toàn bộ dự án)", + "wood_glue.estimate_note": "Độ phủ keo dán gỗ (toàn bộ dự án): {area}", + "wood_glue.area_m2": "{value} m²", + "settings.export_scales": "Tỷ lệ xuất", + "export_scale.define_ratios": "Xác định tỷ lệ để xuất STL. Tỷ lệ = kích thước xuất: kích thước mô hình.", + "export_scale.actual_size_hint": "Kích thước thực tế (1:1) luôn có sẵn. Chia tỷ lệ áp dụng cho tất cả các kích thước, bao gồm cả khớp và lỗ.", + "export_scale.nmra_reference": "NMRA (Bắc Mỹ)", + "export_scale.preset_standards_hint": "Các cài đặt trước của mô hình chế biến gỗ là sự tiện lợi chứ không phải tiêu chuẩn NMRA. Tên đường sắt có thể sử dụng các tỷ lệ khác nhau ở các khu vực khác.", + "export_scale.exported": "Đã xuất", + "export_scale.add_preset": "Thêm giá trị đặt trước", + "export_scale.new_scale": "Quy mô mới", + "export_scale.actual_size": "Kích thước thực tế (1:1)", + "export_scale.custom_ratio": "Tỷ lệ tùy chỉnh", + "export_scale.ratio_units_hint": "Kích thước xuất : kích thước mô hình (cùng đơn vị)", + "export_scale.scale_preview": "Tỷ lệ: {percent:.6}% — 1000 mm trong mô hình xuất dưới dạng {size:.4} mm.", + "export_scale.invalid_ratio": "Nhập hai số hữu hạn lớn hơn 0.", + "export_scale.stl_units_hint": "STL được xuất theo milimet. Dự án vẫn giữ nguyên kích thước ban đầu.", + "export_scale.manage_presets_hint": "Quản lý cài đặt trước trong Cài đặt → Xuất thang âm.", + "export_scale.export_stl": "Xuất STL", + "export_scale.woodworking_mockup_1_2": "Mô hình chế biến gỗ 1:2", + "export_scale.woodworking_mockup_1_5": "Mô hình chế biến gỗ 1:5", + "export_scale.woodworking_mockup_1_10": "Mô hình chế biến gỗ 1:10", + "export_scale.miniature_1_12": "Thu nhỏ 1:12", + "orbit.visible_model_center": "Trung tâm mô hình có thể nhìn thấy", + "orbit.selection_center": "Trung tâm tuyển chọn", + "orbit.world_origin": "Nguồn gốc thế giới", + "orbit.view_center": "Xem trung tâm", + "orbit.focused": "Tập trung", + "orbit.set_focus": "Đặt tiêu điểm", + "orbit.set_focus_hint": "Nhấp vào một điểm trong khung nhìn để đặt tâm xoay. Nhấp chuột phải để hủy. Trước khi đặt tâm, chế độ Tập trung dùng tâm khung nhìn.", + "orbit.pivot_hint": "Chọn tâm xoay. Nếu không có gì được chọn, tùy chọn Tâm vùng chọn sẽ dùng tâm của mô hình đang hiển thị.", + "scale_tool.axis_hint": "Tỷ lệ {axis} trục", + "scale_tool.plane_hint": "Tỷ lệ trong mặt phẳng {plane}", + "scale_tool.uniform_hint": "Tỷ lệ đồng đều", + "core.reference_images.contain": "Chứa", + "core.reference_images.cover": "Phủ kín", + "core.reference_images.stretch": "Kéo giãn", + "core.reference_images.invalid_rectangle": "Hình ảnh hoặc hình chữ nhật tham chiếu không hợp lệ.", + "core.reference_images.missing_frame": ".", + "core.reference_images.invalid_image": "Hình ảnh tham chiếu không hợp lệ.", + "core.modeling.edit_reference_image_tools": "Sử dụng Thuộc tính hình ảnh, Di chuyển, Xoay hoặc Chia tỷ lệ để chỉnh sửa hình ảnh tham chiếu.", + "core.document.autosave_edits_mismatch": "Các chỉnh sửa tự động lưu không khớp với dự án đã lưu.", + "core.document.autosave_history_mismatch": "Lịch sử tự động lưu không khớp với dự án đã lưu.", + "project_files.invalid_preview": "Bản xem trước dự án không hợp lệ", + "project_files.empty_preview": "Bản xem trước khung nhìn trống.", + "project_files.pdf_viewer_closed": "Trình xem PDF đã bị đóng trước khi quá trình tạo hoàn tất.", + "project_files.no_saved_preview": "Dự án này không có bản xem trước chế độ xem đã lưu. Hãy lưu nó vào BenchUp trước.", + "project_files.invalid_chunk_size": "Kích thước khối dự án không hợp lệ", + "project_files.truncated_chunk": "Đoạn dự án bị cắt ngắn", + "project_files.invalid_checksum": "Tổng kiểm tra dữ liệu dự án không hợp lệ.", + "project_files.png_has_no_project": " PNG này không chứa dự án BenchUp.", + "projects.could_not_capture_preview": "Không thể chụp bản xem trước dự án: {error}", + "storage.cannot_restore_edits": "Không thể khôi phục các chỉnh sửa tự động lưu: {error}", + "storage.cannot_migrate_workspace": "Không thể di chuyển không gian làm việc: {error}", + "storage.browser_unavailable": "Browser: {error}", + "updates.unexpected_package_identity": "Nhận dạng gói cập nhật không mong đợi: {id}", + "selection_measurements.worker_unavailable": "Không có nhân viên đo lường.", + "selection_measurements.invalid_result": "Kết quả đo không hợp lệ.", + "pdf_export.could_not_read": "Không thể đọc tệp PDF được tạo.", + "pdf_export.could_not_generate": "Không thể tạo tệp PDF.", + "space_mouse.connect_hint": "Chọn Connect 3D Mouse để cấp quyền truy cập vào thiết bị của bạn.", + "space_mouse.disconnected": "3D Chuột bị ngắt kết nối. Kết nối lại hoặc chọn Kết nối chuột 3D.", + "space_mouse.unsupported": "Trình duyệt này không hỗ trợ truy cập Chuột 3D. Sử dụng Chrome hoặc Edge có hỗ trợ WebHID.", + "space_mouse.insecure": "Mở BenchUp qua HTTPS hoặc localhost để kết nối Chuột 3D.", + "space_mouse.scanning": "Đang tìm chuột 3D đã kết nối trước đó...", + "space_mouse.choosing": "Chọn Chuột 3D trong trình duyệt của bạn.", + "space_mouse.no_selection": "Không có Chuột 3D được chọn. Chọn Kết nối chuột 3D để thử lại.", + "space_mouse.no_device": "Không có chuột 3D được kết nối. Chọn Kết nối chuột 3D.", + "space_mouse.denied": "3D Không được phép truy cập chuột. Hãy kiểm tra quyền thiết bị của trang web này và thử lại.", + "space_mouse.open_failed": "Không thể mở Chuột 3D. Hãy thoát khỏi các ứng dụng hoặc trình điều khiển khác đang sử dụng nó, chẳng hạn như 3DxWare và thử lại.", + "app.measurements_unavailable": "Không có phép đo.", + "app.calculating_measurements": "Tính số đo…", + "sidebar.move_wireframe": "Hiển thị khung dây cho đối tượng khác khi di chuyển", + "sidebar.selected_edge_lengths": "Chiều dài các cạnh đã chọn" +} diff --git a/assets/i18n/zh_CN.json b/assets/i18n/zh_CN.json index ed6af6f..0812708 100644 --- a/assets/i18n/zh_CN.json +++ b/assets/i18n/zh_CN.json @@ -2069,6 +2069,7 @@ "settings.invert_zoom": "反转缩放", "settings.language_simplified_chinese": "简体中文", "settings.language_brazilian_portuguese": "Português (Brasil)", + "settings.language_vietnamese": "越南语", "settings.look_sensitivity": "视角灵敏度", "settings.mouse_trackpad": "鼠标/触控板", "settings.navigation_type": "导航类型", diff --git a/crates/benchup-app/src/estimate_pdf.rs b/crates/benchup-app/src/estimate_pdf.rs index 97fc67a..b07aa40 100644 --- a/crates/benchup-app/src/estimate_pdf.rs +++ b/crates/benchup-app/src/estimate_pdf.rs @@ -28,6 +28,7 @@ const RIGHT: f64 = 553.; const BOTTOM: f64 = 55.; const INK: &str = "0.15 0.20 0.17"; const BORDER: &str = "0.73 0.79 0.74"; +const ROBOTO_FONT_DATA: &[u8] = include_bytes!("../../../assets/fonts/Roboto[wdth,wght].ttf"); enum RowStyle { Plain, @@ -52,6 +53,7 @@ impl RowStyle { struct Pdf<'a> { font: FontRef<'a>, fallback: FontRef<'a>, + unicode_fallback: FontRef<'a>, chars: BTreeMap, pages: Vec, page: String, @@ -63,8 +65,10 @@ impl<'a> Pdf<'a> { fn glyph(&self, ch: char) -> (u8, u16, f64) { let (index, font) = if self.font.charmap().map(ch).is_some() { (1, &self.font) - } else { + } else if self.fallback.charmap().map(ch).is_some() { (2, &self.fallback) + } else { + (3, &self.unicode_fallback) }; let glyph = font.charmap().map(ch).unwrap_or_default(); let width = font @@ -244,7 +248,12 @@ impl<'a> Pdf<'a> { start = end; } } - fn finish(mut self, font_data: &[u8], fallback_data: &[u8]) -> Result, String> { + fn finish( + mut self, + font_data: &[u8], + fallback_data: &[u8], + unicode_fallback_data: &[u8], + ) -> Result, String> { self.pages.push(std::mem::take(&mut self.page)); let count = self.pages.len(); // Add page numbers before constructing the shared font's character map. @@ -289,7 +298,7 @@ impl<'a> Pdf<'a> { let rgb = crate::pdf_header::logo_rgb(); let mut objects = vec![ b"<< /Type /Catalog /Pages 2 0 R >>".to_vec(), - format!("<< /Type /Pages /Count {count} /Kids [{}] >>", (0..count).map(|i| format!("{} 0 R", 14+i*2)).collect::>().join(" ")).into_bytes(), + format!("<< /Type /Pages /Count {count} /Kids [{}] >>", (0..count).map(|i| format!("{} 0 R", 18+i*2)).collect::>().join(" ")).into_bytes(), b"<< /Type /Font /Subtype /Type0 /BaseFont /BenchUpUbuntu /Encoding /Identity-H /DescendantFonts [4 0 R] /ToUnicode 8 0 R >>".to_vec(), format!("<< /Type /Font /Subtype /CIDFontType2 /BaseFont /BenchUpUbuntu /CIDSystemInfo << /Registry (Adobe) /Ordering (Identity) /Supplement 0 >> /FontDescriptor 5 0 R /CIDToGIDMap 7 0 R /W [0 [{widths}]] >>").into_bytes(), b"<< /Type /FontDescriptor /FontName /BenchUpUbuntu /Flags 32 /FontBBox [-1000 -1000 3000 3000] /ItalicAngle 0 /Ascent 1000 /Descent -300 /CapHeight 750 /StemV 80 /FontFile2 6 0 R >>".to_vec(), @@ -303,8 +312,14 @@ impl<'a> Pdf<'a> { b"<< /Type /FontDescriptor /FontName /BenchUpHack /Flags 33 /FontBBox [-1000 -1000 3000 3000] /ItalicAngle 0 /Ascent 1000 /Descent -300 /CapHeight 750 /StemV 80 /FontFile2 13 0 R >>".to_vec(), stream(&format!("/Length1 {}", fallback_data.len()), fallback_data), ]); + objects.extend([ + b"<< /Type /Font /Subtype /Type0 /BaseFont /BenchUpRoboto /Encoding /Identity-H /DescendantFonts [15 0 R] /ToUnicode 8 0 R >>".to_vec(), + format!("<< /Type /Font /Subtype /CIDFontType2 /BaseFont /BenchUpRoboto /CIDSystemInfo << /Registry (Adobe) /Ordering (Identity) /Supplement 0 >> /FontDescriptor 16 0 R /CIDToGIDMap 7 0 R /W [0 [{widths}]] >>").into_bytes(), + b"<< /Type /FontDescriptor /FontName /BenchUpRoboto /Flags 32 /FontBBox [-1000 -1000 3000 3000] /ItalicAngle 0 /Ascent 1000 /Descent -300 /CapHeight 750 /StemV 80 /FontFile2 17 0 R >>".to_vec(), + stream(&format!("/Length1 {}", unicode_fallback_data.len()), unicode_fallback_data), + ]); for (i, page) in self.pages.iter().enumerate() { - objects.push(format!("<< /Type /Page /Parent 2 0 R /MediaBox [0 0 595 842] /Resources << /Font << /F1 3 0 R /F2 10 0 R >> /XObject << /Logo 9 0 R >> >> /Contents {} 0 R >>", 15+i*2).into_bytes()); + objects.push(format!("<< /Type /Page /Parent 2 0 R /MediaBox [0 0 595 842] /Resources << /Font << /F1 3 0 R /F2 10 0 R /F3 14 0 R >> /XObject << /Logo 9 0 R >> >> /Contents {} 0 R >>", 19+i*2).into_bytes()); objects.push(stream("", page.as_bytes())); } let mut bytes = b"%PDF-1.4\n%\xE2\xE3\xCF\xD3\n".to_vec(); @@ -396,6 +411,10 @@ pub(crate) fn render(report: &Report) -> Result, String> { let fallback_data: &[u8] = definitions.font_data["Hack"].font.as_ref().as_ref(); let fallback = FontRef::new(fallback_data) .map_err(|error| tr!("estimate_pdf.could_not_load_report_symbol_font", error = error))?; + // UI font definitions are separate from the fonts embedded in this PDF. + // Keep the existing text and symbol fonts, and use Roboto for Vietnamese. + let unicode_fallback = FontRef::new(ROBOTO_FONT_DATA) + .map_err(|error| tr!("estimate_pdf.could_not_load_report_font", error = error))?; let mut text = vec![report.name.as_str(), report.currency.as_str()]; text.extend(report.summary.iter().map(String::as_str)); text.extend(report.notes.iter().map(String::as_str)); @@ -414,10 +433,11 @@ pub(crate) fn render(report: &Report) -> Result, String> { if chars.len() > 65_000 { return Err(tr!("estimate_pdf.too_many_distinct_characters_for_one_estimate_pdf").into()); } - if let Some(ch) = chars - .iter() - .find(|ch| font.charmap().map(**ch).is_none() && fallback.charmap().map(**ch).is_none()) - { + if let Some(ch) = chars.iter().find(|ch| { + font.charmap().map(**ch).is_none() + && fallback.charmap().map(**ch).is_none() + && unicode_fallback.charmap().map(**ch).is_none() + }) { return Err(tr!( "estimate_pdf.the_pdf_font_cannot_display_u_replace_this", *ch as u32, @@ -427,6 +447,7 @@ pub(crate) fn render(report: &Report) -> Result, String> { let mut pdf = Pdf { font, fallback, + unicode_fallback, chars: BTreeMap::new(), pages: Vec::new(), page: String::new(), @@ -562,7 +583,7 @@ pub(crate) fn render(report: &Report) -> Result, String> { pdf.table_row(row, &widths, &headers, title, RowStyle::alternating(index)); } } - pdf.finish(data, fallback_data) + pdf.finish(data, fallback_data, ROBOTO_FONT_DATA) } #[cfg(test)] @@ -596,6 +617,7 @@ mod tests { let mut pdf = Pdf { font: FontRef::new(data).unwrap(), fallback: FontRef::new(fallback).unwrap(), + unicode_fallback: FontRef::new(ROBOTO_FONT_DATA).unwrap(), chars: BTreeMap::new(), pages: Vec::new(), page: String::new(), @@ -625,6 +647,49 @@ mod tests { assert!(pdf.page.contains("358.000 682.500 Tm")); } + #[test] + fn vietnamese_report_embeds_readable_selectable_text_in_any_ui_language() { + struct ResetLanguage; + impl Drop for ResetLanguage { + fn drop(&mut self) { + benchup_core::i18n::set_language("en"); + } + } + let _reset = ResetLanguage; + benchup_core::i18n::set_language("vi"); + let mut report = Report { + name: "Xưởng gỗ Việt".into(), + currency: "VND".into(), + notes: vec![tr!("wood_glue.estimate_note", area = "1 m²")], + ..Default::default() + }; + for language in ["vi", "en"] { + benchup_core::i18n::set_language(language); + let bytes = + render(&report).expect("Vietnamese project names and notes can be exported"); + let text = String::from_utf8_lossy(&bytes); + assert!(text.contains("/BaseFont /BenchUpRoboto")); + assert!(text.contains("/F3 14 0 R")); + assert!(text.contains("BT /F3 ")); + assert!( + bytes + .windows(ROBOTO_FONT_DATA.len()) + .any(|data| data == ROBOTO_FONT_DATA) + ); + for ch in ['ộ', 'ủ', 'ỗ', 'ự'] { + assert!( + text.contains(&format!("<{:04X}>", ch as u32)), + "missing {ch}" + ); + } + } + report.notes.push("\u{10ffff}".into()); + assert!( + render(&report).is_err(), + "unsupported characters still produce an error" + ); + } + #[test] fn report_paginates_long_rows_and_embeds_real_logo_and_unicode_font() { let report = Report { diff --git a/crates/benchup-app/src/language.rs b/crates/benchup-app/src/language.rs index 909a7f6..106e3a9 100644 --- a/crates/benchup-app/src/language.rs +++ b/crates/benchup-app/src/language.rs @@ -83,6 +83,9 @@ mod tests { for locale in ["pt", "pt_BR", "pt-BR", "pt_BR.UTF-8", "pt-PT", "pt-AO"] { assert_eq!(preferred_language([locale]), "pt_BR", "{locale}"); } + for locale in ["vi", "vi-VN", "vi_VN", "vi_VN.UTF-8"] { + assert_eq!(preferred_language([locale]), "vi", "{locale}"); + } } #[test] @@ -109,6 +112,7 @@ mod tests { assert_eq!(preferred_language(["en-CA", "zh-CN"]), "en"); assert_eq!(preferred_language(["zh-Hant", "zh-Hans"]), "zh_CN"); assert_eq!(preferred_language(["fr-CA", "pt-BR", "en-US"]), "pt_BR"); + assert_eq!(preferred_language(["fr-CA", "vi-VN", "en-US"]), "vi"); assert_eq!(preferred_language(["en-US", "pt-BR"]), "en"); } } diff --git a/crates/benchup-app/src/settings.rs b/crates/benchup-app/src/settings.rs index a5fff91..5450f5d 100644 --- a/crates/benchup-app/src/settings.rs +++ b/crates/benchup-app/src/settings.rs @@ -159,11 +159,12 @@ pub(super) fn detected_language() -> &'static str { language::detected_language() } -fn languages() -> [(&'static str, &'static str); 3] { +fn languages() -> [(&'static str, &'static str); 4] { [ (DEFAULT_LANGUAGE, tr!("settings.language_english")), ("zh_CN", tr!("settings.language_simplified_chinese")), ("pt_BR", tr!("settings.language_brazilian_portuguese")), + ("vi", tr!("settings.language_vietnamese")), ] } @@ -1189,6 +1190,15 @@ mod tests { assert_eq!(settings.language, "pt_BR"); } + #[test] + fn supported_languages_include_vietnamese() { + assert!(languages().contains(&("vi", "Vietnamese"))); + let mut settings = GeneralSettings::default(); + settings.language = "vi".into(); + settings.normalize(); + assert_eq!(settings.language, "vi"); + } + #[test] fn settings_labels_switch_languages_in_the_same_window() { struct Reset; @@ -1203,6 +1213,7 @@ mod tests { ("en", "Settings", "Workspace", "Export scales"), ("zh_CN", "设置", "工作区", "导出比例"), ("pt_BR", "Configurações", "Área de trabalho", "Escalas de exportação"), + ("vi", "Cài đặt", "Không gian làm việc", "Tỷ lệ xuất"), ("en", "Settings", "Workspace", "Export scales"), ] { app.general_settings.language = language.into(); diff --git a/crates/benchup-app/src/sidebar.rs b/crates/benchup-app/src/sidebar.rs index b0f2dbd..a4f4fb1 100644 --- a/crates/benchup-app/src/sidebar.rs +++ b/crates/benchup-app/src/sidebar.rs @@ -245,7 +245,7 @@ mod guide_preference_tests { assert_eq!(restored.drawing_tool, Tool::Line); assert_eq!(restored.images.preferences, app.images.preferences); for key in ["reference_image_defaults", "reference_image_appearance"] { - let id = egui::Id::new(("test/image-section", key)); + let id = egui::Id::unique(("test/image-section", key)); restore_section(&restored_ctx, id, key, true); assert!(!egui::collapsing_header::CollapsingState::load_with_default_open(&restored_ctx, id, true).is_open()); } @@ -3046,7 +3046,7 @@ mod preference_tests { #[test] fn first_launch_language_is_saved_without_a_model_edit_and_not_redetected() { - for language in ["en", "zh_CN", "pt_BR"] { + for language in ["en", "zh_CN", "pt_BR", "vi"] { let ctx = egui::Context::default(); let mut storage = SavedPreferences::default(); let mut app = BenchUpApp::with_document(Document::default(), None, true); diff --git a/crates/benchup-app/src/theme.rs b/crates/benchup-app/src/theme.rs index 0885009..53c528b 100644 --- a/crates/benchup-app/src/theme.rs +++ b/crates/benchup-app/src/theme.rs @@ -167,8 +167,16 @@ pub fn apply(ctx: &egui::Context) { "benchup.chinese".into(), egui::FontData::from_static(include_bytes!("../../../assets/fonts/NotoSansSC-Regular.otf")).into(), ); + fonts.font_data.insert( + "benchup.roboto".into(), + egui::FontData::from_static(include_bytes!("../../../assets/fonts/Roboto[wdth,wght].ttf")).into(), + ); for family in [FontFamily::Proportional, FontFamily::Monospace] { - fonts.families.entry(family).or_default().push("benchup.chinese".into()); + fonts + .families + .entry(family) + .or_default() + .extend(["benchup.chinese".into(), "benchup.roboto".into()]); } let mut title_fonts = fonts.families[&FontFamily::Proportional].clone(); title_fonts.insert(0, PROJECT_TITLE_FONT.into()); diff --git a/crates/benchup-core/build.rs b/crates/benchup-core/build.rs index 77f47ca..46ba62d 100644 --- a/crates/benchup-core/build.rs +++ b/crates/benchup-core/build.rs @@ -123,6 +123,11 @@ fn main() { catalog: read_catalog("../../assets/i18n/pt_BR.json", "Brazilian Portuguese"), singular: true, }, + Translation { + variant: "Vietnamese", + catalog: read_catalog("../../assets/i18n/vi.json", "Vietnamese"), + singular: false, + }, ]; // Generate every format string so Rust continues checking named arguments. diff --git a/crates/benchup-core/src/i18n.rs b/crates/benchup-core/src/i18n.rs index d2cb6bf..2d8c2a9 100644 --- a/crates/benchup-core/src/i18n.rs +++ b/crates/benchup-core/src/i18n.rs @@ -6,6 +6,7 @@ pub enum Language { English, SimplifiedChinese, BrazilianPortuguese, + Vietnamese, } thread_local! { @@ -17,6 +18,7 @@ pub fn set_language(language: &str) { LANGUAGE.set(match language { "zh_CN" | "zh-CN" | "zh-Hans" => Language::SimplifiedChinese, "pt_BR" | "pt-BR" => Language::BrazilianPortuguese, + "vi" | "vi_VN" | "vi-VN" => Language::Vietnamese, _ => Language::English, }); } @@ -50,6 +52,7 @@ pub(crate) fn catalog_message(language: &str, key: &str) -> String { let catalog = match language { "zh_CN" => include_str!("../../../assets/i18n/zh_CN.json"), "pt_BR" => include_str!("../../../assets/i18n/pt_BR.json"), + "vi" => include_str!("../../../assets/i18n/vi.json"), "en" => include_str!("../../../assets/i18n/en.json"), _ => panic!("unsupported test language: {language}"), }; @@ -115,6 +118,41 @@ mod tests { ); assert_eq!(tr!("app.selection_entities", count = 1), "1 entidade"); assert_eq!(tr!("app.selection_entities", count = 2), "2 entidades"); + super::set_language("vi"); + assert_eq!(tr!("common.cancel"), "Hủy"); + assert_eq!(tr!("settings.settings"), "Cài đặt"); + // Vietnamese uses the `other` form even for one selected item. + for count in [0, 1, 2] { + assert_eq!( + tr!("app.selection_entities", count = count), + format!("{count} thực thể") + ); + assert_eq!( + tr!("app.selection_edges", count = count), + format!("{count} cạnh") + ); + assert_eq!( + tr!("app.selection_faces", count = count), + format!("{count} mặt") + ); + assert_eq!( + tr!("app.selection_dimensions", count = count), + format!("{count} kích thước") + ); + assert_eq!( + tr!("app.selection_guides", count = count), + format!("{count} đường dẫn") + ); + assert_eq!( + tr!("app.selection_text_labels", count = count), + format!("{count} nhãn văn bản") + ); + } + #[cfg(not(target_arch = "wasm32"))] + assert_eq!( + super::spawn_localized(super::current_language).join().unwrap(), + super::Language::Vietnamese + ); super::set_language("en"); assert_eq!(tr!("common.cancel"), "Cancel"); assert_eq!(