diff --git a/ui/src/i18n/lib/registry.ts b/ui/src/i18n/lib/registry.ts index d61911053b..bcdb24e961 100644 --- a/ui/src/i18n/lib/registry.ts +++ b/ui/src/i18n/lib/registry.ts @@ -10,7 +10,7 @@ type LazyLocaleRegistration = { export const DEFAULT_LOCALE: Locale = "en"; -const LAZY_LOCALES: readonly LazyLocale[] = ["zh-CN", "zh-TW", "pt-BR", "de", "es"]; +const LAZY_LOCALES: readonly LazyLocale[] = ["zh-CN", "zh-TW", "pt-BR", "de", "es", "vi"]; const LAZY_LOCALE_REGISTRY: Record = { "zh-CN": { @@ -33,6 +33,10 @@ const LAZY_LOCALE_REGISTRY: Record = { exportName: "es", loader: () => import("../locales/es.ts"), }, + vi: { + exportName: "vi", + loader: () => import("../locales/vi.ts"), + }, }; export const SUPPORTED_LOCALES: ReadonlyArray = [DEFAULT_LOCALE, ...LAZY_LOCALES]; @@ -58,6 +62,9 @@ export function resolveNavigatorLocale(navLang: string): Locale { if (navLang.startsWith("es")) { return "es"; } + if (navLang.startsWith("vi")) { + return "vi"; + } return DEFAULT_LOCALE; } diff --git a/ui/src/i18n/lib/types.ts b/ui/src/i18n/lib/types.ts index 8b25ecbc6d..da411bf8c8 100644 --- a/ui/src/i18n/lib/types.ts +++ b/ui/src/i18n/lib/types.ts @@ -1,6 +1,6 @@ export type TranslationMap = { [key: string]: string | TranslationMap }; -export type Locale = "en" | "zh-CN" | "zh-TW" | "pt-BR" | "de" | "es"; +export type Locale = "en" | "zh-CN" | "zh-TW" | "pt-BR" | "de" | "es" | "vi"; export interface I18nConfig { locale: Locale; diff --git a/ui/src/i18n/locales/de.ts b/ui/src/i18n/locales/de.ts index f45ffc3f4c..e80116f17a 100644 --- a/ui/src/i18n/locales/de.ts +++ b/ui/src/i18n/locales/de.ts @@ -126,5 +126,6 @@ export const de: TranslationMap = { ptBR: "Português (Brasilianisches Portugiesisch)", de: "Deutsch", es: "Spanisch (Español)", + vi: "Vietnamesisch (Tiếng Việt)", }, }; diff --git a/ui/src/i18n/locales/en.ts b/ui/src/i18n/locales/en.ts index c4a83017c1..31d649c01c 100644 --- a/ui/src/i18n/locales/en.ts +++ b/ui/src/i18n/locales/en.ts @@ -123,6 +123,7 @@ export const en: TranslationMap = { ptBR: "Português (Brazilian Portuguese)", de: "Deutsch (German)", es: "Español (Spanish)", + vi: "Tiếng Việt (Vietnamese)", }, cron: { summary: { diff --git a/ui/src/i18n/locales/es.ts b/ui/src/i18n/locales/es.ts index a96ee7ad2d..42077be37e 100644 --- a/ui/src/i18n/locales/es.ts +++ b/ui/src/i18n/locales/es.ts @@ -125,6 +125,7 @@ export const es: TranslationMap = { ptBR: "Portugués brasileño (Português)", de: "Deutsch (Alemán)", es: "Español", + vi: "Vietnamita (Tiếng Việt)", }, cron: { summary: { diff --git a/ui/src/i18n/locales/pt-BR.ts b/ui/src/i18n/locales/pt-BR.ts index d763ca0421..b2ba84d8ea 100644 --- a/ui/src/i18n/locales/pt-BR.ts +++ b/ui/src/i18n/locales/pt-BR.ts @@ -119,11 +119,12 @@ export const pt_BR: TranslationMap = { onboardingDisabled: "Desativado durante a integração", }, languages: { - en: "English", - zhCN: "简体中文 (Chinês Simplificado)", - zhTW: "繁體中文 (Chinês Tradicional)", - ptBR: "Português (Português Brasileiro)", - de: "Deutsch (Alemão)", - es: "Español (Espanhol)", + en: "Inglês (English)", + zhCN: "Chinês Simplificado (简体中文)", + zhTW: "Chinês Tradicional (繁體中文)", + ptBR: "Português", + de: "Alemão (Deutsch)", + es: "Espanhol (Español)", + vi: "Vietnamita (Tiếng Việt)", }, }; diff --git a/ui/src/i18n/locales/vi.ts b/ui/src/i18n/locales/vi.ts new file mode 100644 index 0000000000..ec52d751a9 --- /dev/null +++ b/ui/src/i18n/locales/vi.ts @@ -0,0 +1,339 @@ +import type { TranslationMap } from "../lib/types.ts"; + +export const vi: TranslationMap = { + common: { + version: "Phiên bản", + health: "Tình trạng", + ok: "Tốt", + offline: "Ngoại tuyến", + connect: "Kết nối", + refresh: "Làm mới", + enabled: "Đã bật", + disabled: "Đã tắt", + na: "n/a", + docs: "Tài liệu (Docs)", + resources: "Tài nguyên", + }, + nav: { + chat: "Trò chuyện (Chat)", + control: "Điều khiển (Control)", + agent: "Trợ lý (Agent)", + settings: "Cài đặt (Settings)", + expand: "Mở rộng thanh bên", + collapse: "Thu gọn thanh bên", + }, + tabs: { + agents: "Trợ lý (Agents)", + overview: "Tổng quan (Overview)", + channels: "Kênh (Channels)", + instances: "Phiên bản (Instances)", + sessions: "Phiên làm việc (Sessions)", + usage: "Mức sử dụng (Usage)", + cron: "Công việc định kỳ (Cron Jobs)", + skills: "Kỹ năng (Skills)", + nodes: "Nút thiết bị (Nodes)", + chat: "Trò chuyện (Chat)", + config: "Cấu hình (Config)", + debug: "Gỡ lỗi (Debug)", + logs: "Nhật ký (Logs)", + }, + subtitles: { + agents: "Quản lý không gian làm việc của trợ lý (agent workspaces), các công cụ và danh tính.", + overview: "Trạng thái Cổng kết nối (Gateway), các điểm đầu vào và kiểm tra hệ thống nhanh.", + channels: "Quản lý các kênh (channels) và cài đặt liên lạc.", + instances: "Tín hiệu hiện diện (Presence beacons) từ các máy khách và các nút (nodes) đang kết nối.", + sessions: "Kiểm tra các phiên làm việc (sessions) đang hoạt động và điều chỉnh mặc định cho từng phiên.", + usage: "Theo dõi mức sử dụng API và chi phí tương ứng.", + cron: "Lên lịch đánh thức và cấu hình trợ lý tự động chạy định kỳ.", + skills: "Quản lý tính khả dụng của kỹ năng và cấu hình nhúng khóa API.", + nodes: "Các thiết bị đã ghép nối (Paired devices), khả năng kết nối và những lệnh mở công khai.", + chat: "Phiên trò chuyện (chat session) tương tác trực tiếp qua Cổng kết nối để can thiệp nhanh.", + config: "Chỉnh sửa ~/.openclaw/openclaw.json một cách an toàn.", + debug: "Tạo ảnh chụp nhanh (snapshots) của Cổng kết nối, sự kiện và tương tác với các lệnh gọi RPC theo cách thủ công.", + logs: "Bám sát (Live tail) các file nhật ký luồng dữ liệu liên quan tới Cổng kết nối.", + }, + overview: { + access: { + title: "Truy cập Cổng kết nối (Gateway Access)", + subtitle: "Nơi bảng điều khiển kết nối và cách nó xác thực.", + wsUrl: "URL của WebSocket", + token: "Mã thông báo (Gateway Token)", + password: "Mật khẩu (không được lưu)", + sessionKey: "Khóa phiên mặc định (Default Session Key)", + language: "Ngôn ngữ", + connectHint: "Nhấn nút Kết nối (Connect) để áp dụng các thay đổi liên quan đến đường truyền.", + trustedProxy: "Xác thực qua proxy bảo mật đáng tin cậy.", + }, + snapshot: { + title: "Ảnh chụp nhanh (Snapshot)", + subtitle: "Tin tức trao đổi thông tin lần bắt tay khởi điểm gần nhất với Cổng kết nối.", + status: "Trạng thái", + uptime: "Thời gian hoạt động (Uptime)", + tickInterval: "Cự ly nhịp tín hiệu (Tick Interval)", + lastChannelsRefresh: "Lần tải làm mới các Kênh cuối cùng", + channelsHint: "Chuyển sang tab Kênh (Channels) để kết nối vào WhatsApp, Telegram, Discord, Signal, hoặc là iMessage.", + }, + stats: { + instances: "Phiên bản (Instances)", + instancesHint: "Tín hiệu hiện diện trong vòng 5 phút qua.", + sessions: "Phiên làm việc (Sessions)", + sessionsHint: "Những khóa phiên sử dụng (session keys) gần đây được Cổng kết nối đi theo theo dõi.", + cron: "Cron", + cronNext: "Lần thức dậy tiếp theo {time}", + }, + notes: { + title: "Ghi chú", + subtitle: "Nhắc nhở nhanh để dùng cho việc thiết lập điều khiển từ xa.", + tailscaleTitle: "Tailscale serve", + tailscaleText: "Khuyên ưu tiên chạy ở chế độ serve để đảm bảo Cổng kết nối nằm an toàn trong mạng loopback và áp dụng tốt với tailnet auth.", + sessionTitle: "Tiêu chuẩn phiên (Session hygiene)", + sessionText: "Dùng các tham số như /new hoặc calls từ sessions.patch có thể tạo làm mới dọn dẹp ngữ cảnh.", + cronTitle: "Nhắc nhở qua Cron", + cronText: "Bạn nên khởi động dùng kèm các phiên tách lập biệt lập nhằm khi kích lên chạy chu kỳ tự lập cố định.", + }, + auth: { + required: "Cổng kết nối này yêu cầu quá trình tiến hành đăng nhập / xác thực bảo vệ. Nhập điền thêm Mã thông báo (token) vào chỗ trống hay Mật mã đã dựng lên rồi Nhấn dứt điểm nút Kết nối (Connect).", + failed: + "Bị từ chối báo lỗi chứng thực khi đăng nhập. Mời hãy tiến tới làm thao tác sao lưu tiếp nhận lại một đường liên kết qua cách áp dụng dòng câu lệnh {command}, hoặc chịu khó tự kiểm nghiệm bổ sung lại Mã thông báo (token) và nhấn kết nối lại liền luôn.", + }, + pairing: { + hint: "Sử dụng bị gián đoạn vì cái thiết bị này còn thiếu vắng cần phê duyệt xác minh ghép nối do máy gốc làm ra cổng Gateway kia mới chịu nhận dạng.", + mobileHint: + "Ban đang vô từ bên điện thoại à? Sẽ cần có mã URL có đuôi kèm dấu vết đầy đủ chi tiết hơn (ví dụ còn tính thêm cả những mục có #token=...) thì phải vô chạy từ máy tính có gõ cài vào cửa sổ bằng lệnh `openclaw dashboard --no-open`.", + }, + insecure: { + hint: "Hiện tại ở ngoài này trình duyệt tải đang sử dụng giao thức là chuẩn HTTP không rào cản thế nên là nó không chịu chuyển thông tin nhân dạng đặc tính bảo lưu thiết bị an ninh của mảy. Hãy qua trở lề bên HTTPS (hoặc đường Tailscale Serve) hoặc đi ngược sang trang dùng mở đường link {url} tự do tại cái thiết bị cổng host luôn.", + stayHttp: "Giả dụ mà nếu cứ kiên quyết thích làm thân chung qua lại chỉ trên chuẩn HTTP, có hãy cấu hình cập nhập tùy chỉnh thay đổi bằng quy định tham biến {config} qua tệp json lên (sau đây nó sẽ giới hạn cho chạy duy đúng xác thực mỗi mã Token).", + }, + }, + chat: { + disconnected: "Mất kết nối với Gateway.", + refreshTitle: "Làm mới dữ liệu tin nhắn", + thinkingToggle: "Bật/tắt tiến trình thao tác đang xử lý của LLM", + focusToggle: "Bật/Tắt chế độ tập trung đặc biệt (Sẽ bao phủ ẩn các thanh khu phụ trên màn hình)", + hideCronSessions: "Che giấu mốc ẩn lịch qua Cron", + showCronSessions: "Trừng đưa làm xuất hiện lại các mốc lịch ghi qua Cron", + showCronSessionsHidden: "Nổi hiện danh sách phiên lên lịch Cron ({count} bị ẩn đi)", + onboardingDisabled: "Đã vô hiệu hóa trong luồng dẫn nhập cài đặt", + }, + languages: { + en: "Tiếng Anh (English)", + zhCN: "Tiếng Trung Giản Thể (简体中文)", + zhTW: "Tiếng Trung Phồn Thể (繁體中文)", + ptBR: "Tiếng Bồ Đào Nha (Português)", + de: "Tiếng Đức (Deutsch)", + es: "Tiếng Tây Ban Nha (Español)", + vi: "Tiếng Việt", + }, + cron: { + summary: { + enabled: "Đã kích hoạt", + yes: "Có", + no: "Không", + jobs: "Công việc (Jobs)", + nextWake: "Đợt gọi chạy kế", + refreshing: "Đang tải làm mới quá trình...", + refresh: "Làm Mới Trạng", + }, + jobs: { + title: "Công việc (Jobs)", + subtitle: "Quản trị lưu lại toàn bộ mọi thiết lập công việc định sẵn nằm gọn chỗ hệ thống máy cổng Gateway nội đài.", + shownOf: "Xuất ra khoảng chừng {shown} cái trong túc số lớn {total} lệnh", + searchJobs: "Soi tra tên tác vụ cài công việc", + searchPlaceholder: "Danh tự, câu ghi giải nghĩa, hay dòng đặc tính trợ lý LLM", + enabled: "Đã bật chạy", + schedule: "Đặt giờ lập trình", + lastRun: "Diễn khai kì chạy rốt", + all: "Áp tất toàn tập", + sort: "Chia lọc theo tính mốc", + nextRun: "Ngưỡng chừng kế chạy tiếp giáp", + recentlyUpdated: "Canh vào đợt được cho cập nhập trót", + name: "Tên nhãn định tự", + direction: "Theo dòng chuyển dời", + ascending: "Thuận theo hướng đi lên trước tính trên (A-Z)", + descending: "Quay thụt nhượng xuống dưới (Z-A)", + reset: "Xéa bỏ thao tác chỉnh lặp", + noMatching: "Không dư tìm lọc khớp mốc nhãn công việc nào cả.", + loading: "Vẫn trọn xử lý đợi load...", + loadMore: "Truyền tiếp thêm bản tải số lượng việc khác nữa", + }, + runs: { + title: "Lịch sử thực thi (Run history)", + subtitleAll: "Tất cả các thành quả bản chạy của những cấu trúc chạy mốc tự việc cho hết tất yếu lên mặt lên bảng.", + subtitleJob: "Các nội dung phiên ghi chạy gần nhứt cho bên tác việc {title}.", + scope: "Cụm nhắm bao quát dò tầm hiển thị", + allJobs: "Trọn cả tất cả tác vụ cài việc", + selectedJob: "Luân công việc đã và đang bị chấm lựa chọn coi xem riêng", + searchRuns: "Soi khảo rà thông tin phiên tiến trình", + searchPlaceholder: "Hòm hóm sơ sơ báo, thông báo báo ngẫu sự lố lỗi, hoen gỉ tên chỉ điểm vào mỗi phiên lệnh", + newestFirst: "Tin bản thực phiên thời sự sát mốc liền ngay nay thì làm trên trước", + oldestFirst: "Giữ kẹp hoài cổ xa lìa dời trước", + status: "Kiện trạng hiện thị", + delivery: "Nhận phát gửi", + clear: "Hoãn làm trong chùi bớt", + allStatuses: "Quang thu nhận vào thảy tất cả bộ dạng trạng thái", + allDelivery: "Mọi việc khâu đưa liên", + selectJobHint: "Bạn bèn châm thử nhấn trọn cái ngự tác việc đi sẽ hiển thị kỹ xuất coi rà lịch tiến trình hoạt quá cho.", + noMatching: "Lục hết dôi móc không đơm dẻ cái đinh lần ghi trình phiển chạy lệnh khớp chi dữ vậy à.", + loadMore: "Tải trồi lên ngóc thêm mớ chuỗi ghi lần trích nạp coi tiếp", + runStatusOk: "Ổn Khỏe Rồi", + runStatusError: "Hư lỗi (Error)", + runStatusSkipped: "Có bỏ Lơ bớt mất đi", + runStatusUnknown: "Chẳng rành biết sao nua", + deliveryDelivered: "Việc đã chịu tiến tới trao truyền", + deliveryNotDelivered: "Không có đi đưa sang nổi báo hiệu", + deliveryUnknown: "Lạc trôi mất báo nhận", + deliveryNotRequested: "Chả có nài ẻo lấy yêu lụy gì", + }, + form: { + editJob: "Thay Sửa Chữa Mốc Lượng Bản Vụ Việc Cài Cho", + newJob: "Luân Việc Mới toang", + updateSubtitle: "Đắp vô tân gia nạp biên chép sửa mớ lại đống lệnh ấn lên.", + createSubtitle: "Soạn phác tự cái thời điểm choàng mốc định lượng khởi hay là chu kì khơi gợi cho LLM con AI trợ thao phát khởi động.", + required: "Luật ấn định bó buộc (Required)", + requiredSr: "Yêu cầu (Required)", + basics: "Bộ mặt nội chính bản bản nền", + basicsSub: "Báo đặt xưng danh tự nó thế nào, chấm trúng bạn trợ thủ nào LLM đi rồi nhớ mở đóng công tắc hiện hữu chi nó.", + fieldName: "Tên quy xưng gọi", + description: "Thuyết thuật đoạn nghĩa trình thêm gì không", + agentId: "Bí chú chỉ điểm danh số Của LLM (Agent ID)", + namePlaceholder: "Tin tức buổi ban sớm đây à mà", + descriptionPlaceholder: "Kể răn thêm cho đôi câu dẫn lý do có cho công đoạn này tự ý thêm nhen", + agentPlaceholder: "main là được hoặc ghi ops cũng duyệt", + agentHelp: "Anh nắn gõ đi một lúc là bảng báo sẽ xổ trớn cho lựa mớ trợ thủ vốn rành làm sẵn, hoặc đánh rành tên mình thiết lấy vô cũng ngon.", + schedule: "Xếp thời lập tiến hẹn trình biểu sự việc (Schedule)", + scheduleSub: "Dắt chòm khống chế lúc khơi gợi cho tiến lệnh nó rúc làm.", + every: "Chi kỳ mỗi đè lần lượng (Every)", + at: "Ấn ngự vào cự chỉ phút định (At)", + cronOption: "Mã mã hóa Cron biểu", + runAt: "Chỉ đạo cho giờ khởi chạy lúc đó (Run at)", + unit: "Đo lấy chuẩn cự thể đơn vị mốc đi", + minutes: "Phút trôi ngót", + hours: "Hàng Giờ qua", + days: "Vài tháng độ Ngày dời", + expression: "Phương thức chuỗi mã ấn diễn định lên", + expressionPlaceholder: "0 7 * * *", + everyAmountPlaceholder: "30", + timezoneOptional: "Chỉ múc lấn lấy hệ quy điểm Múi Giờ địa (Tùy nghi nếu có rảnh rỗi)", + timezonePlaceholder: "Asia/Ho_Chi_Minh", + timezoneHelp: "Thả trích lựa các vùng khung thông hiểu có phổ biến nhất trên list ra hay anh chịu khó dán nguyên y xì cái mã hệ vùng định chuẩn quốc địa phương chuẩn IANA.", + jitterHelp: "Bị bí tải server ư làm hệ điều khiển nó phải văng dãn chu trình thòng chệch nhịp cho nhàn nha? Cứ đâm đầu vào ô Nâng Cao Cao Tốc (Advanced) đê → Rồi mà lần tìm chỉnh độ dãn tẹc khia tại thông số của Cửa văng đọng sai và Cự dạt đọng đó.", + execution: "Toàn Đạt Trích Thực Nôm Của Chạy Áp Phê (Execution)", + executionSub: "Dịch chuyển ra dấu ý là khi mô mốc tỉnh khởi gọi thì hòng nó dấn làm chi đây nè.", + session: "Nhập môn chia khoảnh riêng ranh phiên hành sự lưu chạy hệ (Session)", + main: "Toán chánh trung môn", + isolated: "Tách bạch ẩn cách cho chia cúp mút phân lìa", + sessionHelp: "Phiên chính sẽ đánh quả dâng rêu sự tình hiện tại dán ngay vô tường trình timeline lộ liễu kia đó. Mà chừng anh dùng Phiên tách bạch thì lại là đánh đánh nhúm tách rời hẳn 1 lút cửa buồng giam hành lạc 1 hiệp chạy làm ngót trọn của tên LLM nó thực chiến cho coi.", + wakeMode: "Kiểu bộ loại đánh động khơi khởi lệnh dậy (Wake mode)", + now: "Tỉnh ngay giờ đây", + nextHeartbeat: "Tại cự phát phập phòng nhịp truyền tiếp kỳ độ kia", + wakeModeHelp: "Ngay đây thì làm chóp nháng liền tại lút chỗ đó làm liền. Đợi nhịp cự tráng thì chờ chầu cho đến cữ chu trình vòng quét rà tiếp kế nha.", + payloadKind: "Chỉ nhắm đòi xử loại tiến thực thi cho là giống cái chi bây chừ?", + systemEvent: "Dán bố cáo gửi điêu truyền trên đại mảng thông báo lịch chu trình thông tuột mặt trước kia kìa", + agentTurn: "Gắn nổ pháo dẫn điệm mồi nhắc chạy mớ nhiệm việc dành gộp của trợ thủ con lính (loại này phải vô chia cách biệt ranh cự riêng lẻ đó nha)", + systemEventHelp: + "Điều xuất chuỗi nhắn gõ văn ngôn kia dán vô đường chỉ dòng mạch hoạt đồ đại quy chuẩn chính của cự móng Cổng máy nhà nhé (Làm cái trò nỳ thích hợp êm ru cho mớ trò cắm lịch ngài gọi rên nhắc khéo hay dộng điểm khơi động cái bộ nổ nè).", + agentTurnHelp: "Đẩy đề lô củi lửa khởi rèn ra dòng máy trí tuệ AI nó trổ ngón làm phiên tự lập độc biên ngay ngót 1 khúc chuỗi riêng, trích từ bộ chuỗi dữ liệu anh soạn đưa chỉ đường chỉ điểm đưa câu mồi.", + timeoutSeconds: "Cứa thời hết nhãn nhượng (Treo rụng TimeOut đo theo lắt Giây)", + timeoutPlaceholder: "Biên chừa thêm ví dụ 90 s cho", + timeoutHelp: + "Đây có cũng được. Buông thõng chừa trắng bóc thì ta xái luôn quy luật cự định dập rụng mặc thế tại bảng Cổng điều máy xái giùm chung nha.", + mainTimelineMessage: "Chuỗi văn nhắn đánh tiếng gởi lên đường trục lịch biểu đại đồ chính yếu", + assistantTaskPrompt: "Bảng gõ chữ nhắn sai phái đề đưa con AI LLM tiến xử tiến hành", + deliverySection: "Truyền nạp giao xuất kết ngõ", + deliverySub: "Nhắm chọn khu xả đẩy bọm chữ kết đoản báo công của cuộc chạy này tống về mé nao.", + resultDelivery: "Báo cáo bạt nộp thông tin thu kết lại đi", + announceDefault: "Vạch mặt dán bố cáo bài sơ quát liền (Chuẩn thế tự gốc là vậy nghe)", + webhookPost: "Tống kiện gửi dữ lượng liên tuyến kiểu POST trích cho rảnh Webhook nha", + noneInternal: "Nín khe chả cần làm trò điêu xuất ẻo gì (Chỉ giấu trong bao kín bưng ngầm hệ đó đi nha)", + deliveryHelp: "Gửi công bố tức diễn tống một bài tổng quát kết ra ngoài màn hình dán. Đặt là Nín lặng sẽ triệt tiêu bưng ép im nhốt khư khư kết việc trọn bưng đi không phun nhả ra hoài.", + webhookUrl: "Link chỉ đường đến Webhook", + channel: "Tuyển ra Đường kết đường Kênh rẽ truyền", + webhookPlaceholder: "https://example.com/cron", + channelHelp: "Nhắm trượt chọn trúng một trong nhiều hệ cầu rẽ truyền Kênh thông tuyến đã trổ ra ngõ hầu mượn trích báo cáo.", + webhookHelp: "Ép đẩy gánh mớ dòng chữ báo cái cự mốc chạy tống ra truyền đi gửi thẳng chót cái lỗ nút chờ API webhook phía phương xa nha.", + to: "Truyền thẳng nhắm tới cho phía mé bên đằng kia", + toPlaceholder: "Ví dụ trổ số điện thoai +84.. hoặc điền vô cự Id chat là xong á chớ", + toHelp: "Để tuỳ nghi lựa có ép đôn ghi đè qua cái điểm trích báo riêng lén không xài chuẩn kia nha (Thí dụ dán ID nhòm vô ổ Hội thoại, Điện thoại tréo leo hay số chứng thư gã User ID cho xài nghen).", + advanced: "Tùy Trình Phức Bức Can Thiệp Nâng Lên Lệch Gì Hơn (Advanced)", + advancedHelp: + "Tùy biến lẩn thòng đôn dập quy thay lệch chỉnh cho phần ngán bắt trọn vẹn của nhận đưa, cựa điểm giờ sai số bị động chệch nhịp lẫn ép đôn cho điều hướng máy AI Model dùng cho công chuyện.", + deleteAfterRun: "Gõ lệnh xẻ tiêu xóa ngót luôn cho phi sạch khỏi sau khi mà cự chạy đã thành (Delete after run)", + deleteAfterRunHelp: "Loại thuốc tiên ngất tuyệt rất ư là hiệu cho cái kiểu nhắc nhắc sáo ngỗng 1 cái cho rồi biến qua đi xong rũ xả bộ tự thu dẹp cái trớn rành rập sau đi cho nó trong sạch sẽ gọn xài.", + clearAgentOverride: "Ủi quét lật xửa đứt cái dấu vết khơi đánh đè lên LLM nhân trợ đi nhe", + clearAgentHelp: "Mở nút kềm ép trói lại cự tác tác cho rấp làm tuân dùng cho cái danh tướng tá máy LLM cơ thế tiêu điểm tự nhiên của cự gốc Máy Gateway là OK thoi.", + exactTiming: "Gõ chốt giờ điểm làm thời nhác trâm trâm đúng ngót chuẩn canh y sì (Ép gắt kềm điểm dãn nghen)", + exactTimingHelp: "Tống ép chạy miệt boong đi trúng bo chốc kỉ luật của rào cron số chả chi ra chừa vòm sai hay dàn đi lệch tẹo nào nha chú mi.", + staggerWindow: "Trương ô số thời khung khoanh vòm trễ hoãn giãn cách số", + staggerUnit: "Biên chốt đo vạch thời chỉ độ cho cữ khung sai đi", + staggerPlaceholder: "Ví tỉ là 30 đi ha", + seconds: "Chi li qua số Giây ngót thời nha", + model: "Cấp chọn mô dạng LLM kiểu Model Máy tính loại chi", + modelPlaceholder: "xạo xạo như openai/gpt-5.2 kìa", + modelHelp: "Lạch cạch tay rành gõ biên lôi cự máy nhân có dạng định biết nằm trong đầu sách lên dùng, nếu không thì ghi tùy tay tên nhãn model do mình lập trình tự ý riêng nha bạn.", + thinking: "Dạng chi độ Càng xoáy nghiền nghĩ màng lâu (Thinking)", + thinkingPlaceholder: "Ví von như là độ low coi (thấp độ)", + thinkingHelp: "Dùng vẹt một cái mức chuẩn gợi nhắc hay phang cho cái giá tham lượng tự dưng của nhà API API nhào nặn vô.", + bestEffortDelivery: "Ép rán cố đánh tới cố sức phát phát cho dứt đường cùng thì ra đi nhe (Best effort delivery)", + bestEffortHelp: "Là đánh vạch khống chế ép không đánh làm tịt đứt hỏng thất bại dính lệnh cho luôn việc nếu như rủi phần chuyển gửi giao không thành kìa.", + cantAddYet: "Kẹt đơ chưa đủ để phang gài thêm tác đi nha chú trẩu xài à", + fillRequired: "Mong anh rán gồng bôi chắp chữ lấp lợp cớ đống lỗ báo cần thiếu bị đỏ ở ngay hàng này dưới cho khai tỏ cự chức nhận nút Đăng Nạp cái coi nha anh ha.", + fixFields: "Để xí đụp điền bôi fix tẹc cho tròn cái {count} chỗ dính đó đi đi đặng cho nhích qua cữ.", + fixFieldsPlural: "Làm ơn xem kỹ tút chuỗi chỗ tréo báo {count} vị dính đạn cái đi đặng bước được ván lấn mốc.", + saving: "Rầm rì cố gánh chốt lưu giùm...", + saveChanges: "Áp vô thay đi", + addJob: "Ngỏ lệnh trâm vô cài thêm một công nữa đê", + cancel: "Lật đánh Hủy ngừng phăng đứt không xài lại", + }, + jobList: { + allJobs: "Tất thảy mọi đống công tác kia đây", + selectJob: "(lựa nhắm chừng mọt cái công việc đê anh em)", + enabled: "bóc kích hoạy cháy", + disabled: "bị kẹp vô khóa lờ đi", + edit: "Biên sửa đôn xửa", + clone: "Ngắt chép nặn clone nhân", + disable: "Bẻ khóa bóp chết nín hoãn", + enable: "Tách lùi kéo hoạt xả lại", + run: "Trút gánh phang khởi chạy thực thi đi", + history: "Bộ lưu phiên xem xét truy sử", + remove: "Ủi lật đá đứt tống khứ liệng", + }, + jobDetail: { + system: "Bàn trung thiết Hệ thống", + prompt: "Bộ văn gõ lôi Đọc nhắc", + delivery: "Độ hướng nơi Chuyển đi", + agent: "Quy thế anh Trợ thủ LLM", + }, + jobState: { + status: "Kiện độ tình trạn", + next: "Khóa mốc đi tới đây nè", + last: "Dòng hồi sát biên cận trót", + }, + runEntry: { + noSummary: "Chả gồng nhét ghi gom bộ dạng chi báo tóm vô trỏng ráo cả.", + runAt: "Đánh lệnh khởi mốc", + openRunChat: "Khơi nảy xuất tung kênh coi lại phiên cự trò chat", + next: "Biển canh độ móc vô lúc độ sau nhúm vạch {rel}", + due: "Đoạn mốc treo ép giáp mặt trúng điểm tời này kia {rel}", + }, + errors: { + nameRequired: "Tên tuổi thì buộc lấp đầy vào đi chứ.", + scheduleAtInvalid: "Quá trình lạp vạch sai nhét cái đúng Giờ/Ngày vào hén bạn ta.", + everyAmountInvalid: "Chuội nhịp biên chu lặp làm mức số lấn vạch hơn qua vị lớn cỡ của con > 0 đi cha.", + cronExprRequired: "Hệ hàm số dất lệnh bộ Cron buộc nhét dán vào nà héng.", + staggerAmountInvalid: "Phần biên chừa độ dãn xệch đi nhét điền vào buộc sai lệch lệch khỏi to hơn cỡ của điểm vị 0 vào là OK.", + systemTextRequired: "Xin gõ lệnh châm chữ diễn văn làm vào nghen cho đi nha.", + agentMessageRequired: "Kẹt phần phải xin tí lời lôi của chú ghi làm điểm tựa nhắn cho bé AI nhé nhen.", + timeoutInvalid: "Rủ bộ canh thời lạn trót có thì gõ cái điểm bưng thời đo chệch vị lớn hơn là xấp lấp trên 0 cái nha trời à.", + webhookUrlRequired: "Link Webhook bắt gắn đắp rải vô cái nèo.", + webhookUrlInvalid: "Vạch Webhook xin cho chạy móc đi ngõ xuất là gõ từ chữ đắp http:// hông thì https:// nhen anh trai.", + invalidRunTime: "Canh giò định đôn lệch múi giò nghen sao mà chạy nổi.", + invalidIntervalAmount: "Hỏng bét cữ độ đo chia khoảng mốc vạch rồi bạn già.", + cronExprRequiredShort: "Báo cron là buộc.", + invalidStaggerAmount: "Khoen định mức đống chừng phang hoãn không rành khớp nổi nghen.", + systemEventTextRequired: "Bám vạch hệ gõ thông hệ bắt có chớ nhễ.", + agentMessageRequiredShort: "Thiếu vắng dòng đưa AI mần nè.", + nameRequiredShort: "Không xưng lấy tự hở.", + }, + }, +}; diff --git a/ui/src/i18n/locales/zh-CN.ts b/ui/src/i18n/locales/zh-CN.ts index 2cf8ca35ec..e9cb99aa36 100644 --- a/ui/src/i18n/locales/zh-CN.ts +++ b/ui/src/i18n/locales/zh-CN.ts @@ -116,12 +116,13 @@ export const zh_CN: TranslationMap = { onboardingDisabled: "引导期间禁用", }, languages: { - en: "English", - zhCN: "简体中文 (简体中文)", - zhTW: "繁體中文 (繁体中文)", - ptBR: "Português (巴西葡萄牙语)", - de: "Deutsch (德语)", - es: "Español (西班牙语)", + en: "英语 (English)", + zhCN: "简体中文 (Simplified Chinese)", + zhTW: "繁体中文 (Traditional Chinese)", + ptBR: "葡萄牙语 (Brazilian Portuguese)", + de: "德语 (Deutsch)", + es: "西班牙语 (Español)", + vi: "越南语 (Tiếng Việt)", }, cron: { summary: { diff --git a/ui/src/i18n/locales/zh-TW.ts b/ui/src/i18n/locales/zh-TW.ts index 6fb48680e7..0f7679e30e 100644 --- a/ui/src/i18n/locales/zh-TW.ts +++ b/ui/src/i18n/locales/zh-TW.ts @@ -116,11 +116,12 @@ export const zh_TW: TranslationMap = { onboardingDisabled: "引導期間禁用", }, languages: { - en: "English", - zhCN: "简体中文 (簡體中文)", - zhTW: "繁體中文 (繁體中文)", - ptBR: "Português (巴西葡萄牙語)", - de: "Deutsch (德語)", - es: "Español (西班牙語)", + en: "英語 (English)", + zhCN: "簡體中文 (Simplified Chinese)", + zhTW: "繁體中文 (Traditional Chinese)", + ptBR: "葡萄牙語 (Brazilian Portuguese)", + de: "德語 (Deutsch)", + es: "西班牙語 (Español)", + vi: "越南語 (Tiếng Việt)", }, };