Skip to content

Commit a1992e5

Browse files
babyskillymkiux
authored andcommitted
feat: add Vietnamese (vi) UI language + ignore internal configs
1 parent 6315a17 commit a1992e5

5 files changed

Lines changed: 169 additions & 17 deletions

File tree

‎.gitignore‎

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,3 +53,16 @@ codex-switcher.exe
5353
# Package manager lockfiles (keep package-lock.json)
5454
# pnpm-lock.yaml
5555
# yarn.lock
56+
log.txt
57+
tmp/
58+
.gitnexus/
59+
60+
# Internal project configs (local-only)
61+
.project-identity
62+
*.code-workspace
63+
help.html
64+
AGENTS.md
65+
CLAUDE.md
66+
CODEBASE.md
67+
.claude/
68+
pnpm-lock.yaml

‎pnpm-lock.yaml‎

Lines changed: 0 additions & 13 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

‎web-ui/modules/i18n.dict.mjs‎

Lines changed: 153 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ const DICT = Object.freeze({
33
// Global
44
'lang.zh': '中文',
55
'lang.en': 'English',
6+
'lang.vi': '越南语',
67
'lang.label': '语言',
78
'nav.topTabs.aria': '导航',
89

@@ -1078,6 +1079,7 @@ const DICT = Object.freeze({
10781079
// Global
10791080
'lang.zh': '中国語',
10801081
'lang.en': 'English',
1082+
'lang.vi': 'ベトナム語',
10811083
'lang.label': '言語',
10821084
'nav.topTabs.aria': 'ナビゲーション',
10831085

@@ -2136,10 +2138,161 @@ const DICT = Object.freeze({
21362138

21372139
},
21382140

2141+
vi: {
2142+
// Global
2143+
'lang.zh': 'Tiếng Trung',
2144+
'lang.en': 'Tiếng Anh',
2145+
'lang.vi': 'Tiếng Việt',
2146+
'lang.label': 'Ngôn ngữ',
2147+
'nav.topTabs.aria': 'Điều hướng',
2148+
2149+
// Common
2150+
'common.all': 'Tất cả',
2151+
'common.copy': 'Sao chép',
2152+
'common.paste': 'Dán',
2153+
'common.edit': 'Chỉnh sửa',
2154+
'common.install': 'Cài đặt',
2155+
'common.update': 'Cập nhật',
2156+
'common.uninstall': 'Gỡ cài đặt',
2157+
'common.official': 'Chính thức',
2158+
'common.custom': 'Tùy chỉnh',
2159+
'common.rules': 'Quy tắc',
2160+
'common.troubleshooting': 'Khắc phục sự cố',
2161+
'common.command': 'Lệnh',
2162+
'common.mirror': 'Nguồn',
2163+
'common.packageManager': 'Trình quản lý gói',
2164+
'common.action': 'Thao tác',
2165+
'common.targets': 'Mục tiêu',
2166+
'common.currentPm': 'Trình quản lý gói',
2167+
'common.currentAction': 'Thao tác hiện tại',
2168+
'common.mirrorActive': 'Nguồn',
2169+
'common.defaultOfficial': 'Mặc định',
2170+
'common.cancel': 'Hủy',
2171+
'common.confirm': 'Xác nhận',
2172+
'common.add': 'Thêm',
2173+
'common.save': 'Lưu',
2174+
'common.saveApply': 'Lưu & áp dụng',
2175+
'common.close': 'Đóng',
2176+
'common.delete': 'Xóa',
2177+
'common.clear': 'Xóa',
2178+
'common.show': 'Hiện',
2179+
'common.hide': 'Ẩn',
2180+
'common.detail': 'Chi tiết',
2181+
'common.refresh': 'Làm mới',
2182+
'common.refreshing': 'Đang làm mới...',
2183+
'common.loading': 'Đang tải...',
2184+
'common.saving': 'Đang lưu...',
2185+
'common.sending': 'Đang gửi...',
2186+
'common.scanning': 'Đang quét...',
2187+
'common.export': 'Xuất',
2188+
'common.import': 'Nhập',
2189+
'common.apply': 'Áp dụng',
2190+
'common.applying': 'Đang áp dụng...',
2191+
'common.confirming': 'Đang xác nhận...',
2192+
'common.writeToEditor': 'Ghi vào trình soạn thảo',
2193+
'common.refreshFromText': 'Làm mới từ văn bản',
2194+
'common.backToEdit': 'Quay lại chỉnh sửa',
2195+
'common.selectAll': 'Chọn tất cả',
2196+
'common.unselectAll': 'Bỏ chọn tất cả',
2197+
'common.resetFilters': 'Đặt lại bộ lọc',
2198+
'common.notEditable': 'Không thể chỉnh sửa',
2199+
'common.notDeletable': 'Không thể xóa',
2200+
'common.notLoaded': 'Chưa tải',
2201+
'common.exists': 'Đã tồn tại',
2202+
'common.notExistsWillCreateOnApply': 'Không tồn tại. Sẽ được tạo khi áp dụng.',
2203+
'common.notExistsWillCreateOnSave': 'Không tồn tại. Sẽ được tạo khi lưu.',
2204+
'common.none': 'Không có',
2205+
'common.notSelected': 'Chưa chọn',
2206+
2207+
// Roles / labels
2208+
'role.you': 'Bạn',
2209+
'role.provider': 'Nhà cung cấp',
2210+
'label.model': 'Mẫu:',
2211+
2212+
// Top tabs
2213+
'tab.dashboard': 'Tổng quan',
2214+
'tab.docs': 'Tài liệu',
2215+
'tab.config': 'Cấu hình',
2216+
'tab.sessions': 'Phiên',
2217+
'tab.usage': 'Sử dụng',
2218+
'tab.orchestration': 'Tác vụ',
2219+
'tab.market': 'Skills',
2220+
'tab.plugins': 'Plugin',
2221+
'tab.settings': 'Cài đặt',
2222+
2223+
// Side rail section titles
2224+
'side.overview': 'Tổng quan',
2225+
'side.docs': 'Tài liệu',
2226+
'side.config': 'Cấu hình',
2227+
'side.sessions': 'Phiên',
2228+
'side.plugins': 'Plugin',
2229+
'side.system': 'Hệ thống',
2230+
'side.orchestration': 'Tác vụ',
2231+
'side.skills': 'Skills',
2232+
2233+
// Side rail items
2234+
'side.overview.doctor': 'Doctor',
2235+
'side.overview.doctor.meta': 'Tổng quan / Chẩn đoán',
2236+
'side.docs.cliInstall': 'Cài CLI',
2237+
'side.docs.cliInstall.meta': 'Cài đặt / Cập nhật / Gỡ',
2238+
'side.config.codex': 'Codex',
2239+
'side.config.codex.meta': 'Provider / Model',
2240+
'side.config.claude': 'Claude Code',
2241+
'side.config.claude.meta': 'Cài đặt Claude',
2242+
'side.config.openclaw': 'OpenClaw',
2243+
'side.config.openclaw.meta': 'JSON5 / AGENTS',
2244+
'side.sessions.browser': 'Trình duyệt phiên',
2245+
'side.sessions.browser.meta': 'Duyệt / Xuất / Dọn dẹp',
2246+
'side.plugins.tools': 'Công cụ prompt',
2247+
'side.plugins.tools.meta': 'Mẫu / Biến',
2248+
'side.system.settings': 'Cài đặt runtime',
2249+
'side.system.settings.meta': 'Dữ liệu / Sao lưu',
2250+
'side.usage.meta': 'Thống kê / Xu hướng',
2251+
'side.orchestration.meta': 'Kế hoạch / Hàng đợi / Runs',
2252+
2253+
// Header titles
2254+
'kicker.dashboard': 'Doctor',
2255+
'kicker.config': 'Cấu hình',
2256+
'kicker.sessions': 'Phiên',
2257+
'kicker.usage': 'Sử dụng',
2258+
'kicker.orchestration': 'Tác vụ',
2259+
'kicker.market': 'Skills',
2260+
'kicker.plugins': 'Plugin',
2261+
'kicker.docs': 'Tài liệu',
2262+
'kicker.settings': 'Cài đặt',
2263+
2264+
'title.dashboard': 'Dashboard / Doctor',
2265+
'title.config': 'Bảng điều khiển cấu hình cục bộ',
2266+
'title.sessions': 'Phiên & Xuất',
2267+
'title.usage': 'Thống kê & Xu hướng',
2268+
'title.orchestration': 'Điều phối tác vụ',
2269+
'title.market': 'Cài đặt & Đồng bộ Skills',
2270+
'title.plugins': 'Plugin & Mẫu',
2271+
'title.docs': 'Cài CLI & Tài liệu',
2272+
'title.settings': 'Hệ thống & Dữ liệu',
2273+
2274+
'subtitle.dashboard': 'Tổng hợp trạng thái và chẩn đoán.',
2275+
'subtitle.config': 'Quản lý cấu hình và mô hình cục bộ.',
2276+
'subtitle.sessions': 'Duyệt và xuất các phiên.',
2277+
'subtitle.usage': 'Xem sử dụng trong 7/30 ngày gần đây.',
2278+
'subtitle.orchestration': 'Lập kế hoạch, xếp hàng, chạy và xem lại tác vụ cục bộ.',
2279+
'subtitle.market': 'Quản lý skills cục bộ.',
2280+
'subtitle.plugins': 'Quản lý plugin và mẫu tái sử dụng.',
2281+
'subtitle.docs': 'Lệnh cài CLI và hướng dẫn.',
2282+
'subtitle.settings': 'Quản lý tải xuống, thư mục và dữ liệu.',
2283+
2284+
// Dashboard / doctor
2285+
'dashboard.doctor.title': 'Doctor',
2286+
'dashboard.doctor.runChecks': 'Chạy kiểm tra',
2287+
'dashboard.doctor.checking': 'Đang kiểm tra...',
2288+
'dashboard.doctor.export': 'Xuất báo cáo'
2289+
},
2290+
21392291
en: {
21402292
// Global
21412293
'lang.zh': '中文',
21422294
'lang.en': 'English',
2295+
'lang.vi': 'Vietnamese',
21432296
'lang.label': 'Language',
21442297
'nav.topTabs.aria': 'Navigation',
21452298

‎web-ui/modules/i18n.mjs‎

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,6 @@ function applyDocumentLanguage(next) {
3737
document.documentElement.lang = meta.htmlLang || meta.code || 'zh-CN';
3838
document.documentElement.dir = meta.dir || 'ltr';
3939
} catch (_) {}
40-
}
4140

4241
function interpolate(template, params) {
4342
if (!params || typeof params !== 'object') return template;

‎web-ui/res/web-ui-render.precompiled.js‎

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2321,7 +2321,7 @@ return function render(_ctx, _cache) {
23212321
}, [
23222322
(_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_ctx.visibleSessionsList, (session, __, ___, _cached) => {
23232323
const _memo = ([_ctx.activeSessionExportKey === _ctx.getSessionExportKey(session), session.messageCount, session.updatedAt, session.title, session.sourceLabel, session.cwd, _ctx.isSessionPinned(session), _ctx.sessionsLoading, session.match && session.match.count])
2324-
if (_cached && _cached.key === session.source + '-' + session.sessionId + '-' + session.filePath && _isMemoSame(_cached, _memo)) return _cached
2324+
if (_cached && _cached.el && _cached.key === session.source + '-' + session.sessionId + '-' + session.filePath && _isMemoSame(_cached, _memo)) return _cached
23252325
const _item = (_openBlock(), _createElementBlock("div", {
23262326
key: session.source + '-' + session.sessionId + '-' + session.filePath,
23272327
class: _normalizeClass([
@@ -2562,7 +2562,7 @@ return function render(_ctx, _cache) {
25622562
: _createCommentVNode("v-if", true),
25632563
(_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_ctx.activeSessionMessages, (msg, idx, ___, _cached) => {
25642564
const _memo = ([msg.text, msg.timestamp, msg.roleLabel, msg.normalizedRole])
2565-
if (_cached && _cached.key === _ctx.getRecordRenderKey(msg, idx) && _isMemoSame(_cached, _memo)) return _cached
2565+
if (_cached && _cached.el && _cached.key === _ctx.getRecordRenderKey(msg, idx) && _isMemoSame(_cached, _memo)) return _cached
25662566
const _item = (_openBlock(), _createElementBlock("div", {
25672567
key: _ctx.getRecordRenderKey(msg, idx),
25682568
"data-message-key": _ctx.getRecordRenderKey(msg, idx),
@@ -2596,7 +2596,7 @@ return function render(_ctx, _cache) {
25962596
_createElementVNode("div", { class: "session-timeline-track" }),
25972597
(_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_ctx.sessionTimelineNodes, (node, __, ___, _cached) => {
25982598
const _memo = ([_ctx.sessionTimelineActiveKey === node.key, node.safePercent, node.title])
2599-
if (_cached && _cached.key === 'timeline-' + node.key && _isMemoSame(_cached, _memo)) return _cached
2599+
if (_cached && _cached.el && _cached.key === 'timeline-' + node.key && _isMemoSame(_cached, _memo)) return _cached
26002600
const _item = (_openBlock(), _createElementBlock("button", {
26012601
key: 'timeline-' + node.key,
26022602
type: "button",

0 commit comments

Comments
 (0)