feat: 品牌统一 LokiStack + 全站中英 i18n + 用户批量删除 + 主题定时切换与浅色侧栏
- 品牌: Go 模块/数据文件/二进制/构建部署资产全部 opsx→lokistack;前端 localStorage 命名空间迁移(读旧写新,含按用户 id 前缀迁移);修复 nginx upstream 与 Makefile 引用已改名服务的断裂 - i18n: react-i18next 落地,common + 11 个页面域命名空间全站中英(菜单/顶栏/登录/列表页/表单/确认弹窗/状态徽章);设置页语言即时切换;修复词典自注册导致的循环导入白屏 - 用户管理: 批量删除(POST /users/batch-delete,不删自己/最后管理员,部分失败不阻断)+ 行复选/全选/批量工具条 - 主题: 浅色侧栏(中性灰激活态)、四态模式(浅色/深色/跟随系统/定时切换,按时区判定)、顶栏太阳月亮二态、设置页紧凑分段选择器 - UI: 登录记住用户名、CardActionButton 统一五页卡片操作钮、shadcn Badge 替换手写徽章、语义色修正 - 清理: 移除主机 Web 终端(前后端)、k8s-helm/Helm 遗留代码与字段、README 重写精简 - 修复: 侧栏与日志告警 order 重复、路由标题 i18n key 未翻译、词典双逗号等
This commit is contained in:
1 parent
02d1bd87a7
commit
f3733f0bfc
201 files changed
+5438
-2388
No files matched your search
@@ -0,0 +1,141 @@
|
||||
// settings namespace — Settings page (general/password/about, notifications, LDAP, image registry), English copy.
|
||||
// Note: theme & language card titles and ThemeSection copy are owned elsewhere and are not in this dictionary.
|
||||
export default {
|
||||
title: 'Settings',
|
||||
description: 'General settings, alert notifications, LDAP integration, and the default image registry',
|
||||
tabs: {
|
||||
general: 'General',
|
||||
notify: 'Alert Notifications',
|
||||
ldap: 'LDAP Integration',
|
||||
registry: 'Default Image Registry',
|
||||
},
|
||||
// Action labels shared across sections
|
||||
actions: {
|
||||
cancel: 'Cancel',
|
||||
saving: 'Saving...',
|
||||
testing: 'Testing...',
|
||||
},
|
||||
password: {
|
||||
title: 'Change Password',
|
||||
oldLabel: 'Current password',
|
||||
oldPlaceholder: 'Enter current password',
|
||||
newLabel: 'New password',
|
||||
newPlaceholder: 'Enter new password (at least 6 characters)',
|
||||
confirmLabel: 'Confirm new password',
|
||||
confirmPlaceholder: 'Re-enter new password',
|
||||
submit: 'Change password',
|
||||
submitting: 'Changing...',
|
||||
errMismatch: 'Passwords do not match',
|
||||
errTooShort: 'New password must be at least 6 characters',
|
||||
errFailed: 'Failed to change password',
|
||||
},
|
||||
about: {
|
||||
title: 'About LokiStack',
|
||||
versionLabel: 'Version',
|
||||
backendLabel: 'Backend',
|
||||
frontendLabel: 'Frontend',
|
||||
k8sLabel: 'Kubernetes Access',
|
||||
summaryLabel: 'Overview',
|
||||
backendValue: 'Go + Gin + JSON file storage',
|
||||
frontendValue: 'React 19 + TypeScript + Tailwind CSS',
|
||||
k8sValue: 'client-go, direct API Server access',
|
||||
summaryValue: 'Lightweight Loki log management platform',
|
||||
},
|
||||
notify: {
|
||||
cardTitle: 'Alert Channels — Feishu (Lark)',
|
||||
create: 'New channel',
|
||||
// Empty state is assembled as "prefix + link + suffix" (link points to the Alerts page)
|
||||
emptyBefore: 'No channels yet — create one per alert group (e.g. "App alerts", "Nginx alerts"), then link rules to it on the ',
|
||||
emptyLink: 'Alerts',
|
||||
emptyAfter: ' page',
|
||||
webhookConfigured: 'Webhook configured',
|
||||
webhookMissing: 'Not configured',
|
||||
secretConfigured: ' · Signing secret configured',
|
||||
testAria: 'Test {{name}}',
|
||||
editAria: 'Edit {{name}}',
|
||||
deleteAria: 'Delete {{name}}',
|
||||
editTitle: 'Edit Channel · {{name}}',
|
||||
createTitle: 'New Notification Channel',
|
||||
nameLabel: 'Channel name *',
|
||||
namePlaceholder: 'e.g. App alerts / Nginx alerts',
|
||||
webhookLabel: 'Webhook URL',
|
||||
webhookKeepHint: ' (leave blank to keep current)',
|
||||
webhookSavedPlaceholder: 'Saved — enter a new URL to replace it',
|
||||
signingLabel: 'Signing secret (optional)',
|
||||
signingSavedPlaceholder: 'Saved — leave blank to keep current',
|
||||
signingPlaceholder: 'Feishu (Lark) bot signing secret',
|
||||
enable: 'Enable channel',
|
||||
saveChanges: 'Save changes',
|
||||
createChannel: 'Create channel',
|
||||
deleteTitle: 'Delete Notification Channel',
|
||||
testSent: 'Test card sent to "{{name}}"',
|
||||
errLoad: 'Failed to load notification channels',
|
||||
errNameRequired: 'Channel name is required',
|
||||
errWebhookRequired: 'A Webhook URL is required for a new channel',
|
||||
errSave: 'Save failed',
|
||||
errSend: 'Send failed',
|
||||
errToggle: 'Failed to toggle',
|
||||
errDelete: 'Delete failed',
|
||||
},
|
||||
ldap: {
|
||||
cardTitle: 'LDAP Integration',
|
||||
headerHint: 'Enables LDAP sign-in and bulk user import',
|
||||
errLoad: 'Failed to load LDAP configuration',
|
||||
disabledHint:
|
||||
'LDAP is disabled — turn it on and fill in the directory details (server / Bind DN / Base DN). After saving, "Import from LDAP" appears on the Users page.',
|
||||
hostLabel: 'Server address *',
|
||||
portLabel: 'Port',
|
||||
ldapsLabel: 'LDAPS',
|
||||
bindDnLabel: 'Bind DN *',
|
||||
bindPasswordLabel: 'Bind password *',
|
||||
bindPasswordSavedPlaceholder: 'Saved — enter a new password to replace it',
|
||||
bindPasswordPlaceholder: 'Administrator password',
|
||||
baseDnLabel: 'Base DN *',
|
||||
userFilterLabel: 'User filter',
|
||||
usernameLabel: 'Username',
|
||||
nameLabel: 'Full name',
|
||||
emailLabel: 'Email',
|
||||
noEmail: 'No email',
|
||||
testButton: 'Test connection',
|
||||
saveButton: 'Save configuration',
|
||||
errMissingFields: 'Fill in the server address / Bind DN / Base DN first',
|
||||
errTest: 'Test failed',
|
||||
savedToast: 'LDAP configuration saved',
|
||||
},
|
||||
registry: {
|
||||
cardTitle: 'Image Registry',
|
||||
modeOverseasLabel: 'Official (overseas)',
|
||||
modeOverseasDesc: 'docker.io, for overseas networks',
|
||||
modeCnLabel: 'China mirror',
|
||||
modeCnDesc: 'docker.m.daocloud.io mirror, for networks in China',
|
||||
modeCustomLabel: 'Private registry',
|
||||
modeCustomDesc: 'Your own registry prefix (e.g. Huawei Cloud SWR)',
|
||||
errLoad: 'Failed to load image registry configuration',
|
||||
savedToast: 'Image registry saved. Future deployments and collectors will use the new image addresses.',
|
||||
customPrefixLabel: 'Private registry prefix *',
|
||||
customPrefixHint: 'The platform prepends this prefix to image names, e.g. {{example}}/grafana/loki:3.4.0',
|
||||
imagesLabel: 'Per-service images (repository / tag can be overridden)',
|
||||
tagFollowVersion: 'Follows deployment version',
|
||||
repoAria: '{{label}} image repository',
|
||||
tagAria: '{{label}} image tag',
|
||||
// The images hint is assembled as "prefix + <code>grafana/loki</code> + suffix"
|
||||
imagesHintBefore: 'Repository is the image path (e.g. ',
|
||||
imagesHintAfter: '); when Tag is empty, Loki / Grafana follow the deployment version and Promtail / Fluent Bit use built-in defaults.',
|
||||
previewTitle: 'Effective image preview',
|
||||
saveButton: 'Save image registry',
|
||||
},
|
||||
themeCard: {
|
||||
title: 'Theme',
|
||||
light: 'Light',
|
||||
dark: 'Dark',
|
||||
system: 'Follow System',
|
||||
auto: 'Scheduled',
|
||||
timezone: 'Timezone',
|
||||
timezoneAria: 'Theme schedule timezone',
|
||||
browser: 'Follow browser (local)',
|
||||
autoHint: 'Light from {{start}}:00 to {{end}}:00 in the selected timezone, dark otherwise; the sun/moon toggle overrides anytime.',
|
||||
},
|
||||
prefsCard: {
|
||||
title: 'Appearance & Language',
|
||||
},
|
||||
}
|
||||
Reference in new issue
Block a user