From dea4e85c00e4f2815684494d322a49f0bd130a53 Mon Sep 17 00:00:00 2001 From: RenjiYuusei Date: Mon, 25 Aug 2025 09:54:47 +0700 Subject: [PATCH 1/5] Refines and expands Vietnamese locale Improves existing Vietnamese translations for better consistency, clarity, and natural phrasing. Adds numerous new translation keys to provide comprehensive localization for recently introduced features and UI elements. --- src/locales/vi-VN/translation.json | 741 ++++++++++++++++------------- 1 file changed, 404 insertions(+), 337 deletions(-) diff --git a/src/locales/vi-VN/translation.json b/src/locales/vi-VN/translation.json index 7387e763f..2dc56bae3 100644 --- a/src/locales/vi-VN/translation.json +++ b/src/locales/vi-VN/translation.json @@ -1,370 +1,431 @@ { - "import_link": "Nhập Liên Kết", - "import_link_failure": "Nhập Link Thất Bại", - "create_user_script": "Tạo Script Người Dùng", - "create_background_script": "Tạo Script Nền", - "create_scheduled_script": "Tạo Script Theo Lịch", - "import_by_local": "Nhập Từ Local", - "import_local_failure": "Nhập Local Thất Bại", - "import_local_success": "Nhập Local Thành Công", - "create_script": "Tạo Script", - "user_guide": "Hướng Dẫn Sử Dụng", - "api_docs": "Tài Liệu Api", - "development_guide": "Hướng Dẫn Phát Triển", - "script_gallery": "Thư Viện Script", - "community_forum": "Diễn Đàn Cộng Đồng", - "external_links": "Liên Kết Bên Ngoài", - "system_follow": "Theo Dõi Hệ Thống", - "no_data": "Không Có Dữ Liệu", - "installed_scripts": "Script Đã Cài Đặt", - "subscribe": "Đăng Ký", - "logs": "Logs", - "tools": "Công Cụ", - "settings": "Cài Đặt", - "hide_sidebar": "Thu Gọn Được", - "guide": "Hướng Dẫn", - "helpcenter": "Trung Tâm Trợ Giúp", + "import_link": "Liên kết nhập", + "import_link_failure": "Nhập liên kết thất bại", + "create_user_script": "Tạo script người dùng", + "create_background_script": "Tạo script nền", + "create_scheduled_script": "Tạo script hẹn giờ", + "import_by_local": "Đã nhập cục bộ", + "import_local_failure": "Nhập cục bộ thất bại", + "import_local_success": "Nhập cục bộ thành công", + "create_script": "Tạo script", + "user_guide": "Hướng dẫn sử dụng", + "api_docs": "Tài liệu api", + "development_guide": "Hướng dẫn phát triển", + "script_gallery": "Thư viện script", + "community_forum": "Diễn đàn cộng đồng", + "external_links": "Liên kết bên ngoài", + "system_follow": "Theo hệ thống", + "no_data": "Không có dữ liệu", + "installed_scripts": "Script đã cài đặt", + "subscribe": "Đăng ký", + "logs": "Nhật ký", + "tools": "Công cụ", + "settings": "Cài đặt", + "hide_sidebar": "Ẩn thanh bên", + "guide": "Hướng dẫn", + "helpcenter": "Trung tâm trợ giúp", "general": "Chung", - "language": "Ngôn Ngữ", - "help_translate": "Giúp Chúng Tôi Dịch", - "script_sync": "Đồng Bộ Script", - "sync_delete": "Đồng Bộ Xóa", - "enable_script_sync_to": "Bật Đồng Bộ Script Đến", + "language": "Ngôn ngữ", + "help_translate": "Giúp chúng tôi dịch", + "script_sync": "Đồng bộ script", + "sync_delete": "Đồng bộ xóa", + "enable_script_sync_to": "Bật đồng bộ script tới", "save": "Lưu", - "cloud_sync_account_verification": "Đang Xác Minh Tài Khoản Đồng Bộ Cloud...", - "cloud_sync_verification_failed": "Xác Minh Tài Khoản Đồng Bộ Cloud Thất Bại", - "save_success": "Lưu Thành Công", - "update": "Cập Nhật", - "check_update": "Kiểm Tra Cập Nhật", - "script_subscription_check_interval": "Khoảng Thời Gian Kiểm Tra Cập Nhật Script/Đăng Ký", - "never": "Không Bao Giờ", - "6_hours": "6 Giờ", - "12_hours": "12 Giờ", - "every_day": "Mỗi Ngày", - "every_week": "Mỗi Tuần", - "update_disabled_scripts": "Cập Nhật Script Bị Vô Hiệu Hóa", - "silent_update_non_critical_changes": "Cập Nhật Lặng Lẽ Các Thay Đổi Không Quan Trọng", - "enable_eslint": "Bật ESLint", - "eslint_rules": "Quy Tắc ESLint", - "enter_eslint_rules": "Vui Lòng Nhập Quy Tắc ESLint, Cấu Hình Có Thể Được Tải Xuống Từ https://eslint.org/play/", - "language_change_tip": "Thay Đổi Ngôn Ngữ Thành Công", - "backup": "Sao Lưu", - "local": "Local", - "export_file": "Xuất File", - "import_file": "Nhập File", - "cloud": "Cloud", - "backup_to": "Sao Lưu Đến", - "preparing_backup": "Đang Chuẩn Bị Sao Lưu Lên Cloud", - "backup_success": "Sao Lưu Thành Công", - "backup_failed": "Sao Lưu Thất Bại", - "no_backup_files": "Không Có File Sao Lưu", - "backup_list": "Danh Sách Sao Lưu", - "open_backup_dir": "Mở Thư Mục Sao Lưu", - "confirm_delete": "Xác Nhận Xóa", - "confirm_delete_backup_file": "Xác Nhận Xóa File Sao Lưu", - "confirm_update": "Xác Nhận Cập Nhật", - "delete_success": "Xóa Thành Công", - "backup_strategy": "Chiến Lược Sao Lưu", - "under_construction": "Đang Xây Dựng", - "development_debugging": "Gỡ Bỏ Sự Cố Trong Quá Trình Phát Triển", - "vscode_url": "Url Vscoode", - "auto_connect_vscode_service": "Tự Động Kết Nối Dịch Vụ Vscoode", - "connect": "Kết Nối", - "connection_success": "Kết Nối Thành Công", - "connection_failed": "Kết Nối Thất Bại", - "select_import_script": "Vui Lòng Chọn Script Cần Nhập Trong Trang Mới", - "import_error": "Lỗi Nhập", - "pulling_data_from_cloud": "Đang Lấy Dữ Liệu Từ Cloud", - "pull_failed": "Lấy Dữ Liệu Thất Bại", - "restore": "Khôi Phục", - "log_title": "Logs Thời Gian Chạy", - "last_5_minutes": "5 Phút Gần Nhất", - "last_15_minutes": "15 Phút Gần Nhất", - "last_30_minutes": "30 Phút Gần Nhất", - "last_1_hour": "1 Giờ Gần Nhất", - "last_3_hours": "3 Giờ Gần Nhất", - "last_6_hours": "6 Giờ Gần Nhất", - "last_12_hours": "12 Giờ Gần Nhất", - "last_24_hours": "24 Giờ Gần Nhất", - "last_7_days": "7 Ngày Gần Nhất", - "query": "Truy Vấn", - "search_regex": "Tìm Kiếm (Hỗ Trợ Regex)", - "clean_schedule": "Dọn Dẹp Lịch Trình", - "days_ago_logs": "Logs Của {{days}} Ngày Trước", - "delete_completed": "Xóa Hoàn Thành", - "delete_current_logs": "Xóa Logs Hiện Tại", - "clear_completed": "Đang Xóa Hoàn Thành", - "clear_logs": "Xóa Logs", - "total_logs": "Tổng Cộng {{length}} Logs Đã Được Truy Vấn", - "filtered_logs": "{{length}} Logs Sau Khi Lọc", - "enter_filter_conditions": "Vui Lòng Nhập Điều Kiện Lọc Để Truy Vấn", + "save_as": "Lưu thành", + "file": "Tệp", + "run": "Chạy", + "debug": "Gỡ lỗi", + "cloud_sync_account_verification": "Đang xác minh tài khoản đồng bộ đám mây...", + "cloud_sync_verification_failed": "Xác minh tài khoản đồng bộ đám mây thất bại", + "save_success": "Lưu thành công", + "update": "Cập nhật", + "check_update": "Kiểm tra cập nhật", + "script_subscription_check_interval": "Khoảng thời gian kiểm tra cập nhật script/đăng ký", + "never": "Không bao giờ", + "6_hours": "6 giờ", + "12_hours": "12 giờ", + "every_day": "Mỗi ngày", + "every_week": "Mỗi tuần", + "update_disabled_scripts": "Cập nhật script đã tắt", + "silent_update_non_critical_changes": "Tự động cập nhật các thay đổi không quan trọng", + "enable_eslint": "Bật eslint", + "eslint_rules": "Quy tắc eslint", + "enter_eslint_rules": "Vui lòng nhập các quy tắc eslint. Cấu hình có thể được tải xuống từ https://eslint.org/play/.", + "language_change_tip": "Thay đổi ngôn ngữ thành công", + "backup": "Sao lưu", + "local": "Cục bộ", + "export_file": "Xuất tệp", + "import_file": "Nhập tệp", + "cloud": "Đám mây", + "backup_to": "Sao lưu tới", + "preparing_backup": "Đang chuẩn bị sao lưu lên đám mây", + "backup_success": "Sao lưu thành công", + "backup_failed": "Sao lưu thất bại", + "no_backup_files": "Không có tệp sao lưu nào", + "backup_list": "Danh sách sao lưu", + "open_backup_dir": "Mở thư mục sao lưu", + "confirm_delete": "Xác nhận xóa", + "confirm_delete_backup_file": "Xác nhận xóa tệp sao lưu", + "confirm_update": "Xác nhận cập nhật", + "delete_success": "Xóa thành công", + "deleting": "Đang xóa", + "backup_strategy": "Chiến lược sao lưu", + "under_construction": "Đang xây dựng", + "development_debugging": "Gỡ lỗi phát triển", + "vscode_url": "Url vscode", + "auto_connect_vscode_service": "Tự động kết nối dịch vụ vscode", + "connect": "Kết nối", + "connection_success": "Kết nối thành công", + "connection_failed": "Kết nối thất bại", + "select_import_script": "Vui lòng chọn script để nhập trong trang mới", + "import_error": "Lỗi nhập", + "pulling_data_from_cloud": "Đang tải dữ liệu từ đám mây", + "pull_failed": "Tải thất bại", + "restore": "Khôi phục", + "log_title": "Nhật ký chạy", + "last_5_minutes": "5 phút trước", + "last_15_minutes": "15 phút trước", + "last_30_minutes": "30 phút trước", + "last_1_hour": "1 giờ trước", + "last_3_hours": "3 giờ trước", + "last_6_hours": "6 giờ trước", + "last_12_hours": "12 giờ trước", + "last_24_hours": "24 giờ trước", + "last_7_days": "7 ngày trước", + "query": "Truy vấn", + "labels": "Nhãn", + "search_regex": "Tìm kiếm (hỗ trợ regex)", + "clean_schedule": "Tự động xóa nhật ký cũ hơn", + "days_ago_logs": "Ngày", + "delete_completed": "Xóa hoàn tất", + "delete_current_logs": "Xóa nhật ký hiện tại", + "clear_completed": "Xóa hoàn tất", + "clear_logs": "Xóa nhật ký", + "total_logs": "Tổng cộng {{length}} nhật ký đã được truy vấn", + "filtered_logs": "{{length}} nhật ký sau khi lọc", + "enter_filter_conditions": "Vui lòng nhập điều kiện lọc để truy vấn", "permission": "Quyền", - "enter_subscribe_name": "Vui Lòng Nhập Tên Đăng Ký", - "subscribe_url": "Url Đăng Ký", + "enter_subscribe_name": "Vui lòng nhập tên đăng ký", + "subscribe_url": "Url đăng ký", + "confirm_delete_subscription": "Bạn có chắc chắn muốn xóa đăng ký này không? Các script liên quan cũng sẽ bị xóa.", "list": { - "confirm_delete": "Bạn Có Chắc Chắn Muốn Xóa Không? Xin Lưu Ý Rằng Điều Này Và Dán Vào Phần Văn Bản Còn Lại.", - "confirm_update": "Bạn Có Chắc Chắn Muốn Cập Nhật Không? Xin Lưu Ý Rằng Đây Là Một Thao Tác Không Thể Hoàn Tác." + "confirm_delete": "Bạn có chắc chắn muốn xóa không? Xin lưu ý rằng đây là một thao tác không thể đảo ngược.", + "confirm_update": "Bạn có chắc chắn muốn cập nhật không? Xin lưu ý rằng đây là một thao tác không thể đảo ngược." }, "enable": "Bật", - "script_list_enable_width": 80, + "script_list_enable_width": 100, "script_list_last_updated_width": 150, - "script_list_apply_to_run_status_width": 160, + "script_list_apply_to_run_status_width": 110, "subscribe_list_enable_width": 120, "disable": "Tắt", "name": "Tên", - "version": "Phiên Bản", - "apply_to_run_status": "Áp Dụng Cho / Trạng Thái Chạy", + "version": "Phiên bản", + "apply_to_run_status": "Áp dụng cho / trạng thái chạy", "source": "Nguồn", - "home": "Trang Chủ", - "sorting": "Sắp Xếp", - "last_updated": "Cập Nhật Cuối Cùng", - "action": "Hành Động", - "foreground_page_script_tooltip": "Script Trang Tiền Cảnh, Chạy Trên Trang Được Chỉ Định", - "background_script_tooltip": "Script Nền, Chạy Trên Trang Được Chỉ Định", - "scheduled_script_tooltip": "Script Theo Lịch, Thời Gian Chạy Tiếp Theo:", - "running": "Đang Chạy", - "completed": "Hoàn Thành", - "subscription_link": "Liên Kết Đăng Ký", - "subscription_installation": "Cài Đặt Đăng Ký", - "manually_created": "Local", - "script_link": "Liên Kết Script", - "user_installation": "Cài Đặt", - "confirm_delete_script": "Bạn Có Chắc Chắn Muốn Xóa Script Này Không?", - "delete_failed": "Xóa Thất Bại", - "enter_script_name": "Vui Lòng Nhập Tên Script", - "update_not_supported": "Script Này Không Hỗ Trợ Kiểm Tra Cập Nhật", - "checking_for_updates": "Đang Kiểm Tra Cập Nhật...", - "new_version_available": "Có Phiên Bản Mới", - "latest_version": "Phiên Bản Mới Nhất", - "checked_for_all_selected": "Đã Kiểm Tra Cập Nhật Cho Tất Cả Các Mục Đã Chọn", - "update_check_failed": "Kiểm Tra Cập Nhật Thất Bại", - "stopping_script": "Đang Dừng Script", - "script_stopped": "Script Đã Dừng", - "starting_script": "Đang Khởi Động Script...", - "starting_updates": "Đang Bắt Đầu Cập Nhật Hàng Loạt...", - "script_started": "Script Đã Khởi Động", - "batch_operations": "Thao Tác Hàng Loạt", + "home": "Trang chủ", + "sorting": "Sắp xếp", + "last_updated": "Cập nhật lần cuối", + "action": "Hành động", + "foreground_page_script_tooltip": "Script trang nền trước, chạy trên trang được chỉ định", + "background_script_tooltip": "Script nền, sẽ chạy ngầm khi được bật", + "scheduled_script_tooltip": "Script hẹn giờ, thời gian chạy tiếp theo:", + "running": "Đang chạy", + "completed": "Hoàn thành", + "subscription_link": "Liên kết đăng ký", + "subscription_installation": "Cài đặt đăng ký", + "manually_created": "Cục bộ", + "script_link": "Liên kết script", + "user_installation": "Cài đặt", + "confirm_delete_script": "Bạn có chắc chắn muốn xóa script này không?", + "confirm_delete_script_content": "Bạn có chắc chắn muốn xóa script \"{{name}}\" không? Hành động này không thể hoàn tác.", + "delete_failed": "Xóa thất bại", + "enter_script_name": "Vui lòng nhập tên script", + "update_not_supported": "Script này không hỗ trợ kiểm tra cập nhật", + "checking_for_updates": "Đang kiểm tra cập nhật...", + "new_version_available": "Phiên bản mới có sẵn", + "latest_version": "Phiên bản mới nhất", + "checked_for_all_selected": "Đã kiểm tra cập nhật cho tất cả các mục đã chọn", + "update_check_failed": "Kiểm tra cập nhật thất bại", + "stopping_script": "Đang dừng script", + "script_stopped": "Script đã dừng", + "starting_script": "Đang khởi động script...", + "starting_updates": "Đang khởi động cập nhật hàng loạt...", + "script_started": "Script đã khởi động", + "batch_operations": "Thao tác hàng loạt", "export": "Xuất", "delete": "Xóa", - "unknown_operation": "Thao Tác Không Xác Định", - "confirm": "Xác Nhận", + "pin_to_top": "Ghim lên đầu", + "scripts_pinned_to_top": "Script đã chọn đã được ghim", + "unknown_operation": "Thao tác không xác định", + "confirm": "Xác nhận", "close": "Đóng", - "page_script": "Script Trang", - "homepage": "Trang Chủ", - "script_website": "Website Script", - "script_source": "Mã Nguồn Script", - "bug_feedback_script_support": "Phản Hồi Lỗi/Hỗ Trợ Script", - "config": "Cấu Hình", + "page_script": "Script trang", + "homepage": "Trang chủ", + "script_website": "Trang web script", + "script_source": "Mã nguồn script", + "bug_feedback_script_support": "Phản hồi lỗi/hỗ trợ script", + "config": "Cấu hình", "key": "Khóa", - "value": "Giá Trị", + "value": "Giá trị", "add": "Thêm", - "type": "Kiểu", - "edit_value": "Chỉnh Sửa Giá Trị", - "add_value": "Thêm Giá Trị", - "update_success": "Cập Nhật Thành Công", - "add_success": "Thêm Thành Công", - "script_storage": "Bộ Nhớ Script", - "enter_key": "Vui Lòng Nhập Khóa", + "type": "Loại", + "edit_value": "Sửa giá trị", + "add_value": "Thêm giá trị", + "update_success": "Cập nhật thành công", + "add_success": "Thêm thành công", + "script_storage": "Lưu trữ script", + "enter_key": "Vui lòng nhập khóa", "key_placeholder": "Khóa", - "value_placeholder": "Khi Kiểu Là Object, Vui Lòng Nhập Dữ Liệu Có Thể Được Giải Mã JSON", + "value_placeholder": "Khi loại là đối tượng, vui lòng nhập dữ liệu có thể phân tích cú pháp json.", "clear": "Xóa", - "clear_success": "Xóa Thành Công", - "confirm_clear": "Bạn Có Chắc Chắn Muốn Xóa Không Gian Lưu Trữ Này Không?", + "clear_success": "Xóa thành công", + "confirm_clear": "Bạn có chắc chắn muốn xóa không gian lưu trữ này không?", "type_string": "Chuỗi", "type_number": "Số", "type_boolean": "Boolean", - "type_object": "Đối Tượng", - "confirm_delete_resource": "Bạn Có Chắc Chắn Muốn Xóa Tài Nguyên Này Không? Tài Nguyên Này Sẽ Được Tải Lại Ở Lần Khởi Động Tiếp Theo", - "confirm_clear_resource": "Bạn Có Chắc Chắn Muốn Xóa Các Tài Nguyên Này Không? Tài Nguyên Sẽ Được Tải Lại Ở Lần Khởi Động Tiếp Theo", - "script_resource": "Tài Nguyên Script", - "permission_value": "Giá Trị Ủy Quyền", - "allow": "Cho Phép", + "type_object": "Đối tượng", + "confirm_delete_resource": "Bạn có chắc chắn muốn xóa tài nguyên này không? Tài nguyên này sẽ tải lại vào lần khởi động tiếp theo.", + "confirm_clear_resource": "Bạn có chắc chắn muốn xóa các tài nguyên này không? Các tài nguyên sẽ tải lại vào lần khởi động tiếp theo.", + "script_resource": "Tài nguyên script", + "permission_value": "Giá trị ủy quyền", + "allow": "Cho phép", "yes": "Có", "no": "Không", - "confirm_delete_permission": "Xác Nhận Xóa Ủy Quyền Này?", - "script_setting": "Cài Đặt Script", - "basic_info": "Thông Tin Cơ Bản", - "update_url": "Url Cập Nhật", - "permission_management": "Quản Lý Quyền", - "add_permission": "Thêm Quyền", - "permission_cors": "Chống Giả Mạo Nguồn Gốc (cors)", - "permission_cookie": "Quản Lý Cookie", - "match": "Phù Hợp", - "user_setting": "Cài Đặt Người Dùng", - "confirm_delete_exclude": "Xác Nhận Xóa Loại Trừ Này?", - "after_deleting_match_item": "Sau Khi Các Mục Phù Hợp Của Script Được Xóa, Chúng Sẽ Được Tự Động Thêm Vào Các Mục Phù Hợp", - "confirm_delete_match": "Xác Nhận Xóa Phù Hợp Này?", - "after_deleting_exclude_item": "Sau Khi Xóa Mục Phù Hợp Của Script, Nó Sẽ Được Tự Động Thêm Vào Các Mục Loại Trừ", - "add_match": "Thêm Phù Hợp", - "add_exclude": "Thêm Loại Trừ", - "website_match": "Phù Hợp Website (@match)", - "reset": "Đặt Lại", - "website_exclude": "Loại Trừ Website (@exclude)", - "confirm_reset": "Xác Nhận Đặt Lại?", - "script_total_runs": "Script Đã Chạy {{runNum}} Lần, {{runNumByIframe}} Lần Trong Iframe", - "script_total_runs_single": "Script Đã Chạy {{runNum}} Lần", - "script_disabled": "Script Đang Bị Vô Hiệu Hóa", - "run_once": "Chạy Một Lần", + "confirm_delete_permission": "Xác nhận xóa ủy quyền này?", + "script_setting": "Cài đặt script", + "basic_info": "Thông tin cơ bản", + "update_url": "Url cập nhật", + "permission_management": "Quản lý quyền", + "add_permission": "Thêm quyền", + "permission_cors": "Cross-domain (cors)", + "permission_cookie": "Quản lý cookie", + "match": "Khớp", + "user_setting": "Cài đặt người dùng", + "confirm_delete_exclude": "Xác nhận xóa loại trừ này?", + "after_deleting_match_item": "Sau khi các mục khớp của script bị xóa, chúng sẽ tự động được thêm vào các mục khớp", + "confirm_delete_match": "Xác nhận xóa khớp này?", + "after_deleting_exclude_item": "Sau khi xóa mục khớp của script, nó sẽ tự động được thêm vào các mục loại trừ", + "add_match": "Thêm khớp", + "add_exclude": "Thêm loại trừ", + "website_match": "Khớp trang web (@match)", + "reset": "Đặt lại", + "website_exclude": "Loại trừ trang web (@exclude)", + "confirm_reset": "Xác nhận đặt lại?", + "script_total_runs": "Script đã chạy {{runNum}} lần, {{runNumByIframe}} lần trong iframes", + "script_total_runs_single": "Script đã chạy {{runNum}} lần", + "script_disabled": "Script chưa được bật", + "run_once": "Chạy một lần", "stop": "Dừng", - "edit": "Chỉnh Sửa", - "exclude_on": "Loại Trừ Bật $0 Loại Trừ Thực Thi", - "exclude_off": "Loại Trừ Tắt $0 Loại Trừ Thực Thi", - "user_config": "Cấu Hình Người Dùng", - "gm_api": "Gm Api", - "storage_api": "Storage Api", - "use_file_system": "Hệ Thống File Đang Sử Dụng", - "open_directory": "Mở Thư Mục", - "account_validation_failed": "Xác Thực Tài Khoản Thất Bại", - "not_set": "Chưa Thiết Lập", - "in_use": "Đang Sử Dụng", - "storage_error": "Lỗi Bộ Nhớ", - "upload_to_cloud": "Tải Lên Cloud", - "save_failed": "Lưu Thất Bại", - "exporting": "Đang Xuất...", - "upload_to": "Tải Lên", - "value_export_expression": "Biểu Thức Xuất Giá Trị", - "overwrite_original_value_on_import": "Ghi Đè Giá Trị Gốc Khi Nhập", - "cookie_export_expression": "Biểu Thức Xuất Cookie", - "overwrite_original_cookie_on_import": "Ghi Đè Cookie Gốc Khi Nhập", - "restore_default_values": "Khôi Phục Giá Trị Mặc Định", - "get_confirm_error": "Lấy Thông Tin Xác Nhận Thất Bại", - "confirm_error": "Xác Nhận Thất Bại", - "ignore": "Bỏ Qua", - "allow_once": "Cho Phép Một Lần", - "temporary_allow": "Cho Phép Tạm Thời {{permissionContent}} Này", - "temporary_allow_all": "Cho Phép Tạm Thời Tất Cả {{permissionContent}}", - "permanent_allow": "Cho Phép Vĩnh Viễn {{permissionContent}} Này", - "permanent_allow_all": "Cho Phép Vĩnh Viễn Tất Cả {{permissionContent}}", - "deny_once": "Từ Chối Một Lần", - "temporary_deny": "Từ Chối Tạm Thời {{permissionContent}} Này", - "temporary_deny_all": "Từ Chối Tạm Thời Tất Cả {{permissionContent}}", - "permanent_deny": "Từ Chối Vĩnh Viễn {{permissionContent}} Này", - "permanent_deny_all": "Từ Chối Vĩnh Viễn Tất Cả {{permissionContent}}", - "data_import": "Nhập Dữ Liệu", + "edit": "Sửa", + "exclude_on": "Cho phép chạy lại $0", + "exclude_off": "Loại trừ chạy $0", + "user_config": "Cấu hình người dùng", + "gm_api": "Api gm", + "storage_api": "Api lưu trữ", + "use_file_system": "Hệ thống tệp đang được sử dụng", + "open_directory": "Mở thư mục", + "account_validation_failed": "Xác thực tài khoản thất bại", + "not_set": "Chưa đặt", + "in_use": "Đang sử dụng", + "storage_error": "Lỗi lưu trữ", + "upload_to_cloud": "Tải lên đám mây", + "save_failed": "Lưu thất bại", + "exporting": "Đang xuất...", + "upload_to": "Tải lên", + "value_export_expression": "Biểu thức xuất giá trị", + "overwrite_original_value_on_import": "Ghi đè giá trị gốc khi nhập", + "cookie_export_expression": "Biểu thức xuất cookie", + "overwrite_original_cookie_on_import": "Ghi đè cookie gốc khi nhập", + "restore_default_values": "Khôi phục giá trị mặc định", + "get_confirm_error": "Lấy thông tin xác nhận thất bại", + "confirm_error": "Xác nhận thất bại", + "ignore": "Bỏ qua", + "allow_once": "Cho phép một lần", + "temporary_allow": "Tạm thời cho phép {{permissionContent}} này", + "temporary_allow_all": "Tạm thời cho phép tất cả {{permissionContent}}", + "permanent_allow": "Cho phép vĩnh viễn {{permissionContent}} này", + "permanent_allow_all": "Cho phép vĩnh viễn tất cả {{permissionContent}}", + "deny_once": "Từ chối một lần", + "temporary_deny": "Tạm thời từ chối {{permissionContent}} này", + "temporary_deny_all": "Tạm thời từ chối tất cả {{permissionContent}}", + "permanent_deny": "Từ chối vĩnh viễn {{permissionContent}} này", + "permanent_deny_all": "Từ chối vĩnh viễn tất cả {{permissionContent}}", + "data_import": "Nhập dữ liệu", "import": "Nhập", - "select_scripts_to_import": "Vui Lòng Chọn Script Bạn Muốn Nhập", - "select_all": "Chọn Tất Cả", - "script_import_progress": "Tiến Trình Nhập Script", - "select_subscribes_to_import": "Vui Lòng Chọn Các Đăng Ký Bạn Muốn Nhập", - "subscribe_import_progress": "Tiến Trình Nhập Đăng Ký", - "author": "Tác Giả", - "description": "Mô Tả", - "operation": "Thao Tác", + "select_scripts_to_import": "Vui lòng chọn các script bạn muốn nhập", + "select_all": "Chọn tất cả", + "script_import_progress": "Tiến độ nhập script", + "select_subscribes_to_import": "Vui lòng chọn các đăng ký bạn muốn nhập", + "subscribe_import_progress": "Tiến độ nhập đăng ký", + "author": "Tác giả", + "description": "Mô tả", + "operation": "Thao tác", "error": "Lỗi", - "unknown": "Không Xác Định", - "add_new": "Thêm Mới", - "no_operation": "Không Có Thao Tác", - "enable_script": "Bật Script", - "local_creation": "Tạo Local", - "import_success": "Nhập Thành Công", - "install_script": "Cài Đặt Script", - "update_script": "Cập Nhật Script", - "install_subscribe": "Cài Đặt Đăng Ký", - "update_subscribe": "Cập Nhật Đăng Ký", - "invalid_link": "Liên Kết Không Hợp Lệ", - "subscribe_install_label": "Đăng Ký Này Sẽ Cài Đặt Các Script Sau", - "script_runs_in": "Script Sẽ Chạy Trên Các Website Sau", - "script_has_full_access_to": "Script Sẽ Có Quyền Truy Cập Đầy Đủ Vào Các Url Sau", - "script_requires": "Script Cần Các Tài Nguyên Bên Ngoài Sau", - "cookie_warning": "Xin Lưu Ý, Script Này Yêu Cầu Truy Cập Vào Quyền Cookie, Đây Là Một Quyền Nguy Hiểm. Vui Lòng Xác Minh Sự An Toàn Của Script.", - "scheduled_script_description_title": "Đây Là Một Script Theo Lịch Trình, Sẽ Tự Động Chạy Vào Một Thời Gian Cụ Thể Sau Khi Được Bật Và Có Thể Được Điều Khiển Thủ Công Trong Bảng Điều Khiển.", - "scheduled_script_description_description": "Biểu Thức Nhiệm Vụ Theo Lịch Trình: {{expression}}, Thời Gian Chạy Gần Nhất: {{time}}", - "background_script_description": "Đây Là Một Script Nền, Sẽ Tự Động Chạy Một Lần Khi Trình Duyệt Mở Sau Khi Được Bật, Và Có Thể Được Điều Khiển Thủ Công Trong Bảng Điều Khiển.", - "install_success": "Cài Đặt Thành Công", + "unknown": "Không xác định", + "add_new": "Thêm mới", + "no_operation": "Không có thao tác nào", + "enable_script": "Bật script", + "local_creation": "Tạo cục bộ", + "import_success": "Nhập thành công", + "install_script": "Cài đặt script", + "update_script": "Cập nhật script", + "install_subscribe": "Cài đặt đăng ký", + "update_subscribe": "Cập nhật đăng ký", + "update_script_no_close": "Cập nhật script mà không đóng cửa sổ", + "install_script_no_close": "Cài đặt script mà không đóng cửa sổ", + "update_script_no_more_update": "Cập nhật script và tắt kiểm tra cập nhật", + "close_update_script_no_more_update": "Đóng và không kiểm tra cập nhật", + "install_script_no_more_update": "Cài đặt script và tắt kiểm tra cập nhật", + "invalid_link": "Liên kết không hợp lệ", + "subscribe_install_label": "Đăng ký này sẽ cài đặt các script sau", + "script_runs_in": "Script sẽ chạy trên các trang web sau", + "script_has_full_access_to": "Script sẽ có toàn quyền truy cập vào các url sau", + "script_requires": "Script yêu cầu các tài nguyên bên ngoài sau", + "cookie_warning": "Xin lưu ý, script này yêu cầu quyền truy cập cookie, đây là một quyền nguy hiểm. Vui lòng xác minh tính bảo mật của script.", + "scheduled_script_description_title": "Đây là script hẹn giờ, sẽ tự động chạy vào một thời điểm cụ thể sau khi được bật và có thể được điều khiển thủ công trong bảng điều khiển.", + "scheduled_script_description_description": "Biểu thức tác vụ hẹn giờ: {{expression}}, thời gian chạy gần nhất: {{time}}", + "background_script_description": "Đây là script nền, sẽ tự động chạy một lần khi trình duyệt mở sau khi được bật và có thể được điều khiển thủ công trong bảng điều khiển.", + "install_success": "Cài đặt thành công", "install": { - "update_success": "Cập Nhật Thành Công" + "update_success": "Cập nhật thành công" }, - "install_failed": "Cài Đặt Thất Bại", - "subscribe_success": "Đăng Ký Thành Công", - "subscribe_failed": "Đăng Ký Thất Bại", - "current_version": "Phiên Bản Hiện Tại", - "update_version": "Phiên Bản Cập Nhật", - "background_script_tag": "Đây Là Một Script Nền", - "scheduled_script_tag": "Đây Là Một Script Theo Lịch Trình", - "background_script": "Script Nền", - "scheduled_script": "Script Theo Lịch Trình", - "install_from_legitimate_sources_warning": "Vui Lòng Cài Đặt Script Từ Nguồn Uy Tín! Script Không Rõ Nguồn Gốc Có Thể Xâm Phạm Quyền Riêng Tư Của Bạn Hoặc Thực Hiện Các Thao Tác Có Hại.", - "antifeature_referral_link_title": "Liên Kết Giới Thiệu", - "antifeature_referral_link_description": "Script Này Sửa Đổi Hoặc Chuyển Hướng Đến Liên Kết Giới Thiệu Của Tác Giả", - "antifeature_ads_title": "Quảng Cáo", - "antifeature_ads_description": "Script Này Chèn Quảng Cáo Vào Các Trang Bạn Truy Cập", - "antifeature_payment_title": "Thanh Toán", - "antifeature_payment_description": "Script Này Yêu Cầu Thanh Toán Để Sử Dụng Đúng Cách", - "antifeature_miner_title": "Đào Tiền Ảo", - "antifeature_miner_description": "Script Này Tham Gia Hoạt Động Đào Tiền Ảo", - "antifeature_membership_title": "Tính Năng Thành Viên", - "antifeature_membership_description": "Script Này Yêu Cầu Đăng Ký Làm Thành Viên Để Sử Dụng Đúng Cách", - "antifeature_tracking_title": "Theo Dõi", - "antifeature_tracking_description": "Script Này Theo Dõi Thông Tin Người Dùng Của Bạn", - "script_info_load_failed": "Thất Bại Khi Tải Thông Tin Script", - "script_status_tooltip": "Bạn Có Thể Điều Khiển Trạng Thái Mở Của Script. Các Script Oil Monkey Thông Thường Được Bật Mặc Định, Và Script Nền Và Script Theo Lịch Trình Được Tắt Mặc Định.", - "get_script": "Lấy Script", - "report_issue": "Báo Cáo Sự Cố", - "project_docs": "Tài Liệu Dự Án", - "community": "Cộng Đồng", + "install_failed": "Cài đặt thất bại", + "subscribe_success": "Đăng ký thành công", + "subscribe_failed": "Đăng ký thất bại", + "current_version": "Phiên bản hiện tại", + "update_version": "Phiên bản cập nhật", + "background_script_tag": "Đây là một script nền", + "scheduled_script_tag": "Đây là một script hẹn giờ", + "background_script": "Script nền", + "scheduled_script": "Script hẹn giờ", + "install_from_legitimate_sources_warning": "Vui lòng cài đặt script từ các nguồn hợp pháp! Script không rõ nguồn gốc có thể xâm phạm quyền riêng tư của bạn hoặc thực hiện các hoạt động độc hại.", + "antifeature_referral_link_title": "Liên kết giới thiệu", + "antifeature_referral_link_description": "Script này sửa đổi hoặc chuyển hướng đến liên kết giới thiệu của tác giả", + "antifeature_ads_title": "Quảng cáo", + "antifeature_ads_description": "Script này chèn quảng cáo vào các trang bạn truy cập", + "antifeature_payment_title": "Thanh toán", + "antifeature_payment_description": "Script này yêu cầu thanh toán để sử dụng đúng cách", + "antifeature_miner_title": "Đào coin", + "antifeature_miner_description": "Script này tham gia vào các hoạt động đào coin", + "antifeature_membership_title": "Tính năng thành viên", + "antifeature_membership_description": "Script này yêu cầu đăng ký làm thành viên để sử dụng đúng cách", + "antifeature_tracking_title": "Theo dõi", + "antifeature_tracking_description": "Script này theo dõi thông tin người dùng của bạn", + "script_info_load_failed": "Tải thông tin script thất bại", + "script_status_tooltip": "Bạn có thể kiểm soát trạng thái mở của script. Script oil monkey thông thường được bật theo mặc định, trong khi script nền và script hẹn giờ bị tắt theo mặc định.", + "get_script": "Lấy script", + "report_issue": "Báo cáo sự cố", + "project_docs": "Tài liệu dự án", + "community": "Cộng đồng", "popup": { - "new_version_available": "Có Phiên Bản Mới" + "new_version_available": "Phiên bản mới có sẵn" }, - "current_page_scripts": "Script Đang Chạy Trên Trang Hiện Tại", - "enabled_background_scripts": "Script Nền Đã Bật Và Đang Chạy", - "script_accessing_cross_origin_resource": "Script Đang Thử Truy Cập Tài Nguyên Từ Nguồn Gốc Khác", - "domain": "Tên Miền", - "script_name": "Tên Script", - "request_domain": "Tên Miền Yêu Cầu", - "request_url": "Url Yêu Cầu", - "access_cookie_content": "Script Đang Thử Truy Cập Nội Dung Cookie Của Website", - "confirm_script_operation": "Vui Lòng Xác Nhận Nếu Bạn Cho Phép Script Thực Hiện Thao Tác Này. Cookie Chứa Dữ Liệu Quan Trọng Của Người Dùng, Vì Vậy Chỉ Cấp Quyền Truy Cập Cho Các Script Uy Tín.", - "cookie_domain": "Tên Miền Cookie", - "script_operation_title": "Script Đang Thử Truy Cập Bộ Nhớ Đồng Bộ Script", - "script_operation_description": "Vui Lòng Xác Nhận Nếu Bạn Cho Phép Script Thực Hiện Thao Tác Này. Nếu Được Cho Phép, Script Sẽ Có Thể Truy Cập Vào Không Gian Lưu Trữ Mà Bạn Đã Thiết Lập Và Tạo Một Thư Mục app/${dir} Bên Trong Nó.", + "current_page_scripts": "Script đang chạy trên trang hiện tại", + "enabled_background_scripts": "Script nền đã bật và đang chạy", + "script_accessing_cross_origin_resource": "Script đang cố gắng truy cập tài nguyên cross-origin", + "confirm_operation_description": "Vui lòng xác nhận xem bạn có cho phép script thực hiện thao tác này không. Script cũng có thể thêm thẻ @connect để bỏ qua tùy chọn này.", + "domain": "Miền", + "script_name": "Tên script", + "request_domain": "Miền yêu cầu", + "request_url": "Url yêu cầu", + "access_cookie_content": "Script đang cố gắng truy cập nội dung cookie của trang web", + "confirm_script_operation": "Vui lòng xác nhận xem bạn có cho phép script thực hiện thao tác này không. Cookie chứa dữ liệu người dùng quan trọng, vì vậy chỉ cấp quyền truy cập cho các script đáng tin cậy.", + "cookie_domain": "Miền cookie", + "script_operation_title": "Script đang cố gắng truy cập bộ nhớ đồng bộ script", + "script_operation_description": "Vui lòng xác nhận xem bạn có cho phép script thực hiện thao tác này không. Nếu được phép, script sẽ có thể truy cập không gian lưu trữ bạn đã thiết lập và tạo một thư mục app/${dir} trong đó.", "script_permission_content": "Script", - "sync_system_connect_failed": "Kết Nối Hệ Thống Đồng Bộ Thất Bại", - "sync_system_closed": "Đồng Bộ Tắt", - "sync_system_closed_description": "Đồng Bộ Đã Bị Vô Hiệu Hóa, Vui Lòng Cấu Hình Lại", - "auth_type": "Kiểu Xác Thực", + "sync_system_connect_failed": "Kết nối hệ thống đồng bộ thất bại", + "sync_system_closed": "Đồng bộ đã tắt", + "sync_system_closed_description": "Đồng bộ bị tắt, vui lòng cấu hình lại", + "auth_type": "Loại xác thực", "url": "Url", - "username": "Tên Người Dùng", - "password": "Mật Khẩu", - "skip": "Bỏ Qua", - "next": "Tiếp Theo", - "back": "Quay Lại", - "last": "Hoàn Tất", - "start_guide_title": "Chào Mừng Đến Với Phần Mở Rộng Scriptcat", - "start_guide_content": "Tiếp Theo, Chúng Tôi Sẽ Giới Thiệu Cách Sử Dụng Cơ Bản Của Scriptcat Cho Bạn.", - "guide_installed_scripts": "Các Script Bạn Đã Cài Đặt Sẽ Được Hiển Thị Ở Đây.", - "guide_script_list_title": "Chợ Script", - "guide_script_list_content": "Bạn Có Thể Cài Đặt Script Từ Chợ Script. Ngoài Việc Hỗ Trợ Script Người Dùng, Scriptcat Còn Hỗ Trợ Script Nền.", - "guide_script_list_enable_title": "Bật Script", - "guide_script_list_enable_content": "Script Cần Được Bật Để Sử Dụng. Script Trang Được Bật Mặc Định Khi Cài Đặt, Trong Khi Script Nền Được Tắt Mặc Định.", - "guide_script_list_apply_to_run_status_title": "Áp Dụng Cho Và Trạng Thái Chạy", - "guide_script_list_apply_to_run_status_content": "Trạng Thái Chạy Của Script Được Hiển Thị Ở Đây. Di Chuột Lên Trên Thẻ Để Xem Kiểu Script.", - "guide_script_list_sort_title": "Sắp Xếp/Cập Nhật Cuối Cùng/Hành Động", - "guide_script_list_sort_content": "Bạn Có Thể Kéo Thẻ Của Script Để Sắp Xếp Chúng. Nhấp Vào Nhãn Cột \"Cập Nhật Cuối Cùng\" Sẽ Kiểm Tra Cập Nhật Một Lần. Cột \"Hành Động\" Cho Phép Bạn Vào Chỉnh Sửa Script, Điều Khiển Script Chạy/Dừng (Đối Với Script Nền), Và Cấu Hình Userconfig.", - "guide_tools_title": "Công Cụ Thông Dụng", - "guide_tools_content": "Các Công Cụ Cung Cấp Các Tính Năng Sao Lưu Và Phát Triển.", - "guide_tools_backup_title": "Sao Lưu", - "guide_tools_backup_content": "Sao Lưu Cho Phép Bạn Lưu Script Để Tránh Mất Mát. Bạn Có Thể Xuất File Script Vào Máy Tính Của Bạn Hoặc Tải File Script Từ Máy Tính Của Bạn. Bạn Cũng Có Thể Sao Lưu Lên Cloud Để Tiện Lợi Hơn.", - "guide_setting_title": "Cài Đặt", - "guide_setting_content": "Cài Đặt Chủ Yếu Bao Gồm Ngôn Ngữ, Đồng Bộ Script, Tần Suất Cập Nhật Và Các Tùy Chọn Thông Dụng Khác.", - "guide_setting_sync_title": "Cập Nhật Và Đồng Bộ", - "guide_setting_sync_content": "Tính Năng Đồng Bộ Script Cho Phép Bạn Dễ Dàng Đồng Bộ Nội Dung Script Của Thiết Bị Này Lên Cloud. Nếu Bạn Chọn Tùy Chọn Đồng Bộ Xóa, Khi Một Script Được Xóa Trên Thiết Bị Này, Nó Cũng Sẽ Được Xóa Khỏi Cloud. Bạn Cũng Có Thể Cập Nhật Phiên Bản Script Ở Đây Để Có Được Các Tính Năng Mạnh Mẽ Hơn.", - "auto": "Tự Động", + "username": "Tên người dùng", + "password": "Mật khẩu", + "skip": "Bỏ qua", + "next": "Tiếp theo", + "next_with_progress": "Tiếp theo (bước {step} trên {steps})", + "back": "Quay lại", + "last": "Hoàn thành", + "start_guide_title": "Chào mừng bạn đến với tiện ích scriptcat", + "start_guide_content": "Tiếp theo, chúng tôi sẽ giới thiệu cho bạn cách sử dụng cơ bản của scriptcat.", + "guide_installed_scripts": "Các script bạn đã cài đặt sẽ được hiển thị ở đây.", + "guide_script_list_title": "Chợ script", + "guide_script_list_content": "Bạn có thể cài đặt script từ chợ script. Ngoài việc hỗ trợ script người dùng, scriptcat còn hỗ trợ script nền.", + "guide_script_list_enable_title": "Bật script", + "guide_script_list_enable_content": "Script cần được bật để sử dụng. Script trang được bật theo mặc định khi cài đặt, trong khi script nền bị tắt theo mặc định.", + "guide_script_list_apply_to_run_status_title": "Áp dụng cho và trạng thái chạy", + "guide_script_list_apply_to_run_status_content": "Trạng thái chạy của script được hiển thị ở đây. Di chuột qua các thẻ để xem loại script.", + "guide_script_list_sort_title": "Sắp xếp/cập nhật lần cuối/hành động", + "guide_script_list_sort_content": "Bạn có thể kéo các thẻ của script để sắp xếp chúng. Nhấp vào nhãn cột \"cập nhật lần cuối\" sẽ kiểm tra cập nhật một lần. Cột \"hành động\" cho phép bạn vào chỉnh sửa script, kiểm soát việc chạy/dừng script (đối với script nền) và cấu hình userconfig.", + "guide_tools_title": "Công cụ chung", + "guide_tools_content": "Các công cụ cung cấp tính năng sao lưu và phát triển.", + "guide_tools_backup_title": "Sao lưu", + "guide_tools_backup_content": "Sao lưu cho phép bạn lưu script để tránh mất mát. Bạn có thể xuất tệp script sang máy cục bộ hoặc tải tệp script từ máy cục bộ của mình. Bạn cũng có thể sao lưu lên đám mây để thuận tiện hơn.", + "guide_setting_title": "Cài đặt", + "guide_setting_content": "Các cài đặt chủ yếu bao gồm ngôn ngữ, đồng bộ script, tần suất cập nhật và các tùy chọn chung khác.", + "guide_setting_sync_title": "Cập nhật và đồng bộ", + "guide_setting_sync_content": "Tính năng đồng bộ script cho phép bạn dễ dàng đồng bộ nội dung script của thiết bị này lên đám mây. Nếu bạn chọn tùy chọn đồng bộ xóa, khi một script bị xóa trên thiết bị này, nó cũng sẽ bị xóa khỏi đám mây. Bạn cũng có thể cập nhật phiên bản script ở đây để có được các tính năng mạnh mẽ hơn.", + "auto": "Tự động", "hide": "Ẩn", - "custom": "Tùy Chỉnh", - "resize_column_width": "Điều Chỉnh Kích Thước Cột", - "collapse": "Thu Gọn", - "expand": "Mở Rộng", - "menu_expand_num_before": "Mục Menu Hơn", - "menu_expand_num_after": "Tự Ẩn.", - "ext_update_notification": "Tiện ích ScriptCat đã được cập nhật", - "ext_update_notification_desc": "Phiên bản hiện tại: {{version}}, chi tiết vui lòng xem nhật ký cập nhật", - "watch_file_description": "Theo dõi thay đổi tệp, tự động cập nhật script, khi sử dụng hãy đảm bảo đường dẫn tệp script không thay đổi và không thể đóng trang", + "custom": "Tùy chỉnh", + "resize_column_width": "Thay đổi kích thước cột", + "collapse": "Thu gọn", + "expand": "Mở rộng", + "menu_expand_num_before": "Các mục menu nhiều hơn", + "menu_expand_num_after": "sẽ bị ẩn.", + "script_name_cannot_be_set_to_empty": "Tên script không được để trống", + "eslint_config_format_error": "Lỗi định dạng cấu hình eslint", + "export_success": "Đổ dữ liệu thành công đã lưu", + "get_backup_dir_url_failed": "Không thể lấy địa chỉ thư mục sao lưu", + "get_backup_files_failed": "Không thể lấy các bản sao lưu", + "request_permission": "Yêu cầu quyền", + "develop_mode_guide": "Chế độ nhà phát triển chưa được phát hiện. Script của bạn không hoạt động, 👉nhấn để tìm hiểu cách bật.", + "allow_user_script_guide": "Cho phép script người dùng chưa được phát hiện. Script của bạn không hoạt động, 👉nhấn để tìm hiểu cách bật", + "lower_version_browser_guide": "Phát hiện phiên bản trình duyệt hiện tại quá cũ và script của bạn không thể sử dụng bình thường. 👉Nhấp vào tôi để tìm hiểu thêm", + "enable_script_failed": "Bật script thất bại", + "disable_script_failed": "Tắt script thất bại", + "confirm_leave_page": "Hiện đang ở trạng thái chỉnh sửa. Rời khỏi trang này sẽ làm mất nội dung hiện tại. Bạn có muốn rời đi không?", + "page_in_blacklist": "Trang hiện tại nằm trong danh sách đen, không thể sử dụng script", + "baidu_netdisk": "Baidunetdisk", + "save_only_current_group": "Chỉ lưu cho nhóm hiện tại", + "script_import_result": "Kết quả nhập script", + "failure_info": "Thông tin thất bại", + "security": "Bảo mật", + "blacklist_pages": "Trang danh sách đen", + "blacklist_placeholder": "Tắt scriptcat để chạy script trên các trang như\nhttps://*.example.com", + "expression_format_error": "Lỗi định dạng biểu thức điều kiện", + "migration_confirm_message": "Thử lại công cụ lưu trữ di chuyển để sửa đổi dữ liệu hiện có. Vui lòng xác nhận, xem: https://docs.scriptcat.org/docs/change/v0.17/.", + "retry_migration": "Thử lại công cụ lưu trữ di chuyển", + "script_modified_leave_confirm": "Script đã được sửa đổi. Các thay đổi sẽ bị mất sau khi rời đi, tiếp tục?", + "create_success_note": "Script mới được tạo thành công. Lưu ý rằng script nền sẽ không được bật theo mặc định.", + "save_as_failed": "Lưu thành thất bại", + "save_as_success": "Lưu thành công", + "only_background_scheduled_can_run": "Chỉ script nền/script crontab mới có thể chạy", + "preparing_script_resources": "Đang chuẩn bị tài nguyên script...", + "build_success_message": "Xây dựng thành công, mở công cụ nhà phát triển để xem đầu ra trong bảng điều khiển", + "script_storage_tooltip": "Có thể quản lý dữ liệu script đã lưu trữ (gm_value)", + "script_resource_tooltip": "Quản lý @resource, @required các tài nguyên đã tải xuống", + "script_setting_tooltip": "Thực hiện một số cài đặt tùy chỉnh cho script", + "script_modified_close_confirm": "Script đã được sửa đổi. Các thay đổi sẽ bị mất sau khi đóng, tiếp tục?", + "close_current_tab": "Đóng tab hiện tại", + "close_other_tabs": "Đóng các tab khác", + "close_left_tabs": "Đóng các tab bên trái", + "close_right_tabs": "Đóng các tab bên phải", + "import_script_placeholder": "Hỗ trợ liên kết tuyệt đối kết thúc bằng .user.js hoặc liên kết đến trang cài đặt scriptcat\ncó thể điền nhiều dòng, mỗi mục\nví dụ:\nhttps://example.com/test.user.js \nhttps://scriptcat.org/en/script-show-page/1234", + "invalid_script_code": "Mã không hợp lệ", + "build_failed": "Xây dựng thất bại", + "drag_script_here_to_upload": "Kéo script vào đây để tải lên", + "sync_status": "Trạng thái đồng bộ", + "search_scripts": "Tìm kiếm script", + "ext_update_notification": "Tiện ích scriptcat đã cập nhật", + "ext_update_notification_desc": "Phiên bản hiện tại: {{version}}, vui lòng xem nhật ký cập nhật để biết chi tiết", + "watch_file_description": "Theo dõi các thay đổi tệp và tự động cập nhật script. Khi sử dụng, vui lòng đảm bảo đường dẫn tệp script không thay đổi và không thể đóng trang.", "watch_file": "Theo dõi tệp", "stop_watch_file": "Dừng theo dõi", - "script_menu_display": "Menu được đăng ký bởi script", - "badge_type_none": "Không hiển thị", + "script_menu_display": "Menu đã đăng ký script", + "badge_type_none": "Không", "badge_type_run_count": "Số lần chạy", - "badge_type_script_count": "Số lượng script", + "badge_type_script_count": "Số script", "interface_settings": "Giao diện", "select_interface_language": "Chọn ngôn ngữ hiển thị giao diện", "extension_icon_badge": "Huy hiệu biểu tượng tiện ích", @@ -372,17 +433,23 @@ "extension_icon_badge_type": "Loại số hiển thị trên biểu tượng tiện ích", "background_color": "Màu nền", "badge_background_color_desc": "Màu nền huy hiệu", - "text_color": "Màu chữ", - "badge_text_color_desc": "Màu chữ huy hiệu", + "text_color": "Màu văn bản", + "badge_text_color_desc": "Màu văn bản huy hiệu", "script_menu": "Menu script", + "display_right_click_menu": "Hiển thị menu chuột phải", + "display_right_click_menu_desc": "Hiển thị menu script trong menu chuột phải của trình duyệt", "expand_count": "Số lượng mở rộng", - "auto_collapse_when_exceeds": "Tự động thu gọn khi vượt quá số lượng này", + "auto_collapse_when_exceeds": "Tự động thu gọn khi vượt quá số này", "check_frequency": "Tần suất kiểm tra", - "script_auto_update_frequency": "Tần suất tự động kiểm tra cập nhật script", + "script_auto_update_frequency": "Tần suất kiểm tra cập nhật script tự động", "update_options": "Tùy chọn cập nhật", "control_script_update_behavior": "Kiểm soát hành vi cập nhật script", - "blacklist_pages_desc": "Cấm script chạy trên các trang được chỉ định, hỗ trợ ký tự đại diện", + "blacklist_pages_desc": "Ngăn script chạy trên các trang được chỉ định, hỗ trợ ký tự đại diện", "development_tools": "Công cụ phát triển", - "check_script_code_quality": "Kiểm tra chất lượng mã script và lỗi", - "custom_eslint_rules_config": "Cấu hình quy tắc ESLint tùy chỉnh (định dạng JSON)" + "check_script_code_quality": "Kiểm tra chất lượng mã và lỗi script", + "custom_eslint_rules_config": "Cấu hình quy tắc eslint tùy chỉnh (định dạng json)", + "light": "Sáng", + "dark": "Tối", + "individual_edit": "Chỉnh sửa riêng lẻ", + "batch_edit": "Chỉnh sửa hàng loạt" } \ No newline at end of file From 5c93e679109b3ed6d7d5c8ec5fbff0edb3bddcf8 Mon Sep 17 00:00:00 2001 From: RenjiYuusei Date: Mon, 25 Aug 2025 10:00:18 +0700 Subject: [PATCH 2/5] Adds global search to the script list Enables users to filter scripts by name, metadata, or their entire source code. Introduces a search input with debounce for better performance and a scope selector to toggle between title-only and full-content search. Lazy-loads and caches script source code on demand when performing full-content searches, improving responsiveness and reducing unnecessary network requests. This enhances script discoverability and management within the options interface. --- src/pages/options/routes/ScriptList.tsx | 79 ++++++++++++++++++++++++- 1 file changed, 76 insertions(+), 3 deletions(-) diff --git a/src/pages/options/routes/ScriptList.tsx b/src/pages/options/routes/ScriptList.tsx index 829c00917..491293e9f 100644 --- a/src/pages/options/routes/ScriptList.tsx +++ b/src/pages/options/routes/ScriptList.tsx @@ -222,6 +222,13 @@ function ScriptList() { const [savedWidths, setSavedWidths] = useState<{ [key: string]: number } | null>(null); const { t } = useTranslation(); + // Global search state + const [searchText, setSearchText] = useState(""); + const [searchScope, setSearchScope] = useState<"title" | "all">("title"); + const [debouncedText, setDebouncedText] = useState(""); + const codeCacheRef = useRef(new Map()); + const [codeCacheVersion, setCodeCacheVersion] = useState(0); + // 处理拖拽排序 const sensors = useSensors( useSensor(PointerSensor), @@ -248,6 +255,26 @@ function ScriptList() { }); }, [dispatch]); + // Debounce search text + useEffect(() => { + const id = setTimeout(() => setDebouncedText(searchText.trim()), 300); + return () => clearTimeout(id); + }, [searchText]); + + // Prefetch codes when doing full-content search + useEffect(() => { + if (searchScope !== "all" || !debouncedText) return; + const toLoad = scriptList.filter((s) => !codeCacheRef.current.has(s.uuid)); + toLoad.forEach((s) => { + scriptClient.getCode(s.uuid).then((res) => { + if (res && typeof res.code === "string") { + codeCacheRef.current.set(s.uuid, res.code.toLocaleLowerCase()); + setCodeCacheVersion((v) => v + 1); + } + }); + }); + }, [searchScope, debouncedText, scriptList]); + const columns: ColumnProps[] = useMemo( () => [ @@ -732,6 +759,32 @@ function ScriptList() { } }, [newColumns, canShowList]); + // Build filtered data source for table + const displayList = useMemo(() => { + const text = debouncedText.toLocaleLowerCase(); + if (!text) return scriptList; + const keys = text.split(" ").filter(Boolean); + const matchAny = (hay: string) => keys.some((k) => hay.includes(k)); + return scriptList.filter((row) => { + const nameLower = (row.name || "").toLocaleLowerCase(); + const i18nLower = i18nName(row).toLocaleLowerCase(); + if (searchScope === "title") { + return matchAny(`${nameLower} ${i18nLower}`); + } + // searchScope === 'all': include metadata + code + let metaStr = ""; + const md: any = row.metadata || {}; + for (const v of Object.values(md)) { + if (Array.isArray(v)) metaStr += ` ${v.join(" ")}`; + else if (typeof v === "string") metaStr += ` ${v}`; + } + const metaLower = metaStr.toLocaleLowerCase(); + const codeLower = codeCacheRef.current.get(row.uuid) || ""; + const hay = `${nameLower} ${i18nLower} ${metaLower} ${codeLower}`; + return matchAny(hay); + }); + }, [scriptList, debouncedText, searchScope, codeCacheVersion]); + const components: ComponentsProps = { header: { operations: ({ selectionNode, expandNode }) => [ @@ -787,11 +840,31 @@ function ScriptList() { className="script-list" style={{ height: "100%", - overflowY: "auto", }} > + {/* Global search bar */} +
+ setSearchText(v)} + /> + +
{showAction && (
Date: Mon, 25 Aug 2025 11:20:19 +0800 Subject: [PATCH 3/5] lint-fix --- src/pages/options/routes/ScriptList.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pages/options/routes/ScriptList.tsx b/src/pages/options/routes/ScriptList.tsx index 491293e9f..762eb1c40 100644 --- a/src/pages/options/routes/ScriptList.tsx +++ b/src/pages/options/routes/ScriptList.tsx @@ -1169,4 +1169,4 @@ function ScriptList() { ); } -export default ScriptList; \ No newline at end of file +export default ScriptList; From 26e4ce9c0e9490ddc52fafea514643d22a583c00 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E4=B8=80=E4=B9=8B?= Date: Tue, 26 Aug 2025 19:49:30 +0800 Subject: [PATCH 4/5] =?UTF-8?q?=E5=85=A8=E5=B1=80=E4=BB=A3=E7=A0=81?= =?UTF-8?q?=E6=90=9C=E7=B4=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/locales/en-US/translation.json | 4 +- src/locales/zh-CN/translation.json | 4 +- src/pages/options/routes/ScriptList.tsx | 151 ++++++++++-------------- src/pages/store/features/script.ts | 21 +++- 4 files changed, 90 insertions(+), 90 deletions(-) diff --git a/src/locales/en-US/translation.json b/src/locales/en-US/translation.json index da884da8c..6cb809fc2 100644 --- a/src/locales/en-US/translation.json +++ b/src/locales/en-US/translation.json @@ -451,5 +451,7 @@ "light": "Light", "dark": "Dark", "individual_edit": "Individual Edit", - "batch_edit": "Batch Edit" + "batch_edit": "Batch Edit", + "script_code": "Script Code", + "enter_search_value": "Enter {{search}} to search" } \ No newline at end of file diff --git a/src/locales/zh-CN/translation.json b/src/locales/zh-CN/translation.json index 4fa0f60cd..cb9a00baf 100644 --- a/src/locales/zh-CN/translation.json +++ b/src/locales/zh-CN/translation.json @@ -451,5 +451,7 @@ "light": "亮色模式", "dark": "暗色模式", "individual_edit": "单独编辑", - "batch_edit": "批量编辑" + "batch_edit": "批量编辑", + "script_code": "脚本代码", + "enter_search_value": "请输入 {{search}} 进行搜索" } \ No newline at end of file diff --git a/src/pages/options/routes/ScriptList.tsx b/src/pages/options/routes/ScriptList.tsx index 762eb1c40..6f6c37997 100644 --- a/src/pages/options/routes/ScriptList.tsx +++ b/src/pages/options/routes/ScriptList.tsx @@ -82,6 +82,7 @@ import { updateEnableStatus, synchronizeClient, batchDeleteScript, + requestScriptCode, } from "@App/pages/store/features/script"; import { ValueClient } from "@App/app/service/service_worker/client"; import { loadScriptFavicons } from "@App/pages/store/utils"; @@ -203,6 +204,8 @@ const EnableSwitch = React.memo( ); EnableSwitch.displayName = "EnableSwitch"; +type SearchType = "auto" | "name" | "script_code"; + function ScriptList() { const [userConfig, setUserConfig] = useState<{ script: Script; @@ -222,13 +225,6 @@ function ScriptList() { const [savedWidths, setSavedWidths] = useState<{ [key: string]: number } | null>(null); const { t } = useTranslation(); - // Global search state - const [searchText, setSearchText] = useState(""); - const [searchScope, setSearchScope] = useState<"title" | "all">("title"); - const [debouncedText, setDebouncedText] = useState(""); - const codeCacheRef = useRef(new Map()); - const [codeCacheVersion, setCodeCacheVersion] = useState(0); - // 处理拖拽排序 const sensors = useSensors( useSensor(PointerSensor), @@ -255,26 +251,6 @@ function ScriptList() { }); }, [dispatch]); - // Debounce search text - useEffect(() => { - const id = setTimeout(() => setDebouncedText(searchText.trim()), 300); - return () => clearTimeout(id); - }, [searchText]); - - // Prefetch codes when doing full-content search - useEffect(() => { - if (searchScope !== "all" || !debouncedText) return; - const toLoad = scriptList.filter((s) => !codeCacheRef.current.has(s.uuid)); - toLoad.forEach((s) => { - scriptClient.getCode(s.uuid).then((res) => { - if (res && typeof res.code === "string") { - codeCacheRef.current.set(s.uuid, res.code.toLocaleLowerCase()); - setCodeCacheVersion((v) => v + 1); - } - }); - }); - }, [searchScope, debouncedText, scriptList]); - const columns: ColumnProps[] = useMemo( () => [ @@ -325,35 +301,84 @@ function ScriptList() { sorter: (a, b) => a.name.localeCompare(b.name), filterIcon: , filterDropdown: ({ filterKeys, setFilterKeys, confirm }: any) => { + if (!filterKeys.length) { + filterKeys = [{ type: "auto", value: "" }]; + } return ( -
+
+ { - setFilterKeys(value ? [value] : []); + filterKeys[0].value = value; + setFilterKeys([...filterKeys]); }} onSearch={() => { - confirm(); + confirm!(); }} />
); }, - onFilter: (value: string, row) => { - if (!value) { + onFilter: (value: { type: SearchType; value: string }, row) => { + if (!value || !value.value) { return true; } - value = value.toLocaleLowerCase(); + const keyword = value.value.toLocaleLowerCase(); row.name = row.name.toLocaleLowerCase(); const i18n = i18nName(row).toLocaleLowerCase(); // 空格分开关键字搜索 - const keys = value.split(" "); + const keys = keyword.split(" "); + const searchName = (keyword: string) => { + return row.name.includes(keyword) || i18n.includes(keyword); + }; + const searchCode = (keyword: string) => { + if (!row.code) { + // 没有code,请求一下code + dispatch(requestScriptCode(row.uuid)); + return false; + } + return row.code.includes(keyword); + }; for (const key of keys) { - if (row.name.includes(key) || i18n.includes(key)) { - return true; + switch (value.type) { + case "auto": + if (searchName(key) || searchCode(key)) { + return true; + } + break; + case "script_code": + if (searchCode(key)) { + return true; + } + break; + case "name": + if (searchName(key)) { + return true; + } + break; } } return false; @@ -572,7 +597,6 @@ function ScriptList() { scriptClient .requestCheckUpdate(script.uuid) .then((res) => { - console.log("res", res); if (res) { Message.warning({ id: "checkupdate", @@ -759,32 +783,6 @@ function ScriptList() { } }, [newColumns, canShowList]); - // Build filtered data source for table - const displayList = useMemo(() => { - const text = debouncedText.toLocaleLowerCase(); - if (!text) return scriptList; - const keys = text.split(" ").filter(Boolean); - const matchAny = (hay: string) => keys.some((k) => hay.includes(k)); - return scriptList.filter((row) => { - const nameLower = (row.name || "").toLocaleLowerCase(); - const i18nLower = i18nName(row).toLocaleLowerCase(); - if (searchScope === "title") { - return matchAny(`${nameLower} ${i18nLower}`); - } - // searchScope === 'all': include metadata + code - let metaStr = ""; - const md: any = row.metadata || {}; - for (const v of Object.values(md)) { - if (Array.isArray(v)) metaStr += ` ${v.join(" ")}`; - else if (typeof v === "string") metaStr += ` ${v}`; - } - const metaLower = metaStr.toLocaleLowerCase(); - const codeLower = codeCacheRef.current.get(row.uuid) || ""; - const hay = `${nameLower} ${i18nLower} ${metaLower} ${codeLower}`; - return matchAny(hay); - }); - }, [scriptList, debouncedText, searchScope, codeCacheVersion]); - const components: ComponentsProps = { header: { operations: ({ selectionNode, expandNode }) => [ @@ -844,27 +842,6 @@ function ScriptList() { > - {/* Global search bar */} -
- setSearchText(v)} - /> - -
{showAction && (
{ + const state = getState() as { script: { scripts: ScriptLoading[] } }; + const script = state.script.scripts.find((s) => s.uuid === uuid); + + // 如果已经有代码了,直接返回 + if (script?.code !== undefined) { + return { code: script.code }; + } + + return await scriptClient.getCode(uuid); +}); + export type ScriptLoading = Script & { enableLoading?: boolean; actionLoading?: boolean; @@ -56,6 +68,7 @@ export type ScriptLoading = Script & { website?: string; icon?: string; }[]; + code?: string; // 用于搜索的脚本代码 }; const updateScript = (scripts: ScriptLoading[], uuid: string, update: (s: ScriptLoading) => void) => { @@ -171,7 +184,13 @@ export const scriptSlice = createAppSlice({ ) .addCase(requestStopScript.fulfilled, (state, action) => updateScript(state.scripts, action.meta.arg, (s) => (s.actionLoading = false)) - ); + ) + //处理请求脚本代码 + .addCase(requestScriptCode.fulfilled, (state, action) => { + updateScript(state.scripts, action.meta.arg, (s) => { + s.code = action.payload?.code.toLocaleLowerCase(); + }); + }); }, selectors: { selectScripts: (state) => state.scripts, From 65eace64ac2c390da5096e645d52bb60c342786d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E4=B8=80=E4=B9=8B?= Date: Tue, 26 Aug 2025 19:50:59 +0800 Subject: [PATCH 5/5] =?UTF-8?q?=E6=81=A2=E5=A4=8Dstyle?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/pages/options/routes/ScriptList.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/src/pages/options/routes/ScriptList.tsx b/src/pages/options/routes/ScriptList.tsx index 6f6c37997..68b9ac8a6 100644 --- a/src/pages/options/routes/ScriptList.tsx +++ b/src/pages/options/routes/ScriptList.tsx @@ -838,6 +838,7 @@ function ScriptList() { className="script-list" style={{ height: "100%", + overflowY: "auto", }} >