Files
AgentHub/client/src/i18n/locales/vi/users.json
T
nntrivi2001 9dd97a369c chore: v2.8.21 — update progress steps, clone in background, extra SSH keys inline, today's spend
- Plugin update reports its running step (plugin-update-progress.json →
  plugin_update_progress); a hidden update or clone leaves a progress chip.
- Clone here can run in the background.
- Git identity: extra SSH keys are added inline per host (no More keys tab).
- Users: spend today (viewer's local day, ?tz_offset=).
- Prettier on the files touched since v2.8.20.
2026-10-23 10:44:11 +07:00

336 lines
19 KiB
JSON
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
{
"title": "Người dùng",
"description": "Mọi tài khoản trên server này, kèm workspace, phiên và mức dùng gần đây.",
"name": "Người dùng",
"role": "Vai trò",
"workspaces": "Workspace",
"sessions": "Phiên",
"today": "Hôm nay",
"last7d": "7 ngày",
"last30d": "30 ngày",
"storage": "Dung lượng",
"storageHint": "{{files}} tệp · đo lúc {{at}}",
"storagePartial": "ít nhất — một phần thư mục chưa đọc được kịp",
"storageNone": "Không có thư mục home riêng",
"storageMeasuring": "Đang đo…",
"disabled": "đã khoá",
"you": "bạn",
"tokens": "{{n}} token",
"actions": "Thao tác",
"roles": {
"admin": "Admin",
"analyst": "Analyst",
"developer": "Developer"
},
"roleHint": {
"admin": "Toàn quyền, kể cả cấu hình của server và dữ liệu của mọi người",
"analyst": "Xem được dữ liệu của mọi người; chỉ làm việc trong workspace của mình, không đổi cài đặt",
"developer": "Chỉ workspace của chính mình; không đổi cài đặt"
},
"add": "Thêm người dùng",
"username": "Tên đăng nhập",
"usernameHint": "Chữ, số, '.', '_' hoặc '-'",
"password": "Mật khẩu",
"passwordHint": "Mật khẩu ban đầu tuỳ ý — người dùng sẽ tự đặt mật khẩu riêng ở lần đăng nhập đầu",
"newPassword": "Mật khẩu mới",
"changeRole": "Đổi vai trò",
"disable": "Khoá",
"enable": "Mở khoá",
"resetPassword": "Đặt lại mật khẩu",
"assignWorkspace": "Giao workspace",
"workspace": "Workspace",
"noOwner": "chưa có chủ",
"ownedBy": "của {{name}}",
"noWorkspaces": "Chưa có workspace nào.",
"yourPassword": "Mật khẩu của bạn",
"yourPasswordHint": "Nhập mật khẩu của chính bạn để xác nhận thay đổi này.",
"save": "Lưu",
"dialog": {
"add": "Thêm người dùng",
"role": "Đổi vai trò của {{name}}",
"disable": "Khoá {{name}}?",
"disableBody": "{{name}} bị đăng xuất khỏi mọi nơi và không đăng nhập được cho tới khi mở khoá. Workspace và lịch sử vẫn giữ nguyên.",
"enable": "Mở khoá {{name}}?",
"password": "Đặt lại mật khẩu cho {{name}}",
"passwordBody": "{{name}} bị đăng xuất khỏi mọi nơi và đăng nhập lại bằng mật khẩu mới.",
"workspace": "Giao workspace cho {{name}}",
"workspaceBody": "Các phiên và chi phí của workspace chuyển sang {{name}}. Developer chỉ thấy workspace của chính mình."
},
"done": {
"created": "Đã thêm {{name}}",
"role": "{{name}} giờ là {{role}}",
"disabled": "Đã khoá {{name}}",
"enabled": "Đã mở khoá {{name}}",
"password": "Đã đặt lại mật khẩu cho {{name}}",
"workspace": "Đã giao workspace cho {{name}}",
"updated": "Đã cập nhật {{name}}",
"deleted": "Đã xoá {{name}}."
},
"errors": {
"EBADIMAGE": "Chỉ nhận ảnh PNG, JPEG, GIF hoặc WebP",
"ETOOBIG": "Ảnh tối đa 1 MB",
"EBADURL": "Hãy nhập đường dẫn https:// tới một ảnh.",
"EPRIVATEURL": "Đường dẫn trỏ tới địa chỉ nội bộ hoặc cục bộ.",
"EFETCH": "Không tải được ảnh từ đường dẫn này.",
"EREAUTH": "Mật khẩu của bạn không đúng.",
"ETOOMANY": "Nhập sai mật khẩu quá nhiều lần. Thử lại sau 15 phút.",
"ESELF": "Bạn không thể tự đổi vai trò hay tự khoá chính mình.",
"EEXISTS": "Tên đăng nhập này đã có người dùng.",
"EBADUSER": "Tên đăng nhập: chữ, số, '.', '_' hoặc '-' (tối đa 64 ký tự).",
"EBADPASSWORD": "Mật khẩu không được để trống.",
"EBADEMAIL": "Địa chỉ email không hợp lệ.",
"EBADFIELD": "Có một giá trị không hợp lệ.",
"ENOLANE": "Workspace đó không còn tồn tại.",
"ENOTOWNED": "Workspace đó không còn thuộc người này.",
"EOWNERFOLDER": "Thư mục của workspace đó thuộc tài khoản của người dùng khác.",
"EBADROLE": "Vai trò không hợp lệ.",
"ELOCALMODE": "Chỉ quản lý tài khoản được ở chế độ server.",
"ELASTADMIN": "Không thể xoá, hạ quyền hay khoá admin cuối cùng.",
"EWEAKPASSWORD": "Mật khẩu mới chưa đạt đủ các yêu cầu (hoặc trùng mật khẩu hiện tại).",
"EPWCHANGE": "Hãy đặt mật khẩu riêng của bạn trước."
},
"readOnly": "Analyst chỉ xem được tài khoản, không thay đổi được.",
"auditTitle": "Nhật ký audit",
"auditDescription": "Các thay đổi tài khoản thực hiện ở đây, và mỗi lần admin hoặc analyst mở phiên của một developer.",
"auditEmpty": "Chưa ghi nhận gì.",
"activeCount": "{{n}} đang hoạt động",
"cost30d": "Chi phí · 30 ngày",
"displayName": "Tên hiển thị",
"displayNameHint": "Hiện cạnh tên đăng nhập. Không bắt buộc.",
"email": "Email",
"edit": {
"button": "Sửa người dùng",
"title": "Sửa {{name}}",
"created": "Ngày tạo",
"lastLogin": "Đăng nhập gần nhất",
"never": "Chưa bao giờ",
"logins": "Phiên đăng nhập",
"profile": "Hồ sơ",
"access": "Quyền truy cập",
"status": "Trạng thái",
"active": "Đang hoạt động",
"statusHint": "Người dùng bị vô hiệu hoá không thể đăng nhập; workspace và lịch sử vẫn được giữ.",
"selfRole": "Bạn không thể đổi vai trò của chính mình.",
"selfDisable": "Bạn không thể tự vô hiệu hoá mình.",
"password": "Mật khẩu",
"passwordHint": "Để trống để giữ mật khẩu hiện tại. Mật khẩu mới sẽ đăng xuất họ ở mọi nơi và họ phải tự đặt mật khẩu riêng ở lần đăng nhập sau.",
"show": "Hiện mật khẩu",
"hide": "Ẩn mật khẩu",
"copy": "Sao chép mật khẩu",
"generate": "Tạo ngẫu nhiên",
"loading": "Đang tải…",
"noOwned": "Chưa sở hữu workspace nào.",
"undo": "Hoàn tác",
"removeWorkspace": "Bỏ {{name}}",
"removeWorkspaceHint": "Workspace sẽ không còn chủ sở hữu",
"addWorkspace": "Thêm workspace",
"chooseWorkspace": "Chọn một workspace…",
"sessions": "Phiên đăng nhập",
"signOut": "Đăng xuất ở mọi nơi",
"signOutHint": "Kết thúc {{n}} phiên đăng nhập đang hoạt động của người này; họ đăng nhập lại bằng mật khẩu.",
"noChanges": "Chưa có thay đổi.",
"ownPasswordHint": "Để trống để giữ mật khẩu hiện tại. Các phiên đăng nhập khác của bạn sẽ kết thúc."
},
"pool": {
"title": "Pool tài khoản",
"description": "Các tài khoản mà phiên mới của từng tool chạy trên đó, mỗi AI tool một tab. Tự chọn tài khoản ít tải nhất (hoặc tài khoản user được gán), không ai phải đăng nhập riêng.",
"refresh": "Đọc lại quota",
"add": "Thêm tài khoản",
"account": "Tài khoản",
"livePanes": "Đang chạy",
"quota": "Quota",
"spend": "5 giờ",
"spend7d": "{{cost}} · {{tokens}} tokens trong 7 ngày",
"tokens": "{{tokens}} tokens",
"added": "thêm lúc {{at}}",
"expired": "hết hạn",
"full": "đầy",
"name": "Tên",
"nameHint": "Nhãn tuỳ ý để bạn nhận ra: chữ, số, '.', '_' hoặc '-'",
"remove": "Xoá {{name}}",
"removeHint": "Phiên mới sẽ không dùng tài khoản này nữa. Các phiên đang chạy trên nó vẫn chạy tiếp.",
"removeButton": "Xoá",
"done": {
"added": "Đã thêm {{name}} vào pool",
"removed": "Đã xoá {{name}} khỏi pool"
},
"errors": {
"EREAUTH": "Mật khẩu của bạn không đúng.",
"ETOOMANY": "Nhập sai mật khẩu quá nhiều lần. Thử lại sau 15 phút.",
"EBADNAME": "Tên: 1–64 ký tự chữ, số, '.', '_' hoặc '-'.",
"EBADTOKEN": "Token không hợp lệ cho công cụ này.",
"EEXISTS": "Đã có tài khoản trùng tên trong pool.",
"ENOACCOUNT": "Tài khoản đó không còn trong pool.",
"ELOCALMODE": "Ở chế độ local, pool được thay đổi từ shell của máy (agenthub accounts).",
"EACTIVE": "Claude Code của server giữ login này trong macOS Keychain. Hãy chuyển nó sang profile khác trước.",
"ENOTFOUND": "Login đã lưu đó không còn nữa.",
"ESTALE": "Login này đã được làm mới ở nơi khác. Đăng nhập lại và lưu lại.",
"EUPSTREAM": "Không kết nối được Anthropic. Thử lại.",
"ENOUSER": "User đó không còn tồn tại.",
"ENOGROUP": "Nhóm đó không còn tồn tại."
},
"source": "Nguồn",
"sources": {
"profile": "Hồ sơ đã lưu (Cài đặt → AI tools → Hồ sơ đăng nhập)",
"credentials": "Dán .credentials.json / Keychain",
"token": "claude setup-token"
},
"sourceHint": {
"profile": "Login được chuyển vào pool: profile rời khỏi trình đổi tài khoản, và server ghi nó vào home của từng user khi phiên của họ bắt đầu.",
"credentials": "Lấy từ ~/.claude/.credentials.json, hoặc trên Mac: `security find-generic-password -s \"Claude Code-credentials\" -w`. Đừng dùng tiếp login đó ở nơi đã copy — hai bản sẽ làm nhau bị đăng xuất.",
"token": "Token 1 năm từ `claude setup-token`, đưa vào mọi phiên qua biến môi trường.",
"codex": "OpenAI API key (sk-…), hoặc toàn bộ ~/.codex/auth.json sau khi `codex login` bằng tài khoản ChatGPT.",
"cursor": "Cursor API key lấy từ Cursor dashboard (Integrations → API keys)."
},
"profile": "Profile",
"profileHint": "Lưu ở Cài đặt → AI tools → Hồ sơ đăng nhập. Hồ sơ mà CLI của server đang dùng cũng chuyển được: server vẫn chạy trên nó.",
"chooseProfile": "Chọn login đã lưu…",
"noProfiles": "Chưa có hồ sơ nào — lưu ở Cài đặt → AI tools → Hồ sơ đăng nhập",
"loadingProfiles": "Đang tải…",
"activeHere": "server đang dùng — vẫn chạy tiếp",
"nameFromProfile": "Để trống để dùng tên profile",
"secret": {
"credentials": "Credentials JSON",
"token": "Token",
"codex": "API key hoặc auth.json",
"cursor": "Cursor API key"
},
"secretHint": {
"credentials": "Toàn bộ file: {\"claudeAiOauth\": {…}}",
"token": "Chuỗi sk-ant-… mà `claude setup-token` in ra.",
"codex": "OpenAI API key (sk-…), hoặc toàn bộ ~/.codex/auth.json sau khi `codex login` bằng tài khoản ChatGPT.",
"cursor": "Tạo trong Cursor dashboard tại Integrations → API keys."
},
"refreshFailed": "làm mới lỗi",
"pinned": "Đang dùng: {{users}}",
"loadingUsers": "Đang tải…",
"pinDone": {
"own-login": "{{user}} đang dùng login riêng của họ, nên không bị ghi đè",
"expired": "{{account}} đã hết hạn — phiên mới của {{user}} quay về tài khoản ít tải nhất"
},
"edit": "Sửa {{name}}",
"editHint": "Tick các user mà phiên của họ chạy trên tài khoản này thay vì tài khoản ít tải nhất — kể cả khi nó đã đầy. User đang ở tài khoản khác sẽ chuyển sang đây. Login Claude được ghi ngay vào home của họ: phiên đang chạy chuyển sang ở lần kiểm tra đăng nhập kế tiếp, không cần khởi động lại. Setup-token hoặc tài khoản Codex áp dụng cho phiên mới. Bỏ tick để trả user về tài khoản ít tải nhất.",
"save": "Lưu",
"users": "User dùng tài khoản này",
"noUsers": "Chưa có user nào.",
"onAccount": "đang ở {{account}}",
"editDone": "Đã lưu {{name}}",
"profilesLink": "Hồ sơ trong Cài đặt",
"addFor": "Thêm tài khoản {{tool}}",
"type": "Loại",
"about": {
"claude": "Phiên Claude Code mới chạy trên các tài khoản này. Setup-token được đưa vào dưới dạng biến môi trường; login thật được server ghi vào home của từng user và tự làm mới.",
"codex": "Phiên Codex mới (không qua AI Proxy) chạy trên các tài khoản này. OpenAI API key được đưa vào dưới dạng biến môi trường; login ChatGPT được ghi vào Codex home riêng của từng user.",
"cursor": "Phiên Cursor CLI mới chạy trên các Cursor API key này, đưa vào phiên qua CURSOR_API_KEY — chỉ trong phiên đó nó được ưu tiên hơn `cursor-agent login` của chính user. Cursor không báo mức dùng hay quota ở đây, nên tài khoản có ít phiên đang chạy nhất sẽ được chọn."
},
"notInstalled": "{{tool}} chưa được cài trên server này.",
"emptyFor": "Chưa có tài khoản {{tool}} nào. Khi chưa thêm, phiên {{tool}} của mỗi user cần chính user đó đăng nhập.",
"kindShort": {
"token": "setup-token",
"login": "Login",
"apikey": "API key",
"chatgpt": "Login ChatGPT"
},
"omp": {
"badgeOn": "chia sẻ",
"about": "Oh My Pi không có account pool: thay vào đó nó chia sẻ login omp của chính server. Đăng nhập tài khoản host bằng `omp` (rồi /login), bật chia sẻ, và phiên omp của mọi user chạy trên login đó qua gateway của omp — với một key chỉ dùng được khi pane còn chạy.",
"off": "Chia sẻ đang tắt: phiên omp của mỗi user dùng login của chính user đó.",
"unavailable": "Oh My Pi không có account pool. Login của nó chỉ chia sẻ được trên server mà mỗi user có tài khoản Linux riêng (server mode với tài khoản theo user); ở đây phiên omp của mỗi user dùng login của chính user đó."
},
"none": {
"title": "{{tool}} không có account pool",
"reason": {
"antigravity": "Antigravity đăng nhập bằng tài khoản Google và giữ login trong keyring của hệ thống; nó không nhận key nào để AgentHub đưa cho phiên. Mỗi user tự đăng nhập agy.",
"default": "AgentHub không thể đưa cho {{tool}} một login dùng chung, nên mỗi user tự đăng nhập."
}
},
"liveCount_one": "{{count}} đang chạy",
"liveCount_other": "{{count}} đang chạy",
"savedProfiles": {
"title": "Profile đã lưu có thể chia sẻ",
"empty": "Chưa có profile nào của tool này. Lưu một profile trong Settings → AI tools → Profiles rồi chia sẻ ở đây.",
"activeHere": "đang dùng trên server này",
"share": "Chia sẻ vào pool",
"shareNamed": "Chia sẻ {{name}} vào pool"
},
"groups": {
"title": "Nhóm",
"description": "Mỗi nhóm có tài khoản riêng: thành viên của nhóm chỉ chạy trên tài khoản của nhóm. User không thuộc nhóm nào dùng chung các tài khoản không nằm trong nhóm nào.",
"new": "Tạo nhóm",
"empty": "Chưa có nhóm — mọi user dùng chung mọi tài khoản.",
"members_one": "{{count}} thành viên",
"members_other": "{{count}} thành viên",
"edit": "Sửa nhóm {{name}}",
"delete": "Xoá nhóm {{name}}",
"deleteHint": "Các thành viên quay về pool chung. Không tài khoản nào bị xoá.",
"noAccounts": "chưa có — thành viên tự đăng nhập",
"saved": "Đã lưu nhóm {{name}}",
"deleted": "Đã xoá nhóm {{name}}",
"hint": "Tick các thành viên và tài khoản mà họ dùng. Mỗi user thuộc một nhóm, tick một user sẽ chuyển họ sang đây. Một tài khoản có thể dùng cho nhiều nhóm.",
"name": "Tên nhóm",
"memberList": "Thành viên",
"inGroup": "đang ở {{group}}",
"accountList": "Tài khoản",
"noneInPool": "Pool chưa có tài khoản nào của tool này.",
"shared": "Pool chung"
},
"window": {
"5h": "5 giờ",
"wk": "Tuần"
},
"resetsIn": "reset sau {{time}} · {{at}}"
},
"delete": {
"button": "Xoá user",
"title": "Xoá {{name}}?",
"body": "Thao tác này xoá vĩnh viễn {{name}}: tài khoản đăng nhập, {{count}} workspace, và tài khoản Linux cùng toàn bộ thư mục home (/srv/agenthub/users/{{user}}) — mọi file và source code trong đó. Không thể khôi phục. Lịch sử session và audit log vẫn được giữ.",
"confirm": "Xoá vĩnh viễn",
"needsPassword": "Hãy nhập mật khẩu của bạn ở ô bên dưới trước."
},
"tmux": {
"title": "Tmux của member",
"description": "Mỗi member có tmux server riêng, giữ phiên bản lúc nó khởi động cho đến khi pane cuối cùng đóng. Bản đã cài: tmux {{version}}.",
"refresh": "Làm mới",
"notMatched": "Chạy `agenthub server install-system` một lần: trước đó, server cũ của member được hỏi bằng tmux bản mới và có thể kẹt ở 100% CPU.",
"empty": "Không member nào đang chạy tmux server.",
"user": "Người dùng",
"version": "tmux",
"sessions": "Session",
"agents": "Agent",
"stuck": "không trả lời",
"outdated": "cũ hơn bản cài",
"since": "từ {{at}}",
"working_one": "{{count}} đang chạy",
"working_other": "{{count}} đang chạy",
"idle": "rảnh",
"restart": "Khởi động lại tmux của {{name}}",
"restartIdle_one": "Khởi động lại {{count}} member đang rảnh",
"restartIdle_other": "Khởi động lại {{count}} member đang rảnh",
"restartIdleTitle": "Khởi động lại tmux của member đang rảnh",
"restartHint": "Mọi pane của {{name}} sẽ đóng ({{count}} session). Phiên Claude của họ resume lại được từ workspace, và lần Start sau sẽ chạy tmux bản đã cài.",
"restartHintBusy": "Agent của {{name}} đang chạy và sẽ bị dừng. Mọi pane của họ sẽ đóng ({{count}} session); phiên Claude resume lại được từ workspace.",
"restartIdleHint": "Khởi động lại tmux của mọi member đang chạy bản cũ mà không có agent nào đang chạy: {{names}}. Pane của họ sẽ đóng; phiên Claude resume lại được từ workspace.",
"restartButton": "Khởi động lại",
"done": "Đã khởi động lại tmux của {{name}}",
"doneIdle": "Đã khởi động lại: {{names}}",
"errors": {
"ETMUXSTUCK": "Server không dừng. Chạy lệnh `sudo kill -9` được nêu, bằng quyền root, trên máy server."
}
},
"rowMenu": {
"openHome": "Mở home trong Files",
"copyUsername": "Sao chép username",
"copyEmail": "Sao chép email"
},
"mustChange": "Chờ đổi mật khẩu",
"mustChangeHint": "Đang dùng mật khẩu do admin cấp; phải tự đặt mật khẩu riêng trước khi dùng AgentHub",
"passwordRules": {
"length": "Ít nhất {{min}} ký tự",
"lower": "Có chữ thường",
"upper": "Có chữ hoa",
"digit": "Có chữ số",
"symbol": "Có ký tự đặc biệt (vd. ! - _ @)",
"username": "Không chứa tên đăng nhập"
}
}