MESSAGES = {
    "project_not_found": "Dự án '{name}' không tồn tại hoặc chưa được khởi tạo",
    "video_capabilities_unresolved": "Không xác định được khả năng mô hình video cho dự án '{name}': {reason}",
    "scope_invalid": "scope phải là full hoặc current",
    "download_expired": "Liên kết tải xuống đã hết hạn, vui lòng xuất lại",
    "download_token_mismatch": "Token tải xuống không khớp với dự án mục tiêu",
    "download_token_invalid": "Token tải xuống không hợp lệ",
    "jianying_path_invalid": "Vui lòng cung cấp đường dẫn thư mục bản nháp Jianying hợp lệ",
    "jianying_path_too_long": "Đường dẫn thư mục bản nháp quá dài",
    "jianying_path_illegal": "Đường dẫn thư mục bản nháp chứa ký tự không hợp lệ",
    "jianying_export_failed": "Xuất bản nháp Jianying thất bại, vui lòng thử lại sau",
    "title_required": "Tên dự án không được để trống",
    "project_exists": "Dự án '{name}' đã tồn tại",
    "script_not_found": "Kịch bản '{name}' không tồn tại",
    "scene_not_found": "Cảnh '{id}' không tồn tại",
    "segment_not_found": "Đoạn '{id}' không tồn tại",
    "script_missing": "Kịch bản không tồn tại",
    "narration_mode_required": "Kịch bản này không ở chế độ thuyết minh, vui lòng dùng API cập nhật cảnh",
    "content_or_file_required": "Vui lòng cung cấp nội dung hoặc tệp",
    "one_of_content_or_file": "Không thể đồng thời cung cấp nội dung và tệp, vui lòng chọn một",
    "unsupported_file_type": "Chỉ hỗ trợ tệp .txt / .md, đã nhận: {name}",
    "file_too_large": "Kích thước tệp vượt quá giới hạn (tối đa khoảng {max_chars} ký tự)",
    "invalid_encoding": "Lỗi mã hóa tệp, vui lòng dùng tệp văn bản mã hóa UTF-8",
    "unauthorized": "Tên đăng nhập hoặc mật khẩu không đúng",
    "task_not_found": "Tác vụ '{id}' không tồn tại",
    "prompt_must_be_string_or_scene_object": "prompt phải là chuỗi hoặc đối tượng chứa scene/composition",
    "prompt_scene_empty": "prompt.scene không được để trống",
    "prompt_must_be_string_or_object": "prompt phải là chuỗi hoặc đối tượng",
    "prompt_text_empty": "prompt không được để trống",
    "storyboard_task_submitted": "Đã gửi tác vụ tạo phân cảnh cho '{segment_id}'",
    "generate_storyboard_first": "Vui lòng tạo phân cảnh scene_{segment_id}.png trước",
    "video_prompt_must_be_string_or_action_object": "prompt phải là chuỗi hoặc đối tượng chứa action/camera_motion",
    "video_prompt_action_empty": "prompt.action không được để trống",
    "video_prompt_dialogue_array": "prompt.dialogue phải là mảng",
    "video_task_submitted": "Đã gửi tác vụ tạo video cho '{segment_id}'",
    "character_not_found": "Nhân vật '{name}' không tồn tại",
    "character_task_submitted": "Đã gửi tác vụ tạo thiết kế nhân vật cho '{name}'",
    "scene_task_submitted": "Đã gửi tác vụ tạo thiết kế cảnh cho '{name}'",
    "prop_task_submitted": "Đã gửi tác vụ tạo thiết kế đạo cụ cho '{name}'",
    # Files
    "file_not_found": "Tệp không tồn tại: {path}",
    "forbidden_access": "Cấm truy cập tệp ngoài thư mục dự án",
    "invalid_upload_type": "Loại tải lên không hợp lệ: {upload_type}",
    "missing_filename": "Tệp tải lên thiếu tên tệp",
    "unsupported_image_type": "Định dạng tệp không hỗ trợ {ext}. Các loại cho phép: {allowed}",
    "invalid_image_file": "Tệp ảnh không hợp lệ, không thể phân tích",
    "invalid_asset_type": "Loại tài nguyên phải là character / scene / prop",
    "invalid_asset_filename": "Tên tệp không được chứa ký tự phân tách đường dẫn hoặc ..",
    "invalid_step_num": "Số bước không hợp lệ: {step_num}",
    "draft_file_not_found": "Tệp bản nháp không tồn tại",
    "draft_event_label": "Tập {episode} {label_prefix}",
    "normalized_script": "Kịch bản đã chuẩn hóa",
    "segment_splitting": "Chia đoạn",
    # Source loader
    "source_unsupported_format": "Định dạng nguồn không hỗ trợ: {ext} (hỗ trợ: .txt / .md / .docx / .epub / .pdf)",
    "source_decode_failed": "Không giải mã được tệp nguồn '{filename}' (đã thử: {tried})",
    "source_corrupt_file": "Tệp nguồn '{filename}' không thể phân tích: {reason}",
    "source_too_large": "Tệp nguồn '{filename}' quá lớn ({size_mb} MB > {limit_mb} MB)",
    "source_conflict": "Tệp nguồn '{existing}' đã tồn tại; gợi ý đổi tên: '{suggested}'",
    # Providers
    "unknown_provider": "Nhà cung cấp không xác định: {provider_id}",
    "credentials_not_found": "Không tìm thấy thông tin xác thực",
    "vertex_json_read_failed": "Không đọc được tệp đã tải lên",
    "vertex_json_too_large": "Tệp thông tin xác thực quá lớn",
    "vertex_json_invalid": "Tệp thông tin xác thực JSON không hợp lệ",
    "vertex_json_missing_project_id": "Tệp thông tin xác thực thiếu project_id",
    "connection_success": "Kết nối thành công",
    "connection_timeout": "Kết nối hết thời gian, vui lòng kiểm tra mạng hoặc cấu hình API",
    "connection_failed": "Kết nối thất bại: {err_msg}",
    "unsupported_test": "Nhà cung cấp {provider_id} hiện chưa hỗ trợ kiểm tra kết nối",
    "missing_credentials": "Thiếu cấu hình thông tin xác thực, vui lòng thêm khóa trước",
    # Assistant
    "session_not_found": "Phiên '{session_id}' không tồn tại",
    "session_or_project_not_found": "Phiên hoặc dự án không tồn tại",
    "sdk_session_timeout": "Tạo phiên SDK quá thời gian",
    "agent_startup_failed": "Khởi động agent thất bại:\n{details}",
    "interface_offline": "Giao diện này đã ngừng hoạt động, vui lòng dùng giao diện được khuyến nghị",
    "answers_required": "answers không được để trống",
    # Custom Providers
    "price_input_required": "price_input phải được đặt khi đặt price_output",
    "model_id_required": "Phải cung cấp model_id cho các mô hình đã bật",
    "duplicate_model_id": "model_id trùng lặp: {model_id}",
    "default_model_conflict": "Mỗi media_type chỉ có tối đa một mô hình mặc định. Xung đột: {conflict}",
    "provider_not_found": "Nhà cung cấp không tồn tại",
    "at_least_one_field_required": "Phải cung cấp ít nhất một trường để cập nhật",
    "discovery_failed": "Phát hiện mô hình thất bại: {err_msg}",
    "anthropic_discovery_no_key": "API Key chưa được cấu hình, không thể phát hiện mô hình",
    "unknown_endpoint": "Endpoint không xác định: {endpoint}",
    "unknown_discovery_format": "discovery_format không hỗ trợ: {discovery_format}",
    "endpoint_required": "Mô hình đã bật phải chỉ định endpoint",
    "endpoint_media_type_mismatch": "media_type của endpoint không khớp: {detail}",
    "backend_creation_failed": "Tạo backend thất bại: {err_msg}",
    "unsupported_discovery_format": "Kiểm tra kết nối không hỗ trợ với {discovery_format}",
    # Projects
    "unknown_style_template": "Mẫu phong cách không xác định: {template_id}",
    "project_id_not_editable": "content_mode không thể chỉnh sửa sau khi tạo dự án",
    "project_deleted": "Đã xóa dự án '{name}'",
    "scene_updated": "Đã cập nhật cảnh '{scene_id}'",
    "segment_updated": "Đã cập nhật đoạn '{segment_id}'",
    # Characters / Scenes / Props
    "character_already_exists": "Nhân vật '{name}' đã tồn tại",
    "character_deleted": "Đã xóa nhân vật '{name}'",
    "project_scene_already_exists": "Cảnh '{name}' đã tồn tại",
    "project_scene_not_found": "Không tìm thấy cảnh '{name}'",
    "project_scene_deleted": "Đã xóa cảnh '{name}'",
    "prop_already_exists": "Đạo cụ '{name}' đã tồn tại",
    "prop_not_found": "Không tìm thấy đạo cụ '{name}'",
    "prop_deleted": "Đã xóa đạo cụ '{name}'",
    # API Keys
    "jwt_auth_required": "API Key không được phép thực hiện thao tác này, vui lòng dùng xác thực JWT",
    "api_key_name_exists": "Tên '{name}' đã tồn tại",
    "api_key_not_found": "Không tìm thấy API Key {key_id}",
    # Agent Chat
    "session_project_mismatch": "Phiên '{session_id}' thuộc dự án '{session_project}', không khớp với dự án yêu cầu '{request_project}'",
    # Cost Estimation
    "cost_estimation_failed": "Ước tính chi phí thất bại, vui lòng thử lại sau",
    # Validators
    "invalid_backend_format": "Định dạng {field_name} phải là provider/model",
    # Versions
    "unsupported_resource_type": "Loại tài nguyên không hỗ trợ: {resource_type}",
    # Reference Video
    "ref_missing_asset": "Tham chiếu đến {type} '{name}' không có trong thư viện tài nguyên dự án, vui lòng tạo trước",
    "ref_duration_exceeded": "Thời lượng đơn vị video tham chiếu {duration}s vượt giới hạn {max_duration}s của {model}, đã cắt bớt",
    "ref_too_many_images": "Số lượng ảnh tham chiếu {count} vượt giới hạn {max_count} của {model}, đã giữ {max_count} ảnh đầu tiên",
    "ref_payload_too_large": "Dữ liệu ảnh tham chiếu vượt giới hạn của nhà cung cấp, đã thử lại với mức nén bổ sung",
    "ref_sora_single_ref": "Chế độ tham chiếu Sora hiện không hỗ trợ nhiều ảnh, đã hạ về một ảnh",
    "ref_shot_parse_fallback": "Không phát hiện tiêu đề Shot N (Xs), được xử lý như một cảnh quay duy nhất",
    "ref_episode_not_found": "Không tìm thấy tập {episode}",
    "ref_not_reference_video_mode": "Kịch bản của tập này không ở chế độ video tham chiếu",
    "ref_not_registered": "Các tài nguyên được tham chiếu chưa được đăng ký: {missing}",
    "ref_unit_not_found": "Không tìm thấy đơn vị video '{unit_id}'",
    "ref_unit_ids_length_mismatch": "Số lượng unit_ids không khớp với các đơn vị hiện có",
    "ref_duplicate_unit_ids": "unit_ids bị trùng lặp",
    "ref_unit_ids_mismatch": "unit_ids không khớp với các đơn vị hiện có",
    "ref_script_missing": "Tệp kịch bản gắn với tập này không tồn tại",
    "ref_script_rebound": "Liên kết kịch bản của tập này đã thay đổi, vui lòng thử lại",
    "about_update_check_failed": "Kiểm tra cập nhật thất bại, vui lòng thử lại sau",
    "about_version_read_failed": "Không đọc được phiên bản ứng dụng",
    # Image Capability
    "image_endpoint_mismatch_no_i2i": "Mô hình {model} chỉ hỗ trợ text-to-image (không có /v1/images/edits); hãy bỏ ảnh tham chiếu hoặc chọn mô hình hỗ trợ chỉnh sửa ảnh",
    "image_endpoint_mismatch_no_t2i": "Mô hình {model} chỉ hỗ trợ image-to-image (cần ảnh tham chiếu); hãy cung cấp ảnh tham chiếu hoặc chọn mô hình hỗ trợ text-to-image",
    "image_capability_missing_i2i": "{provider}/{model} không hỗ trợ image-to-image; hãy cấu hình mô hình mặc định có hỗ trợ chỉnh sửa ảnh",
    "image_capability_missing_t2i": "{provider}/{model} không hỗ trợ text-to-image; hãy cấu hình mô hình mặc định có hỗ trợ text-to-image",
    # Agent credentials
    "agent_preset_unknown": "Nhà cung cấp đặt sẵn không xác định: {preset_id}",
    "agent_base_url_required_custom": "Cấu hình tuỳ chỉnh yêu cầu base_url",
    "agent_no_fields_to_update": "Không có trường nào để cập nhật",
    "agent_credential_not_found": "Không tìm thấy xác thực",
    "agent_cannot_delete_active": "Không thể xóa xác thực đang hoạt động; hãy kích hoạt xác thực khác trước",
    "agent_test_validation_error": "Kiểm tra kết nối thất bại: {error}",
}
