# -*- coding: utf-8 -*-
"""
LVT Shared Infrastructure — Internationalization (i18n).

Bilingual translation system (English / Vietnamese) with persistent
language preference stored via QSettings.

The translation dictionary covers all menu items, messages, and UI labels
used across the LVT Plugin Suite.

Author: Lộc Vũ Trung (LVT) / Slow Forest
License: GPL-3.0
"""

from qgis.PyQt.QtCore import QSettings, QObject, pyqtSignal

# QSettings key for persisting the language choice
_SETTINGS_KEY = "LVT4U/language"

# Default language
_DEFAULT_LANG = "en"


class _LanguageEmitter(QObject):
    """Singleton signal bus — emits when language changes."""
    language_changed = pyqtSignal(str)  # new lang code: "en" or "vi"


# Module-level singleton — import and connect to this anywhere
language_signals = _LanguageEmitter()

# Translation dictionary: English key → Vietnamese translation
# English is the base language (key = display text)
_TRANSLATIONS = {
    # --- Menu items ---
    "Map Layout": "Xây dựng Layout bản đồ",
    "KML": "KML",
    "SHP → KML/KMZ": "SHP → KML/KMZ",
    "KML/KMZ → SHP": "KML/KMZ → SHP",
    "Create MBTiles": "Tạo MBTiles",
    "Create GeoJSON EUDR": "Tạo GeoJSON EUDR",
    "EUDR": "EUDR",
    "Export GeoJSON": "Xuất GeoJSON",
    "Reference Documents": "Tài liệu tham khảo",
    "Package Map": "Đóng gói bản đồ",
    "Thematic Map": "Bản đồ chuyên đề",
    "Circular 16/2023": "Theo TT 16/2023",
    "Plot Labels": "Nhãn lô",
    "Basemap": "Basemap",
    "Google Maps": "Google Maps",
    "Google Satellite": "Google Satellite",
    "Google Hybrid": "Google Hybrid",
    "Legal Documents": "Văn bản pháp lý",
    "Font Converter": "Chuyển đổi font chữ",
    "Coordinate System": "Hệ tọa độ",
    "CRS Conversion": "Chuyển đổi hệ tọa độ",
    "Define CRS": "Định nghĩa hệ tọa độ",
    "CRS Catalog": "Danh mục hệ tọa độ",
    "About": "Thông tin",
    "Circular 33": "Theo TT 33",
    "Style Library": "Thư viện định dạng",
    "Excel → GIS": "Chuyển Excel vào bản đồ",
    "Thematic Map": "Bản đồ chuyên đề",
    "Forest Status Thematic Map": "Bản đồ chuyên đề hiện trạng rừng",
    "Create Thematic Map": "Tạo bản đồ chuyên đề",
    "Create Plot Labels": "Tạo nhãn lô",
    "Apply Style": "Áp dụng kiểu",
    "Apply": "Áp dụng",
    "Plot Labels": "Nhãn lô",
    "Close": "Đóng",
    "Legal Docs": "Văn bản pháp lý",
    "Appendix 1": "Phụ lục 1",
    "Biodiversity": "Đa dạng sinh học",

    # --- Click-Classify tool ---
    "🖱️ Click-Classify Tool":               "🖱️ Công cụ Click phân loại",
    "🖱️ Click-Classify [ACTIVE]":            "🖱️ Click phân loại [ĐANG CHẠY]",
    "Click Classify":                        "Click phân loại",
    "Layer & Fields":                        "Lớp & Trường dữ liệu",
    "Layer:":                                "Lớp:",
    "Count field:":                          "Trường đếm:",
    "Write label text:":                     "Ghi nhãn văn bản:",
    "+ New field":                           "+ Trường mới",
    "+ New":                                 "+ Mới",
    "Click schedule":                        "Lịch click",
    "Step":                                  "Bước",
    "Value":                                 "Giá trị",
    "Label":                                 "Nhãn",
    "Colour":                                "Màu sắc",
    "+ Add step":                            "+ Thêm bước",
    "− Remove":                              "− Xóa",
    "Save options":                          "Tuỳ chọn lưu",
    "Auto-save each click":                  "Tự lưu mỗi click",
    "Manual save":                           "Lưu thủ công",
    "💾 Save now":                           "💾 Lưu ngay",
    "Ready. Configure above then press Start.":
        "Sẵn sàng. Cấu hình bên trên rồi nhấn Bắt đầu.",
    "▶ Start":                               "▶ Bắt đầu",
    "■ Stop":                                "■ Dừng",
    "⛶ Config":                              "⛶ Cấu hình",
    "▲ Hide":                                "▲ Ẩn",
    "↺ Restore":                             "↺ Khôi phục",
    "Show/hide configuration panel":         "Hiện/ẩn bảng cấu hình",
    "Restore the original renderer before Click-Classify was activated":
        "Khôi phục kiểu hiển thị gốc trước khi Click phân loại được kích hoạt",
    "Choose colour":                         "Chọn màu",
    "Click on a feature...":                 "Click vào đối tượng...",
    "✅ Tool active. Click on features to classify.":
        "✅ Công cụ đang hoạt động. Click vào đối tượng để phân loại.",
    "Tool stopped. Edits saved.":            "Đã dừng công cụ. Chỉnh sửa đã lưu.",
    "Renderer updated.":                     "Đã cập nhật kiểu hiển thị.",
    "Original renderer restored.":           "Đã khôi phục kiểu hiển thị gốc.",
    "No backup renderer found for this layer.":
        "Không tìm thấy bản sao lưu kiểu hiển thị cho lớp này.",
    "Changes saved.":                        "Đã lưu thay đổi.",
    "(unclassified)":                        "(chưa phân loại)",
    "Error":                                 "Lỗi",
    "No vector layer selected.":             "Chưa chọn lớp vector.",
    "Please select a vector layer.":         "Vui lòng chọn một lớp vector.",
    "Please select a count field.":          "Vui lòng chọn trường đếm.",
    "Define at least 2 steps (step 0 = unclassified).":
        "Cần ít nhất 2 bước (bước 0 = chưa phân loại).",


    # --- Click-Classify editable fields ---
    "Select or type field name\u2026":
        "Ch\u1ecdn ho\u1eb7c g\u00f5 t\u00ean tr\u01b0\u1eddng\u2026",
    "Pick an existing numeric field OR type a new name,\nthen click \"+ New field\" to create it.":
        "Ch\u1ecdn tr\u01b0\u1eddng s\u1ed1 c\u00f3 s\u1eb5n HO\u1eCac g\u00f5 t\u00ean m\u1edbi,\nr\u1ed3i b\u1ea5m \"+ Tr\u01b0\u1eddng m\u1edbi\" \u0111\u1ec3 t\u1ea1o.",
    "Pick an existing text field OR type a new name,\nthen click \"+ New\" to create it.":
        "Ch\u1ecdn tr\u01b0\u1eddng v\u0103n b\u1ea3n c\u00f3 s\u1eb5n HO\u1eCac g\u00f5 t\u00ean m\u1edbi,\nr\u1ed3i b\u1ea5m \"+ M\u1edbi\" \u0111\u1ec3 t\u1ea1o.",
    "Create a new Integer field with the name typed above":
        "T\u1ea1o tr\u01b0\u1eddng s\u1ed1 nguy\u00ean m\u1edbi v\u1edbi t\u00ean \u0111\u00e3 g\u00f5 b\u00ean tr\u00ean",
    "Create a new Text field with the name typed above":
        "T\u1ea1o tr\u01b0\u1eddng v\u0103n b\u1ea3n m\u1edbi v\u1edbi t\u00ean \u0111\u00e3 g\u00f5 b\u00ean tr\u00ean",
    "Please select or enter a count field name.":
        "Vui l\u00f2ng ch\u1ecdn ho\u1eb7c nh\u1eadp t\u00ean tr\u01b0\u1eddng \u0111\u1ebfm.",
    "\u270f Click a row to select, then click the Label cell to edit freely (e.g. T\u1ed1t / X\u1ea5u / TB / 1 / 2 / 3\u2026)":
        "\u270f Click v\u00e0o h\u00e0ng \u0111\u1ec3 ch\u1ecdn, r\u1ed3i click \u00f4 Nh\u00e3n \u0111\u1ec3 \u0111\u1eadp n\u1ed9i dung t\u00f9y \u00fd (v\u00ed d\u1ee5: T\u1ed1t / X\u1ea5u / TB / 1 / 2 / 3\u2026)",
    # --- Rename Field & Type ---

    "Rename Field & Type":          "Đổi tên trường & kiểu dữ liệu",
    "Rename Field":                 "Đổi tên trường",
    "Rename Field & Type":          "Đổi tên trường & kiểu dữ liệu",
    "Source":                       "Nguồn",
    "Field to rename:":             "Trường cần đổi:",
    "Current type:":                "Kiểu hiện tại:",
    "New settings":                 "Cài đặt mới",
    "New name:":                    "Tên mới:",
    "New type:":                    "Kiểu mới:",
    "Also change field type":       "Thay đổi cả kiểu dữ liệu",
    "If unchecked, only the field name is changed (fast).\nIf checked, a new field is created, values are copied,\nand the old field is deleted.":
        "Nếu bỏ chọn: chỉ đổi tên (nhanh).\nNếu chọn: tạo trường mới, sao chép dữ liệu,\nsau đó xoá trường cũ.",
    "New field name (leave blank to keep)": "Tên trường mới (bỏ trống = giữ nguyên)",
    "✔  Rename":                    "✔  Đổi tên",
    "✕  Close":                     "✕  Đóng",
    "Working…":                     "Đang xử lý…",
    "⚠ Please select a layer.":     "⚠ Vui lòng chọn lớp.",
    "⚠ Please select a field.":     "⚠ Vui lòng chọn trường.",
    "⚠ No changes requested (same name, type unchanged).":
        "⚠ Không có thay đổi (tên và kiểu giữ nguyên).",
    "⚠ Invalid field name (use letters, digits, underscore; max 10 chars).":
        "⚠ Tên trường không hợp lệ (chữ, số, gạch dưới; tối đa 10 ký tự).",
    "✖ Cannot start editing on this layer.":
        "✖ Không thể bắt đầu chỉnh sửa lớp này.",
    "renameAttribute() failed — provider may not support it.":
        "renameAttribute() thất bại — nhà cung cấp dữ liệu không hỗ trợ.",
    "Failed to add new field.":     "Không thể thêm trường mới.",
    "Field index lookup failed after add.":
        "Không tìm thấy chỉ mục trường sau khi thêm.",
    "Failed to delete original field.": "Không thể xoá trường gốc.",
    "Commit failed.":               "Lưu thất bại.",
    "✔ Field renamed successfully!": "✔ Đổi tên trường thành công!",
    # Field type labels
    "Text (String)":                "Văn bản (String)",
    "Integer":                      "Số nguyên",
    "Long Integer":                 "Số nguyên lớn",
    "Double":                       "Số thực",
    "Boolean":                      "Boolean",
    "Date":                         "Ngày",
    "Time":                         "Giờ",
    "DateTime":                     "Ngày + Giờ",


    "Flycam Photos": "Ảnh Flycam",
    "📥 Import": "📥 Nhập ảnh",
    "👁️ View": "👁️ Xem ảnh",
    "🔄 Update": "🔄 Cập nhật",
    "📤 Export": "📤 Xuất ảnh",
    "Input folder:": "Thư mục ảnh:",
    "Output file:": "File đầu ra:",
    "Select folder containing photos...": "Chọn thư mục chứa ảnh...",
    "Output vector file path...": "Đường dẫn file vector đầu ra...",
    "Relative root:": "Thư mục gốc tương đối:",
    "Optional — for relative paths": "Tùy chọn — cho đường dẫn tương đối",
    "Web root:": "Đường dẫn web:",
    "Optional — URL prefix for KML": "Tùy chọn — URL tiền tố cho KML",
    "Only import photos within current canvas extent":
        "Chỉ nhập ảnh trong phạm vi bản đồ hiện tại",
    "🚀 Import Photos": "🚀 Nhập ảnh",
    "Photo Layer": "Lớp ảnh",
    "Layer:": "Lớp:",
    "🖱️ Click Photos on Map": "🖱️ Click ảnh trên bản đồ",
    "Click tool active — click on photo points in the map.":
        "Công cụ click đã kích hoạt — click vào điểm ảnh trên bản đồ.",
    "Sync Layer with Photo Folder": "Đồng bộ lớp với thư mục ảnh",
    "🔄 Update Layer": "🔄 Cập nhật lớp",
    "Export Photos from Layer": "Xuất ảnh từ lớp",
    "📤 Export All Photos": "📤 Xuất tất cả ảnh",
    "Select photo folder": "Chọn thư mục ảnh",
    "Save output file": "Lưu file đầu ra",
    "Select relative root folder": "Chọn thư mục gốc tương đối",
    "Select export folder": "Chọn thư mục xuất",
    "No JPEG photos found in the selected folder.":
        "Không tìm thấy ảnh JPEG trong thư mục đã chọn.",
    "Please select a valid input folder.":
        "Vui lòng chọn thư mục đầu vào hợp lệ.",
    "Please specify an output file.":
        "Vui lòng chỉ định file đầu ra.",
    "Please select a photo layer.":
        "Vui lòng chọn lớp ảnh.",
    "Please select a layer to update.":
        "Vui lòng chọn lớp cần cập nhật.",
    "Please select a layer.":
        "Vui lòng chọn lớp.",
    "Please select an output folder.":
        "Vui lòng chọn thư mục đầu ra.",
    "Flycam Photo Viewer": "Xem ảnh Flycam",
    "Previous photo": "Ảnh trước",
    "Next photo": "Ảnh tiếp",
    "Fit to window": "Vừa cửa sổ",
    "Rotate 90° clockwise": "Xoay 90° theo chiều kim đồng hồ",
    "Rotate to azimuth (north-up)": "Xoay theo phương vị (hướng Bắc lên)",
    "Save current view as image": "Lưu ảnh hiện tại",
    "Save Image As": "Lưu ảnh thành",

    # --- Messages ---
    "{module} — Coming soon!": "{module} — Sắp ra mắt!",
    "{name} added successfully.": "{name} đã được thêm thành công.",
    "{name} is already loaded.": "{name} đã được tải rồi.",
    "Failed to load {name}.": "Không thể tải {name}.",

    # --- About dialog ---
    "Author": "Tác giả",
    "Version": "Phiên bản",
    "License": "Giấy phép",
    "Language": "Ngôn ngữ",
    "English": "English",
    "Vietnamese": "Tiếng Việt",
    "Close": "Đóng",
    "Settings saved. Restart QGIS to apply.": "Đã lưu. Khởi động lại QGIS để áp dụng.",
    "Expertise": "Phạm vi chuyên môn",
    "FSC, Silviculture & Digital Transformation Expert": "Chuyên gia FSC, Kỹ thuật lâm sinh, và Chuyển đổi số",
    "FSC/CoC Forest Certification": "Hệ thống chứng chỉ rừng FSC/CoC",
    "EU Deforestation Regulation (EUDR)": "Quy định chống phá rừng châu Âu (EUDR)",
    "Webapp / Appsheet Applications": "Ứng dụng Webapp / Appsheet",
    "QGIS GIS / Data Management": "Hệ thống thông tin địa lý QGIS / Quản lý DATA",
    "Silviculture": "Kỹ thuật Lâm sinh",

    # --- Common ---
    "OK": "OK",
    "Cancel": "Hủy",
    "Apply": "Áp dụng",
    "Browse...": "Chọn...",
    "Output folder": "Thư mục đầu ra",
    "Input layer": "Layer đầu vào",
    "Output file": "File đầu ra",
    "Select": "Chọn",
    "Error": "Lỗi",
    "Warning": "Cảnh báo",
    "Success": "Thành công",
    "Processing...": "Đang xử lý...",

    # --- Font Converter ---
    "Font Converter": "Chuyển đổi font chữ",
    "Convert font TCVN3/VNI ↔ Unicode, export Shapefile or MapInfo TAB.": "Chuyển font TCVN3/VNI ↔ Unicode, xuất Shapefile hoặc MapInfo TAB.",
    "Conversion:": "Chuyển đổi:",
    "No conversion": "Không chuyển font",
    "Format:": "Định dạng:",
    "Export CRS:": "CRS xuất:",
    "Convert & Export": "Chuyển đổi & Xuất",
    "Guide": "Hướng dẫn",
    "Help": "Hướng dẫn",
    "Close": "Đóng",

    # --- Layout ---
    "Create Layout": "Tạo khung",
    "Map Layout": "Xây dựng Layout bản đồ",
    "Layout Mode": "Chế độ Layout",
    "Map Title": "Tên bản đồ",
    "Study Area": "Khu vực",
    "Date": "Ngày",
    "Paper Size": "Khổ giấy",
    "Custom Size": "Kích thước tự chọn",
    "Orientation": "Hướng",
    "Scale": "Tỷ lệ",
    "Data Sources": "Nguồn dữ liệu xây dựng bản đồ",

    # --- Layer Editor ---
    "Layer Editor": "Biên tập Layer",
    "Group Mode": "Chế độ nhóm",
    "Auto Group (by geometry)": "Nhóm tự động (theo hình học)",
    "Manual Group": "Nhóm thủ công",
    "Point Layers": "Lớp Điểm",
    "Line Layers": "Lớp Đường",
    "Polygon Layers": "Lớp Vùng",
    "Raster Layers": "Lớp Raster",
    "Refresh": "Làm mới",
    "Apply All": "Áp dụng tất cả",
    "Group in Panel": "Nhóm trong Panel",
    "Save Preset": "Lưu cấu hình",
    "Load Preset": "Tải cấu hình",
    "Coordinate Converter": "Chuyển đổi tọa độ",

    # --- TopoFix module ---
    "TopoFix": "TopoFix",
    "Topology Check & Fix": "Kiểm tra & Sửa lỗi Topology",
    "Select layer": "Chọn lớp bản đồ",
    "Refresh layers": "Cập nhật lớp",
    "Check errors": "Kiểm tra lỗi",
    "Error type": "Loại lỗi",
    "Result": "Kết quả",
    "Highlight": "Tô sáng",
    "Fix": "Sửa",
    "Show": "Hiển thị",
    "Parameters": "Tham số",
    "Gap tolerance (ha)": "Ngưỡng khoảng hở (ha)",
    "Sliver max area (ha)": "Diện tích sliver tối đa (ha)",
    "Sliver ratio (P/sqrt A)": "Tỷ lệ sliver (P/căn A)",
    "Must-not-overlap min (m2)": "Ngưỡng chồng đè tối thiểu (m2)",
    "Missing node tolerance": "Dung sai nút thiếu",
    "Tiny polygon min (ha)": "Diện tích polygon nhỏ (ha)",
    "Max vertices": "Số đỉnh tối đa",
    "Select All": "Chọn tất cả",
    "Check Errors": "Kiểm tra lỗi",
    "Stop": "Dừng",
    "Fix Errors": "Sửa lỗi",
    "Clear Highlight": "Xóa tô sáng",
    "No layer selected": "Chưa chọn lớp bản đồ",
    "No checks selected": "Chưa chọn loại lỗi",
    "Save fixed layer": "Lưu lớp đã sửa",
    "Proceed with fixing? This creates a new file.":
        "Tiến hành sửa lỗi? Sẽ tạo file mới.",
    "Fix complete! Layer added to map.":
        "Sửa lỗi hoàn thành! Đã thêm lớp vào bản đồ.",
    "Duplicates": "Trùng lặp",
    "Invalid Geometry": "Hình học không hợp lệ",
    "Multipart": "Đa phần (Multipart)",
    "Overlaps": "Chồng đè (Overlaps)",
    "Gaps": "Khoảng hở (Gaps)",
    "Must Not Overlap": "Cắt thông minh",
    "Sliver Polygons": "Vùng hình kim (Sliver)",
    "Redundant Vertices": "Đỉnh dư thừa",
    "Unclosed Rings": "Vòng không khép kín",
    "Missing Nodes": "Thiếu nút trên cạnh chung",
    "Tiny Polygons": "Polygon nhỏ (Tiny)",
    "Help": "Hướng dẫn",
    "Algorithm Principles": "Nguyên lý thuật toán",
    "User Guide": "Hướng dẫn sử dụng",
    "Research Plan": "Kế hoạch nghiên cứu",
    "Auto-fixing invalid geometry...": "Đang tự động sửa hình học...",
    "Fixing": "Đang sửa",
    "Proceed with fixing? A temporary layer will be created.":
        "Tiến hành sửa lỗi? Sẽ tạo lớp tạm để xem trước.",
    "Fix complete! Temporary layer added for review."
    " Re-Scan to verify, then save manually.":
        "Sửa lỗi hoàn thành! Đã thêm lớp tạm để xem."
        " Chạy lại kiểm tra để xác nhận, sau đó tự lưu.",
    "No displayable geometries": "Không có hình học hiển thị được",
    "Scan All Errors": "Kiểm tra tất cả lỗi",
    "Re-Scan": "Kiểm tra lại",
    "Count": "Số lỗi",
    "Errors Found": "Kết quả lỗi",
    "No errors found! Layer is clean.":
        "Không phát hiện lỗi! Dữ liệu sạch.",
    "errors found": "lỗi phát hiện",
    "Advanced Parameters": "Tham số nâng cao",
    "No fix types selected": "Chưa chọn loại sửa lỗi",
    "Output CRS": "CRS đầu ra",
    "Output CRS:": "CRS đầu ra:",
    "Keep original CRS": "Giữ nguyên CRS gốc",
    "Result — VN-2000": "Kết quả — VN-2000",
    "Select VN-2000 meridian": "Chọn kinh tuyến trục VN-2000",
    # --- FSC Plot Layout ---
    "FSC Plot Layout": "Bản đồ trích lục FSC",
    "Data Selection": "Chọn dữ liệu",
    "Main layer": "Layer chính",
    "Plot ID field": "Trường mã lô",
    "Month field": "Trường tháng KT",
    "Auxiliary layers": "Layer phụ trợ",
    "Contour lines": "Đường đồng mức",
    "Sub-compartment boundary": "Ranh tiểu khu",
    "Roads": "Giao thông",
    "Compartment labels": "Số hiệu TK/Khoảnh",
    "Plot Selection": "Chọn lô khai thác",
    "Filter": "Lọc",
    "All communes": "Tất cả xã",
    "All months": "Tất cả tháng",
    "All years": "Tất cả năm",
    "Owner": "Chủ rừng",
    "Plot ID": "Mã lô",
    "Area": "Diện tích",
    "Month": "Tháng",
    "Year": "Năm",
    "Select All": "Chọn tất cả",
    "Deselect All": "Bỏ chọn tất cả",
    "Selected": "Đã chọn",
    "Map Settings": "Cài đặt bản đồ",
    "Title": "Tiêu đề",
    "Subtitle": "Dòng phụ",
    "Organization": "Đơn vị xây dựng",
    "Scale": "Tỷ lệ",
    "Custom": "Tùy chỉnh",
    "Signatures": "Ô ký",
    "Plot owner": "Chủ rừng",
    "Group representative": "Đại diện nhóm chứng chỉ",
    "Output": "Đầu ra",
    "Output folder": "Thư mục đầu ra",
    "Select output folder": "Chọn thư mục đầu ra",
    "Separate PDFs": "Nhiều file PDF riêng",
    "Merged PDF": "Gộp 1 file PDF",
    "Export PDF": "Xuất PDF",
    "Please select a main layer.": "Vui lòng chọn layer chính.",
    "Please select an output folder.": "Vui lòng chọn thư mục đầu ra.",
    "Please select at least one plot.": "Vui lòng chọn ít nhất một lô.",
    "Done": "Hoàn thành",
    "Export complete": "Xuất bản đồ hoàn thành",
    "Export failed": "Xuất bản đồ thất bại",
    "Owner field": "Trường chủ rừng",
    "Area field": "Trường diện tích",
    "Commune field": "Trường xã",
    "Year field": "Trường năm",
    "Load data": "Tải dữ liệu",
    "Plot label": "Nhãn lô",
    "Show label": "Hiển thị nhãn",
    "Numerator": "Tử số",
    "Denominator": "Mẫu số",
    "Show legend": "Hiển thị chú giải",
    "Open output after export": "Mở sản phẩm sau khi xuất",

    # --- Satellite Downloader ---
    "Satellite Downloader": "Tải ảnh vệ tinh",
    "Satellite Image Downloader": "Tải ảnh vệ tinh",
    "LVT4U — Satellite Image Downloader":
        "LVT4U — Tải ảnh vệ tinh",
    "Satellite:": "Vệ tinh:",
    "From:": "Từ:",
    "To:": "Đến:",
    "Layer": "Lớp bản đồ",

    "Map View": "Khung nhìn bản đồ",
    "Bands:": "Kênh ảnh:",
    "Cloud max:": "Mây tối đa:",
    "Resolution:": "Độ phân giải:",

    "  Search Images": "  Tìm kiếm ảnh",
    "  Reset": "  Đặt lại",
    "Ready": "Sẵn sàng",
    "Date": "Ngày",
    "Cloud %": "Mây %",
    "Tile ID": "Mã tile",
    "Preview": "Xem trước",
    "Click an image in the table\nto preview cloud coverage":
        "Chọn ảnh trong bảng\nđể xem trước độ che phủ mây",
    "Loading preview...": "Đang tải xem trước...",
    "Preview failed": "Không thể xem trước",
    "Preview not available": "Không có ảnh xem trước",
    "Select All": "Chọn tất cả",
    "Deselect All": "Bỏ chọn tất cả",
    "{n} selected": "{n} đã chọn",
    "Format:": "Định dạng:",
    "Folder:": "Thư mục:",
    "Add to QGIS": "Thêm vào QGIS",
    "  Download Selected": "  Tải ảnh đã chọn",
    "Close": "Đóng",
    "Select output folder": "Chọn thư mục đầu ra",
    "Select at least one image.": "Vui lòng chọn ít nhất một ảnh.",
    "No polygon layer selected.": "Chưa chọn lớp polygon.",
    "Layer is empty or not found.": "Lớp trống hoặc không tìm thấy.",

    "Searching satellite catalog...": "Đang tìm kiếm dữ liệu vệ tinh...",
    "Found {n} images": "Tìm thấy {n} ảnh",
    "Downloading {n}/{total}: {date}...":
        "Đang tải {n}/{total}: {date}...",
    "Downloaded {n} images ({s:.1f} MB)":
        "Đã tải {n} ảnh ({s:.1f} MB)",
    "Downloaded {n} images to:\n{d}":
        "Đã tải {n} ảnh về:\n{d}",
    "A task is running. Please wait.":
        "Đang chạy tác vụ. Vui lòng đợi.",
    "Layer '{name}' added.": "Đã thêm lớp '{name}'.",
    "Help": "Hướng dẫn",
    "No valid geometries in layer.":
        "Không có hình học hợp lệ trong lớp.",
    "Creating composite & downloading...":
        "Đang tạo ảnh tổng hợp & tải...",
    "Planet WMTS Settings": "Cài đặt Planet WMTS",
    "Enter your Planet WMTS URL below. It will be saved for future sessions.\nLeave empty to disable Planet basemap.":
        "Nhập URL Planet WMTS bên dưới. Sẽ được lưu cho các lần sau.\nĐể trống nếu không dùng Planet basemap.",
    "Save": "Lưu",
    "Load Basemap": "Tải Basemap",
    "Planet WMTS URL saved!": "Đã lưu URL Planet WMTS!",
    "Planet WMTS URL cleared.": "Đã xóa URL Planet WMTS.",
    "Please enter a Planet WMTS URL first.":
        "Vui lòng nhập URL Planet WMTS trước.",
    "Planet Basemap added to QGIS!":
        "Đã thêm Planet Basemap vào QGIS!",
    "Planet Basemap added to QGIS! (XYZ fallback)":
        "Đã thêm Planet Basemap vào QGIS! (phương thức XYZ)",
    "Could not load Planet basemap. Check your URL and API key.":
        "Không thể tải Planet basemap. Kiểm tra URL và API key.",

    # --- Menu section headers ---
    "── 📐 Setup ──": "── 📐 Thiết lập ──",
    "── 🗺️ Map Editing ──": "── 🗺️ Biên tập bản đồ ──",
    "── 🔄 Convert ──": "── 🔄 Chuyển đổi ──",
    "── 📥 Data ──": "── 📥 Dữ liệu ──",
    "── 🔧 Tools ──": "── 🔧 Công cụ ──",
    "── 📚 Reference ──": "── 📚 Tham khảo ──",

    # --- Menu actions missing translations ---
    "TopoFix": "Sửa lỗi (TopoFix)",
    "Create Labels": "Tạo nhãn",
    "Lot Numbering": "Đánh số lô",
    "Thematic Map Editor": "Biên tập bản đồ chuyên đề",
    "Layer Compare": "So sánh lớp bản đồ",
    "🧹 Disk Cleaner": "🧹 Dọn dẹp ổ đĩa",
    "Terms of Use": "Điều khoản sử dụng",
    "FSC Harvest Map": "Trích lục bản đồ",

    # --- Layer Compare dialog ---
    "Layer A  (base / right / below)": "Lớp A  (nền / phải / dưới)",
    "Layer B  (overlay / left / above)": "Lớp B  (phủ / trái / trên)",
    "🔄 Refresh Layer List": "🔄 Làm mới danh sách lớp",
    "Direction:": "Chiều kéo:",
    "↔ Horizontal": "↔ Ngang",
    "↕ Vertical": "↕ Dọc",
    "🔃 Swap B": "🔃 Hoán đổi B",
    "⊕ Center": "⊕ Về giữa",
    "Swap B side display to opposite": "Đổi phần hiện Lớp B sang phía ngược lại",
    "Set divider to center (50%)": "Đặt đường chia về vị trí 50%",
    "⏸ Inactive": "⏸ Chưa kích hoạt",
    "▶ Activate": "▶ Kích hoạt",
    "⏹ Stop": "⏹ Dừng",
    "Please select both Layer A and Layer B.": "Vui lòng chọn đủ Lớp A và Lớp B.",
    "Layer A and Layer B must be different.": "Lớp A và Lớp B phải khác nhau.",
    "⏸ Stopped": "⏸ Đã dừng",
    "⚠️ Tool changed — click Activate again": "⚠️ Tool bị đổi — bấm Kích hoạt lại",
    "⏳ Rendering: {name}…": "⏳ Đang render: {name}…",

    # --- Toolbar button labels ---
    "🗺️ Basemap": "🗺️ Basemap",
    "📥 Import Data": "📥 Nhập dữ liệu",
    "✏️ Map Editing": "✏️ Biên tập bản đồ",
    "🔄 Convert": "🔄 Chuyển đổi",
    "🌿 Thematic": "🌿 Chuyên ngành",
    "ℹ️ Help": "ℹ️ Trợ giúp",

    # --- Toolbar dropdown section headers ---
    "COORDINATE SYSTEM": "HỆ TOẠ ĐỘ",
    "FONTS": "FONT CHỮ",
    "FROM SPREADSHEET": "TỪ BẢNG TÍNH",
    "FROM CAD / GIS": "TỪ CAD / GIS",
    "PHOTOS / VIDEO": "ẢNH / VIDEO",
    "VECTOR PROCESSING": "XỬ LÝ VECTOR",
    "EXPORT": "XUẤT BẢN",
    "TOOLS": "CÔNG CỤ",
    "REMOTE SENSING": "VIỄN THÁM",
    "BIODIVERSITY": "ĐA DẠNG SINH HỌC",
    "DOCUMENTS": "TÀI LIỆU",

    # --- Sync dialog ---
    "LVT Sync — Google Drive & Export":         "LVT Sync — Đồng bộ Google Drive & Xuất file",
    "☁️ Google":                                "☁️ Google",
    "📤 Export":                                "📤 Xuất file",

    # Google tab
    "Google Account":                           "Tài khoản Google",
    "Data is stored on your personal Google Drive.\n"
    "Folder: Google Drive / LVTField / projects\n"
    "Free — 15 GB per Google account.":
        "Dữ liệu được lưu trên Google Drive cá nhân của bạn.\n"
        "Thư mục: Google Drive / LVTField / projects\n"
        "Miễn phí — 15GB/tài khoản Google.",
    "🔑 Sign in with Google":                   "🔑 Đăng nhập bằng Google",
    "Sign out":                                 "Đăng xuất",
    "⚪ Not signed in":                         "⚪ Chưa đăng nhập",
    "🟢 Signed in":                             "🟢 Đã đăng nhập",
    "📁 Projects on Google Drive":              "📁 Dự án trên Google Drive",
    "🔄 Refresh":                               "🔄 Làm mới",
    "🗑️ Delete project":                        "🗑️ Xóa dự án",
    "Project name":                             "Tên dự án",
    "Description":                              "Mô tả",
    "Layers":                                   "Số layer",
    "ID":                                       "ID",
    "Press \"Refresh\" to load projects.":      "Nhấn \"Làm mới\" để tải danh sách dự án.",
    "🔄 Sync":                                  "🔄 Đồng bộ",
    "🔄 Sync Google Drive":                     "🔄 Đồng bộ Google Drive",
    "Last sync: —":                             "Lần đồng bộ cuối: —",
    "Last sync: {t}":                           "Lần đồng bộ cuối: {t}",
    "Log:":                                     "Nhật ký:",
    "⏳ Waiting for Google confirmation...":    "⏳ Đang chờ xác nhận Google...",
    "Signed in: {email}":                       "Đã đăng nhập: {email}",

    # Export tab
    "Export folder":                            "Thư mục xuất",
    "Choose export folder...":                  "Chọn thư mục lưu file...",
    "Browse...":                                "Chọn...",
    "Select layers to export":                  "Chọn lớp xuất",
    "Select All":                               "Chọn tất cả",
    "Deselect All":                             "Bỏ tất cả",
    "Visible only":                             "Chỉ layer hiện",
    "Refresh layer list":                       "Làm mới danh sách layer",
    "Layer":                                    "Lớp dữ liệu",
    "Type":                                     "Loại",
    "Features":                                 "Số đối tượng",
    "Selected {checked}/{total} layers — {features} features":
        "Đã chọn {checked}/{total} lớp — {features} đối tượng",
    "Export GPKG — single file with data + styles":
        "Xuất GPKG — Một file chứa dữ liệu + style",
    "Save styles (labels, colours, line styles)":
        "Lưu style (nhãn, màu sắc, nét vẽ)",
    "📦 Export GPKG":                           "📦 Xuất GPKG",
    "Export ZIP project — .qgs + all .gpkg files":
        "Xuất dự án ZIP — File .qgs + tất cả .gpkg",
    "Bundle the entire QGIS project into one ZIP file.\n"
    "Includes: project.qgs + layer .gpkg files + styles.\n"
    "Use to import into LVTField on mobile.":
        "Đóng gói toàn bộ dự án QGIS thành 1 file ZIP.\n"
        "Bao gồm: project.qgs + các layer.gpkg + styles.\n"
        "Dùng để import vào LVTField trên điện thoại.",
    "📦 Export ZIP project":                    "📦 Xuất dự án ZIP",
    "Export log:":                              "Nhật ký xuất:",

    # Sync dialog messages
    "Not signed in":                            "Chưa đăng nhập",
    "Please sign in first.":                    "Vui lòng đăng nhập trước.",
    "Please sign in to Google first.":          "Vui lòng đăng nhập Google trước.",
    "No project":                               "Chưa có dự án",
    "Please open a QGIS project first.":        "Vui lòng mở một dự án QGIS trước.",
    "No data":                                  "Không có dữ liệu",
    "No vector layers found.":                  "Không có vector layer nào.",
    "Confirm":                                  "Xác nhận",
    "Push project \"{name}\" to Google Drive?": "Đẩy dự án \"{name}\" lên Google Drive?",
    "Confirm download":                         "Xác nhận tải về",
    "Download project \"{name}\" to QGIS?":    "Tải dự án \"{name}\" về QGIS?",
    "Confirm delete":                           "Xác nhận xóa",
    "Are you sure you want to delete \"{name}\" from Google Drive?\n"
    "All related data will be permanently deleted!":
        "Bạn có chắc chắn muốn xóa dự án \"{name}\" trên Google Drive?\n"
        "Tất cả dữ liệu liên quan sẽ bị xóa vĩnh viễn!",
    "Nothing selected":                         "Chưa chọn",
    "Please select a project.":                 "Vui lòng chọn một dự án.",
    "Please select a project to delete.":       "Vui lòng chọn một dự án để xóa.",
    "Success":                                  "Thành công",
    "Google login successful: {email}":         "Đăng nhập Google thành công: {email}",
    "Signed in to Google!\nHello {name}":       "Đã đăng nhập Google!\nXin chào {name}",
    "Login failed":                             "Đăng nhập thất bại",
    "Error:\n{msg}":                            "Lỗi:\n{msg}",
    "Cannot export":                            "Không thể xuất",
    "No layer selected":                        "Chưa chọn lớp",
    "Please select at least one layer to export.\n\nTick the layers in the list above.":
        "Vui lòng chọn ít nhất một lớp để xuất.\n\nTích chọn các lớp trong danh sách phía trên.",
    "Please select a valid export folder.":     "Vui lòng chọn thư mục xuất hợp lệ.",
    "Export GPKG successful":                   "Xuất GPKG thành công",
    "✅ Export successful!\n\n"
    "• {n} layers, {f} features\n"
    "• File: {fname}\n"
    "• Size: {size:.1f} MB\n\n"
    "📂 {path}":
        "✅ Đã xuất thành công!\n\n"
        "• {n} layers, {f} features\n"
        "• File: {fname}\n"
        "• Kích thước: {size:.1f} MB\n\n"
        "📂 {path}",
    "Export ZIP successful":                    "Xuất ZIP thành công",
    "✅ Project exported successfully!\n\n"
    "• {n} layers, {f} features\n"
    "• File: {fname}\n"
    "• Size: {size:.1f} MB\n\n"
    "📱 Copy this file to phone → LVTField → Import ZIP\n\n"
    "📂 {path}":
        "✅ Đã xuất dự án thành công!\n\n"
        "• {n} layers, {f} features\n"
        "• File: {fname}\n"
        "• Kích thước: {size:.1f} MB\n\n"
        "📱 Copy file này sang điện thoại → LVTField → Import ZIP\n\n"
        "📂 {path}",
    "Warning":                                  "Cảnh báo",
    "Issues found:\n• {issues}\n\nContinue anyway?":
        "Phát hiện vấn đề:\n• {issues}\n\nBạn có muốn tiếp tục?",
    "⬆ Push QGIS project to Google Drive":     "⬆ Đẩy dự án QGIS lên Google Drive",
    "Push current project to Google Drive":     "Đẩy dự án hiện tại lên Google Drive",
    "⬇ Download projects from Google Drive":   "⬇ Tải dự án từ Google Drive về QGIS",
    "Loading...":                               "Đang tải...",
    "Select projects to download ({n} projects):":
        "Chọn dự án cần tải ({n} dự án):",
    "🔄 Sync now":                              "🔄 Đồng bộ",
    "Cancel":                                   "Hủy",
    "Select project":                           "Chọn dự án",
    "Projects on Google Drive:":                "Dự án trên Google Drive:",
    "Empty":                                    "Trống",
    "No projects on Google Drive.":             "Không có dự án nào trên Google Drive.",
    "Found {n} projects.":                      "Tìm thấy {n} dự án.",
    "Choose export folder":                     "Chọn thư mục xuất",

    # --- Package Map module ---
    "Package/Extract":                          "Đóng gói/Bung gói",
    "📦  Package Map":                          "📦  Đóng gói bản đồ",
    "📦 Package":                               "📦 Đóng gói",
    "📤 Extract SHP":                           "📤 Bung gói SHP",
    "Package the current QGIS project into a portable folder.\nAll data, styles, labels, and layouts are copied — opens correctly on any machine.":
        "Đóng gói project QGIS hiện tại thành thư mục di động.\nToàn bộ dữ liệu, style, nhãn, layout được copy — mở trên máy khác hiển thị đúng.",
    "Destination folder:":                      "Thư mục đích:",
    "Options":                                  "Tùy chọn",
    "Copy original data (keep format)":         "Copy dữ liệu gốc (giữ nguyên định dạng)",
    "Package into a single GeoPackage file (.gpkg)":
        "Đóng gói vào một file GeoPackage (.gpkg)",
    "Vacuum SQLite file after copy":            "Vacuum file SQLite sau khi copy",
    "📦  Package":                              "📦  Đóng gói",
    "Select destination folder":                "Chọn thư mục đích",
    "Project not saved.\nPlease save the project (Ctrl+S) before packaging.":
        "Project chưa được lưu.\nHãy lưu project (Ctrl+S) trước khi đóng gói.",
    "Project has unsaved changes.\nPlease save the project (Ctrl+S) before packaging.":
        "Project có thay đổi chưa lưu.\nHãy lưu project (Ctrl+S) trước khi đóng gói.",
    "No file layers found in the current project.":
        "Không có layer file nào trong project hiện tại.",
    "Destination folder must not be inside the project folder!":
        "Thư mục đích không được nằm trong thư mục project!",
    "Folder '{outdir}' already exists.\nExisting data will be deleted. Continue?":
        "Thư mục '{outdir}' đã tồn tại.\nDữ liệu cũ sẽ bị xóa. Tiếp tục?",
    "Error deleting folder: {e}":               "Lỗi xóa thư mục: {e}",
    "LVT4U — Packaging":                        "LVT4U — Đóng gói",
    "Saving project...":                        "Lưu project...",
    "Packaging error: {e}":                     "Lỗi đóng gói: {e}",
    "Packaged successfully! → {url}":           "Đóng gói thành công! → {url}",
    "Failed to save project!":                  "Lưu project thất bại!",
    "No spatial file layers to package.\n({n} online layers will keep their URL)":
        "Không có layer file nào để đóng gói.\n({n} online layers sẽ giữ nguyên URL)",
    "LVT4U — Full Package":                     "LVT4U — Đóng gói hoàn chỉnh",
    "Packaging {n} vectors → GPKG...":          "Đóng gói {n} vector → GPKG...",
    "Copy table: {name}":                       "Copy bảng: {name}",
    "Copy raster: {name}":                      "Copy raster: {name}",
    "Copy: {name}":                             "Copy: {name}",
    "Copy {n} icons → assets/...":             "Copy {n} icon → assets/...",
    "GPKG packaging error:\n{e}\n\n{tb}":       "Lỗi đóng gói GPKG:\n{e}\n\n{tb}",

    # Extract SHP tab
    "Select 1 .gpkg file → export ALL layers as .shp (UTF-8) in one operation.":
        "Chọn 1 file .gpkg → xuất toàn bộ layer thành các file .shp (UTF-8) trong một thao tác duy nhất.",
    "GPKG file:":                               "File GPKG:",
    "SHP folder:":                              "Thư mục SHP:",
    "Select .gpkg file...":                     "Chọn file .gpkg ...",
    "SHP output folder...":                     "Thư mục chứa SHP đầu ra ...",
    "Select GeoPackage file":                   "Chọn file GeoPackage",
    "GeoPackage (*.gpkg);;All files (*.*)":     "GeoPackage (*.gpkg);;Tất cả (*.*)",
    "Select SHP output folder":                 "Chọn thư mục đầu ra SHP",
    "Load exported SHPs into QGIS":            "Tải các SHP vừa xuất vào QGIS",
    "📤  Export all → SHP":                    "📤  Xuất tất cả → SHP",
    "No valid GPKG file selected.":             "Chưa chọn file GPKG hợp lệ.",
    "Cannot open file:\n{path}":               "Không mở được file:\n{path}",
    "GPKG file contains no layers.":           "File GPKG không chứa layer nào.",
    "Exporting layers...":                      "Đang xuất layers...",
    "Cancel":                                   "Hủy",
    "LVT4U — Extract GPKG":                    "LVT4U — Bung gói GPKG",
    "Exporting: {name} ({i}/{n})":             "Xuất: {name} ({i}/{n})",
    "{name}: failed to create SHP":            "{name}: không tạo được file SHP",
    "{name}: CopyLayer failed":                "{name}: CopyLayer thất bại",
    "✅ Exported {ok}/{total} layers:":        "✅ Đã xuất {ok}/{total} layer:",
    "⚠️ {n} layer errors:":                    "⚠️ Lỗi {n} layer:",
    "📂 Folder: {folder}":                     "📂 Thư mục: {folder}",
    "LVT4U — Extract GPKG Result":             "LVT4U — Kết quả bung gói GPKG",
}


def current_language():
    """Return the currently selected language code.

    Returns:
        str: "en" or "vi".
    """
    return QSettings().value(_SETTINGS_KEY, _DEFAULT_LANG)


def set_language(lang_code):
    """Persist the language preference and notify all listeners immediately.

    Emits language_signals.language_changed so any connected widget
    can retranslate itself without requiring a QGIS restart.

    Args:
        lang_code: "en" for English, "vi" for Vietnamese.
    """
    if lang_code in ("en", "vi"):
        QSettings().setValue(_SETTINGS_KEY, lang_code)
        language_signals.language_changed.emit(lang_code)


def tr(text):
    """Translate the given text based on the current language setting.

    If the current language is English, the original text is returned.
    If Vietnamese is selected, the translation is looked up in the dictionary.
    If no translation is found, the original English text is returned as fallback.

    Args:
        text: English text to translate.

    Returns:
        str: Translated text (or original if no translation available).
    """
    if current_language() == "vi":
        return _TRANSLATIONS.get(text, text)
    return text
