Files
cowork-local/presentation/settings/about_widget.py
T
anhtnm1andClaude Opus 5 ab04d68a22
CI / test (pull_request) Canceled after 0s
fix(i18n): dịch nốt chữ do Qt tự vẽ, và thêm dòng phiên bản ở góc phải
Người dùng báo: chọn tiếng Nhật mà nhóm Sandbox Security, nút Save/Cancel và
nhiều chỗ khác vẫn tiếng Anh. Bộ test i18n cũ vẫn xanh vì nó chỉ bắt lỗi "có
dịch nhưng không ai áp lại" — hai lỗ thật nằm chỗ khác:

* Chuỗi HARDCODE không đi qua ``tr()`` bao giờ (``QPushButton("Unlock")``), nên
  phép đo "đổi ngôn ngữ rồi tìm chỗ không mang mốc" thấy nó đứng yên ở cả hai
  lần chụp và coi là bình thường.
* Nhãn nút do CHÍNH Qt vẽ. ``QDialogButtonBox``, ``QMessageBox.question`` và
  ``QInputDialog.get*`` lấy chữ từ bảng dịch riêng của Qt; ứng dụng không cài
  ``QTranslator`` nào và bản PySide6 đang dùng cũng không đóng gói file
  ``qtbase_*.qm`` nào để cài — nên chúng luôn rơi về tiếng Anh.

``ui/dialog_buttons.py`` gán nhãn của dự án đè lên nhãn Qt: ``dialog_buttons``
(10 hộp thoại), ``confirm`` (13 hộp Có/Không), ``ask_text``/``ask_multiline``/
``ask_item`` (16 hộp nhập liệu). Cùng với 17 chuỗi hardcode và 5 câu lỗi mà
``core/tasks.py`` trả thẳng ra hộp thoại — nay trả KHOÁ i18n, nơi hiển thị mới
gọi ``tr()`` — là 61 chỗ.

Ba chỗ nữa cùng lớp lỗi, phát hiện khi rà lại:

* ``_add_section`` nhận chuỗi ĐÃ dịch nên bốn tiêu đề mục của Step config đứng
  nguyên ở ngôn ngữ lúc dựng panel. Nay nhận khoá + ``bind_dynamic`` để không
  mất trạng thái gập/mở khi đổi ngôn ngữ.
* Thẻ tool ở Giám sát ▸ Công cụ hiện thẳng ``spec.description`` — chuỗi gửi cho
  MÔ HÌNH trong schema function-calling, phải giữ tiếng Anh. Thêm bộ mô tả hiển
  thị riêng cho 9 tool.
* Tên nhóm catalog ở tab Connector ("Other (any generic MCP server)").

Kèm theo, phần giao diện người dùng yêu cầu:

* ``__version__`` 2.26.0 -> 0.0.1, một nguồn cho tiêu đề cửa sổ, tab Giới thiệu
  và dòng mới ở góc phải thanh trạng thái (thay dòng ghi công tác giả).
* Tắt size grip: nó vẽ một vệt ngay bên phải dòng phiên bản. Cửa sổ vẫn kéo
  giãn được từ các cạnh.
* ``_NAV_SETTINGS_GAP`` 10 -> 4: hàng Cài đặt bớt xa nhóm Dashboard/Giám sát.

Hai test SẼ TREO nếu không sửa kèm: chúng patch ``QInputDialog.getText/getItem``
để tự trả lời, mà code nay gọi ``ask_text``/``ask_item`` — patch không còn chặn
được và hộp thoại thật sẽ mở ra chờ người bấm.

Ba cổng mới trong ``tests/ui/test_i18n_khong_hardcode_chu.py`` canh ở mức cấu
trúc (không ai được dựng lại kiểu cũ); đã kiểm chúng CẮN trên bản trước khi sửa:
10 + 13 + 17 vi phạm.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-09 11:09:42 +09:00

61 lines
2.7 KiB
Python

"""Mục "Giới thiệu" trong Cài đặt.
Dòng ghi công tác giả trước đây nằm cố định ở góc dưới phải cửa sổ, dưới dạng
widget thường trực của thanh trạng thái. Chỗ đó chiếm một góc màn hình trên MỌI
màn hình, suốt cả phiên làm việc, cho một thông tin người dùng chỉ cần đọc một
lần. Chuyển vào Cài đặt: vẫn tra được bất cứ lúc nào, nhưng không còn đứng
thường trực trong tầm mắt.
Cùng nhóm widget với bốn mục kia của Cài đặt (``general``/``provider``/
``parameter``/``routing``) nên nó tự là một trang, không cần lắp ráp riêng.
"""
from __future__ import annotations
from PySide6.QtCore import Qt
from PySide6.QtWidgets import QLabel, QVBoxLayout, QWidget
from ... import DISPLAY_NAME, __version__
from ...i18n import tr
class AboutSettingsWidget(QWidget):
"""Nhóm "Giới thiệu": tên ứng dụng và dòng ghi công tác giả."""
def __init__(self, ctx=None, parent: QWidget | None = None) -> None:
"""Trang Giới thiệu. ``ctx`` không dùng tới, giữ cho khớp chữ ký của
bốn widget Cài đặt còn lại."""
super().__init__(parent)
self.ctx = ctx
layout = QVBoxLayout(self)
layout.setContentsMargins(4, 4, 4, 4)
layout.setSpacing(8)
# Tên sản phẩm là danh từ riêng, không dịch — lấy thẳng từ gốc gói,
# cùng nguồn với tiêu đề cửa sổ (main_window.py:90) nên hai chỗ không lệch.
self.app_label = QLabel(f"{DISPLAY_NAME} v{__version__}")
# Không đặt màu ở đây: cỡ chữ là khác biệt duy nhất cần thiết, còn màu
# do theme quyết định (xem theme/__init__.py — ngoài theme/ không file
# nào được đặt tên một màu).
font = self.app_label.font()
font.setPointSize(font.pointSize() + 4)
font.setBold(True)
self.app_label.setFont(font)
layout.addWidget(self.app_label)
self.version_label = QLabel(tr("app.version", v=__version__))
self.version_label.setObjectName("faint")
self.version_label.setTextInteractionFlags(Qt.TextSelectableByMouse)
layout.addWidget(self.version_label)
layout.addStretch(1)
def apply_to(self, data: dict) -> None:
"""Không có thiết lập nào để ghi — mục này chỉ hiển thị.
Vẫn khai để khớp giao diện chung của các trang Cài đặt: ``_save`` gọi
``apply_to`` trên từng trang, nên một trang thiếu hàm này sẽ là
``AttributeError`` ngay lần đầu ai đó thêm nó vào vòng lặp.
"""
return